[SCM] mapnik branch, upstream, updated. upstream/0.7.1-1-g457d91a

David Paleino dapal at debian.org
Mon Sep 26 20:23:29 UTC 2011


The following commit has been merged in the upstream branch:
commit 457d91a31f6229e6a9ec5939c75838dcfadacd8c
Author: David Paleino <dapal at debian.org>
Date:   Mon Sep 26 22:19:54 2011 +0200

    Imported Upstream version 2.0.0

diff --git a/AUTHORS b/AUTHORS
index df5bbba..3dd813c 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -8,12 +8,16 @@ Committers
  - Jon Burgess (Core)
  - Jean-Francois Doyon (Python API, OGCServer) <jfdoyon -at- gmail.com>
  - Dominic Hargreaves (Stable releases)
+ - Hermann Kraus (MetaWriters)
  - Tom Hughes (Cairo)
+ - Carlos López (SVG Renderer)
  - Ben Moores (PDF branch)
+ - Marcin Rudowski (graphics)
  - David Siegel (XML)
  - Vince Spader (TextSymbolizer)
  - Dane Springmeyer (Python API, SCons) <dane.springmeyer -at- gmail.com>
  - David Leaver (Label Placement)
+ - Alberto Valverde (GlyphSymbolizer, Python API)
  - Andreas Volz (Autotools)
  - Nick Whitelegg (OSM plugin)
 
@@ -21,17 +25,22 @@ Patches
 =======
 
  - Andy Allen
+ - AJ Ashton
  - Justin Bronn
  - Christopher Brown
  - Toby Collet
  - Robert Coup
  - Berteun Damman
+ - Craig de Stigter
  - David Eastcott
  - Krzysztof Godlewski
  - Beau Gunderson
  - John Hague
  - Aubrey Holland
+ - Konstantin Käfer
  - Mak Kolybabi
+ - Peter Körner
+ - Stella Laurenzo
  - Dennis Luxen
  - Tom MacWright
  - Michal Migurski
@@ -42,7 +51,6 @@ Patches
  - Igor Podolskiy
  - Reid Priedhorsky
  - Brian Quinion
- - Marcin Rudowski
  - Christopher Schmidt
  - Andreas Schneider
  - Vincent Schut
@@ -52,11 +60,12 @@ Patches
  - Philipp Spitzer
  - Dave Stubbs
  - River Tarnell
- - Alberto Valverde
+ - Oliver Tonnhofer
+ - Lennard voor den Dag
  - Shaun Walbridge
  - Leslie Wu
   
 Community Wiki
 ==============
 
- - http://trac.mapnik.org/stractistics
\ No newline at end of file
+ - http://trac.mapnik.org/stractistics
diff --git a/CHANGELOG b/CHANGELOG
index 29b12c1..eebfb53 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -11,46 +11,95 @@ Developers: Please commit along with changes.
 For a complete change history, see the SVN log.
 
 
+Mapnik Trunk
+------------
 
-Mapnik 0.7.1 Release
---------------------
+- Add minimum-path-length property to text_symbolizer to allow labels to be placed only on lines of a certain length (#865)
+
+- Add support for png quantization using fixed palettes (#843)
+
+- Add AlsoFilter functionality - http://trac.mapnik.org/wiki/AlsoFilter
+
+- SQLite Plugin: optimize i/o using shared cache and no mutexes (#797)
+
+- Directly link input plugins to libmapnik to avoid having to set dlopen flags from binding languages (#790)
+
+- Throw an error during registration for fonts which Freetype2 does not report a family or style name (r2985).
+
+- Fixed quoting syntax for "table"."attribute" in PostGIS plugin (previously if table aliases were used quoting like "table.attribute" would cause query failure) (r2979).
+
+- Added the ability to control the PostGIS feature id by suppling a key_field to reference and integer attribute name (r2979).
+
+- Added alternative, more robust proj_transform functions to project a bbox using more points than just the four
+  corners to ensure an optimally sized bbox despite proj4 out of bounds conditions. (olt)
+
+- Added map.base parameter that can be set to control where files with relative paths should be interpreted
+  from when a map is loaded from a string or saved to a string. It defaults to an empty string which means
+  that the base path will be the current working directory of the mapnik process. When a stylesheet is read
+  from a file that files directory is used. And a custom value can still be passed as an argument to 
+  load_map_from_string().
+
+- Added python function 'render_grid' to allow conversion of grid buffer to python object containing list of grid
+  pixels, list of keys, and a and dictionary of feature attributes.
+
+- Added new rendering backend, grid_renderer, that collects the attributes of rendered features and
+  burns their ids into a grid buffer.
+
+- Added optional 'maximum-extent' parameter to map object. If set will be used, instead of combined
+  layer extents, for return value of map.zoom_all(). Useful in cases where the combined layer extents
+  cannot possibly be projected into the map srs or the user wishes to control map bounds without
+  modifying the extents of each layer.
+
+- Support for NODATA values with grey and rgb images in GDAL plugin (#727)
+
+- Print warning if invalid XML property names are used (#110)
 
-(Packaged from r1745)
+- Made XML property names use consistent dashes, never underscores (#644)
 
-- Rasters: Various fixes and improvements to 8bit png output (#522,#475)
+- Added support for drawing only first matching rule using filter-mode="first" in Style (#706)
 
-- XML: Save map buffer_size when serializing map.
+- Added support to PointSymbolizer ('ignore_placement') for skipping adding placed points to collision detector (#564)
 
-- SCons: Added new build options 'PRIORITIZE_LINKING' and 'LINK_PRIORITY'. The first is a boolean (default True)
-  of whether to use the new sorting implementation that gives explcit preference to custom or local paths
-  during compile and linking that will affect builds when duplicate libraries and include directories are on the
-  system. LINK_PRIORITY defaults to prioritizing internal sources of the mapnik source folder, then local/user 
-  installed libraries over system libraries, but the option can be customized. Sorting not only ensures that 
-  compiling and linking will more likely match the desired libraries but also gives more likelyhood to avoid 
-  the scenario where libraries are linked that don't match the includes libmapnik compiled against.
+- Added ability to register fonts within XML using Map level 'font_directory' parameter (#168)
 
-- XML: Fixed behavior of PolygonPatternSymbolizer and LinePatternSymbolizer whereby width, height,
-  and type of images is actually allowed to be optionally ommitted (#508). This was added in r1543 but
-  only worked correctly for PointSymbolizer and ShieldSymbolizer. 
+- TextSymbolizer: Change text_convert to text_transform to better match css naming (r2211)
+
+- Shapefile Plugin: Throw error if attribute name is requested that does not exist (#604)
+
+- Upgraded to the latest proj4 string literal for EPSG:4326 (WGS84) as global default projection (#333)
+
+- Added 'mapnik_version_from_string()' function in python bindings to easily convert string representation
+  of version number to the integer format used in 'mapnik/version.hpp'. e.g. '0.7.1' --> 701.
+
+- Added xinclude (http://www.w3.org/TR/xinclude/) support to libxml2-based xml parser (oldtopos) (#567)
+
+- Optimized rendering speeds by avoiding locking in the projection code (r2063) (r2713)
+
+- Added support for setting global alignment of polygon pattern fills (#203)
+
+- Added support for choosing OGR layer by index number using 'layer_by_index' parameter (r1904)
+
+- Added support for fractional halo widths (using FT Stroker) (#93)
+
+- Added support for reading jpeg images (in addition to png/tiff) for image symbolizers (#518)
+
+- Made libjpeg dependency optional at compile time and added mapnik2.has_jpeg() method to check for support in python (#545).
 
 - Fixed reading of PostGIS data on Big Endian systems (#515)
 
-- PostGIS: Added better support for alterative schemas (#500)
+- PostGIS: Added better support for alternative schemas (#500)
 
 - AGG Renderer - Enforced default gamma function on all symbolizers to ensure proper antialiasing
   even when gamma is modified on the PolygonSymbolizer. (#512)
 
+- Added ability to read pre 2.0.0 stylesheets, but prints a warning for deprecated syntax (r1592, #501)
+
+- Rasterlite Plugin: Experimental support for Rasterlite, to practically use sqlite database with wavelet compressed rasters (#469)
+
 - PNG: fixed png256 for large images and some improvements to reduce color corruptions (#522)
 
-- PNG: Added new quantization method for indexed png format using hextree with full support for alpha
-  channel. Also new method has some optimizations for color gradients common when using elevation based
-  rasters. By default old method using octree is used. (r1680, r1683, #477)
+- Implement MarkersSymbolizer in Cairo render and improve the markers placement finder. (#553)
 
-- PNG: Added initial support for passing options to png writter like number of colors, transparency
-  support, quantization method and possibly other in future using type parameter. For example
-  "png8:c=128:t=1:m=h" limits palette to 128 colors, uses only binary transparency (0 - none,
-  1 - binary, 2 - full), and new method of quantization using hextree (h - hextree, o - octree).
-  Existing type "png256" can be also written using "png8:c=256:m=o:t=2"  (r1680, r1683, #477)
 
 Mapnik 0.7.0 Release
 --------------------
@@ -84,13 +133,21 @@ Mapnik 0.7.0 Release
   in cases where the subquery limits results, provide a faster and more accurate layer extent. It will have
   no effect if the 'table' parameter is simply an existing table. This parameter is false by default. (#456)
 
-- PostGIS Plugin: Added 'bbox' token substitution ability in sql query string. This opens the door for various
+- PostGIS Plugin: Added '!bbox!' token substitution ability in sql query string. This opens the door for various
   complex queries that may aggregate geometries to be kept fast by allowing proper placement of the bbox
   query to be used by indexes. (#415)
 
     * Pass the bbox token inside a subquery like: !bbox!
+    
+    * Valid Usages include:
 
-    * e.g. (Select ST_Union(geom) as geom from table where ST_Intersects(geometry,!bbox!)) as map
+      <Parameter name="table">
+        (Select ST_Union(geom) as geom from table where ST_Intersects(geometry,!bbox!)) as map
+      </Parameter>
+
+      <Parameter name="table">
+        (Select * from table where geom && !bbox!) as map
+      </Parameter>
 
 - PostGIS Plugin: Added 'scale_denominator' substitution ability in sql query string (#415/#465)
 
@@ -117,22 +174,22 @@ Mapnik 0.7.0 Release
 
 - Shape Plugin: Fixed missing compiler flags that causes crashing on newer g++ versions (#436)
 
-- PNG: Fixed problem with garbled/striped png256 output along sharpe edges(#416,#445,#447,#202)
+- PNG: Fixed problem with garbled/striped png256 output along sharp edges(#416,#445,#447,#202)
 
-- PNG: Added support for semitransparency in png256 output (#477,#202)
+- PNG: Added support for semi-transparency in png256 output (#477,#202)
 
 - PolygonSymbolizer: Added 'gamma' attribute to allow for dilation of polygon edges - a solution
   to gap artifacts or "ghost lines" between adjacent polygons and allows for slight sharpening of
   the edges of non overlapping polygons. Accepts any values but 0-1 is the recommended range.
    
-- TextSymbolizer: Large set of new attributes: 'text_convert', 'line_spacing', 'character_spacing', 
+- TextSymbolizer: Large set of new attributes: 'text_transform', 'line_spacing', 'character_spacing', 
   'wrap_character', 'wrap_before', 'horizontal_alignment', 'justify_alignment', and 'opacity'.
 
     * More details at changesets: r1254 and r1341
 
 - SheildSymbolizer: Added special new attributes: 'unlock_image', 'VERTEX' placement, 'no_text' and many
   attributes previously only supported in the TextSymbolizer: 'allow_overlap', 'vertical_alignment', 
-  'horizontal_alignment', 'justify_alignment', 'wrap_width', 'wrap_character', 'wrap_before', 'text_convert',
+  'horizontal_alignment', 'justify_alignment', 'wrap_width', 'wrap_character', 'wrap_before', 'text_transform',
   'line_spacing', 'character_spacing', and 'opacity'.
 
     * More details at changeset r1341
@@ -193,6 +250,8 @@ Mapnik 0.6.1 Release
 
 (Packaged from r1247)
 
+- Plugins: expose list of registered plugins as a 'plugin_names()' method of DatasourceCache (r1180) 
+
 - XML: Fixed serialization and parsing bugs related to handling of integers and Enums (#328,#353)
 
 - SCons: Added the ability to set the PKG_CONFIG_PATH env setting (#217)
@@ -347,6 +406,8 @@ Mapnik 0.6.0 Release
 
 - Plugins: PostGIS plugin now accepts alternate schemas (r773)
 
+- Core: Added a Map aspect_fix_mode to ensure proper syncing of map dimensions and bbox (r705)
+
 - Fonts: Added support for fallback fonts (r704)
 
 - Cairo: Cairo support exposed in Python (r666)
diff --git a/INSTALL b/INSTALL
index 334e44d..c06daa1 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,210 +1,187 @@
-# $Id: INSTALL 1552 2010-01-11 19:41:18Z dane $
+# Mapnik Installation
 
-INSTALLATION INSTRUCTIONS
 
+## Quick Start
 
-Quick Start
------------
+To configure and build mapnik do:
 
-For platform specific install guides see:
+    ./configure
+    make
+    sudo make install
 
-  http://trac.mapnik.org/wiki/MapnikInstallation
+If you need to uninstall do:
 
-Install needed dependencies::
+    sudo make uninstall
 
-  $ sudo apt-get install libboost* libicu* libfreetype* proj # see below for full list
-  $ cd ~/src/mapnik
+For more details see the 'Building' Section below.
 
-Configure the build setup::
+Platform specific install guides at http://trac.mapnik.org/wiki/MapnikInstallation
 
-  $ python scons/scons.py configure
+For troubleshooting help see http://trac.mapnik.org/wiki/InstallationTroubleshooting
 
-Build Mapnik source code::
 
-  $ python scons/scons.py
+## Depends
 
-Install Mapnik library and python bindings::
+Mapnik is cross platform and runs on Linux, Mac OSX, Solaris, *BSD, and Windows.
 
-  $ sudo python scons/scons.py install
+The build system should work for all posix/unix systems but for windows see:
 
-If on Linux then run:
+    http://trac.mapnik.org/wiki/BuildingOnWindows
 
-  $ sudo ldconfig
+Build dependencies are:
 
-Run python interpreter and check installation::
+ * C++ compiler (like g++ or clang++)
+ * Python >= 2.4
+ * >= 2 GB RAM
 
-  >>> import mapnik
-  Traceback (most recent call last):
-   File "<stdin>", line 1, in <module>
-  ImportError: No module named mapnik
-  >>>
+Mapnik Core depends on:
 
-If you get this error ensure that Mapnik in is your PYTHONPATH.
-
-Otherwise your setup is ready. You can now visit http://trac.mapnik.org/wiki/GettingStarted for a basic tutorial.
-
-For help with using SCons see: http://trac.mapnik.org/wiki/UsingScons
+ * Boost >= 1.42.x (>= 1.45.x if using clang++) with these libraries:
+    - filesystem
+    - system
+    - thread (if mapnik threadsafe support is required, default on)
+    - regex (optionally built with icu regex support)
+    - program_options (optionally for mapnik command line programs)
 
-For troubleshooting errors see: http://trac.mapnik.org/wiki/InstallationTroubleshooting.
+ * libicuuc >= 4.0 (ideally >= 4.2) - International Components for Unicode
+ * libpng >= 1.2.x - PNG Graphics
+ * libjpeg - JPEG Graphics
+ * libtiff - TIFF Graphics 
+ * libz - Zlib Compression
+ * libfreetype - Freetype2 for Font support (Install requires freetype-config)
+ * libxml2 - XML parsing (Install requires xml2-config)
+ * libproj - PROJ.4 Projection library
 
+Mapnik Python binding depend on:
 
-Prerequisites
--------------
+ * Python >= 2.4
+ * Boost python
 
-First, here is a quick list of the required software dependencies:
+Optional dependencies:
 
-- Linux/UNIX with g++ compiler
-- Python 2.2 or greater to build Mapnik
-    - Python 2.4 for python bindings (see below)
-- libboost >= 1.34.0 or greater with the following libraries included:
-    - system
-    - thread
-    - filesystem
-    - regex
-    - iostreams
-    - python - required only for python bindings (see below)
-- libicu - International Components for Unicode
-- libpng - PNG Graphics
-- libjpeg - JPEG Graphics
-- libtiff - TIFF Graphics 
-- libz - Compression
-- libfreetype2 - Font support (Install requires freetype-config)
-- libxml2 - XML parsing (Install requires xml2-config)
-- proj - PROJ.4 Projection library
-
-Second, here are the optional software dependencies:
-
-- Python 2.4 or greater for Python language bindings
-- Boost 'python', required for binding Python language bindings
-- Boost 'program_options' for shapeindex executable support
-- Cairo - Graphics library for PDF, PS, and SVG formats
+ * Cairo - Graphics library for PDF, PS, and SVG formats
     - pkg-config - Required for building with cairo support
+    - libsigc++ - C++ support for cairomm
     - cairomm - C++ bindings for cairo
     - pycairo - Python bindings for cairo
-- libpq - PostgreSQL libraries (For PostGIS plugin support)
-- libgdal - GDAL/OGR input (For gdal and ogr plugin support)
-- libsqlite3 - SQLite input (needs RTree support) (sqlite plugin support)
-- libocci - Oracle input plugin support
-- libcurl - OSM input plugin support
+ * libpq - PostgreSQL libraries (For PostGIS plugin support)
+ * libgdal - GDAL/OGR input (For gdal and ogr plugin support)
+ * libsqlite3 - SQLite input (needs RTree support) (sqlite plugin support)
+ * libocci - Oracle input plugin support
+ * libcurl - OSM input plugin support
 
-If your system does NOT have one of these installed, you will need to install the mandatory ones at the very least before proceeding further.
+Instructions for installing many of these dependencies on
+various platforms can be found at the Mapnik Community Wiki
+(http://trac.mapnik.org/wiki/MapnikInstallation).
 
-Instructions for installing many of these dependencies on various platforms can be found at the Mapnik Community Wiki (http://trac.mapnik.org/wiki/MapnikInstallation).
 
-On Linux and Mac OS, package management systems (such as apt for debian or macports for darwin) can be used to install most or all dependencies, but source installs may be preferrable. This is particularly true for libraries that a required for the Python bindings, where source installs may be the best way to ensure that the same python version us linked to Boost, Cairo, and Mapnik.
 
-Note: a minimum of 256MB of RAM is recommended for the build process.
+## Building
 
+The build system uses SCons, a pure python equivalent to autotools or cmake.
 
-Building
---------
+We provide a simple Makefile wrapper that can be used like:
 
-Once you've installed the required software packages, the simplest way to build Mapnik is to run SCons (The software builder) without any options::
+    ./configure && make && make install
 
-  $ cd ~/src/mapnik
-  $ python scons/scons.py configure
-  $ python scons/scons.py # will build sources
+To interact with the local copy of scons directly you can do:
 
-This should compile and link the mapnik library as well as the input plugins and the python language binding (if possible).  If any mandatory dependencies are not found the build will fail, and you will need to specify custom paths to your libraries and include files.
+    python scons/scons.py configure
 
-SCons accepts a variety of options to customize your build.  This allows you to specify which components are compiled, where to find dependencies, where to install mapnik, and so on.
+You can also use a globally installed scons:
 
-To see the list of available options, from the root of the source distribution, run::
+    scons configure
 
-  $ python scons/scons.py -h
+If you want to clean your build do:
 
-For example, if you compiled your own set of Boost libraries, you might use::
+    make clean
 
-  $ python scons/scons.py configure BOOST_INCLUDES=/usr/local/include/ BOOST_LIBS=/usr/local/lib
+If you experience odd configure errors, try resetting the SCons caches:
 
-Or if you installed ICU from source and you'd like to build Mapnik in Debug mode you might use::
+    make reset
 
-  $ python scons/scons.py configure DEBUG=True ICU_INCLUDES=/usr/local/include ICU_LIBS=/usr/local/lib
+To install in a custom location do:
 
-For more details on all the options see: http://trac.mapnik.org/wiki/UsingScons
+    ./configure PREFIX=/opt/mapnik
 
-Note: the Python used to run SCons does NOT have to be the same as the one used for the python bindings.
+To pass custom CXXFLAGS or LDFLAGS do:
 
+    ./configure CUSTOM_CXXFLAGS="-g -I/usr/include" CUSTOM_LDFLAGS="-L/usr/lib"
 
-Installation
-------------
+To pass custom paths to a dependency, like boost, do:
 
-Once the build has successfully completed, you can install the various files on your system by executing::
+    ./configure BOOST_INCLUDES=/opt/boost/include BOOST_LIBS=/opt/boost/lib
 
-  $ sudo python scons/scons.py install
+To pass custom paths to a dependency, like icu, do:
 
-By default, everything will be installed under the PREFIX '/usr/local' as such::
+    ./configure ICU_INCLUDES=/usr/local/include ICU_LIBS=/usr/local/include
 
-  $PREFIX/lib: libmapnik.so (.dylib on mac os)
-  $PREFIX/lib/mapnik/input: input plug-ins
-  $PREFIX/include: mapnik include files
-  $PREFIX/bin: shapeindex utility
-  $PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages/mapnik: Python bindings
+If you want to see configure options do:
 
-If you're using the default PREFIX, you will most likely need to be root to perform the install.
+    ./configure --help
 
+For more details on all the options see:
 
-Testing Installation
---------------------
+    http://trac.mapnik.org/wiki/UsingScons
 
-First, try importing the Mapnik python module in a python interpreter, and make sure it does so without errors::
 
-  $ python
-  Python 2.5.1 (r251:54863, Jan 17 2008, 19:35:17) 
-  [GCC 4.0.1 (Apple Inc. build 5465)] on darwin
-  Type "help", "copyright", "credits" or "license" for more information.
-  >>> import mapnik
-  >>> 
+## Testing Installation
+
+First, try importing the Mapnik python module in a python interpreter,
+and make sure it does so without errors:
+
+    $ python
+    Python 2.5.1 (r251:54863, Jan 17 2008, 19:35:17) 
+    [GCC 4.0.1 (Apple Inc. build 5465)] on darwin
+    Type "help", "copyright", "credits" or "license" for more information.
+    >>> import mapnik
+    >>> 
 
 Then, try rendering the demo map, included in the Mapnik source code::
 
-  $ cd demo/python
-  $ python rundemo.py 
+    cd demo/python
+    python rundemo.py 
 
-If the resulting maps look good, this indicates the core components of Mapnik are installed properly, as well as the Shapefile plugin, Unicode text support (ICU), and re-projection support using Proj.
+If the resulting maps look good, this indicates the core components of
+Mapnik are installed properly, as well as the Shapefile plugin, Unicode
+text support (ICU), and re-projection support using Proj.
 
 For further tests see the `tests` folder within the Mapnik source code.
 
 
-Learning Mapnik
----------------
+## Learning Mapnik
 
-For Users:
-  - Visit http://trac.mapnik.org/wiki/LearningMapnik for basic tutorials on making maps with Mapnik using the Python bindings.
+### Users
 
-For Developers:
-  - Visit http://trac.mapnik.org/#DevelopersCorner for resources for getting involved with Mapnik development.
+Visit http://trac.mapnik.org/wiki/LearningMapnik for basic tutorials on making maps with Mapnik using the Python bindings.
 
+### Developers
 
-Mapnik Community
-----------------
+Visit http://trac.mapnik.org/#DevelopersCorner for resources for getting involved with Mapnik development.
 
-Mapnik has an active community of talented users and developers making amazing maps.
 
-If you are looking for further help on installation or usage and you can't find what you are looking for from searching the users list archives (http://lists.berlios.de/pipermail/mapnik-users/) or the trac wiki (http://trac.mapnik.org/), feel free to join the Mapnik community and introduce yourself.
+## Mapnik Community
 
-You can get involved by:
-  - Subscribing to the mapnik-users list: http://lists.berlios.de/mailman/listinfo/mapnik-users
-  - Subscribing to the mapnik-developers list: http://lists.berlios.de/mailman/listinfo/mapnik-devel
-  - Joining the #mapnik channel on irc://irc.freenode.net/mapnik
-  - Signing up as a user or contributer at http://www.ohloh.net/p/mapnik/  
 
+Mapnik has an active community of talented users and developers making
+amazing maps.
+
+If you are looking for further help on installation or usage and you can't
+find what you are looking for from searching the users list archives
+(http://lists.berlios.de/pipermail/mapnik-users/) or the trac wiki
+(http://trac.mapnik.org/), feel free to join the Mapnik community and
+introduce yourself.
+
+You can get involved by:
 
-A note on projection support
-----------------------------
+ * Subscribing to the mapnik-users list:
 
-Mapnik's core C++ library and map rendering engine support on-the-fly cartographic
-reprojections.
+    http://lists.berlios.de/mailman/listinfo/mapnik-users
 
-Here is an example on how to use it::
+ * Subscribing to the mapnik-developers list:
 
-  >>> import mapnik
-  >>> p = mapnik.Projection('+init=epsg:27700') # British National Grid
-  >>> p.forward(mapnik.Coord(-1.125,51.75))
-  Coord(460396.920899,206113.214203) # reprojected coordinate x, y pair
-  >>> p.forward(mapnik.Envelope(-1.125,51.75,-1.0,50.75))
-  Envelope(461721.365661,94917.0749406,469024.861457,206224.090767) # reprojected extent
+    http://lists.berlios.de/mailman/listinfo/mapnik-devel
 
+ * Joining the #mapnik channel on irc://irc.freenode.net/mapnik
 
-The Projection() instance provides inverse() and forward() methods.  For details on the possible parameters,
-see the PROJ.4 documentation.
+ * Signing up as a user or contributor at http://www.ohloh.net/p/mapnik/  
diff --git a/README b/README
index 2f518c5..e109ba2 100644
--- a/README
+++ b/README
@@ -1,20 +1,22 @@
 See INSTALL file for installation instructions
 
-Mapnik is an OpenSource C++/Python toolkit for developing 
-GIS (Geographic Information Systems) applications. At the core is a C++ shared 
-library providing algorithms/patterns for spatial data access and visualization.
+Mapnik is an OpenSource C++/Python toolkit for developing GIS (Geographic
+Information Systems) applications. At the core is a C++ shared library
+providing algorithms/patterns for spatial data access and visualization.
 
-Essentially a collection of geographic objects (map, layer, datasource, feature, geometry), 
-the library doesn't rely on "windowing systems" and can be deployed in any server environment. 
-It is intended to play fair in a multi-threaded environment and is aimed primarily, 
-but not exclusively, at web-based development.
+Essentially a collection of geographic objects (map, layer, datasource,
+feature, geometry), the library doesn't rely on "windowing systems"
+and can be deployed in any server environment.  It is intended to play
+fair in a multi-threaded environment and is aimed primarily, but not
+exclusively, at web-based development.
 
-High-level Python bindings (boost.python) facilitate rapid application development, 
-targeting zope3, django etc.
+High-level Python bindings (boost.python) facilitate rapid application
+development, targeting zope3, django etc.
 
-Mapnik is a free software and is released under LGPL (GNU Lesser General Public Licence) (see COPYING)
+Mapnik is a free software and is released under LGPL (GNU Lesser General
+Public Licence) (see COPYING)
 
 For further information see:
   - http://mapnik.org
   - http://trac.mapnik.org
-  - http://ohloh.net/p/mapnik
\ No newline at end of file
+  - http://ohloh.net/p/mapnik
diff --git a/SConstruct b/SConstruct
index 1133a54..6088d64 100644
--- a/SConstruct
+++ b/SConstruct
@@ -16,7 +16,7 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
-# $Id: SConstruct 1728 2010-03-18 22:51:14Z dane $
+# $Id: SConstruct 3352 2011-09-15 22:15:04Z dane $
 
 
 import os
@@ -34,6 +34,79 @@ try:
 except:
     HAS_DISTUTILS = False
 
+
+# local file to hold custom user configuration variables
+# Todo check timestamp, reload if changed?
+SCONS_LOCAL_CONFIG = 'config.py'
+# build log
+SCONS_LOCAL_LOG = 'config.log'
+# local pickled file to cache configured environment
+SCONS_CONFIGURE_CACHE = 'config.cache'
+# directory SCons uses to stash build tests
+SCONF_TEMP_DIR = '.sconf_temp'
+# auto-search directories for boost libs/headers
+BOOST_SEARCH_PREFIXES = ['/usr/local','/opt/local','/sw','/usr',]
+BOOST_MIN_VERSION = '1.41'
+CAIROMM_MIN_VERSION = '1.8.0'
+
+DEFAULT_LINK_PRIORITY = ['internal','other','frameworks','user','system']
+
+
+pretty_dep_names = {
+    'ociei':'Oracle database library | configure with OCCI_LIBS & OCCI_INCLUDES | more info: http://trac.mapnik.org/wiki/OCCI',
+    'gdal':'GDAL C++ library | configured using gdal-config program | try setting GDAL_CONFIG SCons option | more info: http://trac.mapnik.org/wiki/GDAL',
+    'ogr':'OGR-enabled GDAL C++ Library | configured using gdal-config program | try setting GDAL_CONFIG SCons option | more info: http://trac.mapnik.org/wiki/OGR',
+    'geos_c':'GEOS Simple Geometry Specification C Library | configured with GEOS_LIB & GEOS_INCLUDE | more info: http://trac.mapnik.org/wiki/GEOS',
+    'cairo':'Cairo C library | configured using pkg-config | try setting PKG_CONFIG_PATH SCons option',
+    'cairomm':'Cairomm C++ bindings to Cairo library | configured using pkg-config | try setting PKG_CONFIG_PATH SCons option',
+    'cairomm-version':'Cairomm version is too old (so cairo renderer will not be built), you need at least %s' % CAIROMM_MIN_VERSION,
+    'pycairo':'Python bindings to Cairo library | configured using pkg-config | try setting PKG_CONFIG_PATH SCons option',
+    'proj':'Proj.4 C Projections library | configure with PROJ_LIBS & PROJ_INCLUDES | more info: http://trac.osgeo.org/proj/',
+    'pg':'Postgres C Library requiered for PostGIS plugin | configure with pg_config program | more info: http://trac.mapnik.org/wiki/PostGIS',
+    'sqlite3':'SQLite3 C Library | configure with SQLITE_LIBS & SQLITE_INCLUDES | more info: http://trac.mapnik.org/wiki/SQLite',
+    'jpeg':'JPEG C library | configure with JPEG_LIBS & JPEG_INCLUDES',
+    'tiff':'TIFF C library | configure with TIFF_LIBS & TIFF_INCLUDES',
+    'png':'PNG C library | configure with PNG_LIBS & PNG_INCLUDES',
+    'icuuc':'ICU C++ library | configure with ICU_LIBS & ICU_INCLUDES or use ICU_LIB_NAME to specify custom lib name  | more info: http://site.icu-project.org/',
+    'ltdl':'GNU Libtool | more info: http://www.gnu.org/software/libtool',
+    'z':'Z compression library | more info: http://www.zlib.net/',
+    'm':'Basic math library, part of C++ stlib',
+    'pkg-config':'pkg-config tool | more info: http://pkg-config.freedesktop.org',
+    'pg_config':'pg_config program | try setting PG_CONFIG SCons option',
+    'xml2-config':'xml2-config program | try setting XML2_CONFIG SCons option',
+    'gdal-config':'gdal-config program | try setting GDAL_CONFIG SCons option',
+    'geos-config':'geos-config program | try setting GEOS_CONFIG SCons option',
+    'freetype-config':'freetype-config program | try setting FREETYPE_CONFIG SCons option',
+    'osm':'more info: http://trac.mapnik.org/wiki/OsmPlugin',
+    'curl':'libcurl is required for the "osm" plugin - more info: http://trac.mapnik.org/wiki/OsmPlugin',
+    'boost_regex_icu':'libboost_regex built with optional ICU unicode support is needed for unicode regex support in mapnik.',
+    'sqlite_rtree':'The SQLite plugin requires libsqlite3 built with RTREE support (-DSQLITE_ENABLE_RTREE=1)',
+    'pgsql2sqlite_rtree':'The pgsql2sqlite program requires libsqlite3 built with RTREE support (-DSQLITE_ENABLE_RTREE=1)'
+    }
+    
+# Core plugin build configuration
+# opts.AddVariables still hardcoded however...
+PLUGINS = { # plugins with external dependencies
+            # configured by calling project, henche 'path':None
+            'postgis': {'default':True,'path':None,'inc':'libpq-fe.h','lib':'pq','lang':'C'},
+            'gdal':    {'default':True,'path':None,'inc':'gdal_priv.h','lib':'gdal','lang':'C++'},
+            'ogr':     {'default':True,'path':None,'inc':'ogrsf_frmts.h','lib':'gdal','lang':'C++'},
+            'geos':    {'default':False,'path':None,'inc':'geos_c.h','lib':'geos_c','lang':'C'},
+            # configured with custom paths, hence 'path': PREFIX/INCLUDES/LIBS
+            'occi':    {'default':False,'path':'OCCI','inc':'occi.h','lib':'ociei','lang':'C++'},
+            'sqlite':  {'default':True,'path':'SQLITE','inc':'sqlite3.h','lib':'sqlite3','lang':'C'},
+            'rasterlite':  {'default':False,'path':'RASTERLITE','inc':['sqlite3.h','rasterlite.h'],'lib':'rasterlite','lang':'C'},
+            
+            # todo: osm plugin does also depend on libxml2 (but there is a separate check for that)
+            'osm':     {'default':False,'path':None,'inc':'curl/curl.h','lib':'curl','lang':'C'},
+
+            # plugins without external dependencies requiring CheckLibWithHeader...
+            'shape':   {'default':True,'path':None,'inc':None,'lib':None,'lang':'C++'},
+            'raster':  {'default':True,'path':None,'inc':None,'lib':None,'lang':'C++'},
+            'kismet':  {'default':False,'path':None,'inc':None,'lib':None,'lang':'C++'},
+            }
+
+
 #### SCons build options and initial setup ####
 env = Environment(ENV=os.environ)
 
@@ -55,12 +128,64 @@ def regular_print(color,text,newline=True):
         print text
 
 def call(cmd, silent=False):
-    stdin, stderr = Popen(cmd,shell=True,stdout=PIPE,stderr=PIPE).communicate()
+    stdin, stderr = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE).communicate()
     if not stderr:
         return stdin.strip()
     elif not silent:
         color_print(1,'Problem encounted with SCons scripts, please post bug report to: http://trac.mapnik.org\nError was: %s' % stderr)
 
+def strip_first(string,find,replace=''):
+    if string.startswith(find):
+        return string.replace(find,replace,1)
+    return string
+
+def get_libtool_major_version():
+    """libtool >= 2.1b support lt_dlopenadvise and the previous
+    release appears to be 1.9f (based on NEWS) so checking for 
+    >= 2 seems adequate.
+    """
+    cmd = 'libtool'
+    if platform.uname()[0] == "Darwin":
+        cmd = 'glibtool'
+    version = None
+    fallback_version = 2
+    pattern = r'(.*[^\S])(\d{1}\.\d+\.?\d?)(.*[^\S])'
+    ret = os.popen('%s --version' % cmd).read()
+    match = re.match(pattern,ret)
+    if match:
+        groups = match.groups()
+        if len(groups):
+            version_string = groups[1]
+            if version_string:
+                version_string = version_string.split('.')[0]
+                try:
+                    version = int(version_string)
+                except ValueError:
+                    pass
+    if not version:
+        color_print(1,'Could not detect libtool --version, assuming major version 2')
+        return fallback_version
+    return version
+
+# http://www.scons.org/wiki/InstallTargets
+def create_uninstall_target(env, path, is_glob=False):
+    if 'uninstall' in COMMAND_LINE_TARGETS:
+        if is_glob:
+            all_files = Glob(path,strings=True)
+            for filei in all_files:
+                env.Command( "uninstall-"+filei, filei,
+                [
+                Delete("$SOURCE"),
+                ])
+                env.Alias("uninstall", "uninstall-"+filei)
+        else:
+            if os.path.exists(path):
+                env.Command( "uninstall-"+path, path,
+                [
+                Delete("$SOURCE"),
+                ])
+                env.Alias("uninstall", "uninstall-"+path)
+    
 def shortest_name(libs):
     name = '-'*200
     for lib in libs:
@@ -68,7 +193,6 @@ def shortest_name(libs):
             name = lib
     return name
 
-DEFAULT_LINK_PRIORITY = ['internal','other','frameworks','user','system']
 
 def sort_paths(items,priority):
     """Sort paths such that compiling and linking will globally prefer custom or local libs
@@ -101,7 +225,10 @@ def sort_paths(items,priority):
             path_types['frameworks'].append(i)
         # various 'local' installs like /usr/local or /opt/local
         elif 'local' in i or '/sw' in i:
-            path_types['user'].append(i)
+            if '/usr/local' in i:
+                path_types['user'].insert(0,i)
+            else:
+                path_types['user'].append(i)
         # key system libs (likely others will fall into 'other')
         elif '/usr/' in i or '/System' in i or '/lib' in i:
             path_types['system'].append(i)
@@ -143,30 +270,7 @@ elif platform.uname()[4] == 'ppc64':
 else:
     LIBDIR_SCHEMA='lib'
 
-pretty_dep_names = {
-    'ociei':'Oracle database library | configure with OCCI_LIBS & OCCI_INCLUDES | more info: http://trac.mapnik.org/wiki/OCCI',
-    'gdal':'GDAL C++ library | configured using gdal-config program | try setting GDAL_CONFIG SCons option | more info: http://trac.mapnik.org/wiki/GDAL',
-    'ogr':'OGR-enabled GDAL C++ Library | configured using gdal-config program | try setting GDAL_CONFIG SCons option | more info: http://trac.mapnik.org/wiki/OGR',
-    'cairo':'Cairo C library | configured using pkg-config | try setting PKG_CONFIG_PATH SCons option',
-    'cairomm':'Cairomm C++ bindings to Cairo library | configured using pkg-config | try setting PKG_CONFIG_PATH SCons option',
-    'pycairo':'Python bindings to Cairo library | configured using pkg-config | try setting PKG_CONFIG_PATH SCons option',
-    'proj':'Proj.4 C Projections library | configure with PROJ_LIBS & PROJ_INCLUDES | more info: http://trac.osgeo.org/proj/',
-    'pg':'Postgres C Library requiered for PostGIS plugin | configure with pg_config program | more info: http://trac.mapnik.org/wiki/PostGIS',
-    'sqlite3':'SQLite3 C Library | configure with SQLITE_LIBS & SQLITE_INCLUDES | more info: http://trac.mapnik.org/wiki/SQLite',
-    'osm':'more info: http://trac.mapnik.org/wiki/OsmPlugin',
-    'jpeg':'JPEG C library | configure with JPEG_LIBS & JPEG_INCLUDES',
-    'tiff':'TIFF C library | configure with TIFF_LIBS & TIFF_INCLUDES',
-    'png':'PNG C library | configure with PNG_LIBS & PNG_INCLUDES',
-    'icuuc':'ICU C++ library | configure with ICU_LIBS & ICU_INCLUDES or use ICU_LIB_NAME to specify custom lib name  | more info: http://site.icu-project.org/',
-    'ltdl':'GNU Libtool | more info: http://www.gnu.org/software/libtool',
-    'z':'Z compression library | more info: http://www.zlib.net/',
-    'm':'Basic math library, part of C++ stlib',
-    'pkg-config':'pkg-config tool | more info: http://pkg-config.freedesktop.org',
-    'pg_config':'pg_config program | try setting PG_CONFIG SCons option',
-    'xml2-config':'xml2-config program | try setting XML2_CONFIG SCons option',
-    'gdal-config':'gdal-config program | try setting GDAL_CONFIG SCons option',
-    'freetype-config':'freetype-config program | try setting FREETYPE_CONFIG SCons option',
-    }
+
     
 def pretty_dep(dep):
     pretty = pretty_dep_names.get(dep)
@@ -176,35 +280,6 @@ def pretty_dep(dep):
         return '%s (%s)' % (dep,'more info see: http://trac.mapnik.org/wiki/MapnikInstallation & http://www.boost.org')
     return dep
 
-# local file to hold custom user configuration variables
-SCONS_LOCAL_CONFIG = 'config.py'
-# build log
-SCONS_LOCAL_LOG = 'config.log'
-# local pickled file to cache configured environment
-SCONS_CONFIGURE_CACHE = 'config.cache'
-# directory SCons uses to stash build tests
-SCONF_TEMP_DIR = '.sconf_temp'
-# auto-search directories for boost libs/headers
-BOOST_SEARCH_PREFIXES = ['/usr/local','/opt/local','/sw','/usr',]
-
-
-# Core plugin build configuration
-# opts.AddVariables still hardcoded however...
-PLUGINS = { # plugins with external dependencies
-            'postgis': {'default':True,'path':'PGSQL','inc':'libpq-fe.h','lib':'pq','lang':'C'},
-            'gdal':    {'default':False,'path':None,'inc':'gdal_priv.h','lib':'gdal','lang':'C++'},
-            'ogr':     {'default':False,'path':None,'inc':'ogrsf_frmts.h','lib':'gdal','lang':'C++'},
-            'occi':    {'default':False,'path':'OCCI','inc':'occi.h','lib':'ociei','lang':'C++'},
-            'sqlite':  {'default':False,'path':'SQLITE','inc':'sqlite3.h','lib':'sqlite3','lang':'C'},
-            
-            # todo: osm plugin does depend on libxml2 and libcurl
-            'osm':     {'default':False,'path':None,'inc':None,'lib':None,'lang':'C++'},
-
-            # plugins without external dependencies requiring CheckLibWithHeader...
-            'shape':   {'default':True,'path':None,'inc':None,'lib':None,'lang':'C++'},
-            'raster':  {'default':True,'path':None,'inc':None,'lib':None,'lang':'C++'},
-            'kismet':  {'default':False,'path':None,'inc':None,'lib':None,'lang':'C++'},
-            }
 
 DEFAULT_PLUGINS = []
 for k,v in PLUGINS.items():
@@ -217,24 +292,32 @@ opts = Variables()
 
 opts.AddVariables(
     # Compiler options
-    ('CXX', 'The C++ compiler to use (defaults to g++).', 'g++'),
-    EnumVariable('OPTIMIZATION','Set g++ optimization level','2', ['0','1','2','3','4']),
+    ('CXX', 'The C++ compiler to use to compile mapnik (defaults to g++).', 'g++'),
+    ('CC', 'The C compiler used for configure checks of C libs (defaults to gcc).', 'gcc'),
+    ('CUSTOM_CXXFLAGS', 'Custom C++ flags, e.g. -I<include dir> if you have headers in a nonstandard directory <include dir>', ''),
+    ('CUSTOM_LDFLAGS', 'Custom linker flags, e.g. -L<lib dir> if you have libraries in a nonstandard directory <lib dir>', ''),
+    EnumVariable('LINKING', "Set library format for libmapnik",'shared', ['shared','static']),
+    EnumVariable('RUNTIME_LINK', "Set preference for linking dependencies",'shared', ['shared','static']),
+    EnumVariable('OPTIMIZATION','Set g++ optimization level','3', ['0','1','2','3','4','s']),
     # Note: setting DEBUG=True will override any custom OPTIMIZATION level
     BoolVariable('DEBUG', 'Compile a debug version of Mapnik', 'False'),
-    BoolVariable('XML_DEBUG', 'Compile a XML verbose debug version of mapnik', 'False'),
     ListVariable('INPUT_PLUGINS','Input drivers to include',DEFAULT_PLUGINS,PLUGINS.keys()),
+    ('WARNING_CXXFLAGS', 'Compiler flags you can set to reduce warning levels which are placed after -Wall.', ''),
     
     # SCons build behavior options
     ('CONFIG', "The path to the python file in which to save user configuration options. Currently : '%s'" % SCONS_LOCAL_CONFIG,SCONS_LOCAL_CONFIG),
     BoolVariable('USE_CONFIG', "Use SCons user '%s' file (will also write variables after successful configuration)", 'True'),
-    BoolVariable('FAST', "Make scons faster at the cost of less precise dependency tracking", 'False'),
-    BoolVariable('PRIORITIZE_LINKING', 'Sort list of lib and inc directories to ensure preferencial compiling and linking (useful when duplicate libs)', 'True'),
+    # http://www.scons.org/wiki/GoFastButton
+    # http://stackoverflow.com/questions/1318863/how-to-optimize-an-scons-script
+    BoolVariable('FAST', "Make SCons faster at the cost of less precise dependency tracking", 'False'),
+    BoolVariable('PRIORITIZE_LINKING', 'Sort list of lib and inc directories to ensure preferential compiling and linking (useful when duplicate libs)', 'True'),
     ('LINK_PRIORITY','Priority list in which to sort library and include paths (default order is internal, other, frameworks, user, then system - see source of `sort_paths` function for more detail)',','.join(DEFAULT_LINK_PRIORITY)),    
     
     # Install Variables
     ('PREFIX', 'The install path "prefix"', '/usr/local'),
     ('PYTHON_PREFIX','Custom install path "prefix" for python bindings (default of no prefix)',''),
     ('DESTDIR', 'The root directory to install into. Useful mainly for binary package building', '/'),
+    ('PATH_INSERT', 'A custom path to append to the $PATH env to prioritize usage of shell programs like pkg-config will be used if multiple are present on the system', ''),
     
     # Boost variables
     # default is '/usr/include', see FindBoost method below
@@ -254,6 +337,7 @@ opts.AddVariables(
     ('ICU_LIB_NAME', 'The library name for icu (such as icuuc, sicuuc, or icucore)', 'icuuc'),
     PathVariable('PNG_INCLUDES', 'Search path for libpng include files', '/usr/include', PathVariable.PathAccept),
     PathVariable('PNG_LIBS','Search path for libpng include files','/usr/' + LIBDIR_SCHEMA, PathVariable.PathAccept),
+    BoolVariable('JPEG', 'Build Mapnik with JPEG read and write support', 'True'),    
     PathVariable('JPEG_INCLUDES', 'Search path for libjpeg include files', '/usr/include', PathVariable.PathAccept),
     PathVariable('JPEG_LIBS', 'Search path for libjpeg library files', '/usr/' + LIBDIR_SCHEMA, PathVariable.PathAccept),
     PathVariable('TIFF_INCLUDES', 'Search path for libtiff include files', '/usr/include', PathVariable.PathAccept),
@@ -263,25 +347,36 @@ opts.AddVariables(
     ('PKG_CONFIG_PATH', 'Use this path to point pkg-config to .pc files instead of the PKG_CONFIG_PATH environment setting',''),
     
     # Variables affecting rendering back-ends
+    
+    BoolVariable('RENDERING_STATS', 'Output rendering statistics during style processing', 'False'),
+    
     BoolVariable('INTERNAL_LIBAGG', 'Use provided libagg', 'True'),
+
+    BoolVariable('SVG_RENDERER', 'build support for native svg renderer', 'False'),
     
     # Variables for optional dependencies
+    ('GEOS_CONFIG', 'The path to the geos-config executable.', 'geos-config'),
     # Note: cairo, cairomm, and pycairo all optional but configured automatically through pkg-config
     # Therefore, we use a single boolean for whether to attempt to build cairo support.
     BoolVariable('CAIRO', 'Attempt to build with Cairo rendering support', 'True'),
+    PathVariable('CAIRO_INCLUDES', 'Search path for cairo/cairomm include files', '',PathVariable.PathAccept),
+    PathVariable('CAIRO_LIBS', 'Search path for cairo/cairomm library files','',PathVariable.PathAccept),
     ('GDAL_CONFIG', 'The path to the gdal-config executable for finding gdal and ogr details.', 'gdal-config'),
     ('PG_CONFIG', 'The path to the pg_config executable.', 'pg_config'),
     PathVariable('OCCI_INCLUDES', 'Search path for OCCI include files', '/usr/lib/oracle/10.2.0.3/client/include', PathVariable.PathAccept),
     PathVariable('OCCI_LIBS', 'Search path for OCCI library files', '/usr/lib/oracle/10.2.0.3/client/'+ LIBDIR_SCHEMA, PathVariable.PathAccept),
     PathVariable('SQLITE_INCLUDES', 'Search path for SQLITE include files', '/usr/include/', PathVariable.PathAccept),
     PathVariable('SQLITE_LIBS', 'Search path for SQLITE library files', '/usr/' + LIBDIR_SCHEMA, PathVariable.PathAccept),
+    PathVariable('RASTERLITE_INCLUDES', 'Search path for RASTERLITE include files', '/usr/include/', PathVariable.PathAccept),
+    PathVariable('RASTERLITE_LIBS', 'Search path for RASTERLITE library files', '/usr/' + LIBDIR_SCHEMA, PathVariable.PathAccept),
     
     # Other variables
     BoolVariable('SHAPE_MEMORY_MAPPED_FILE', 'Utilize memory-mapped files in Shapefile Plugin (higher memory usage, better performance)', 'True'),
     ('SYSTEM_FONTS','Provide location for python bindings to register fonts (if given aborts installation of bundled DejaVu fonts)',''),
-    ('LIB_DIR_NAME','Name to use for the "lib" folder where fonts and plugins are installed','/mapnik/'),
+    ('LIB_DIR_NAME','Name to use for the subfolder beside libmapnik where fonts and plugins are installed','mapnik2'),
     PathVariable('PYTHON','Full path to Python executable used to build bindings', sys.executable),
     BoolVariable('FRAMEWORK_PYTHON', 'Link against Framework Python on Mac OS X', 'True'),
+    BoolVariable('PYTHON_DYNAMIC_LOOKUP', 'On OSX, do not directly link python lib, but rather dynamically lookup symbols', 'True'),
     ('FRAMEWORK_SEARCH_PATH','Custom framework search path on Mac OS X', ''),
     BoolVariable('FULL_LIB_PATH', 'Use the full path for the libmapnik.dylib "install_name" when linking on Mac OS X', 'True'),
     ListVariable('BINDINGS','Language bindings to build','all',['python']),
@@ -291,25 +386,32 @@ opts.AddVariables(
     BoolVariable('DEMO', 'Compile demo c++ application', 'False'),
     BoolVariable('PGSQL2SQLITE', 'Compile and install a utility to convert postgres tables to sqlite', 'False'),
     BoolVariable('COLOR_PRINT', 'Print build status information in color', 'True'),
+    BoolVariable('SAMPLE_INPUT_PLUGINS', 'Compile and install sample plugins', 'False'),
     )
-    
+
 # variables to pickle after successful configure step
 # these include all scons core variables as well as custom
-# env variables needed in Sconscript files
+# env variables needed in SConscript files
 pickle_store = [# Scons internal variables
-        'CC',
-        'CXX',
+        'CC', # compiler user to check if c deps compile during configure
+        'CXX', # C++ compiler to compile mapnik
         'CCFLAGS',
         'CPPDEFINES',
-        'CPPFLAGS',
+        'CPPFLAGS', # c preprocessor flags
         'CPPPATH',
-        'CXXFLAGS',
+        'CXXFLAGS', # C++ flags built up during configure
         'LIBPATH',
         'LIBS',
         'LINKFLAGS',
+        'CUSTOM_LDFLAGS', # user submitted
+        'CUSTOM_CXXFLAGS', # user submitted
+        'MAPNIK_LIB_NAME',
+        'LINK',
+        'RUNTIME_LINK',
         # Mapnik's SConstruct build variables
         'PLUGINS',
         'ABI_VERSION',
+        'MAPNIK_VERSION_STRING',
         'PLATFORM',
         'BOOST_ABI',
         'BOOST_APPEND',
@@ -322,6 +424,30 @@ pickle_store = [# Scons internal variables
         'PYTHON_SYS_PREFIX',
         'COLOR_PRINT',
         'HAS_BOOST_SYSTEM',
+        'SVN_REVISION',
+        'HAS_CAIRO',
+        'HAS_PYCAIRO',
+        'HAS_LIBXML2',
+        'LIBTOOL_SUPPORTS_ADVISE',
+        'PYTHON_IS_64BIT',
+        'SAMPLE_INPUT_PLUGINS',
+        'PKG_CONFIG_PATH',
+        'PATH_INSERT',
+        'MAPNIK_LIB_DIR',
+        'MAPNIK_LIB_DIR_DEST',
+        'INSTALL_PREFIX',
+        'MAPNIK_INPUT_PLUGINS',
+        'MAPNIK_INPUT_PLUGINS_DEST',
+        'MAPNIK_FONTS',
+        'MAPNIK_FONTS_DEST',
+        'MAPNIK_LIB_BASE',
+        'MAPNIK_LIB_BASE_DEST',
+        'EXTRA_FREETYPE_LIBS',
+        'LIBMAPNIK_CPPATHS',
+        'LIBMAPNIK_CXXFLAGS',
+        'CAIROMM_LIBPATHS',
+        'CAIROMM_LINKFLAGS',
+        'CAIROMM_CPPPATHS',
         ]
 
 # Add all other user configurable options to pickle pickle_store
@@ -343,22 +469,15 @@ if ('-h' in command_line_args) or ('--help' in command_line_args):
     HELP_REQUESTED = True
     
 
-if 'configure' in command_line_args:
+if 'configure' in command_line_args and not HELP_REQUESTED:
     force_configure = True
 elif HELP_REQUESTED:
-    preconfigured = True # this is just to ensure config gets skipped when help is requested
+    # to ensure config gets skipped when help is requested
+    preconfigured = True
 
 # initially populate environment with defaults and any possible custom arguments
 opts.Update(env)
 
-if env.has_key('COLOR_PRINT') and env['COLOR_PRINT'] == False:
-    color_print = regular_print
-
-if sys.platform == "win32":
-    color_print = regular_print
-
-color_print(4,'\nWelcome to Mapnik...\n')
-
 # if we are not configuring overwrite environment with pickled settings
 if not force_configure:
     if os.path.exists(SCONS_CONFIGURE_CACHE):
@@ -369,7 +488,6 @@ if not force_configure:
                 env[key] = value
             preconfigured = True
         except:
-            # unpickling failed, so reconfigure as fallback
             preconfigured = False
     else:
         preconfigured = False
@@ -379,6 +497,7 @@ if not force_configure:
 # rebuilds, e.g. for folks following trunk
 for opt in pickle_store:
     if not opt in env:
+        #print 'missing opt', opt
         preconfigured = False
 
 # if custom arguments are supplied make sure to accept them
@@ -395,17 +514,31 @@ elif preconfigured:
         color_print(4,'Using previous successful configuration...')
         color_print(4,'Re-configure by running "python scons/scons.py configure".')
 
+if env.has_key('COLOR_PRINT') and env['COLOR_PRINT'] == False:
+    color_print = regular_print
 
+if sys.platform == "win32":
+    color_print = regular_print
+
+color_print(4,'\nWelcome to Mapnik...\n')
+
+color_print(1,'*'*45)
+color_print(1,'You are compiling Mapnik trunk (aka Mapnik2)')
+color_print(1,'See important details at:\nhttp://trac.mapnik.org/wiki/Mapnik2')
+color_print(1,('*'*45)+'\n')
 
 
 #### Custom Configure Checks ###
 
-def prioritize_paths(context):    
+def prioritize_paths(context,silent=True):    
     env = context.env
     prefs = env['LINK_PRIORITY'].split(',')
-    context.Message( 'Sorting lib and inc compiler paths by priority... %s' % ','.join(prefs) )
+    if not silent:
+        context.Message( 'Sorting lib and inc compiler paths by priority... %s' % ','.join(prefs) )
     env['LIBPATH'] = sort_paths(env['LIBPATH'],prefs)
     env['CPPPATH'] = sort_paths(env['CPPPATH'],prefs)
+    if silent:
+        context.did_show_result=1
     ret = context.Result( True )
     return ret
 
@@ -421,11 +554,17 @@ def CheckPKG(context, name):
     context.Result( ret )
     return ret
 
+def CheckPKGVersion(context, name, version):
+    context.Message( 'Checking for at least version %s for %s... ' % (version,name) )
+    ret = context.TryAction('pkg-config --atleast-version=%s \'%s\'' % (version,name))[0]
+    context.Result( ret )
+    return ret
+
 def parse_config(context, config, checks='--libs --cflags'):
     env = context.env
     tool = config.lower().replace('_','-')
     toolname = tool
-    if config == 'GDAL_CONFIG':
+    if config in ('GDAL_CONFIG','GEOS_CONFIG'):
         toolname += ' %s' % checks
     context.Message( 'Checking for %s... ' % toolname)
     cmd = '%s %s' % (env[config],checks)
@@ -433,16 +572,32 @@ def parse_config(context, config, checks='--libs --cflags'):
     parsed = False
     if ret:
         try:
-            env.ParseConfig(cmd)
+            if 'gdal-config' in cmd:
+                env.ParseConfig(cmd)
+                # hack for potential -framework GDAL syntax
+                # which will not end up being added to env['LIBS']
+                # and thus breaks knowledge below that gdal worked
+                # TODO - upgrade our scons logic to support Framework linking
+                if env['PLATFORM'] == 'Darwin':
+                    value = call(cmd,silent=True)
+                    if value and '-framework GDAL' in value:
+                        env['LIBS'].append('gdal')
+                        if os.path.exists('/Library/Frameworks/GDAL.framework/unix/lib'):
+                            env['LIBPATH'].insert(0,'/Library/Frameworks/GDAL.framework/unix/lib')
+                    if 'GDAL' in env.get('FRAMEWORKS',[]):
+                        env["FRAMEWORKS"].remove("GDAL")
+            else:
+                env.ParseConfig(cmd)
             parsed = True
         except OSError, e:
             ret = False
             print ' (xml2-config not found!)'
     if not parsed:
-        if config == 'GDAL_CONFIG':
+        if config in ('GDAL_CONFIG','GEOS_CONFIG'):
+            # optional deps...
             env['SKIPPED_DEPS'].append(tool)
-            conf.rollback_option('GDAL_CONFIG')
-        else:
+            conf.rollback_option(config)
+        else: # freetype and libxml2, not optional
             env['MISSING_DEPS'].append(tool)        
     context.Result( ret )
     return ret
@@ -457,9 +612,13 @@ def get_pkg_lib(context, config, lib):
     parsed = False
     if ret:
         try:
-            libnames = re.findall(libpattern,call(cmd,silent=True))
+            value = call(cmd,silent=True)
+            libnames = re.findall(libpattern,value)
             if libnames:
-              libname = libnames[0]
+                libname = libnames[0]
+            else:
+                # osx 1.8 install gives '-framework GDAL'
+                libname = 'gdal'
         except Exception, e:
             ret = False
             print ' unable to determine library name:'# %s' % str(e)
@@ -468,6 +627,7 @@ def get_pkg_lib(context, config, lib):
     return libname
 
 def parse_pg_config(context, config):
+    # TODO - leverage `LDFLAGS_SL` if RUNTIME_LINK==static
     env = context.env
     tool = config.lower()
     context.Message( 'Checking for %s... ' % tool)
@@ -475,8 +635,8 @@ def parse_pg_config(context, config):
     if ret:
         lib_path = call('%s --libdir' % env[config])
         inc_path = call('%s --includedir' % env[config])
-        env.AppendUnique(CPPPATH = inc_path)
-        env.AppendUnique(LIBPATH = lib_path)
+        env.AppendUnique(CPPPATH = os.path.realpath(inc_path))
+        env.AppendUnique(LIBPATH = os.path.realpath(lib_path))
         lpq = env['PLUGINS']['postgis']['lib']
         env.Append(LIBS = lpq)
     else:
@@ -517,9 +677,11 @@ def FindBoost(context, prefixes, thread_flag):
         search_lib = 'libboost_thread'        
     else:
         search_lib = 'libboost_filesystem'
-    
-    prefixes.insert(0,os.path.dirname(env['BOOST_INCLUDES']))
-    prefixes.insert(0,os.path.dirname(env['BOOST_LIBS']))
+
+    # note: must call normpath to strip trailing slash otherwise dirname
+    # does not remove 'lib' and 'include'
+    prefixes.insert(0,os.path.dirname(os.path.normpath(env['BOOST_INCLUDES'])))
+    prefixes.insert(0,os.path.dirname(os.path.normpath(env['BOOST_LIBS'])))
     for searchDir in prefixes:
         libItems = glob(os.path.join(searchDir, LIBDIR_SCHEMA, '%s*.*' % search_lib))
         if not libItems:
@@ -572,8 +734,8 @@ def FindBoost(context, prefixes, thread_flag):
             env['BOOST_APPEND'] = '-'.join(append_params)
         msg += '\n  *using boost lib naming: %s' % env['BOOST_APPEND']
 
-    env.AppendUnique(CPPPATH = env['BOOST_INCLUDES'])
-    env.AppendUnique(LIBPATH = env['BOOST_LIBS'])    
+    env.AppendUnique(CPPPATH = os.path.realpath(env['BOOST_INCLUDES']))
+    env.AppendUnique(LIBPATH = os.path.realpath(env['BOOST_LIBS']))    
     if env['COLOR_PRINT']:
         msg = "\033[94m%s\033[0m" % (msg)
     ret = context.Result(msg)
@@ -650,18 +812,105 @@ int main()
     major_version = version / 100000
     return [major_version,minor_version,patch_level]
 
-conf_tests = { 'prioritize_paths' : prioritize_paths,
-               'CheckPKGConfig' : CheckPKGConfig,
-               'CheckPKG' : CheckPKG,
-               'FindBoost' : FindBoost,
-               'CheckBoost' : CheckBoost,
-               'GetBoostLibVersion' : GetBoostLibVersion,
-               'GetMapnikLibVersion' : GetMapnikLibVersion,
-               'parse_config' : parse_config,
-               'parse_pg_config' : parse_pg_config,
-               'ogr_enabled': ogr_enabled,
-               'get_pkg_lib': get_pkg_lib,
-               'rollback_option': rollback_option
+def icu_at_least_four_two(context):
+    ret = context.TryRun("""
+
+#include <unicode/uversion.h>
+#include <iostream>
+
+int main() 
+{
+    std::cout << U_ICU_VERSION_MAJOR_NUM << "." << U_ICU_VERSION_MINOR_NUM << std::endl;
+    return 0;
+}
+
+""", '.cpp')
+    # hack to avoid printed output
+    context.Message('Checking for ICU version >= 4.2... ')
+    context.did_show_result=1
+    result = ret[1].strip()
+    if not result:
+        context.Result('error, could not get major and minor version from unicode/uversion.h')
+        return False
+    
+    major, minor = map(int,result.split('.'))
+    if major >= 4 and minor >= 0:
+        color_print(4,'\nFound icu version... %s\n' % result)
+        return True
+    
+    color_print(1,'\nFound insufficient icu version... %s\n' % result)
+    return False
+
+def boost_regex_has_icu(context):
+    ret = context.TryRun("""
+
+#include <boost/regex/icu.hpp>
+#include <unicode/unistr.h>
+
+int main() 
+{
+    UnicodeString ustr;
+    try { 
+        boost::u32regex pattern = boost::make_u32regex(ustr);
+    }
+    // an exception is fine, still indicates support is
+    // likely compiled into regex
+    catch (...) {
+        return 0;
+    }
+    return 0;
+}
+
+""", '.cpp')
+    context.Message('Checking if boost_regex was built with ICU unicode support... ')
+    context.Result(ret[0])
+    if ret[0]:
+        return True
+    return False
+
+def sqlite_has_rtree(context):
+    """ check an sqlite3 install has rtree support.
+    
+    PRAGMA compile_options;
+    http://www.sqlite.org/c3ref/compileoption_get.html
+    """
+     
+    ret = context.TryRun("""
+
+extern "C" {
+  #include <sqlite3.h>
+}
+
+int main() 
+{
+    sqlite3_rtree_geometry *p;
+    //sqlite3_compileoption_used("ENABLE_RTREE");
+    return 0;
+}
+
+""", '.cpp')
+    context.Message('Checking if SQLite supports RTREE... ')
+    context.Result(ret[0])
+    if ret[0]:
+        return True
+    return False
+        
+conf_tests = { 'prioritize_paths'      : prioritize_paths,
+               'CheckPKGConfig'        : CheckPKGConfig,
+               'CheckPKG'              : CheckPKG,
+               'CheckPKGVersion'       : CheckPKGVersion,
+               'FindBoost'             : FindBoost,
+               'CheckBoost'            : CheckBoost,
+               'GetBoostLibVersion'    : GetBoostLibVersion,
+               'GetMapnikLibVersion'   : GetMapnikLibVersion,
+               'parse_config'          : parse_config,
+               'parse_pg_config'       : parse_pg_config,
+               'ogr_enabled'           : ogr_enabled,
+               'get_pkg_lib'           : get_pkg_lib,
+               'rollback_option'       : rollback_option,
+               'icu_at_least_four_two' : icu_at_least_four_two,
+               'boost_regex_has_icu'   : boost_regex_has_icu,
+               'sqlite_has_rtree'      : sqlite_has_rtree,
                }
 
 
@@ -703,27 +952,70 @@ if not preconfigured:
         mode = 'debug mode'
     else:
         mode = 'release mode'
-
-    if env['XML_DEBUG']:
-        mode += ' (with XML debug on)'
         
     env['PLATFORM'] = platform.uname()[0]
     color_print(4,"Configuring on %s in *%s*..." % (env['PLATFORM'],mode))
+    
+    env['LIBTOOL_SUPPORTS_ADVISE'] = get_libtool_major_version() >= 2
 
     env['MISSING_DEPS'] = []
     env['SKIPPED_DEPS'] = []
-    
+    env['HAS_CAIRO'] = False
+    env['CAIROMM_LIBPATHS'] = []
+    env['CAIROMM_LINKFLAGS'] = []
+    env['CAIROMM_CPPPATHS'] = []
+    env['HAS_PYCAIRO'] = False
+    env['HAS_LIBXML2'] = False
+    env['SVN_REVISION'] = None
+    env['LIBMAPNIK_LIBS'] = []
+    env['LIBMAPNIK_CPPATHS'] = []
+    env['LIBMAPNIK_CXXFLAGS'] = []
     env['LIBDIR_SCHEMA'] = LIBDIR_SCHEMA
     env['PLUGINS'] = PLUGINS
+    env['EXTRA_FREETYPE_LIBS'] = []
+
+    # previously a leading / was expected for LIB_DIR_NAME
+    # now strip it to ensure expected behavior
+    if env['LIB_DIR_NAME'].startswith(os.path.sep):
+        env['LIB_DIR_NAME'] = strip_first(env['LIB_DIR_NAME'],os.path.sep)
+    
+    # base install location
+    env['MAPNIK_LIB_BASE'] = os.path.join(env['PREFIX'],env['LIBDIR_SCHEMA'])
+    # directory for plugins and fonts
+    env['MAPNIK_LIB_DIR'] = os.path.join(env['MAPNIK_LIB_BASE'],env['LIB_DIR_NAME'])
+    # input plugins sub directory
+    env['MAPNIK_INPUT_PLUGINS'] = os.path.join(env['MAPNIK_LIB_DIR'],'input')
+    # fonts sub directory
+    if env['SYSTEM_FONTS']:
+        env['MAPNIK_FONTS'] = os.path.normpath(env['SYSTEM_FONTS'])
+    else:
+        env['MAPNIK_FONTS'] = os.path.join(env['MAPNIK_LIB_DIR'],'fonts')
+    
+    # install prefix is a pre-pended base location to 
+    # re-route the install and only intended for package building
+    # we normalize to ensure no trailing slash and proper pre-pending to the absolute prefix
+    install_prefix = os.path.normpath(os.path.realpath(env['DESTDIR'])) + os.path.realpath(env['PREFIX'])
+    env['INSTALL_PREFIX'] = strip_first(install_prefix,'//','/')
+    # all values from above based on install_prefix
+    # if env['DESTDIR'] == '/' these should be unchanged
+    env['MAPNIK_LIB_BASE_DEST'] = os.path.join(env['INSTALL_PREFIX'],env['LIBDIR_SCHEMA'])
+    env['MAPNIK_LIB_DIR_DEST'] =  os.path.join(env['MAPNIK_LIB_BASE_DEST'],env['LIB_DIR_NAME'])
+    env['MAPNIK_INPUT_PLUGINS_DEST'] = os.path.join(env['MAPNIK_LIB_DIR_DEST'],'input')
+    if env['SYSTEM_FONTS']:
+        env['MAPNIK_FONTS_DEST'] = os.path.normpath(env['SYSTEM_FONTS'])
+    else:
+        env['MAPNIK_FONTS_DEST'] = os.path.join(env['MAPNIK_LIB_DIR_DEST'],'fonts')
+    
+    if env['LINKING'] == 'static':
+       env['MAPNIK_LIB_NAME'] = '${LIBPREFIX}mapnik2${LIBSUFFIX}'
+    else:
+       env['MAPNIK_LIB_NAME'] = '${SHLIBPREFIX}mapnik2${SHLIBSUFFIX}'
         
     if env['PKG_CONFIG_PATH']:
-        env['ENV']['PKG_CONFIG_PATH'] = env['PKG_CONFIG_PATH']
+        env['ENV']['PKG_CONFIG_PATH'] = os.path.realpath(env['PKG_CONFIG_PATH'])
         # otherwise this variable == os.environ["PKG_CONFIG_PATH"]
-
-    thread_suffix = 'mt'
-    if env['PLATFORM'] == 'FreeBSD':
-        thread_suffix = ''
-        env.Append(LIBS = 'pthread')
+    if env['PATH_INSERT']:
+        env['ENV']['PATH'] = os.path.realpath(env['PATH_INSERT']) + ':' + env['ENV']['PATH']
     
     if env['SYSTEM_FONTS']:
         if not os.path.isdir(env['SYSTEM_FONTS']):
@@ -734,17 +1026,21 @@ if not preconfigured:
     env['CPPPATH'] = ['#include', '#']
     env['LIBPATH'] = ['#src']
     
+    # set any custom cxxflags to come first
+    env.Append(CXXFLAGS = env['CUSTOM_CXXFLAGS'])
+
+    ### platform specific bits
+
+    thread_suffix = 'mt'
+    if env['PLATFORM'] == 'FreeBSD':
+        thread_suffix = ''
+        env.Append(LIBS = 'pthread')
+
     # Solaris & Sun Studio settings (the `SUNCC` flag will only be
     # set if the `CXX` option begins with `CC`)
     SOLARIS = env['PLATFORM'] == 'SunOS'
     env['SUNCC'] = SOLARIS and env['CXX'].startswith('CC')
     
-    # For Solaris include paths (e.g., for freetype2, ltdl, etc.).
-    if SOLARIS:
-        blastwave_dir = '/opt/csw/%s'
-        env.AppendUnique(CPPPATH = blastwave_dir % 'include')
-        env.AppendUnique(LIBPATH = blastwave_dir % LIBDIR_SCHEMA)
-    
     # If the Sun Studio C++ compiler (`CC`) is used instead of GCC.
     if env['SUNCC']:
         env['CC'] = 'cc'
@@ -753,42 +1049,46 @@ if not preconfigured:
         # before the `-o` flag).
         env['CXX'] = 'CC -library=stlport4'
         if env['THREADING'] == 'multi':
-            env['CXXFLAGS'] = ['-mt']
+            env.Append(CXXFLAGS = '-mt')
+
+    # allow for mac osx /usr/lib/libicucore.dylib compatibility
+    # requires custom supplied headers since Apple does not include them
+    # details: http://lists.apple.com/archives/xcode-users/2005/Jun/msg00633.html
+    # To use system lib download and make && make install one of these:
+    # http://www.opensource.apple.com/tarballs/ICU/
+    # then copy the headers to a location that mapnik will find
+    if 'core' in env['ICU_LIB_NAME']:
+        env.Append(CXXFLAGS = '-DU_HIDE_DRAFT_API')
+        env.Append(CXXFLAGS = '-DUDISABLE_RENAMING')
+        if os.path.exists(env['ICU_LIB_NAME']):
+            #-sICU_LINK=" -L/usr/lib -licucore
+            env['ICU_LIB_NAME'] = os.path.basename(env['ICU_LIB_NAME']).replace('.dylib','').replace('lib','')
         
     # Adding the required prerequisite library directories to the include path for
     # compiling and the library path for linking, respectively.
-    for required in ('PNG', 'JPEG', 'TIFF','PROJ','ICU'):
+    for required in ('PNG', 'JPEG', 'TIFF','PROJ','ICU', 'SQLITE'):
         inc_path = env['%s_INCLUDES' % required]
         lib_path = env['%s_LIBS' % required]
-        env.AppendUnique(CPPPATH = inc_path)
-        env.AppendUnique(LIBPATH = lib_path)
+        env.AppendUnique(CPPPATH = os.path.realpath(inc_path))
+        env.AppendUnique(LIBPATH = os.path.realpath(lib_path))
 
+    
     conf.parse_config('FREETYPE_CONFIG')
 
+    # check if freetype links to bz2
+    if env['RUNTIME_LINK'] == 'static':
+        temp_env = env.Clone()
+        temp_env['LIBS'] = []
+        temp_env.ParseConfig('%s --libs' % env['FREETYPE_CONFIG'])
+        if 'bz2' in temp_env['LIBS']:
+            env['EXTRA_FREETYPE_LIBS'].append('bz2')
+
     if env['XMLPARSER'] == 'tinyxml':
         env['CPPPATH'].append('#tinyxml')
         env.Append(CXXFLAGS = '-DBOOST_PROPERTY_TREE_XML_PARSER_TINYXML -DTIXML_USE_STL')
     elif env['XMLPARSER'] == 'libxml2':
         if conf.parse_config('XML2_CONFIG'):
-            env.Append(CXXFLAGS = '-DHAVE_LIBXML2')
-            
-    if env['CAIRO'] and conf.CheckPKGConfig('0.15.0') and conf.CheckPKG('cairomm-1.0'):
-        env.ParseConfig('pkg-config --libs --cflags cairomm-1.0')
-        env.Append(CXXFLAGS = '-DHAVE_CAIRO')
-    else:
-        env['SKIPPED_DEPS'].extend(['cairo','cairomm'])
-
-    # allow for mac osx /usr/lib/libicucore.dylib compatibility
-    # requires custom supplied headers since Apple does not include them
-    # details: http://lists.apple.com/archives/xcode-users/2005/Jun/msg00633.html
-    # To use system lib download and make && make install one of these:
-    # http://www.opensource.apple.com/tarballs/ICU/
-    # then copy the headers to a location that mapnik will find
-    if 'core' in env['ICU_LIB_NAME']:
-        env.Append(CXXFLAGS = '-DU_HIDE_DRAFT_API')
-        env.Append(CXXFLAGS = '-DUDISABLE_RENAMING')
-        if os.path.exists(env['ICU_LIB_NAME']):
-            env['ICU_LIB_NAME'] = os.path.basename(env['ICU_LIB_NAME']).replace('.dylib','').replace('lib','')
+            env['HAS_LIBXML2'] = True
 
     LIBSHEADERS = [
         ['m', 'math.h', True,'C'],
@@ -796,15 +1096,19 @@ if not preconfigured:
         ['png', 'png.h', True,'C'],
         ['tiff', 'tiff.h', True,'C'],
         ['z', 'zlib.h', True,'C'],
-        ['jpeg', ['stdio.h', 'jpeglib.h'], True,'C'],
         ['proj', 'proj_api.h', True,'C'],
         [env['ICU_LIB_NAME'],'unicode/unistr.h',True,'C++'],
     ]
 
+    if env['JPEG']:
+        env.Append(CXXFLAGS = '-DHAVE_JPEG')
+        LIBSHEADERS.append(['jpeg', ['stdio.h', 'jpeglib.h'], True,'C'])
+    else:
+        env['SKIPPED_DEPS'].extend(['jpeg'])
 
     # if requested, sort LIBPATH and CPPPATH before running CheckLibWithHeader tests
     if env['PRIORITIZE_LINKING']:
-        conf.prioritize_paths()    
+        conf.prioritize_paths(silent=False)    
     
     for libinfo in LIBSHEADERS:
         if not conf.CheckLibWithHeader(libinfo[0], libinfo[1], libinfo[3]):
@@ -815,6 +1119,11 @@ if not preconfigured:
                 color_print(4,'Could not find optional header or shared library for %s' % libinfo[0])
                 env['SKIPPED_DEPS'].append(libinfo[0])            
 
+    if env['ICU_LIB_NAME'] not in env['MISSING_DEPS']:
+        if not conf.icu_at_least_four_two():
+            # expression_string.cpp and map.cpp use fromUTF* function only available in >= ICU 4.2
+            env['MISSING_DEPS'].append(env['ICU_LIB_NAME'])
+    
     if env['THREADING'] == 'multi':
         thread_flag = thread_suffix
     else:
@@ -836,21 +1145,30 @@ if not preconfigured:
         ['system', 'boost/system/system_error.hpp', env['HAS_BOOST_SYSTEM']],
         ['filesystem', 'boost/filesystem/operations.hpp', True],
         ['regex', 'boost/regex.hpp', True],
-        ['iostreams','boost/iostreams/device/mapped_file.hpp',True],
         ['program_options', 'boost/program_options.hpp', False]
     ]
         
     if env['THREADING'] == 'multi':
         BOOST_LIBSHEADERS.append(['thread', 'boost/thread/mutex.hpp', True])
+        # on solaris the configure checks for boost_thread
+        # require the -pthreads flag to be able to check for 
+        # threading support, so we add as a global library instead
+        # of attaching to cxxflags after configure
+        if env['PLATFORM'] == 'SunOS':
+            env.Append(CXXFLAGS = '-pthreads')
+
+    # if requested, sort LIBPATH and CPPPATH before running CheckLibWithHeader tests
+    if env['PRIORITIZE_LINKING']:
+        conf.prioritize_paths()    
                 
     # if the user is not setting custom boost configuration
-    # enforce boost version greater than or equal to 1.34
-    if not conf.CheckBoost('1.34'):
-        color_print (1,'Boost version 1.34 or greater is requred') 
+    # enforce boost version greater than or equal to BOOST_MIN_VERSION
+    if not conf.CheckBoost(BOOST_MIN_VERSION):
+        color_print(1,'Boost version %s or greater is required' % BOOST_MIN_VERSION) 
         if not env['BOOST_VERSION']:
-            env['MISSING_DEPS'].append('boost version >=1.34')
+            env['MISSING_DEPS'].append('boost version >=%s' % BOOST_MIN_VERSION)
     else:
-        color_print (4,'Found boost lib version... %s' % boost_lib_version_from_header )
+        color_print(4,'Found boost lib version... %s' % boost_lib_version_from_header )
     
     for count, libinfo in enumerate(BOOST_LIBSHEADERS):
         if not conf.CheckLibWithHeader('boost_%s%s' % (libinfo[0],env['BOOST_APPEND']), libinfo[1], 'C++'):
@@ -860,54 +1178,149 @@ if not preconfigured:
             else:
                 color_print(4,'Could not find optional header or shared library for boost %s' % libinfo[0])
                 env['SKIPPED_DEPS'].append('boost ' + libinfo[0])
+
+    if env['ICU_LIB_NAME'] not in env['MISSING_DEPS']:
+        # http://lists.boost.org/Archives/boost/2009/03/150076.php
+        if conf.boost_regex_has_icu():
+            # TODO - should avoid having this be globally defined...
+            env.Append(CXXFLAGS = '-DBOOST_REGEX_HAS_ICU')
+        else:
+            env['SKIPPED_DEPS'].append('boost_regex_icu')
     
     env['REQUESTED_PLUGINS'] = [ driver.strip() for driver in Split(env['INPUT_PLUGINS'])]
     
-    color_print(4,'Checking for requested plugins dependencies...')
-    for plugin in env['REQUESTED_PLUGINS']:
-        details = env['PLUGINS'][plugin]
-        if plugin == 'gdal':
-            if conf.parse_config('GDAL_CONFIG',checks='--libs'):
-                conf.parse_config('GDAL_CONFIG',checks='--cflags')
-                libname = conf.get_pkg_lib('GDAL_CONFIG','gdal')
-                if libname:
-                    details['lib'] = libname
-        elif plugin == 'postgis':
-            conf.parse_pg_config('PG_CONFIG')
-        elif plugin == 'ogr':
-            if conf.ogr_enabled():
-                if not 'gdal' in env['REQUESTED_PLUGINS']:
-                    conf.parse_config('GDAL_CONFIG',checks='--libs')
+    if len(env['REQUESTED_PLUGINS']):
+        color_print(4,'Checking for requested plugins dependencies...')
+        for plugin in env['REQUESTED_PLUGINS']:
+            details = env['PLUGINS'][plugin]
+            if plugin == 'gdal':
+                if conf.parse_config('GDAL_CONFIG',checks='--libs'):
                     conf.parse_config('GDAL_CONFIG',checks='--cflags')
-                libname = conf.get_pkg_lib('GDAL_CONFIG','ogr')
-                if libname:
-                    details['lib'] = libname
-                
-        elif details['path'] and details['lib'] and details['inc']:
-            backup = env.Clone().Dictionary()
-            # Note, the 'delete_existing' keyword makes sure that these paths are prepended
-            # to the beginning of the path list even if they already exist
-            incpath = env['%s_INCLUDES' % details['path']]
-            env.PrependUnique(CPPPATH = incpath,delete_existing=True)
-            env.PrependUnique(LIBPATH = env['%s_LIBS' % details['path']],delete_existing=True)
-            if not conf.CheckLibWithHeader(details['lib'], details['inc'], details['lang']):
-                env.Replace(**backup)
-                env['SKIPPED_DEPS'].append(details['lib'])
+                    libname = conf.get_pkg_lib('GDAL_CONFIG','gdal')
+                    if libname:
+                        details['lib'] = libname
+            elif plugin == 'postgis':
+                conf.parse_pg_config('PG_CONFIG')
+            elif plugin == 'ogr':
+                if conf.ogr_enabled():
+                    if not 'gdal' in env['REQUESTED_PLUGINS']:
+                        conf.parse_config('GDAL_CONFIG',checks='--libs')
+                        conf.parse_config('GDAL_CONFIG',checks='--cflags')
+                    libname = conf.get_pkg_lib('GDAL_CONFIG','ogr')
+                    if libname:
+                        details['lib'] = libname
+            elif plugin == 'geos':
+                if conf.parse_config('GEOS_CONFIG',checks='--ldflags --cflags'):
+                    lgeos_c = env['PLUGINS']['geos']['lib']
+                    env.Append(LIBS = lgeos_c)
+
+            elif details['path'] and details['lib'] and details['inc']:
+                backup = env.Clone().Dictionary()
+                # Note, the 'delete_existing' keyword makes sure that these paths are prepended
+                # to the beginning of the path list even if they already exist
+                incpath = env['%s_INCLUDES' % details['path']]
+                libpath = env['%s_LIBS' % details['path']]
+                env.PrependUnique(CPPPATH = os.path.realpath(incpath),delete_existing=True)
+                env.PrependUnique(LIBPATH = os.path.realpath(libpath),delete_existing=True)
+                if not conf.CheckLibWithHeader(details['lib'], details['inc'], details['lang']):
+                    env.Replace(**backup)
+                    env['SKIPPED_DEPS'].append(details['lib'])
+                #if plugin == 'sqlite':
+                #    if not conf.sqlite_has_rtree():
+                #        env.Replace(**backup)
+                #        if details['lib'] in env['LIBS']:
+                #            env['LIBS'].remove(details['lib'])
+                #        env['SKIPPED_DEPS'].append('sqlite_rtree')
+
+            elif details['lib'] and details['inc']:
+                if not conf.CheckLibWithHeader(details['lib'], details['inc'], details['lang']):
+                    env['SKIPPED_DEPS'].append(details['lib'])
+    
+        # re-append the local paths for mapnik sources to the beginning of the list
+        # to make sure they come before any plugins that were 'prepended'
+        env.PrependUnique(CPPPATH = '#include', delete_existing=True)
+        env.PrependUnique(CPPPATH = '#', delete_existing=True)
+        env.PrependUnique(LIBPATH = '#src', delete_existing=True)
 
-    # re-append the local paths for mapnik sources to the beginning of the list
-    # to make sure they come before any plugins that were 'prepended'
-    env.PrependUnique(CPPPATH = '#include', delete_existing=True)
-    env.PrependUnique(CPPPATH = '#', delete_existing=True)
-    env.PrependUnique(LIBPATH = '#src', delete_existing=True)
+    #if env['PGSQL2SQLITE']:
+    #    if not conf.sqlite_has_rtree():
+    #        env['SKIPPED_DEPS'].append('pgsql2sqlite_rtree')
+    #        env['PGSQL2SQLITE'] = False
 
     # Decide which libagg to use
     # if we are using internal agg, then prepend to make sure
     # we link locally
+    
     if env['INTERNAL_LIBAGG']:
         env.Prepend(CPPPATH = '#agg/include')
         env.Prepend(LIBPATH = '#agg')
     else:
         env.ParseConfig('pkg-config --libs --cflags libagg')
+
+    if env['CAIRO']:
+        if env['CAIRO_LIBS'] or env['CAIRO_INCLUDES']:
+            c_inc = env['CAIRO_INCLUDES']
+            if env['CAIRO_LIBS']:
+                env["CAIROMM_LIBPATHS"].append(os.path.realpath(env['CAIRO_LIBS']))
+                if not env['CAIRO_INCLUDES']:
+                    c_inc = env['CAIRO_LIBS'].replace('lib','',1) 
+            if c_inc:
+                c_inc = os.path.normpath(os.path.realpath(env['CAIRO_INCLUDES']))
+                if c_inc.endswith('include'):
+                    c_inc = os.path.dirname(c_inc)
+                env["CAIROMM_CPPPATHS"].extend(
+                    [
+                      os.path.join(c_inc,'include/cairomm-1.0'),
+                      os.path.join(c_inc,'lib/cairomm-1.0/include'),
+                      os.path.join(c_inc,'include/cairo'),
+                      os.path.join(c_inc,'include/sigc++-2.0'),
+                      os.path.join(c_inc,'lib/sigc++-2.0/include'),
+                      os.path.join(c_inc,'include/pixman-1'),
+                      #os.path.join(c_inc,'include/freetype2'),
+                      #os.path.join(c_inc,'include/libpng'),
+                    ]
+                )
+                env["CAIROMM_LINKFLAGS"] = ['cairo','cairomm-1.0']
+                if env['RUNTIME_LINK'] == 'static':
+                    env["CAIROMM_LINKFLAGS"].extend(
+                        ['sigc-2.0','pixman-1','expat','fontconfig','iconv']
+                    )
+                # todo - run actual checkLib?
+                env['HAS_CAIRO'] = True
+        else:
+            if not conf.CheckPKGConfig('0.15.0'):
+                env['HAS_CAIRO'] = False
+                env['SKIPPED_DEPS'].append('pkg-config')
+                env['SKIPPED_DEPS'].append('cairo')
+                env['SKIPPED_DEPS'].append('cairomm')
+            elif not conf.CheckPKG('cairo'):
+                env['HAS_CAIRO'] = False
+                env['SKIPPED_DEPS'].append('cairo')
+            elif not conf.CheckPKG('cairomm-1.0'):
+                env['HAS_CAIRO'] = False
+                env['SKIPPED_DEPS'].append('cairomm')
+            elif not conf.CheckPKGVersion('cairomm-1.0',CAIROMM_MIN_VERSION):
+                env['HAS_CAIRO'] = False
+                env['SKIPPED_DEPS'].append('cairomm-version')
+            else:
+                cmd = 'pkg-config --libs --cflags cairomm-1.0'
+                if env['RUNTIME_LINK'] == 'static':
+                    cmd += ' --static'
+                cairo_env = env.Clone()
+                cairo_env.ParseConfig(cmd)
+                for lib in cairo_env['LIBS']:
+                    if not lib in env['LIBS']:
+                        env["CAIROMM_LINKFLAGS"].append(lib)
+                for lpath in cairo_env['LIBPATH']:
+                    if not lpath in env['LIBPATH']:
+                        env["CAIROMM_LIBPATHS"].append(lpath)
+                for inc in cairo_env['CPPPATH']:
+                    if not inc in env['CPPPATH']:
+                        env["CAIROMM_CPPPATHS"].append(inc)
+                env['HAS_CAIRO'] = True
+            
+    else:
+        color_print(4,'Not building with cairo support, pass CAIRO=True to enable')
     
     if 'python' in env['BINDINGS']:
         # checklibwithheader does not work for boost_python since we can't feed it
@@ -916,22 +1329,25 @@ if not preconfigured:
             color_print(1,'Could not find required header files for boost python')
             env['MISSING_DEPS'].append('boost python')
 
-        if env['CAIRO'] and conf.CheckPKGConfig('0.15.0') and conf.CheckPKG('pycairo'):
-            env.ParseConfig('pkg-config --cflags pycairo')
-            env.Append(CXXFLAGS = '-DHAVE_PYCAIRO')
+        if env['CAIRO']:
+            if conf.CheckPKGConfig('0.15.0') and conf.CheckPKG('pycairo'):
+                env['HAS_PYCAIRO'] = True
+            else:
+                env['SKIPPED_DEPS'].extend(['pycairo'])
         else:
-            env['SKIPPED_DEPS'].extend(['pycairo'])
+            color_print(4,'Not building with pycairo support, pass CAIRO=True to enable')
+            
              
     #### End Config Stage for Required Dependencies ####
     
     if env['MISSING_DEPS']:
         # if required dependencies are missing, print warnings and then let SCons finish without building or saving local config
         color_print(1,'\nExiting... the following required dependencies were not found:\n   - %s' % '\n   - '.join([pretty_dep(dep) for dep in env['MISSING_DEPS']]))
-        color_print(1,"\nSee the 'config.log' for details on possible problems.")
+        color_print(1,"\nSee '%s' for details on possible problems." % (os.path.realpath(SCONS_LOCAL_LOG)))
         if env['SKIPPED_DEPS']:
             color_print(4,'\nAlso, these OPTIONAL dependencies were not found:\n   - %s' % '\n   - '.join([pretty_dep(dep) for dep in env['SKIPPED_DEPS']]))
         color_print(4,"\nSet custom paths to these libraries and header files on the command-line or in a file called '%s'" % SCONS_LOCAL_CONFIG)
-        color_print(4,"    ie. $ python scons/scons.py BOOST_INCLUDES=/usr/local/include/ BOOST_LIBS=/usr/local/lib")
+        color_print(4,"    ie. $ python scons/scons.py BOOST_INCLUDES=/usr/local/include BOOST_LIBS=/usr/local/lib")
         color_print(4, "\nOnce all required dependencies are found a local '%s' will be saved and then install:" % SCONS_LOCAL_CONFIG)
         color_print(4,"    $ sudo python scons/scons.py install")
         color_print(4,"\nTo view available path variables:\n    $ python scons/scons.py --help or -h")
@@ -960,29 +1376,28 @@ if not preconfigured:
             print
 
         # fetch the mapnik version header in order to set the
-        # ABI version used to build libmapnik.so on linux in src/SConscript
+        # ABI version used to build libmapnik.so on linux in src/build.py
         abi = conf.GetMapnikLibVersion()
-        abi_fallback = [0,7,1]
+        abi_fallback = [2,0,0]
         if not abi:
             color_print(1,'Problem encountered parsing mapnik version, falling back to %s' % abi_fallback)
             env['ABI_VERSION'] = abi_fallback
         else:
             env['ABI_VERSION'] = abi
+        env['MAPNIK_VERSION_STRING'] = '.'.join(['%d' % i for i in env['ABI_VERSION']])
 
 
         # Common C++ flags.
-        if env['THREADING'] == 'multi' :
+        if env['THREADING'] == 'multi':
             common_cxx_flags = '-D%s -DBOOST_SPIRIT_THREADSAFE -DMAPNIK_THREADSAFE ' % env['PLATFORM'].upper()
         else :
             common_cxx_flags = '-D%s ' % env['PLATFORM'].upper()
 
-        
         svn_version = call('svnversion')
         if not svn_version == 'exported':
             pattern = r'(\d+)(.*)'
             try:
-                rev = re.match(pattern,svn_version).groups()[0]
-                common_cxx_flags += '-DSVN_REVISION=%s ' % rev
+                env['SVN_REVISION'] = re.match(pattern,svn_version).groups()[0]
             except: pass
             
         # Mac OSX (Darwin) special settings
@@ -1001,10 +1416,7 @@ if not preconfigured:
         # Common debugging flags.
         debug_flags  = '-g -DDEBUG -DMAPNIK_DEBUG'
         ndebug_flags = '-DNDEBUG'
-        
-        if env['XML_DEBUG']: 
-            common_cxx_flags += '-DMAPNIK_XML_DEBUG '
-        
+       
         # Customizing the C++ compiler flags depending on: 
         #  (1) the C++ compiler used; and
         #  (2) whether debug binaries are requested.
@@ -1015,8 +1427,7 @@ if not preconfigured:
                 env.Append(CXXFLAGS = common_cxx_flags + '-O %s' % ndebug_flags)
         else:
             # Common flags for GCC.
-            gcc_cxx_flags = '-ansi -Wall %s -ftemplate-depth-100 %s' % (pthread, common_cxx_flags)
-        
+            gcc_cxx_flags = '-ansi -Wall %s %s -ftemplate-depth-300 %s' % (env['WARNING_CXXFLAGS'], pthread, common_cxx_flags)        
             if env['DEBUG']:
                 env.Append(CXXFLAGS = gcc_cxx_flags + '-O0 -fno-inline %s' % debug_flags)
             else: 
@@ -1027,12 +1438,7 @@ if not preconfigured:
                 color_print(1,"Cannot run python interpreter at '%s', make sure that you have the permissions to execute it." % env['PYTHON'])
                 Exit(1)
             
-            res = os.popen('''%s -c "print 1"''' % env['PYTHON'])
-            if res.read() == '1':
-                py3 = False
-            else:
-                py3 = True
-            #sys.version_info.major == 3
+            py3 = 'True' in os.popen('''%s -c "import sys as s;s.stdout.write(str(s.version_info[0] == 3))"''' % env['PYTHON']).read().strip()
 
             if py3:
                 sys_prefix = '''%s -c "import sys; print(sys.prefix)"''' % env['PYTHON']
@@ -1063,17 +1469,40 @@ if not preconfigured:
                 env['PYTHON_SYS_PREFIX'] = os.popen('''%s -c "import sys; print sys.prefix"''' % env['PYTHON']).read().strip()
                 env['PYTHON_VERSION'] = os.popen('''%s -c "import sys; print sys.version"''' % env['PYTHON']).read()[0:3]
                 env['PYTHON_INCLUDES'] = env['PYTHON_SYS_PREFIX'] + '/include/python' + env['PYTHON_VERSION']
-                env['PYTHON_SITE_PACKAGES'] = env['DESTDIR'] + '/' + env['PYTHON_SYS_PREFIX'] + '/' + env['LIBDIR_SCHEMA'] + '/python' + env['PYTHON_VERSION'] + '/site-packages/'
+                env['PYTHON_SITE_PACKAGES'] = env['DESTDIR'] + os.path.sep + env['PYTHON_SYS_PREFIX'] + os.path.sep + env['LIBDIR_SCHEMA'] + '/python' + env['PYTHON_VERSION'] + '/site-packages/'
         
             # if user-requested custom prefix fall back to manual concatenation for building subdirectories       
             if env['PYTHON_PREFIX']:
                 py_relative_install = env['LIBDIR_SCHEMA'] + '/python' + env['PYTHON_VERSION'] + '/site-packages/' 
-                env['PYTHON_INSTALL_LOCATION'] = env['DESTDIR'] + '/' + env['PYTHON_PREFIX'] + '/' +  py_relative_install            
+                env['PYTHON_INSTALL_LOCATION'] = env['DESTDIR'] + os.path.sep + env['PYTHON_PREFIX'] + os.path.sep +  py_relative_install            
+            else:
+                env['PYTHON_INSTALL_LOCATION'] = env['DESTDIR'] + os.path.sep + env['PYTHON_SITE_PACKAGES']
+
+            if py3:
+                is_64_bit = '''%s -c "import sys; print(sys.maxsize == 9223372036854775807)"''' % env['PYTHON']
             else:
-                env['PYTHON_INSTALL_LOCATION'] = env['DESTDIR'] + '/' + env['PYTHON_SITE_PACKAGES']
+                is_64_bit = '''%s -c "import sys; print sys.maxint == 9223372036854775807"''' % env['PYTHON']
+            
+            if is_64_bit:
+                env['PYTHON_IS_64BIT'] = True
+            else:
+                env['PYTHON_IS_64BIT'] = False                
                
             majver, minver = env['PYTHON_VERSION'].split('.')
-        
+ 
+            # we don't want the includes it in the main environment...
+            # as they are later set in the python build.py
+            # ugly hack needed until we have env specific conf
+            backup = env.Clone().Dictionary()
+            env.AppendUnique(CPPPATH = os.path.realpath(env['PYTHON_INCLUDES']))
+            
+            if not conf.CheckHeader(header='Python.h',language='C'):
+                color_print(1,'Could not find required header files for the Python language (version %s)' % env['PYTHON_VERSION'])
+                env.Replace(**backup)
+                env['MISSING_DEPS'].append('python %s development headers' % env['PYTHON_VERSION'])
+            else:
+                env.Replace(**backup)
+       
             if (int(majver), int(minver)) < (2, 2):
                 color_print(1,"Python version 2.2 or greater required")
                 Exit(1)
@@ -1124,14 +1553,30 @@ if not preconfigured:
 # autogenerate help on default/current SCons options
 Help(opts.GenerateHelpText(env))
 
-#env.Prepend(CPPPATH = '/usr/local/include')
-#env.Prepend(LIBPATH = '/usr/local/lib')
-
 #### Builds ####
 if not HELP_REQUESTED:
-    # export env so it is available in Sconscript files
-    Export('env')
+
+    if 'uninstall' in COMMAND_LINE_TARGETS:
+        # dummy action in case there is nothing to uninstall, to avoid phony error..
+        env.Alias("uninstall", "")
+    env['create_uninstall_target'] = create_uninstall_target
+
+    if env['PKG_CONFIG_PATH']:
+        env['ENV']['PKG_CONFIG_PATH'] = os.path.realpath(env['PKG_CONFIG_PATH'])
+        # otherwise this variable == os.environ["PKG_CONFIG_PATH"]
     
+    if env['PATH_INSERT']:
+        env['ENV']['PATH'] = os.path.realpath(env['PATH_INSERT']) + ':' + env['ENV']['PATH']
+
+    # export env so it is available in build.py files
+    Export('env')
+
+
+    # clear the '_CPPDEFFLAGS' variable
+    # for unknown reasons this variable puts -DNone
+    # in the g++ args prompting unnecessary recompiles
+    env['_CPPDEFFLAGS'] = None
+
     
     if env['FAST']:
         # caching is 'auto' by default in SCons
@@ -1150,11 +1595,11 @@ if not HELP_REQUESTED:
         SetOption("num_jobs", env['JOBS'])  
         
     # Build agg first, doesn't need anything special
-    if env['INTERNAL_LIBAGG']:
-        SConscript('agg/SConscript')
+    if env['RUNTIME_LINK'] == 'shared' and env['INTERNAL_LIBAGG']:
+        SConscript('agg/build.py')
     
     # Build the core library
-    SConscript('src/SConscript')
+    SConscript('src/build.py')
     
     # Build the requested and able-to-be-compiled input plug-ins
     GDAL_BUILT = False
@@ -1162,7 +1607,7 @@ if not HELP_REQUESTED:
     for plugin in env['REQUESTED_PLUGINS']:
         details = env['PLUGINS'][plugin]
         if details['lib'] in env['LIBS']:
-            SConscript('plugins/input/%s/SConscript' % plugin)
+            SConscript('plugins/input/%s/build.py' % plugin)
             if plugin == 'ogr': OGR_BUILT = True
             if plugin == 'gdal': GDAL_BUILT = True
             if plugin == 'ogr' or plugin == 'gdal':
@@ -1172,26 +1617,70 @@ if not HELP_REQUESTED:
                 env['LIBS'].remove(details['lib'])
         elif not details['lib']:
             # build internal shape and raster plugins
-            SConscript('plugins/input/%s/SConscript' % plugin)
+            SConscript('plugins/input/%s/build.py' % plugin)
+        else:
+            color_print(1,"Notice: dependencies not met for plugin '%s', not building..." % plugin)
+    
+    create_uninstall_target(env, env['MAPNIK_LIB_DIR_DEST'], False)
+    create_uninstall_target(env, env['MAPNIK_INPUT_PLUGINS_DEST'] , False)
+    create_uninstall_target(env, env['MAPNIK_INPUT_PLUGINS_DEST'] , False)
+
+    # before installing plugins, wipe out any previously
+    # installed plugins that we are no longer building
+    if 'install' in COMMAND_LINE_TARGETS:
+        for plugin in PLUGINS.keys():
+            if plugin not in env['REQUESTED_PLUGINS']:
+                plugin_path = os.path.join(env['MAPNIK_INPUT_PLUGINS_DEST'],'%s.input' % plugin)
+                if os.path.exists(plugin_path):
+                    color_print(1,"Notice: removing out of date plugin: '%s'" % plugin_path)
+                    os.unlink(plugin_path)
     
     # Build the c++ rundemo app if requested
     if env['DEMO']:
-        SConscript('demo/c++/SConscript')
+        SConscript('demo/c++/build.py')
     
     # Build the pgsql2psqlite app if requested
     if env['PGSQL2SQLITE']:
-        SConscript('utils/pgsql2sqlite/SConscript')
-        
+        SConscript('utils/pgsql2sqlite/build.py')
+    
     # Build shapeindex and remove its dependency from the LIBS
     if 'boost_program_options%s' % env['BOOST_APPEND'] in env['LIBS']:
-        SConscript('utils/shapeindex/SConscript')
+        SConscript('utils/shapeindex/build.py')
+        
+        # devtools not ready for public 
+        #SConscript('utils/ogrindex/build.py')
+        #SConscript('utils/svg2png/build.py')
         env['LIBS'].remove('boost_program_options%s' % env['BOOST_APPEND'])
     else :
         color_print(1,"WARNING: Cannot find boost_program_options. 'shapeindex' won't be available")
         
     # Build the Python bindings
     if 'python' in env['BINDINGS']:
-        SConscript('bindings/python/SConscript')
+        SConscript('bindings/python/build.py')
+        
+        # Install the python speed testing scripts if python bindings will be available
+        SConscript('utils/performance/build.py')
+
+    # Install the mapnik2 upgrade script
+    SConscript('utils/upgrade_map_xml/build.py')
     
     # Configure fonts and if requested install the bundled DejaVu fonts
-    SConscript('fonts/SConscript')
+    SConscript('fonts/build.py')
+    
+    # build C++ tests
+    # not ready for release
+    #SConscript('tests/cpp_tests/build.py')
+    
+    # not ready for release
+    #if env['SVG_RENDERER']:
+    #    SConscript('tests/cpp_tests/svg_renderer_tests/build.py')
+
+    # install pkg-config script and mapnik-config script
+    SConscript('utils/mapnik-config/build.py')
+
+    # write the viewer.ini file
+    SConscript('demo/viewer/build.py')
+    
+    # if requested, build the sample input plugins
+    if env['SAMPLE_INPUT_PLUGINS']:
+        SConscript('plugins/input/templates/helloworld/build.py')
diff --git a/agg/SConscript b/agg/SConscript
deleted file mode 100644
index ce9a332..0000000
--- a/agg/SConscript
+++ /dev/null
@@ -1,27 +0,0 @@
-#  This file is part of Mapnik (c++ mapping toolkit)
-#  Copyright (C) 2005 Artem Pavlenko, Jean-Francois Doyon
-#
-#  Mapnik is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU General Public License
-#  as published by the Free Software Foundation; either version 2
-#  of the License, or any later version.
-#
-#  This program is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#  GNU General Public License for more details.
-#
-#  You should have received a copy of the GNU General Public License
-#  along with this program; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-# $Id$
-
-import glob
-
-Import('env')
-
-if env['PLATFORM'] == 'SunOS':
-    env.StaticLibrary('agg', glob.glob('./src/' + '*.cpp'), LIBS=[], CPPPATH='./include', CXXFLAGS='-O -KPIC -DNDEBUG')
-else:
-    env.StaticLibrary('agg', glob.glob('./src/' + '*.cpp'), LIBS=[], CPPPATH='./include', CXXFLAGS='-O%s -fPIC -DNDEBUG' % env['OPTIMIZATION'])
diff --git a/agg/build.py b/agg/build.py
new file mode 100644
index 0000000..9e2db94
--- /dev/null
+++ b/agg/build.py
@@ -0,0 +1,31 @@
+#  This file is part of Mapnik (c++ mapping toolkit)
+#  Copyright (C) 2005 Artem Pavlenko, Jean-Francois Doyon
+#
+#  Mapnik is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+# $Id$
+
+import glob
+
+Import('env')
+
+agg_env = env.Clone()
+
+if env['SUNCC']:
+    cxxflags = env['CUSTOM_CXXFLAGS'] + ' -O -KPIC -DNDEBUG'
+else:
+    cxxflags = env['CUSTOM_CXXFLAGS'] + ' -O%s -fPIC -DNDEBUG' % env['OPTIMIZATION']
+
+agg_env.StaticLibrary('agg', glob.glob('./src/' + '*.cpp'), LIBS=[], CPPPATH='./include', CXXFLAGS=cxxflags, LINKFLAGS=env['CUSTOM_LDFLAGS'])
\ No newline at end of file
diff --git a/agg/include/agg_basics.h b/agg/include/agg_basics.h
index cb95838..b48976e 100644
--- a/agg/include/agg_basics.h
+++ b/agg/include/agg_basics.h
@@ -229,7 +229,7 @@ namespace agg
     {
         poly_subpixel_shift = 8,                      //----poly_subpixel_shift
         poly_subpixel_scale = 1<<poly_subpixel_shift, //----poly_subpixel_scale 
-        poly_subpixel_mask  = poly_subpixel_scale-1,  //----poly_subpixel_mask 
+        poly_subpixel_mask  = poly_subpixel_scale-1  //----poly_subpixel_mask 
     };
 
     //----------------------------------------------------------filling_rule_e
diff --git a/agg/include/agg_bezier_arc.h b/agg/include/agg_bezier_arc.h
index 6d98d1a..b3d6549 100644
--- a/agg/include/agg_bezier_arc.h
+++ b/agg/include/agg_bezier_arc.h
@@ -68,7 +68,7 @@ namespace agg
             *x = m_vertices[m_vertex];
             *y = m_vertices[m_vertex + 1];
             m_vertex += 2;
-            return (m_vertex == 2) ? path_cmd_move_to : m_cmd;
+            return (m_vertex == 2) ? (unsigned)path_cmd_move_to : m_cmd;
         }
 
         // Supplemantary functions. num_vertices() actually returns doubled 
diff --git a/agg/include/agg_color_rgba.h b/agg/include/agg_color_rgba.h
index 7c088c6..06ab5fe 100644
--- a/agg/include/agg_color_rgba.h
+++ b/agg/include/agg_color_rgba.h
@@ -143,7 +143,7 @@ namespace agg
 
         //--------------------------------------------------------------------
         static rgba from_wavelength(double wl, double gamma = 1.0);
-	
+
         //--------------------------------------------------------------------
         explicit rgba(double wavelen, double gamma=1.0)
         {
diff --git a/agg/include/agg_conv_curve.h b/agg/include/agg_conv_curve.h
index d5b475d..b75cfd5 100644
--- a/agg/include/agg_conv_curve.h
+++ b/agg/include/agg_conv_curve.h
@@ -154,10 +154,10 @@ namespace agg
             return path_cmd_line_to;
         }
 
-        double ct2_x;
-        double ct2_y;
-        double end_x;
-        double end_y;
+        double ct2_x=0;
+        double ct2_y=0;
+        double end_x=0;
+        double end_y=0;
 
         unsigned cmd = m_source->vertex(x, y);
         switch(cmd)
diff --git a/agg/include/agg_gradient_lut.h b/agg/include/agg_gradient_lut.h
index 9aaa426..ad269d4 100644
--- a/agg/include/agg_gradient_lut.h
+++ b/agg/include/agg_gradient_lut.h
@@ -210,7 +210,7 @@ namespace agg
         {
             unsigned i;
             unsigned start = uround(m_color_profile[0].offset * color_lut_size);
-            unsigned end;
+            unsigned end = 0;
             color_type c = m_color_profile[0].color;
             for(i = 0; i < start; i++) 
             {
diff --git a/agg/include/agg_image_accessors.h b/agg/include/agg_image_accessors.h
index baaef9c..e43e052 100644
--- a/agg/include/agg_image_accessors.h
+++ b/agg/include/agg_image_accessors.h
@@ -189,7 +189,7 @@ namespace agg
             m_x = m_x0 = x;
             m_y = y;
             if(y >= 0 && y < (int)m_pixf->height() &&
-               x >= 0 && x+len <= (int)m_pixf->width())
+               x >= 0 && x+(int)len <= (int)m_pixf->width())
             {
                 return m_pix_ptr = m_pixf->pix_ptr(x, y);
             }
diff --git a/agg/include/agg_math.h b/agg/include/agg_math.h
index 2ec49cf..bbb4669 100644
--- a/agg/include/agg_math.h
+++ b/agg/include/agg_math.h
@@ -94,7 +94,7 @@ namespace agg
 
         if(dx == 0 && dy == 0)
         {
-	        return 0;
+            return 0;
         }
 
         double pdx = x - x1;
@@ -111,12 +111,12 @@ namespace agg
     {
         if(u <= 0)
         {
-	        return calc_sq_distance(x, y, x1, y1);
+            return calc_sq_distance(x, y, x1, y1);
         }
         else 
         if(u >= 1)
         {
-	        return calc_sq_distance(x, y, x2, y2);
+            return calc_sq_distance(x, y, x2, y2);
         }
         return calc_sq_distance(x, y, x1 + u * (x2 - x1), y1 + u * (y2 - y1));
     }
diff --git a/agg/include/agg_path_storage.h b/agg/include/agg_path_storage.h
index f4f7547..6a238ae 100644
--- a/agg/include/agg_path_storage.h
+++ b/agg/include/agg_path_storage.h
@@ -148,7 +148,7 @@ namespace agg
             unsigned cmd = v.vertex(i, &x, &y);
             add_vertex(x, y, cmd);
         }
-	    return *this;
+        return *this;
     }
 
     //------------------------------------------------------------------------
@@ -720,7 +720,8 @@ namespace agg
         template<class VertexSource> 
         void concat_path(VertexSource& vs, unsigned path_id = 0)
         {
-            double x, y;
+            double x=0;
+            double y=0;
             unsigned cmd;
             vs.rewind(path_id);
             while(!is_stop(cmd = vs.vertex(&x, &y)))
@@ -869,6 +870,12 @@ namespace agg
                 *x += x2;
                 *y += y2;
             }
+            else if (!is_stop(m_vertices.last_command()) && 
+                     is_vertex(m_vertices.prev_vertex(&x2, &y2)))
+            {
+                *x += x2;
+                *y += y2;
+            }
         }
     }
 
@@ -1417,6 +1424,10 @@ namespace agg
         }
     }
 
+////////////////////////////////////////////////////////////////////////////////
+
+
+
     //-----------------------------------------------------vertex_stl_storage
     template<class Container> class vertex_stl_storage
     {
@@ -1533,13 +1544,12 @@ namespace agg
 
 // Example of declarations path_storage with std::vector as a container
 //---------------------------------------------------------------------------
-//#include <vector>
-//namespace agg
-//{
-//    typedef path_base<vertex_stl_storage<std::vector<vertex_d> > > stl_path_storage; 
-//}
-
 
+//#include <vector> 
+//namespace agg 
+//{ 
+//    typedef path_base<vertex_stl_storage<std::vector<vertex_d> > > path_storage;  
+//} 
 
 
 #endif
diff --git a/agg/include/agg_pixfmt_rgba.h b/agg/include/agg_pixfmt_rgba.h
index 7d89b49..22db118 100644
--- a/agg/include/agg_pixfmt_rgba.h
+++ b/agg/include/agg_pixfmt_rgba.h
@@ -208,7 +208,7 @@ namespace agg
         static AGG_INLINE void blend_pix(value_type* p, 
                                          unsigned cr, unsigned cg, unsigned cb,
                                          unsigned alpha,
-                                         unsigned cover=0)
+                                         unsigned /*cover*/=0)
         {
             if(alpha == 0) return;
             calc_type a = p[Order::A];
@@ -1331,7 +1331,7 @@ namespace agg
         // Dca' = (Da - Dca) * Sa + Dca.(1 - Sa)
         // Da'  = Sa + Da - Sa.Da 
         static AGG_INLINE void blend_pix(value_type* p, 
-                                         unsigned sr, unsigned sg, unsigned sb, 
+                                         unsigned /*sr*/, unsigned /*sg*/, unsigned /*sb*/, 
                                          unsigned sa, unsigned cover)
         {
             sa = (sa * cover + 255) >> 8;
@@ -1602,7 +1602,7 @@ namespace agg
             base_mask  = color_type::base_mask 
         };
 
-        static AGG_INLINE void blend_pix(unsigned op, value_type* p, 
+        static AGG_INLINE void blend_pix(unsigned /*op*/, value_type* p, 
                                          unsigned cr, unsigned cg, unsigned cb,
                                          unsigned ca,
                                          unsigned cover)
@@ -1627,7 +1627,7 @@ namespace agg
             base_mask  = color_type::base_mask 
         };
 
-        static AGG_INLINE void blend_pix(unsigned op, value_type* p, 
+        static AGG_INLINE void blend_pix(unsigned /*op*/, value_type* p, 
                                          unsigned cr, unsigned cg, unsigned cb,
                                          unsigned ca,
                                          unsigned cover)
@@ -1657,7 +1657,7 @@ namespace agg
             base_mask  = color_type::base_mask 
         };
 
-        static AGG_INLINE void blend_pix(unsigned op, value_type* p, 
+        static AGG_INLINE void blend_pix(unsigned /*op*/, value_type* p, 
                                          unsigned cr, unsigned cg, unsigned cb,
                                          unsigned ca,
                                          unsigned cover)
@@ -2330,7 +2330,7 @@ namespace agg
         void blend_from_color(const SrcPixelFormatRenderer& from, 
                               const color_type& color,
                               int xdst, int ydst,
-                              int xsrc, int ysrc,
+                              int /*xsrc*/, int ysrc,
                               unsigned len,
                               int8u cover)
         {
@@ -2357,7 +2357,7 @@ namespace agg
         void blend_from_lut(const SrcPixelFormatRenderer& from, 
                             const color_type* color_lut,
                             int xdst, int ydst,
-                            int xsrc, int ysrc,
+                            int /*xsrc*/, int ysrc,
                             unsigned len,
                             int8u cover)
         {
@@ -2782,7 +2782,7 @@ namespace agg
         void blend_from_color(const SrcPixelFormatRenderer& from, 
                               const color_type& color,
                               int xdst, int ydst,
-                              int xsrc, int ysrc,
+                              int /*xsrc*/, int ysrc,
                               unsigned len,
                               int8u cover)
         {
@@ -2810,7 +2810,7 @@ namespace agg
         void blend_from_lut(const SrcPixelFormatRenderer& from, 
                             const color_type* color_lut,
                             int xdst, int ydst,
-                            int xsrc, int ysrc,
+                            int /*xsrc*/, int ysrc,
                             unsigned len,
                             int8u cover)
         {
diff --git a/agg/include/agg_rasterizer_cells_aa.h b/agg/include/agg_rasterizer_cells_aa.h
index f073153..4e1c62a 100755
--- a/agg/include/agg_rasterizer_cells_aa.h
+++ b/agg/include/agg_rasterizer_cells_aa.h
@@ -30,7 +30,8 @@
 #define AGG_RASTERIZER_CELLS_AA_INCLUDED
 
 #include <string.h>
-#include <math.h>
+#include <cstdlib>
+#include <limits>
 #include "agg_math.h"
 #include "agg_array.h"
 
@@ -325,8 +326,8 @@ namespace agg
             int cy = (y1 + y2) >> 1;
 
             // Bail if values are so large they are likely to wrap
-            if ((abs(x1) >= INT_MAX/2) || (abs(y1) >= INT_MAX/2) ||
-                (abs(x2) >= INT_MAX/2) || (abs(y2) >= INT_MAX/2))
+            if ((std::abs(x1) >= std::numeric_limits<int>::max()/2) || (std::abs(y1) >= std::numeric_limits<int>::max()/2) ||
+                (std::abs(x2) >= std::numeric_limits<int>::max()/2) || (std::abs(y2) >= std::numeric_limits<int>::max()/2))
                     return;
 
             line(x1, y1, cx, cy);
diff --git a/agg/include/agg_rasterizer_sl_clip.h b/agg/include/agg_rasterizer_sl_clip.h
index e7ba065..a3c5867 100644
--- a/agg/include/agg_rasterizer_sl_clip.h
+++ b/agg/include/agg_rasterizer_sl_clip.h
@@ -317,7 +317,7 @@ namespace agg
         rasterizer_sl_no_clip() : m_x1(0), m_y1(0) {}
 
         void reset_clipping() {}
-        void clip_box(coord_type x1, coord_type y1, coord_type x2, coord_type y2) {}
+        void clip_box(coord_type /*x1*/, coord_type /*y1*/, coord_type /*x2*/, coord_type /*y2*/) {}
         void move_to(coord_type x1, coord_type y1) { m_x1 = x1; m_y1 = y1; }
 
         template<class Rasterizer>
diff --git a/agg/include/agg_renderer_outline_aa.h b/agg/include/agg_renderer_outline_aa.h
index 575a4ae..57d5a70 100644
--- a/agg/include/agg_renderer_outline_aa.h
+++ b/agg/include/agg_renderer_outline_aa.h
@@ -1365,7 +1365,10 @@ namespace agg
         //---------------------------------------------------------------------
         void profile(const line_profile_aa& prof) { m_profile = &prof; }
         const line_profile_aa& profile() const { return *m_profile; }
-        line_profile_aa& profile() { return *m_profile; }
+        
+        // clang error: binding of reference to type 'agg::line_profile_aa' to a value of type
+        // 'const agg::line_profile_aa' drops qualifiers        
+        //line_profile_aa& profile() { return *m_profile; }
 
         //---------------------------------------------------------------------
         int subpixel_width() const { return m_profile->subpixel_width(); }
@@ -1562,11 +1565,11 @@ namespace agg
             {
                 if(li.vertical())
                 {
-                    while(li.step_ver());
+                    while(li.step_ver()) ;
                 }
                 else
                 {
-                    while(li.step_hor());
+                    while(li.step_hor()) ;
                 }
             }
         }
@@ -1617,11 +1620,11 @@ namespace agg
             line_interpolator_aa1<self_type> li(*this, lp, sx, sy);
             if(li.vertical())
             {
-                while(li.step_ver());
+                while(li.step_ver()) ;
             }
             else
             {
-                while(li.step_hor());
+                while(li.step_hor()) ;
             }
         }
 
@@ -1685,11 +1688,11 @@ namespace agg
             line_interpolator_aa2<self_type> li(*this, lp, ex, ey);
             if(li.vertical())
             {
-                while(li.step_ver());
+                while(li.step_ver()) ;
             }
             else
             {
-                while(li.step_hor());
+                while(li.step_hor()) ;
             }
         }
 
@@ -1756,11 +1759,11 @@ namespace agg
             line_interpolator_aa3<self_type> li(*this, lp, sx, sy, ex, ey);
             if(li.vertical())
             {
-                while(li.step_ver());
+                while(li.step_ver()) ;
             }
             else
             {
-                while(li.step_hor());
+                while(li.step_hor()) ;
             }
         }
 
diff --git a/agg/include/agg_renderer_outline_image.h b/agg/include/agg_renderer_outline_image.h
index aae92fc..f258376 100644
--- a/agg/include/agg_renderer_outline_image.h
+++ b/agg/include/agg_renderer_outline_image.h
@@ -210,7 +210,7 @@ namespace agg
         typedef Filter filter_type;
         typedef typename filter_type::color_type color_type;
         typedef line_image_pattern<Filter> base_type;
-	
+
         //--------------------------------------------------------------------
         line_image_pattern_pow2(const Filter& filter) :
             line_image_pattern<Filter>(filter), m_mask(line_subpixel_mask) {}
@@ -924,11 +924,11 @@ namespace agg
                                                   m_start, m_scale_x);
             if(li.vertical())
             {
-                while(li.step_ver());
+                while(li.step_ver()) ;
             }
             else
             {
-                while(li.step_hor());
+                while(li.step_hor()) ;
             }
             m_start += uround(lp.len / m_scale_x);
         }
diff --git a/agg/include/agg_rendering_buffer.h b/agg/include/agg_rendering_buffer.h
index 4240f31..5af2e6b 100644
--- a/agg/include/agg_rendering_buffer.h
+++ b/agg/include/agg_rendering_buffer.h
@@ -56,14 +56,14 @@ namespace agg
         //--------------------------------------------------------------------
         void attach(T* buf, unsigned width, unsigned height, int stride)
         {
-			m_buf = m_start = buf;
-			m_width = width;
-			m_height = height;
-			m_stride = stride;
-			if(stride < 0) 
+            m_buf = m_start = buf;
+            m_width = width;
+            m_height = height;
+            m_stride = stride;
+            if(stride < 0) 
             { 
-				m_start = m_buf - int(height - 1) * stride;
-			}
+                m_start = m_buf - int(height - 1) * stride;
+            }
         }
 
         //--------------------------------------------------------------------
@@ -78,13 +78,13 @@ namespace agg
         }
 
         //--------------------------------------------------------------------
-		AGG_INLINE       T* row_ptr(int, int y, unsigned) 
+        AGG_INLINE       T* row_ptr(int, int y, unsigned) 
         { 
             return m_start + y * m_stride; 
         }
-		AGG_INLINE       T* row_ptr(int y)       { return m_start + y * m_stride; }
-		AGG_INLINE const T* row_ptr(int y) const { return m_start + y * m_stride; }
-		AGG_INLINE row_data row    (int y) const 
+        AGG_INLINE       T* row_ptr(int y)       { return m_start + y * m_stride; }
+        AGG_INLINE const T* row_ptr(int y) const { return m_start + y * m_stride; }
+        AGG_INLINE row_data row    (int y) const 
         { 
             return row_data(0, m_width-1, row_ptr(y)); 
         }
diff --git a/agg/include/agg_scanline_u.h b/agg/include/agg_scanline_u.h
index 5a28ed1..2a84d46 100644
--- a/agg/include/agg_scanline_u.h
+++ b/agg/include/agg_scanline_u.h
@@ -454,11 +454,12 @@ namespace agg
     // The scanline container with alpha-masking
     // 
     //------------------------------------------------------------------------
+    
     template<class AlphaMask> 
     class scanline32_u8_am : public scanline32_u8
     {
     public:
-        typedef scanline_u8           base_type;
+        typedef scanline32_u8         base_type;
         typedef AlphaMask             alpha_mask_type;
         typedef base_type::cover_type cover_type;
         typedef base_type::coord_type coord_type;
@@ -490,7 +491,7 @@ namespace agg
     private:
         const AlphaMask* m_alpha_mask;
     };
-
+    
 
 
 }
diff --git a/agg/include/agg_span_image_filter_rgba.h b/agg/include/agg_span_image_filter_rgba.h
index 134a802..77949f9 100644
--- a/agg/include/agg_span_image_filter_rgba.h
+++ b/agg/include/agg_span_image_filter_rgba.h
@@ -725,6 +725,7 @@ namespace agg
                                 base_type::m_ry_inv) >> 
                                     image_subpixel_shift;
                 int total_weight = 0;
+                int total_weight_alpha = 0;
                 int x_lr = x >> image_subpixel_shift;
                 int x_hr = ((image_subpixel_mask - (x & image_subpixel_mask)) * 
                                 base_type::m_rx_inv) >> 
@@ -739,15 +740,21 @@ namespace agg
                     x_hr = x_hr2;
                     for(;;)
                     {
-                        int weight = (weight_y * weight_array[x_hr] + 
+                        int weight = (weight_y * weight_array[x_hr] +
                                      image_filter_scale / 2) >> 
                                      downscale_shift;
+                        int weight_alpha = (weight_y * weight_array[x_hr] / base_mask * fg_ptr[3] +
+                                     image_filter_scale / 2) >>
+                                     downscale_shift;
 
-                        fg[0] += *fg_ptr++ * weight;
-                        fg[1] += *fg_ptr++ * weight;
-                        fg[2] += *fg_ptr++ * weight;
+                        fg[0] += *fg_ptr++ * weight_alpha;
+                        fg[1] += *fg_ptr++ * weight_alpha;
+                        fg[2] += *fg_ptr++ * weight_alpha;
                         fg[3] += *fg_ptr++ * weight;
+                        
                         total_weight += weight;
+                        total_weight_alpha += weight_alpha;
+                        
                         x_hr  += base_type::m_rx_inv;
                         if(x_hr >= filter_scale) break;
                         fg_ptr = (const value_type*)base_type::source().next_x();
@@ -756,16 +763,26 @@ namespace agg
                     if(y_hr >= filter_scale) break;
                     fg_ptr = (const value_type*)base_type::source().next_y();
                 }
-
-                fg[0] /= total_weight;
-                fg[1] /= total_weight;
-                fg[2] /= total_weight;
-                fg[3] /= total_weight;
-
-                if(fg[0] < 0) fg[0] = 0;
-                if(fg[1] < 0) fg[1] = 0;
-                if(fg[2] < 0) fg[2] = 0;
-                if(fg[3] < 0) fg[3] = 0;
+                
+                if (total_weight && total_weight_alpha)
+                {
+                    fg[3] /= total_weight;
+                    fg[0] = fg[0] / total_weight_alpha * fg[3] / base_mask;
+                    fg[1] = fg[1] / total_weight_alpha * fg[3] / base_mask;
+                    fg[2] = fg[2] / total_weight_alpha * fg[3] / base_mask;
+    
+                    if(fg[0] < 0) fg[0] = 0;
+                    if(fg[1] < 0) fg[1] = 0;
+                    if(fg[2] < 0) fg[2] = 0;
+                    if(fg[3] < 0) fg[3] = 0;
+                }
+                else
+                {
+                    fg[0] = 0;
+                    fg[1] = 0;
+                    fg[2] = 0;
+                    fg[3] = 0;
+                }
 
                 if(fg[order_type::A] > base_mask)         fg[order_type::A] = base_mask;
                 if(fg[order_type::R] > fg[order_type::A]) fg[order_type::R] = fg[order_type::A];
diff --git a/agg/src/agg_curves.cpp b/agg/src/agg_curves.cpp
index cb7a8d7..3400aee 100644
--- a/agg/src/agg_curves.cpp
+++ b/agg/src/agg_curves.cpp
@@ -252,8 +252,10 @@ namespace agg
         return m_scale;
     }
 
+#if defined(_MSC_VER) && _MSC_VER <= 1200
     //------------------------------------------------------------------------
     static double MSC60_fix_ICE(double v) { return v; }
+#endif
 
     //------------------------------------------------------------------------
     void curve4_inc::init(double x1, double y1, 
@@ -296,7 +298,7 @@ namespace agg
         double pre2 = 3.0 * subdivide_step2;
         double pre4 = 6.0 * subdivide_step2;
         double pre5 = 6.0 * subdivide_step3;
-	
+
         double tmp1x = x1 - x2 * 2.0 + x3;
         double tmp1y = y1 - y2 * 2.0 + y3;
 
diff --git a/agg/src/agg_gsv_text.cpp b/agg/src/agg_gsv_text.cpp
index ffb24eb..fb4be5a 100644
--- a/agg/src/agg_gsv_text.cpp
+++ b/agg/src/agg_gsv_text.cpp
@@ -555,8 +555,10 @@ namespace agg
             if(len > 0)
             {
                 m_loaded_font.resize(len);
-                fread(&m_loaded_font[0], 1, len, fd);
-                m_font = &m_loaded_font[0];
+                if (fread(&m_loaded_font[0], 1, len, fd) == len)
+                {
+                    m_font = &m_loaded_font[0];
+                }
             }
             fclose(fd);
         }
diff --git a/agg/src/agg_trans_double_path.cpp b/agg/src/agg_trans_double_path.cpp
index cd40c7f..d5692a9 100644
--- a/agg/src/agg_trans_double_path.cpp
+++ b/agg/src/agg_trans_double_path.cpp
@@ -21,10 +21,10 @@ namespace agg
 
     //------------------------------------------------------------------------
     trans_double_path::trans_double_path() :
-        m_kindex1(0.0),
-        m_kindex2(0.0),
         m_base_length(0.0),
         m_base_height(1.0),
+        m_kindex1(0.0),
+        m_kindex2(0.0),
         m_status1(initial),
         m_status2(initial),
         m_preserve_x_scale(true)
diff --git a/bindings/python/SConscript b/bindings/python/SConscript
deleted file mode 100644
index e38e57b..0000000
--- a/bindings/python/SConscript
+++ /dev/null
@@ -1,140 +0,0 @@
-#
-# This file is part of Mapnik (c++ mapping toolkit)
-#
-# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-# $Id$
-
-import glob
-import re
-import os
-
-Import('env')
-
-prefix = env['PREFIX']
-install_prefix = env['DESTDIR'] + '/' + prefix
-
-linkflags = ''
-libraries = ['mapnik','png','jpeg']
-headers = [env['PYTHON_INCLUDES']] + env['CPPPATH']
-
-if env['BOOST_PYTHON_LIB']:
-    if os.path.sep in env['BOOST_PYTHON_LIB']:
-        pylib_dir = os.path.dirname(env['BOOST_PYTHON_LIB'])
-        env.Prepend(LIBPATH = pylib_dir)
-        pylib_name = os.path.splitext(os.path.basename(env['BOOST_PYTHON_LIB']))[0].replace('lib','',1)
-        libraries.append(pylib_name)
-    else:
-        libraries.append(env['BOOST_PYTHON_LIB'].replace('lib','',1))
-else:
-    libraries.append('boost_python%s' % env['BOOST_APPEND'])
-
-if env['PLATFORM'] == 'Darwin':
-    libraries.append(env['ICU_LIB_NAME'])
-    libraries.append('boost_regex%s' % env['BOOST_APPEND'])
-    if env['THREADING'] == 'multi':
-        libraries.append('boost_thread%s' % env['BOOST_APPEND'])
-    if '-DHAVE_CAIRO' in env['CXXFLAGS']:
-        libraries.append([lib for lib in env['LIBS'] if lib.startswith('cairo')])
-
-    ##### Python linking on OS X is tricky ### 
-    # Confounding problems are:
-    # 1) likelyhood of multiple python installs of the same major.minor version
-    #  because apple supplies python built-in and many users may have installed 
-    #  further versions using macports
-    # 2) boost python directly links to a python version
-    # 3) the below will directly link _mapnik.so to a python version
-    # 4) _mapnik.so must link to the same python lib as boost_python.dylib otherwise
-    # python will Abort with a Verion Mismatch error.
-    # See http://trac.mapnik.org/ticket/453 for the seeds of a better approach
-    # for now we offer control over method of direct linking...
-    # The default below is to link against the python dylib in the form of
-    #/path/to/Python.framework/Python instead of -lpython
-    
-    # http://developer.apple.com/mac/library/DOCUMENTATION/Darwin/Reference/ManPages/man1/ld.1.html
-    
-    if env['FRAMEWORK_PYTHON']:
-        if env['FRAMEWORK_SEARCH_PATH']:
-            # if the user has supplied a custom root path to search for 
-            # a given Python framework, then use that to direct the linker
-            linkflags = '-F%s -framework Python -Z' % env['FRAMEWORK_SEARCH_PATH']
-        else:
-            # otherwise be as explicit as possible for linking to the same Framework
-            # as the executable we are building with (or is pointed to by the PYTHON variable)
-            # otherwise we may accidentally link against either:
-            # /System/Library/Frameworks/Python.framework/Python/Versions/
-            # or
-            # /Library/Frameworks/Python.framework/Python/Versions/
-            # See: http://trac.mapnik.org/ticket/380
-            link_prefix = env['PYTHON_SYS_PREFIX']
-            if '.framework' in link_prefix:
-                linkflags = '-F%s -framework Python -Z' % os.path.dirname(link_prefix.split('.')[0])
-            elif '/System' in link_prefix:
-                linkflags = '-F/System/Library/Frameworks/ -framework Python -Z'
-            else:
-                # should we fall back to -lpython here?
-                linkflags = '-F/ -framework Python'
-            
-    # if we are not linking to a framework then use the *nix standard approach
-    else:
-        linkflags = '-lpython%s' % env['PYTHON_VERSION']
-
-
-
-paths = '''
-"""Configuration paths of Mapnik fonts and input plugins (autogenerated by SCons)."""
-
-import os
-
-mapniklibpath = '%s'
-'''
-
-paths += "inputpluginspath = os.path.normpath(mapniklibpath + '/input')\n"
-
-if env['SYSTEM_FONTS']:
-    paths += "fontscollectionpath = os.path.normpath('%s')" % env['SYSTEM_FONTS']
-else:
-    paths += "fontscollectionpath = os.path.normpath(mapniklibpath + '/fonts')"
-
-
-# write out the location of the 'mapniklibpath' into a python file
-# so that the python module can locate it at runtime
-exp =  r"%s{2,}" % os.sep
-# Note: we use prefix rather than install_prefix here since install_prefix is for package building
-# and we intend for python to look to the standard prefix location to find the fonts and plugins
-mapnik_lib_path  = re.sub(exp,os.sep, prefix + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME'])
-file('mapnik/paths.py','w').write(paths % (mapnik_lib_path))
-
-try:
-    os.chmod('mapnik/paths.py',0666)
-except: pass
-
-# install the core mapnik python files, including '__init__.py' and 'paths.py'
-init_files = glob.glob('mapnik/*.py')
-init_module = env.Install(env['PYTHON_INSTALL_LOCATION'] + '/mapnik', init_files)
-env.Alias(target='install', source=init_module)
-
-# install the ogcserver module code
-ogcserver_files = glob.glob('mapnik/ogcserver/*.py')
-ogcserver_module = env.Install(env['PYTHON_INSTALL_LOCATION'] + '/mapnik/ogcserver', ogcserver_files)
-env.Alias(target='install', source=ogcserver_module)
-
-
-# install the shared object beside the module directory
-_mapnik = env.LoadableModule('_mapnik', glob.glob('*.cpp'), LIBS=libraries, LDMODULEPREFIX='', LDMODULESUFFIX='.so', CPPPATH=headers,LINKFLAGS=linkflags)
-pymapniklib = env.Install(env['PYTHON_INSTALL_LOCATION'] + '/mapnik',_mapnik)
-env.Alias(target='install',source=pymapniklib)
diff --git a/bindings/python/build.py b/bindings/python/build.py
new file mode 100644
index 0000000..bdd29c6
--- /dev/null
+++ b/bindings/python/build.py
@@ -0,0 +1,206 @@
+#
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+import os, re, sys, glob
+from subprocess import Popen, PIPE
+
+
+Import('env')
+
+def call(cmd, silent=True):
+    stdin, stderr = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE).communicate()
+    if not stderr:
+        return stdin.strip()
+    elif not silent:
+        print stderr
+
+def run_2to3(*args,**kwargs):
+    call('2to3 -w %s' % os.path.dirname(kwargs['target'][0].path))
+
+def is_py3():
+    return 'True' in os.popen('''%s -c "import sys as s;s.stdout.write(str(s.version_info[0] == 3))"''' % env['PYTHON']).read().strip()
+
+
+prefix = env['PREFIX']
+target_path = env['PYTHON_INSTALL_LOCATION'] + os.path.sep + 'mapnik2'
+
+libraries = ['mapnik2','png']
+
+if env['JPEG']:
+    libraries.append('jpeg')
+
+if env['BOOST_PYTHON_LIB']:
+    if os.path.sep in env['BOOST_PYTHON_LIB']:
+        pylib_dir = os.path.dirname(env['BOOST_PYTHON_LIB'])
+        env.Prepend(LIBPATH = pylib_dir)
+        pylib_name = os.path.splitext(os.path.basename(env['BOOST_PYTHON_LIB']))[0].replace('lib','',1)
+        libraries.append(pylib_name)
+    else:
+        libraries.append(env['BOOST_PYTHON_LIB'].replace('lib','',1))
+else:
+    if is_py3():
+        libraries.append('boost_python3%s' % env['BOOST_APPEND'])
+    else:
+        libraries.append('boost_python%s' % env['BOOST_APPEND'])
+
+if env['PLATFORM'] == 'Darwin':
+    libraries.append(env['ICU_LIB_NAME'])
+    libraries.append('boost_regex%s' % env['BOOST_APPEND'])
+    if env['THREADING'] == 'multi':
+        libraries.append('boost_thread%s' % env['BOOST_APPEND'])
+
+    ##### Python linking on OS X is tricky ### 
+    # Confounding problems are:
+    # 1) likelyhood of multiple python installs of the same major.minor version
+    #  because apple supplies python built-in and many users may have installed 
+    #  further versions using macports
+    # 2) boost python directly links to a python version
+    # 3) the below will directly link _mapnik.so to a python version
+    # 4) _mapnik.so must link to the same python lib as boost_python.dylib otherwise
+    # python will Abort with a Version Mismatch error.
+    # See http://trac.mapnik.org/ticket/453 for the seeds of a better approach
+    # for now we offer control over method of direct linking...
+    # The default below is to link against the python dylib in the form of
+    #/path/to/Python.framework/Python instead of -lpython
+    
+    # http://developer.apple.com/mac/library/DOCUMENTATION/Darwin/Reference/ManPages/man1/ld.1.html
+    
+    if env['PYTHON_DYNAMIC_LOOKUP']:
+        python_link_flag = '-undefined dynamic_lookup'
+    elif env['FRAMEWORK_PYTHON']:
+        if env['FRAMEWORK_SEARCH_PATH']:
+            # if the user has supplied a custom root path to search for 
+            # a given Python framework, then use that to direct the linker
+            python_link_flag = '-F%s -framework Python -Z' % env['FRAMEWORK_SEARCH_PATH']
+        else:
+            # otherwise be as explicit as possible for linking to the same Framework
+            # as the executable we are building with (or is pointed to by the PYTHON variable)
+            # otherwise we may accidentally link against either:
+            # /System/Library/Frameworks/Python.framework/Python/Versions/
+            # or
+            # /Library/Frameworks/Python.framework/Python/Versions/
+            # See: http://trac.mapnik.org/ticket/380
+            link_prefix = env['PYTHON_SYS_PREFIX']
+            if '.framework' in link_prefix:
+                python_link_flag = '-F%s -framework Python -Z' % os.path.dirname(link_prefix.split('.')[0])
+            elif '/System' in link_prefix:
+                python_link_flag = '-F/System/Library/Frameworks/ -framework Python -Z'
+            else:
+                # should we fall back to -lpython here?
+                python_link_flag = '-F/ -framework Python'
+            
+    # if we are not linking to a framework then use the *nix standard approach
+    else:
+        # TODO - do we need to pass -L/?
+        python_link_flag = '-lpython%s' % env['PYTHON_VERSION']
+elif env['PLATFORM'] == 'SunOS':
+    # make sure to explicitly link mapnik.so against
+    # libmapnik in its installed location
+    python_link_flag = '-R%s' % env['MAPNIK_LIB_BASE']
+else:
+    # all other platforms we don't directly link python
+    python_link_flag = ''
+
+if env['CUSTOM_LDFLAGS']:
+    linkflags = '%s %s' % (env['CUSTOM_LDFLAGS'], python_link_flag)
+else:
+    linkflags = python_link_flag
+
+paths = '''
+"""Configuration paths of Mapnik fonts and input plugins (auto-generated by SCons)."""
+
+import os
+
+mapniklibpath = '%s'
+'''
+
+paths += "inputpluginspath = os.path.normpath(mapniklibpath + '/input')\n"
+
+if env['SYSTEM_FONTS']:
+    paths += "fontscollectionpath = os.path.normpath('%s')" % env['SYSTEM_FONTS']
+else:
+    paths += "fontscollectionpath = os.path.normpath(mapniklibpath + '/fonts')"
+
+
+if not os.path.exists('mapnik'):
+    os.mkdir('mapnik')
+file('mapnik/paths.py','w').write(paths % (env['MAPNIK_LIB_DIR']))
+
+try:
+    os.chmod('mapnik/paths.py',0666)
+except: pass
+
+# install the core mapnik python files, including '__init__.py' and 'paths.py'
+if 'install' in COMMAND_LINE_TARGETS:
+    init_files = glob.glob('mapnik/*.py')
+    init_module = env.Install(target_path, init_files)
+    env.Alias(target='install', source=init_module)
+
+# install the ogcserver module code
+if 'install' in COMMAND_LINE_TARGETS:
+    ogcserver_files = glob.glob('mapnik/ogcserver/*.py')
+    ogcserver_module = env.Install(target_path + '/ogcserver', ogcserver_files)
+    env.Alias(target='install', source=ogcserver_module)
+
+
+# install the shared object beside the module directory
+sources = glob.glob('*.cpp')
+
+
+py_env = env.Clone()
+py_env.Append(CPPPATH = env['PYTHON_INCLUDES'])
+
+if env['HAS_CAIRO']:
+    py_env.Append(CPPPATH = env['CAIROMM_CPPPATHS'])
+    py_env.Append(CXXFLAGS = '-DHAVE_CAIRO')
+    if env['PLATFORM'] == 'Darwin':
+        py_env.Append(LIBS=env['CAIROMM_LINKFLAGS'])
+
+if env['HAS_PYCAIRO']:
+    py_env.ParseConfig('pkg-config --cflags pycairo')
+    py_env.Append(CXXFLAGS = '-DHAVE_PYCAIRO')
+
+if env['SVN_REVISION']:
+    sources.remove('mapnik_python.cpp')
+    env2 = py_env.Clone()
+    env2.Append(CXXFLAGS='-DSVN_REVISION=%s' % env['SVN_REVISION'])
+    sources.insert(0,env2.SharedObject('mapnik_python.cpp'))
+
+_mapnik = py_env.LoadableModule('mapnik/_mapnik2', sources, LIBS=libraries, LDMODULEPREFIX='', LDMODULESUFFIX='.so',LINKFLAGS=linkflags)
+
+Depends(_mapnik, env.subst('../../src/%s' % env['MAPNIK_LIB_NAME']))
+
+if env['PLATFORM'] == 'SunOS' and env['PYTHON_IS_64BIT']:
+    # http://mail.python.org/pipermail/python-dev/2006-August/068528.html
+    cxx_module_path = os.path.join(target_path,'64')
+else:
+    cxx_module_path = target_path
+    
+if 'uninstall' not in COMMAND_LINE_TARGETS:
+    pymapniklib = env.Install(cxx_module_path,_mapnik)
+    py_env.Alias(target='install',source=pymapniklib)
+    if 'install' in COMMAND_LINE_TARGETS:
+        if is_py3():
+            env.AddPostAction(pymapniklib, run_2to3)
+
+
+env['create_uninstall_target'](env, target_path)
+    
\ No newline at end of file
diff --git a/bindings/python/mapnik/__init__.py b/bindings/python/mapnik/__init__.py
index ad20d09..e3efbbb 100644
--- a/bindings/python/mapnik/__init__.py
+++ b/bindings/python/mapnik/__init__.py
@@ -23,10 +23,11 @@ Boost Python bindings to the Mapnik C++ shared library.
 
 Several things happen when you do:
 
-    >>> import mapnik
+    >>> import mapnik2
 
  1) Mapnik C++ objects are imported via the '__init__.py' from the '_mapnik.so' shared object
-    which references libmapnik.so (linux), libmapnik.dylib (mac), or libmapnik.dll (win).
+    (_mapnik.pyd on win) which references libmapnik.so (linux), libmapnik.dylib (mac), or
+    mapnik.dll (win32).
 
  2) The paths to the input plugins and font directories are imported from the 'paths.py'
     file which was constructed and installed during SCons installation.
@@ -39,31 +40,42 @@ Several things happen when you do:
 """
 
 import os
+import sys
+import warnings
 
-from sys import getdlopenflags, setdlopenflags
-try:
-    from ctypes import RTLD_NOW, RTLD_GLOBAL
-except ImportError:
-    RTLD_NOW = 2
-    RTLD_GLOBAL = 256
-
-flags = getdlopenflags()
-setdlopenflags(RTLD_NOW | RTLD_GLOBAL)
-
-from _mapnik import *
+from _mapnik2 import *
 from paths import inputpluginspath, fontscollectionpath
 
+import printing
+printing.renderer = render
+
 # The base Boost.Python class
 BoostPythonMetaclass = Coord.__class__
 
-class _injector(object):
-    class __metaclass__(BoostPythonMetaclass):
-        def __init__(self, name, bases, dict):
-            for b in bases:
-                if type(b) not in (self, type):
-                    for k,v in dict.items():
-                        setattr(b,k,v)
-            return type.__init__(self, name, bases, dict)
+class _MapnikMetaclass(BoostPythonMetaclass):
+    def __init__(self, name, bases, dict):
+        for b in bases:
+            if type(b) not in (self, type):
+                for k,v in list(dict.items()):
+                    if hasattr(b, k):
+                        setattr(b, '_c_'+k, getattr(b, k))
+                    setattr(b,k,v)
+        return type.__init__(self, name, bases, dict)
+
+# metaclass injector compatible with both python 2 and 3
+# http://mikewatkins.ca/2008/11/29/python-2-and-3-metaclasses/
+_injector = _MapnikMetaclass('_injector', (object, ), {})
+
+def Filter(*args,**kwargs):
+    warnings.warn("'Filter' is deprecated and will be removed in Mapnik 2.0.1, use 'Expression' instead",
+    DeprecationWarning, 2)
+    return Expression(*args, **kwargs)
+
+class Envelope(Box2d):
+    def __init__(self, *args, **kwargs):
+        warnings.warn("'Envelope' is deprecated and will be removed in Mapnik 2.0.1, use 'Box2d' instead",
+        DeprecationWarning, 2)
+        Box2d.__init__(self, *args, **kwargs)
 
 class _Coord(Coord,_injector):
     """
@@ -138,12 +150,12 @@ class _Coord(Coord,_injector):
         """
         return inverse_(self, projection)
 
-class _Envelope(Envelope,_injector):
+class _Box2d(Box2d,_injector):
     """
     Represents a spatial envelope (i.e. bounding box). 
     
     
-    Following operators are defined for Envelope:
+    Following operators are defined for Box2d:
 
     Addition:
     e1 + e2 is equvalent to e1.expand_to_include(e2) but yields 
@@ -165,9 +177,11 @@ class _Envelope(Envelope,_injector):
 
     Equality: two envelopes are equal if their corner points are equal.
     """
+
     def __repr__(self):
-        return 'Envelope(%s,%s,%s,%s)' % \
+        return 'Box2d(%s,%s,%s,%s)' % \
             (self.minx,self.miny,self.maxx,self.maxy)
+
     def forward(self, projection):
         """
         Projects the envelope from the geographic space 
@@ -178,6 +192,7 @@ class _Envelope(Envelope,_injector):
            Coord.forward(self, projection)
         """
         return forward_(self, projection)
+
     def inverse(self, projection):
         """
         Projects the envelope from the cartesian space 
@@ -190,69 +205,115 @@ class _Envelope(Envelope,_injector):
         return inverse_(self, projection)
 
 class _Projection(Projection,_injector):
+
     def __repr__(self):
         return "Projection('%s')" % self.params()
+
     def forward(self,obj):
         """
-        Projects the given object (Envelope or Coord) 
+        Projects the given object (Box2d or Coord) 
         from the geographic space into the cartesian space.
 
         See also:
-          Envelope.forward(self, projection),
+          Box2d.forward(self, projection),
           Coord.forward(self, projection).
         """
         return forward_(obj,self)
+
     def inverse(self,obj):
         """
-        Projects the given object (Envelope or Coord) 
+        Projects the given object (Box2d or Coord) 
         from the cartesian space into the geographic space.
 
         See also:
-          Envelope.inverse(self, projection),
+          Box2d.inverse(self, projection),
           Coord.inverse(self, projection).
         """
         return inverse_(obj,self)
 
-def get_types(num):
-    dispatch = {1: int,
-                2: float,
-                3: float,
-                4: str,
-                5: Geometry2d,
-                6: object}
-    return dispatch.get(num)
-
 class _Datasource(Datasource,_injector):
+
     def describe(self):
         return Describe(self)
-    def field_types(self):
-        return map(get_types,self._field_types())
-    def all_features(self):
-        query = Query(self.envelope(),1.0)
-        for fld in self.fields():
+
+    def all_features(self,fields=None):
+        query = Query(self.envelope())
+        attributes = fields or self.fields()
+        for fld in attributes:
             query.add_property_name(fld)
         return self.features(query).features
 
-class _Feature(Feature,_injector):
+    def featureset(self,fields=None):
+        query = Query(self.envelope())
+        attributes = fields or self.fields()
+        for fld in attributes:
+            query.add_property_name(fld)
+        return self.features(query)
+
+class _DeprecatedFeatureProperties(object):
+
+    def __init__(self, feature):
+        self._feature = feature
+
+    def __getitem__(self, name):
+        warnings.warn("indexing feature.properties is deprecated, index the "
+             "feature object itself for the same effect", DeprecationWarning, 2)
+        return self._feature[name]
+
+    def __iter__(self):
+        warnings.warn("iterating feature.properties is deprecated, iterate the "
+             "feature object itself for the same effect", DeprecationWarning, 2)
+        return iter(self._feature)
+
+class _Feature(Feature, _injector):
+    """
+    A Feature.
+
+    TODO: docs
+    """
+    @property
+    def properties(self):
+        return _DeprecatedFeatureProperties(self)
+
     @property
     def attributes(self):
-        attr = {}
-        for prop in self.properties:
-            attr[prop[0]] = prop[1]
-        return attr
+        #XXX Returns a copy! changes to it won't affect feat.'s attrs.
+        #    maybe deprecate?
+        return dict(self)
+    
+    def __init__(self, id, wkt=None, **properties):
+        Feature._c___init__(self, id)
+        if wkt is not None:
+            self.add_geometries_from_wkt(wkt)
+        for k, v in properties.iteritems():
+            self[k] = v
+    
+class _Color(Color,_injector):
+    def __repr__(self):
+        return "Color(R=%d,G=%d,B=%d,A=%d)" % (self.r,self.g,self.b,self.a)
+
+class _Symbolizers(Symbolizers,_injector):
+
+    def __getitem__(self, idx):
+        sym = Symbolizers._c___getitem__(self, idx)
+        return sym.symbol()
+
+def _add_symbol_method_to_symbolizers(vars=globals()):
+
+    def symbol_for_subcls(self):
+        return self
 
-class _Symbolizer(Symbolizer,_injector):
-    def symbol(self):
+    def symbol_for_cls(self):
         return getattr(self,self.type())()
 
-#class _Filter(Filter,_injector):
-#    """Mapnik Filter expression.
-#    
-#    Usage:
-#    >>> from mapnik import Filter
-#    >>> Filter("[waterway]='canal' and not ([tunnel] = 'yes' or [tunnel] ='true')")
-#    
-#    """
+    for name, obj in vars.items():
+        if name.endswith('Symbolizer') and not name.startswith('_'):
+            if name == 'Symbolizer':
+                symbol = symbol_for_cls
+            else:
+                symbol = symbol_for_subcls
+            type('dummy', (obj,_injector), {'symbol': symbol})
+_add_symbol_method_to_symbolizers()
 
 def Datasource(**keywords):
     """Wrapper around CreateDatasource.
@@ -334,6 +395,7 @@ def PostGIS(**keywords):
     keywords['type'] = 'postgis'
     return CreateDatasource(keywords)
 
+
 def Raster(**keywords):
     """Create a Raster (Tiff) Datasource.
 
@@ -344,7 +406,7 @@ def Raster(**keywords):
       hix -- highest (max) x/longitude of tiff extent
       hiy -- highest (max) y/latitude of tiff extent
 
-    Hint: lox,loy,hix,hiy make a Mapnik Envelope
+    Hint: lox,loy,hix,hiy make a Mapnik Box2d
 
     Optional keyword arguments:
       base -- path prefix (default None)
@@ -367,6 +429,7 @@ def Gdal(**keywords):
     Optional keyword arguments:
       base -- path prefix (default None)
       shared -- boolean, open GdalDataset in shared mode (default: False)
+      bbox -- tuple (minx, miny, maxx, maxy). If specified, overrides the bbox detected by GDAL.
 
     >>> from mapnik import Gdal, Layer
     >>> dataset = Gdal(base='/home/mapnik/data',file='elevation.tif')
@@ -375,6 +438,9 @@ def Gdal(**keywords):
 
     """
     keywords['type'] = 'gdal'
+    if 'bbox' in keywords:
+        if isinstance(keywords['bbox'], (tuple, list)):
+            keywords['bbox'] = ','.join([str(item) for item in keywords['bbox']])
     return CreateDatasource(keywords)
 
 def Occi(**keywords):
@@ -412,9 +478,10 @@ def Ogr(**keywords):
 
     Required keyword arguments:
       file -- path to OGR supported dataset
-      layer -- layer to use within datasource
+      layer -- name of layer to use within datasource (optional if layer_by_index is used)
 
     Optional keyword arguments:
+      layer_by_index -- choose layer by index number instead of by layer name.
       base -- path prefix (default None)
       encoding -- file encoding (default 'utf-8')
       multiple_geometries -- boolean, direct the Mapnik wkb reader to interpret as multigeometries (default False)
@@ -457,6 +524,26 @@ def SQLite(**keywords):
     keywords['type'] = 'sqlite'
     return CreateDatasource(keywords)
 
+def Rasterlite(**keywords):
+    """Create a Rasterlite Datasource.
+
+    Required keyword arguments:
+      file -- path to Rasterlite database file
+      table -- table name or subselect query
+
+    Optional keyword arguments:
+      base -- path prefix (default None)
+      extent -- manually specified data extent (comma delimited string, default None)
+
+    >>> from mapnik import Rasterlite, Layer
+    >>> rasterlite = Rasterlite(base='/home/mapnik/data',file='osm.db',table='osm',extent='-20037508,-19929239,20037508,19929239') 
+    >>> lyr = Layer('Rasterlite Layer')
+    >>> lyr.datasource = rasterlite
+
+    """
+    keywords['type'] = 'rasterlite'
+    return CreateDatasource(keywords)
+
 def Osm(**keywords):
     """Create a Osm Datasource.
 
@@ -499,81 +586,150 @@ def Kismet(**keywords):
     keywords['type'] = 'kismet'
     return CreateDatasource(keywords)
 
-def mapnik_version_string():
+def Geos(**keywords):
+    """Create a GEOS Vector Datasource.
+
+    Required keyword arguments:
+      wkt -- inline WKT text of the geometry
+
+    Optional keyword arguments:
+      multiple_geometries -- boolean, direct the GEOS wkt reader to interpret as multigeometries (default False)
+      extent -- manually specified data extent (comma delimited string, default None)
+
+    >>> from mapnik import Geos, Layer
+    >>> datasource = Geos(wkt='MULTIPOINT(100 100, 50 50, 0 0)') 
+    >>> lyr = Layer('GEOS Layer from WKT string')
+    >>> lyr.datasource = datasource
+
+    """
+    keywords['type'] = 'geos'
+    return CreateDatasource(keywords)
+
+def mapnik_version_string(version=mapnik_version()):
     """Return the Mapnik version as a string."""
-    version = mapnik_version()
     patch_level = version % 100
     minor_version = version / 100 % 1000
     major_version = version / 100000
     return '%s.%s.%s' % ( major_version, minor_version,patch_level)
 
+def mapnik_version_from_string(version_string):
+    """Return the Mapnik version from a string."""
+    n = version_string.split('.')
+    return (int(n[0]) * 100000) + (int(n[1]) * 100) + (int(n[2]));
+
 def register_plugins(path=inputpluginspath):
     """Register plugins located by specified path"""
     DatasourceCache.instance().register_datasources(path)
 
-def register_fonts(path=fontscollectionpath):
+def register_fonts(path=fontscollectionpath,valid_extensions=['.ttf','.otf','.ttc','.pfa','.pfb','.ttc','.dfont']):
     """Recursively register fonts using path argument as base directory"""
     for dirpath, _, filenames in os.walk(path):
         for filename in filenames:
-            if os.path.splitext(filename)[1] == '.ttf':
+            if os.path.splitext(filename.lower())[1] in valid_extensions:
                 FontEngine.instance().register_font(os.path.join(dirpath, filename))
 
 # auto-register known plugins and fonts
 register_plugins()
 register_fonts()
 
-#set dlopen flags back to the original
-setdlopenflags(flags)
-
 # Explicitly export API members to avoid namespace pollution
 # and ensure correct documentation processing
 __all__ = [
     # classes
-    'Color', 'Coord', 
+    'Color',
+    'Coord',
+    'Palette',
+    #'ColorBand',
+    'CompositeOp',
     'DatasourceCache',
-    'Envelope',
-    'Feature', 'Featureset', 'FontEngine',
+    'MemoryDatasource',
+    'Box2d',
+    'Feature',
+    'Featureset',
+    'FontEngine',
     'Geometry2d',
-    'Image', 'ImageView',
-    'Layer', 'Layers',
-    'LinePatternSymbolizer', 'LineSymbolizer',
+    'GlyphSymbolizer',
+    'Image',
+    'ImageView',
+    'Grid',
+    'GridView',
+    'Layer',
+    'Layers',
+    'LinePatternSymbolizer',
+    'LineSymbolizer',
     'Map',
+    'MarkersSymbolizer',
     'Names',
-    'Parameter', 'Parameters',
-    'PointDatasource', 'PointSymbolizer',
-    'PolygonPatternSymbolizer', 'PolygonSymbolizer',
+    'Path',
+    'Parameter',
+    'Parameters',
+    'PointDatasource',
+    'PointSymbolizer',
+    'PolygonPatternSymbolizer',
+    'PolygonSymbolizer',
     'ProjTransform',
     'Projection',
-    'Properties',
     'Query',
     'RasterSymbolizer',
+    'RasterColorizer',
     'Rule', 'Rules',
     'ShieldSymbolizer',
     'Singleton',
-    'Stroke', 'Style',
-    'Symbolizer', 'Symbolizers',
+    'Stroke',
+    'Style',
+    'Symbolizer',
+    'Symbolizers',
     'TextSymbolizer',
     'ViewTransform',
     # enums
-    'aspect_fix_mode', 'label_placement',
-    'line_cap', 'line_join',
-    'text_convert', 'vertical_alignment',
+    'aspect_fix_mode',
+    'point_placement',
+    'label_placement',
+    'line_cap',
+    'line_join',
+    'text_transform',
+    'vertical_alignment',
+    'horizontal_alignment',
+    'justify_alignment',
+    'pattern_alignment',
+    'filter_mode',
     # functions
     # datasources
-    'Datasource', 'CreateDatasource',
-    'Shapefile', 'PostGIS', 'Raster', 'Gdal',
-    'Occi', 'Ogr', 'SQLite',
-    'Osm', 'Kismet',
+    'Datasource',
+    'CreateDatasource',
+    'Shapefile',
+    'PostGIS',
+    'Raster',
+    'Gdal',
+    'Occi',
+    'Ogr',
+    'SQLite',
+    'Osm',
+    'Kismet',
     'Describe',
     #   version and environment
-    'mapnik_version_string', 'mapnik_version', 'mapnik_svn_revision',
-    'has_cairo', 'has_pycairo',
+    'mapnik_version_string',
+    'mapnik_version',
+    'mapnik_svn_revision',
+    'has_cairo',
+    'has_pycairo',
     #   factory methods
-    'Filter',
+    'Expression',
+    'PathExpression',
     #   load/save/render
-    'load_map', 'load_map_from_string', 'save_map', 'save_map_to_string',
-    'render', 'render_tile_to_file', 'render_to_file',
+    'load_map',
+    'load_map_from_string',
+    'save_map',
+    'save_map_to_string',
+    'render',
+    'render_grid',
+    'render_tile_to_file',
+    'render_to_file',
     #   other
-    'register_plugins', 'register_fonts',
+    'register_plugins',
+    'register_fonts',
     'scale_denominator',
+    # deprecated
+    'Filter',
+    'Envelope',
     ]
diff --git a/bindings/python/mapnik/ogcserver/WMS.py b/bindings/python/mapnik/ogcserver/WMS.py
index 188e8bf..e5ae192 100644
--- a/bindings/python/mapnik/ogcserver/WMS.py
+++ b/bindings/python/mapnik/ogcserver/WMS.py
@@ -17,7 +17,7 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
-# $Id: WMS.py 1032 2009-03-30 04:24:01Z dane $
+# $Id: WMS.py 1782 2010-05-08 17:07:03Z dane $
 
 """Interface for registering map styles and layers for availability in WMS Requests."""
 
@@ -25,7 +25,7 @@ from common import Version, copy_style, copy_layer
 from exceptions import OGCException, ServerConfigurationError
 from wms111 import ServiceHandler as ServiceHandler111
 from wms130 import ServiceHandler as ServiceHandler130
-from mapnik import Style, Map, load_map 
+from mapnik2 import Style, Map, load_map 
 import re
 import sys
 
diff --git a/bindings/python/mapnik/ogcserver/__init__.py b/bindings/python/mapnik/ogcserver/__init__.py
index a661d98..5bd42b5 100644
--- a/bindings/python/mapnik/ogcserver/__init__.py
+++ b/bindings/python/mapnik/ogcserver/__init__.py
@@ -17,6 +17,12 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
-# $Id: __init__.py 1033 2009-03-30 04:25:01Z dane $
+# $Id: __init__.py 2796 2011-04-19 00:20:50Z dane $
 
 """Mapnik OGC WMS Server."""
+
+import os
+import warnings
+
+warnings.warn("ogcserver module development has moved to https://github.com/mapnik/OGCServer.\n This code will function fine with this version, but will be removed in Mapnik 2.1.0. Disable this warning by editing this file: %s" % os.path.realpath(__file__), DeprecationWarning, 2)
+
diff --git a/bindings/python/mapnik/ogcserver/cgiserver.py b/bindings/python/mapnik/ogcserver/cgiserver.py
index c139e96..f70f86c 100644
--- a/bindings/python/mapnik/ogcserver/cgiserver.py
+++ b/bindings/python/mapnik/ogcserver/cgiserver.py
@@ -17,7 +17,7 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
-# $Id: cgiserver.py 1033 2009-03-30 04:25:01Z dane $
+# $Id: cgiserver.py 2326 2010-11-08 23:18:08Z dane $
 
 """CGI/FastCGI handler for Mapnik OGC WMS Server.
 
@@ -74,7 +74,7 @@ class Handler(cgi.DebugHandler):
         if reqparams.has_key('service'):
             del reqparams['service']
         try:
-            mapnikmodule = __import__('mapnik.ogcserver.' + service)
+            mapnikmodule = __import__('mapnik2.ogcserver.' + service)
         except:
             raise OGCException('Unsupported service "%s".' % service)
         ServiceHandlerFactory = getattr(mapnikmodule.ogcserver, service).ServiceHandlerFactory
diff --git a/bindings/python/mapnik/ogcserver/common.py b/bindings/python/mapnik/ogcserver/common.py
index 4aabba3..5ca904b 100644
--- a/bindings/python/mapnik/ogcserver/common.py
+++ b/bindings/python/mapnik/ogcserver/common.py
@@ -17,12 +17,12 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
-# $Id: common.py 1126 2009-05-01 02:27:56Z dane $
+# $Id: common.py 1782 2010-05-08 17:07:03Z dane $
 
 """Core OGCServer classes and functions."""
 
 from exceptions import OGCException, ServerConfigurationError
-from mapnik import Map, Color, Envelope, render, Image, Layer, Style, Projection as MapnikProjection, Coord
+from mapnik2 import Map, Color, Box2d, render, Image, Layer, Style, Projection as MapnikProjection, Coord
 from PIL.Image import new
 from PIL.ImageDraw import Draw
 from StringIO import StringIO
@@ -409,7 +409,7 @@ class WMSBaseServiceHandler(BaseServiceHandler):
                     else:
                         raise ServerConfigurationError('Layer "%s" refers to non-existent style "%s".' % (layername, stylename))
                 m.layers.append(layer)
-        m.zoom_to_box(Envelope(params['bbox'][0], params['bbox'][1], params['bbox'][2], params['bbox'][3]))
+        m.zoom_to_box(Box2d(params['bbox'][0], params['bbox'][1], params['bbox'][2], params['bbox'][3]))
         return m
 
 class BaseExceptionHandler:
diff --git a/bindings/python/mapnik/ogcserver/modserver.py b/bindings/python/mapnik/ogcserver/modserver.py
index 22a260a..fc2459a 100644
--- a/bindings/python/mapnik/ogcserver/modserver.py
+++ b/bindings/python/mapnik/ogcserver/modserver.py
@@ -78,7 +78,7 @@ class ModHandler(object):
                 if reqparams.has_key('service'):
                     del reqparams['service']
                 try:
-                    mapnikmodule = __import__('mapnik.ogcserver.' + service)
+                    mapnikmodule = __import__('mapnik2.ogcserver.' + service)
                 except:
                     raise OGCException('Unsupported service "%s".' % service)
                 ServiceHandlerFactory = getattr(mapnikmodule.ogcserver, service).ServiceHandlerFactory
diff --git a/bindings/python/mapnik/ogcserver/wms111.py b/bindings/python/mapnik/ogcserver/wms111.py
index 411164b..845848c 100644
--- a/bindings/python/mapnik/ogcserver/wms111.py
+++ b/bindings/python/mapnik/ogcserver/wms111.py
@@ -17,7 +17,7 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
-# $Id: wms111.py 1085 2009-04-09 18:40:39Z dane $
+# $Id: wms111.py 1782 2010-05-08 17:07:03Z dane $
 
 """WMS 1.1.1 compliant GetCapabilities, GetMap, GetFeatureInfo, and Exceptions interface."""
 
@@ -25,7 +25,7 @@ from common import ParameterDefinition, Response, Version, ListFactory, \
                    ColorFactory, CRSFactory, WMSBaseServiceHandler, CRS, \
                    BaseExceptionHandler, Projection
 from exceptions import OGCException, ServerConfigurationError
-from mapnik import Coord
+from mapnik2 import Coord
 
 try:
     from lxml import etree as ElementTree
diff --git a/bindings/python/mapnik/ogcserver/wms130.py b/bindings/python/mapnik/ogcserver/wms130.py
index 593b179..e855876 100644
--- a/bindings/python/mapnik/ogcserver/wms130.py
+++ b/bindings/python/mapnik/ogcserver/wms130.py
@@ -17,15 +17,15 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
-# $Id: wms130.py 1085 2009-04-09 18:40:39Z dane $
+# $Id: wms130.py 1782 2010-05-08 17:07:03Z dane $
 
 """WMS 1.3.0 compliant GetCapabilities, GetMap, GetFeatureInfo, and Exceptions interface."""
 
 from common import ParameterDefinition, Response, Version, ListFactory, \
                    ColorFactory, CRSFactory, CRS, WMSBaseServiceHandler, \
-                   BaseExceptionHandler, Projection, Envelope
+                   BaseExceptionHandler, Projection, Box2d
 from exceptions import OGCException, ServerConfigurationError
-from mapnik import Coord
+from mapnik2 import Coord
 
 try:
     from lxml import etree as ElementTree
@@ -238,7 +238,7 @@ class ServiceHandler(WMSBaseServiceHandler):
         m = WMSBaseServiceHandler._buildMap(self, params)
         # for range of epsg codes reverse axis
         if params['crs'].code >= 4000 and params['crs'].code < 5000:
-            m.zoom_to_box(Envelope(params['bbox'][1], params['bbox'][0], params['bbox'][3], params['bbox'][2]))
+            m.zoom_to_box(Box2d(params['bbox'][1], params['bbox'][0], params['bbox'][3], params['bbox'][2]))
         return m    
 
 class ExceptionHandler(BaseExceptionHandler):
diff --git a/bindings/python/mapnik/ogcserver/wsgi.py b/bindings/python/mapnik/ogcserver/wsgi.py
index 537e408..9ce867a 100644
--- a/bindings/python/mapnik/ogcserver/wsgi.py
+++ b/bindings/python/mapnik/ogcserver/wsgi.py
@@ -17,7 +17,7 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
-# $Id: wsgi.py 1052 2009-03-31 17:18:41Z dane $
+# $Id: wsgi.py 2326 2010-11-08 23:18:08Z dane $
 
 """WSGI application wrapper for Mapnik OGC WMS Server."""
 
@@ -72,7 +72,7 @@ class WSGIApp:
             if reqparams.has_key('service'):
                 del reqparams['service']
             try:
-                mapnikmodule = __import__('mapnik.ogcserver.' + service)
+                mapnikmodule = __import__('mapnik2.ogcserver.' + service)
             except:
                 raise OGCException('Unsupported service "%s".' % service)
             ServiceHandlerFactory = getattr(mapnikmodule.ogcserver, service).ServiceHandlerFactory
diff --git a/bindings/python/mapnik/printing.py b/bindings/python/mapnik/printing.py
new file mode 100644
index 0000000..9ef4be7
--- /dev/null
+++ b/bindings/python/mapnik/printing.py
@@ -0,0 +1,1027 @@
+# -*- coding: utf-8 -*-
+
+"""Mapnik classes to assist in creating printable maps
+
+basic usage is along the lines of
+
+import mapnik2
+
+page = mapnik2.printing.PDFPrinter()
+m = mapnik2.Map(100,100)
+mapnik2.load_map(m, "my_xml_map_description", True)
+m.zoom_all()
+page.render_map(m,"my_output_file.pdf")
+
+see the documentation of mapnik2.printing.PDFPrinter() for options
+
+"""
+
+from . import render, Map, Box2d, MemoryDatasource, Layer, Feature, Projection, ProjTransform, Coord, Style, Rule, Geometry2d
+import math
+import os
+import tempfile
+
+try:
+    import cairo
+    HAS_PYCAIRO_MODULE = True
+except ImportError:
+    HAS_PYCAIRO_MODULE = False
+
+try:
+    import pangocairo
+    import pango
+    HAS_PANGOCAIRO_MODULE = True
+except ImportError:
+    HAS_PANGOCAIRO_MODULE = False
+
+try:
+    import pyPdf
+    HAS_PYPDF = True
+except ImportError:
+    HAS_PYPDF = False
+
+class centering:
+    """Style of centering to use with the map, the default is constrained
+    
+    none: map will be placed flush with the margin/box in the top left corner
+    constrained: map will be centered on the most constrained axis (for a portrait page
+                 and a square map this will be horizontally)
+    unconstrained: map will be centered on the unconstrained axis
+    vertical:
+    horizontal:
+    both:
+    """
+    none=0
+    constrained=1
+    unconstrained=2
+    vertical=3
+    horizontal=4
+    both=5
+
+"""Some predefined page sizes custom sizes can also be passed
+a tuple of the page width and height in meters"""
+pagesizes = {
+    "a0": (0.841000,1.189000),
+    "a0l": (1.189000,0.841000),
+    "b0": (1.000000,1.414000),
+    "b0l": (1.414000,1.000000),
+    "c0": (0.917000,1.297000),
+    "c0l": (1.297000,0.917000),
+    "a1": (0.594000,0.841000),
+    "a1l": (0.841000,0.594000),
+    "b1": (0.707000,1.000000),
+    "b1l": (1.000000,0.707000),
+    "c1": (0.648000,0.917000),
+    "c1l": (0.917000,0.648000),
+    "a2": (0.420000,0.594000),
+    "a2l": (0.594000,0.420000),
+    "b2": (0.500000,0.707000),
+    "b2l": (0.707000,0.500000),
+    "c2": (0.458000,0.648000),
+    "c2l": (0.648000,0.458000),
+    "a3": (0.297000,0.420000),
+    "a3l": (0.420000,0.297000),
+    "b3": (0.353000,0.500000),
+    "b3l": (0.500000,0.353000),
+    "c3": (0.324000,0.458000),
+    "c3l": (0.458000,0.324000),
+    "a4": (0.210000,0.297000),
+    "a4l": (0.297000,0.210000),
+    "b4": (0.250000,0.353000),
+    "b4l": (0.353000,0.250000),
+    "c4": (0.229000,0.324000),
+    "c4l": (0.324000,0.229000),
+    "a5": (0.148000,0.210000),
+    "a5l": (0.210000,0.148000),
+    "b5": (0.176000,0.250000),
+    "b5l": (0.250000,0.176000),
+    "c5": (0.162000,0.229000),
+    "c5l": (0.229000,0.162000),
+    "a6": (0.105000,0.148000),
+    "a6l": (0.148000,0.105000),
+    "b6": (0.125000,0.176000),
+    "b6l": (0.176000,0.125000),
+    "c6": (0.114000,0.162000),
+    "c6l": (0.162000,0.114000),
+    "a7": (0.074000,0.105000),
+    "a7l": (0.105000,0.074000),
+    "b7": (0.088000,0.125000),
+    "b7l": (0.125000,0.088000),
+    "c7": (0.081000,0.114000),
+    "c7l": (0.114000,0.081000),
+    "a8": (0.052000,0.074000),
+    "a8l": (0.074000,0.052000),
+    "b8": (0.062000,0.088000),
+    "b8l": (0.088000,0.062000),
+    "c8": (0.057000,0.081000),
+    "c8l": (0.081000,0.057000),
+    "a9": (0.037000,0.052000),
+    "a9l": (0.052000,0.037000),
+    "b9": (0.044000,0.062000),
+    "b9l": (0.062000,0.044000),
+    "c9": (0.040000,0.057000),
+    "c9l": (0.057000,0.040000),
+    "a10": (0.026000,0.037000),
+    "a10l": (0.037000,0.026000),
+    "b10": (0.031000,0.044000),
+    "b10l": (0.044000,0.031000),
+    "c10": (0.028000,0.040000),
+    "c10l": (0.040000,0.028000),
+    "letter": (0.216,0.279),
+    "letterl": (0.279,0.216),
+    "legal": (0.216,0.356),
+    "legall": (0.356,0.216),
+}
+"""size of a pt in meters"""
+pt_size=0.0254/72.0
+
+def m2pt(x):
+    """convert distance from meters to points"""
+    return x/pt_size
+
+def pt2m(x):
+    """convert distance from points to meters"""
+    return x*pt_size
+
+def m2in(x):
+    """convert distance from meters to inches"""
+    return x/0.0254
+
+def m2px(x,resolution):
+    """convert distance from meters to pixels at the given resolution in DPI/PPI"""
+    return m2in(x)*resolution
+
+class resolutions:
+    """some predefined resolutions in DPI"""
+    dpi72=72
+    dpi150=150
+    dpi300=300
+    dpi600=600
+
+def any_scale(scale):
+    """Scale helper function that allows any scale"""
+    return scale
+
+def sequence_scale(scale,scale_sequence):
+    """Default scale helper, this rounds scale to a 'sensible' value"""
+    factor = math.floor(math.log10(scale))
+    norm = scale/(10**factor)
+    
+    for s in scale_sequence:
+        if norm <= s:
+            return s*10**factor
+    return scale_sequence[0]*10**(factor+1)
+
+def default_scale(scale):
+    """Default scale helper, this rounds scale to a 'sensible' value"""
+    return sequence_scale(scale, (1,1.25,1.5,1.75,2,2.5,3,4,5,6,7.5,8,9,10))
+
+def deg_min_sec_scale(scale):
+    for x in (1.0/3600,
+              2.0/3600,
+              5.0/3600,
+              10.0/3600,
+              30.0/3600,
+              1.0/60,
+              2.0/60,
+              5.0/60,
+              10.0/60,
+              30.0/60,
+              1,
+              2,
+              5,
+              10,
+              30,
+              60
+              ):
+        if scale < x:
+            return x
+    else:
+        return x
+    
+def format_deg_min_sec(value):
+    deg = math.floor(value)
+    min = math.floor((value-deg)/(1.0/60))
+    sec = int((value - deg*1.0/60)/1.0/3600)
+    return "%d°%d'%d\"" % (deg,min,sec)
+
+def round_grid_generator(first,last,step):
+        val = (math.floor(first / step) + 1) * step
+        yield val
+        while val < last:
+            val += step
+            yield val
+
+
+def convert_pdf_pages_to_layers(filename,output_name=None,layer_names=(),reverse_all_but_last=True):
+    """
+    opens the given multipage PDF and converts each page to be a layer in a single page PDF
+    layer_names should be a sequence of the user visible names of the layers, if not given
+    or if shorter than num pages generic names will be given to the unnamed layers
+    
+    if output_name is not provided a temporary file will be used for the conversion which
+    will then be copied back over the source file.
+    
+    requires pyPdf >= 1.13 to be available"""
+    
+
+    if not HAS_PYPDF:
+        raise Exception("pyPdf Not available")
+
+    infile = file(filename, 'rb')
+    if output_name:
+        outfile = file(output_name, 'wb')
+    else:
+        (outfd,outfilename) = tempfile.mkstemp(dir=os.path.dirname(filename))
+        outfile = os.fdopen(outfd,'wb')
+        
+    i = pyPdf.PdfFileReader(infile)
+    o = pyPdf.PdfFileWriter()
+    
+    template_page_size = i.pages[0].mediaBox
+    op = o.addBlankPage(width=template_page_size.getWidth(),height=template_page_size.getHeight())
+    
+    contentkey = pyPdf.generic.NameObject('/Contents')
+    resourcekey = pyPdf.generic.NameObject('/Resources')
+    propertieskey = pyPdf.generic.NameObject('/Properties')
+    op[contentkey] = pyPdf.generic.ArrayObject()
+    op[resourcekey] = pyPdf.generic.DictionaryObject()
+    properties = pyPdf.generic.DictionaryObject()
+    ocgs = pyPdf.generic.ArrayObject()
+    
+    for (i, p) in enumerate(i.pages):
+        # first start an OCG for the layer
+        ocgname = pyPdf.generic.NameObject('/oc%d' % i)
+        ocgstart = pyPdf.generic.DecodedStreamObject()
+        ocgstart._data = "/OC %s BDC\n" % ocgname
+        ocgend = pyPdf.generic.DecodedStreamObject()
+        ocgend._data = "EMC\n"
+        if isinstance(p['/Contents'],pyPdf.generic.ArrayObject):
+            p[pyPdf.generic.NameObject('/Contents')].insert(0,ocgstart)
+            p[pyPdf.generic.NameObject('/Contents')].append(ocgend)
+        else:
+            p[pyPdf.generic.NameObject('/Contents')] = pyPdf.generic.ArrayObject((ocgstart,p['/Contents'],ocgend))
+            
+        op.mergePage(p)
+        
+        ocg = pyPdf.generic.DictionaryObject()
+        ocg[pyPdf.generic.NameObject('/Type')] = pyPdf.generic.NameObject('/OCG')
+        if len(layer_names) > i:
+            ocg[pyPdf.generic.NameObject('/Name')] = pyPdf.generic.TextStringObject(layer_names[i])
+        else:
+            ocg[pyPdf.generic.NameObject('/Name')] = pyPdf.generic.TextStringObject('Layer %d' % (i+1))
+        indirect_ocg = o._addObject(ocg)
+        properties[ocgname] = indirect_ocg
+        ocgs.append(indirect_ocg)
+    
+    op[resourcekey][propertieskey] = o._addObject(properties)
+    
+    ocproperties = pyPdf.generic.DictionaryObject()
+    ocproperties[pyPdf.generic.NameObject('/OCGs')] = ocgs
+    defaultview = pyPdf.generic.DictionaryObject()
+    defaultview[pyPdf.generic.NameObject('/Name')] = pyPdf.generic.TextStringObject('Default')
+    defaultview[pyPdf.generic.NameObject('/BaseState ')] = pyPdf.generic.NameObject('/ON ')
+    defaultview[pyPdf.generic.NameObject('/ON')] = ocgs
+    if reverse_all_but_last:
+        defaultview[pyPdf.generic.NameObject('/Order')] = pyPdf.generic.ArrayObject(reversed(ocgs[:-1]))
+        defaultview[pyPdf.generic.NameObject('/Order')].append(ocgs[-1])
+    else:
+        defaultview[pyPdf.generic.NameObject('/Order')] = pyPdf.generic.ArrayObject(reversed(ocgs))
+    defaultview[pyPdf.generic.NameObject('/OFF')] = pyPdf.generic.ArrayObject()
+    
+    ocproperties[pyPdf.generic.NameObject('/D')] = o._addObject(defaultview)
+    
+    o._root.getObject()[pyPdf.generic.NameObject('/OCProperties')] = o._addObject(ocproperties)
+    
+    o.write(outfile)
+    
+    outfile.close()
+    infile.close()
+    
+    if not output_name:
+        os.rename(outfilename, filename)
+
+class PDFPrinter:
+    """Main class for creating PDF print outs, basically contruct an instance
+    with appropriate options and then call render_map with your mapnik map
+    """
+    def __init__(self, 
+                 pagesize=pagesizes["a4"], 
+                 margin=0.005, 
+                 box=None,
+                 percent_box=None,
+                 scale=default_scale, 
+                 resolution=resolutions.dpi72,
+                 preserve_aspect=True,
+                 centering=centering.constrained,
+                 is_latlon=False,
+                 use_ocg_layers=False):
+        """Creates a cairo surface and context to render a PDF with.
+        
+        pagesize: tuple of page size in meters, see predefined sizes in pagessizes dict (default a4)
+        margin: page margin in meters (default 0.01)
+        box: box within the page to render the map into (will not render over margin). This should be 
+             a Mapnik Box2d object. Default is the full page within the margin
+        percent_box: as per box, but specified as a percent (0->1) of the full page size. If both box
+                     and percent_box are specified percent_box will be used.
+        scale: scale helper to use when rounding the map scale. This should be a function that
+               takes a single float and returns a float which is at least as large as the value
+               passed in. This is a 1:x scale.
+        resolution: the resolution to render non vector elements at (in DPI), defaults to 72 DPI
+        preserve_aspect: whether to preserve map aspect ratio. This defaults to True and it
+                         is recommended you do not change it unless you know what you are doing
+                         scales and so on will not work if this is False.
+        centering: Centering rules for maps where the scale rounding has reduced the map size.
+                   This should be a value from the centering class. The default is to center on the
+                   maps constrained axis, typically this will be horizontal for portrait pages and
+                   vertical for landscape pages.
+        is_latlon: Is the map in lat lon degrees. If true magic anti meridian logic is enabled
+        use_ocg_layers: Create OCG layers in the PDF, requires pyPdf >= 1.13
+        """
+        self._pagesize = pagesize
+        self._margin = margin
+        self._box = box
+        self._scale = scale
+        self._resolution = resolution
+        self._preserve_aspect = preserve_aspect
+        self._centering = centering
+        self._is_latlon = is_latlon
+        self._use_ocg_layers = use_ocg_layers
+        
+        self._s = None
+        self._layer_names = []
+        self._filename = None
+        
+        self.map_box = None
+        self.scale = None
+        
+        # don't both to round the scale if they are not preserving the aspect ratio
+        if not preserve_aspect:
+            self._scale = any_scale
+        
+        if percent_box:
+            self._box = Box2d(percent_box[0]*pagesize[0],percent_box[1]*pagesize[1],
+                         percent_box[2]*pagesize[0],percent_box[3]*pagesize[1])
+
+        if not HAS_PYCAIRO_MODULE:
+            raise Exception("PDF rendering only available when pycairo is available")
+        
+        self.font_name = "DejaVu Sans"
+    
+    def finish(self):
+        if self._s:
+            self._s.finish()
+            self._s = None
+        
+        if self._use_ocg_layers:
+            convert_pdf_pages_to_layers(self._filename,layer_names=self._layer_names + ["Legend and Information"],reverse_all_but_last=True)
+    
+    def add_geospatial_pdf_header(self,m,filename,epsg=None,wkt=None):
+        """ Postprocessing step to add geospatial PDF information to PDF file as per
+        PDF standard 1.7 extension level 3 (also in draft PDF v2 standard at time of writing)
+        
+        one of either the epsg code or wkt text for the projection must be provided
+        
+        Should be called *after* the page has had .finish() called"""
+        if HAS_PYPDF and (epsg or wkt):
+            infile=file(filename,'rb')
+            (outfd,outfilename) = tempfile.mkstemp(dir=os.path.dirname(filename))
+            outfile = os.fdopen(outfd,'wb')
+            
+            i=pyPdf.PdfFileReader(infile)
+            o=pyPdf.PdfFileWriter()
+            
+            # preserve OCProperties at document root if we have one
+            if i.trailer['/Root'].has_key(pyPdf.generic.NameObject('/OCProperties')):
+                o._root.getObject()[pyPdf.generic.NameObject('/OCProperties')] = i.trailer['/Root'].getObject()[pyPdf.generic.NameObject('/OCProperties')]
+            
+            for p in i.pages:
+                gcs = pyPdf.generic.DictionaryObject()
+                gcs[pyPdf.generic.NameObject('/Type')]=pyPdf.generic.NameObject('/PROJCS')
+                if epsg:
+                    gcs[pyPdf.generic.NameObject('/EPSG')]=pyPdf.generic.NumberObject(int(epsg))
+                if wkt:
+                    gcs[pyPdf.generic.NameObject('/WKT')]=pyPdf.generic.TextStringObject(wkt)
+                
+                measure = pyPdf.generic.DictionaryObject()
+                measure[pyPdf.generic.NameObject('/Type')]=pyPdf.generic.NameObject('/Measure')
+                measure[pyPdf.generic.NameObject('/Subtype')]=pyPdf.generic.NameObject('/GEO')
+                measure[pyPdf.generic.NameObject('/GCS')]=gcs
+                bounds=pyPdf.generic.ArrayObject()
+                for x in (0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0):
+                    bounds.append(pyPdf.generic.FloatObject(str(x)))
+                measure[pyPdf.generic.NameObject('/Bounds')]=bounds
+                measure[pyPdf.generic.NameObject('/LPTS')]=bounds
+                gpts=pyPdf.generic.ArrayObject()
+                
+                proj=Projection(m.srs)
+                env=m.envelope()
+                for x in ((env.minx, env.miny), (env.minx, env.maxy), (env.maxx, env.maxy), (env.maxx, env.miny)):
+                    latlon_corner=proj.inverse(Coord(*x))
+                    # these are in lat,lon order according to the standard
+                    gpts.append(pyPdf.generic.FloatObject(str(latlon_corner.y)))
+                    gpts.append(pyPdf.generic.FloatObject(str(latlon_corner.x)))
+                measure[pyPdf.generic.NameObject('/GPTS')]=gpts
+                
+                vp=pyPdf.generic.DictionaryObject()
+                vp[pyPdf.generic.NameObject('/Type')]=pyPdf.generic.NameObject('/Viewport')
+                bbox=pyPdf.generic.ArrayObject()
+                
+                for x in self.map_box:
+                    bbox.append(pyPdf.generic.FloatObject(str(x)))
+                vp[pyPdf.generic.NameObject('/BBox')]=bbox
+                vp[pyPdf.generic.NameObject('/Measure')]=measure
+                
+                vpa = pyPdf.generic.ArrayObject()
+                vpa.append(vp)
+                p[pyPdf.generic.NameObject('/VP')]=vpa
+                o.addPage(p)
+                
+            o.write(outfile)
+            infile=None
+            outfile.close()
+            os.rename(outfilename,filename)
+        
+    
+    def get_context(self):
+        """allow access so that extra 'bits' can be rendered to the page directly"""
+        return cairo.Context(self._s)
+    
+    def get_width(self):
+        return self._pagesize[0]
+
+    def get_height(self):
+        return self._pagesize[1]
+
+    def get_margin(self):
+        return self._margin
+    
+    def write_text(self,ctx,text,box_width=None,size=10, fill_color=(0.0, 0.0, 0.0), alignment=None):
+        if HAS_PANGOCAIRO_MODULE:
+            (attr,t,accel) = pango.parse_markup(text)
+            pctx = pangocairo.CairoContext(ctx)
+            l = pctx.create_layout()
+            l.set_attributes(attr)
+            fd = pango.FontDescription("%s %d" % (self.font_name,size))
+            l.set_font_description(fd)
+            if box_width:
+                l.set_width(int(box_width*pango.SCALE))
+            if alignment:
+                l.set_alignment(alignment)
+            pctx.update_layout(l)
+            l.set_text(t)
+            pctx.set_source_rgb(*fill_color)
+            pctx.show_layout(l)
+            return l.get_pixel_extents()[0]
+            
+        else:
+            ctx.rel_move_to(0,size)
+            ctx.select_font_face(self.font_name, cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL)
+            ctx.set_font_size(size)
+            ctx.show_text(text)
+            ctx.rel_move_to(0,size)
+            return (0,0,len(text)*size,size)
+
+    def _get_context(self):
+        if HAS_PANGOCAIRO_MODULE:
+            return 
+        elif HAS_PYCAIRO_MODULE:
+            return cairo.Context(self._s)
+        return None
+    
+    def _get_render_area(self):
+        """return a bounding box with the area of the page we are allowed to render out map to
+        in page coordinates (i.e. meters)
+        """
+        # take off our page margins
+        render_area = Box2d(self._margin,self._margin,self._pagesize[0]-self._margin,self._pagesize[1]-self._margin)
+        
+        #then if user specified a box to render get intersection with that
+        if self._box:
+            return render_area.intersect(self._box)
+        
+        return render_area
+
+    def _get_render_area_size(self):
+        """Get the width and height (in meters) of the area we can render the map to, returned as a tuple"""
+        render_area = self._get_render_area()
+        return (render_area.width(),render_area.height())
+
+    def _is_h_contrained(self,m):
+        """Test if the map size is constrained on the horizontal or vertical axes"""
+        available_area = self._get_render_area_size()
+        map_aspect = m.envelope().width()/m.envelope().height()
+        page_aspect = available_area[0]/available_area[1]
+        
+        return map_aspect > page_aspect
+
+    def _get_meta_info_corner(self,render_size,m):
+        """Get the corner (in page coordinates) of a possibly
+        sensible place to render metadata such as a legend or scale"""
+        (x,y) = self._get_render_corner(render_size,m)
+        if self._is_h_contrained(m):
+            y += render_size[1]+0.005
+            x = self._margin
+        else:
+            x += render_size[0]+0.005
+            y = self._margin
+            
+        return (x,y)
+
+    def _get_render_corner(self,render_size,m):
+        """Get the corner of the box we should render our map into"""
+        available_area = self._get_render_area()
+
+        x=available_area[0]
+        y=available_area[1]
+        
+        h_is_contrained = self._is_h_contrained(m)
+        
+        if (self._centering == centering.both or
+            self._centering == centering.horizontal or
+            (self._centering == centering.constrained and h_is_contrained) or
+            (self._centering == centering.unconstrained and not h_is_contrained)):
+            x+=(available_area.width()-render_size[0])/2
+
+        if (self._centering == centering.both or
+            self._centering == centering.vertical or
+            (self._centering == centering.constrained and not h_is_contrained) or
+            (self._centering == centering.unconstrained and h_is_contrained)):
+            y+=(available_area.height()-render_size[1])/2
+        return (x,y)
+    
+    def _get_map_pixel_size(self, width_page_m, height_page_m):
+        """for a given map size in paper coordinates return a tuple of the map 'pixel' size we
+        should create at the defined resolution"""
+        return (int(m2px(width_page_m,self._resolution)), int(m2px(height_page_m,self._resolution)))
+        
+    def render_map(self,m, filename):
+        """Render the given map to filename"""
+        
+        # store this for later so we can post process the PDF
+        self._filename = filename
+        
+        # work out the best scale to render out map at given the available space
+        (eff_width,eff_height) = self._get_render_area_size()
+        map_aspect = m.envelope().width()/m.envelope().height()
+        page_aspect = eff_width/eff_height
+        
+        scalex=m.envelope().width()/eff_width
+        scaley=m.envelope().height()/eff_height
+        
+        scale=max(scalex,scaley)
+
+        rounded_mapscale=self._scale(scale)
+        scalefactor = scale/rounded_mapscale
+        mapw=eff_width*scalefactor
+        maph=eff_height*scalefactor
+        if self._preserve_aspect:
+            if map_aspect > page_aspect:
+                maph=mapw*(1/map_aspect)
+            else:
+                mapw=maph*map_aspect
+        
+        # set the map size so that raster elements render at the correct resolution
+        m.resize(*self._get_map_pixel_size(mapw,maph))
+        # calculate the translation for the map starting point
+        (tx,ty) = self._get_render_corner((mapw,maph),m)
+        
+        # create our cairo surface and context and then render the map into it
+        self._s = cairo.PDFSurface(filename, m2pt(self._pagesize[0]),m2pt(self._pagesize[1]))
+        ctx=cairo.Context(self._s)
+        
+        for l in m.layers:
+            # extract the layer names for naming layers if we use OCG
+            self._layer_names.append(l.title or l.name)
+        
+            layer_map = Map(m.width,m.height,m.srs)
+            layer_map.layers.append(l)
+            for s in l.styles:
+                layer_map.append_style(s,m.find_style(s))
+            layer_map.zoom_to_box(m.envelope())
+        
+            def render_map():
+                ctx.save()
+                ctx.translate(m2pt(tx),m2pt(ty))
+                #cairo defaults to 72dpi
+                ctx.scale(72.0/self._resolution,72.0/self._resolution)
+                render(layer_map, ctx)
+                ctx.restore()
+            
+            # antimeridian
+            render_map()
+            if self._is_latlon and (m.envelope().minx < -180 or m.envelope().maxx > 180):
+                old_env = m.envelope()
+                if m.envelope().minx < -180:
+                    delta = 360
+                else:
+                    delta = -360
+                m.zoom_to_box(Box2d(old_env.minx+delta,old_env.miny,old_env.maxx+delta,old_env.maxy))
+                render_map()
+                # restore the original env
+                m.zoom_to_box(old_env)
+            
+            if self._use_ocg_layers:
+                self._s.show_page()
+        
+        self.scale = rounded_mapscale
+        self.map_box = Box2d(tx,ty,tx+mapw,ty+maph)
+
+    def render_on_map_lat_lon_grid(self,m,dec_degrees=True):
+        # don't render lat_lon grid if we are already in latlon
+        if self._is_latlon:
+            return
+        p2=Projection(m.srs)
+
+        latlon_bounds = p2.inverse(m.envelope())
+        if p2.inverse(m.envelope().center()).x > latlon_bounds.maxx:
+            latlon_bounds = Box2d(latlon_bounds.maxx,latlon_bounds.miny,latlon_bounds.minx+360,latlon_bounds.maxy)
+
+        if p2.inverse(m.envelope().center()).y > latlon_bounds.maxy:
+            latlon_bounds = Box2d(latlon_bounds.miny,latlon_bounds.maxy,latlon_bounds.maxx,latlon_bounds.miny+360)
+            
+        latlon_mapwidth = latlon_bounds.width()
+        # render an extra 20% so we generally won't miss the ends of lines
+        latlon_buffer = 0.2*latlon_mapwidth
+        if dec_degrees:
+            latlon_divsize = default_scale(latlon_mapwidth/7.0)
+        else:
+            latlon_divsize = deg_min_sec_scale(latlon_mapwidth/7.0)
+        latlon_interpsize = latlon_mapwidth/m.width
+        
+        self._render_lat_lon_axis(m,p2,latlon_bounds.minx,latlon_bounds.maxx,latlon_bounds.miny,latlon_bounds.maxy,latlon_buffer,latlon_interpsize,latlon_divsize,dec_degrees,True)
+        self._render_lat_lon_axis(m,p2,latlon_bounds.miny,latlon_bounds.maxy,latlon_bounds.minx,latlon_bounds.maxx,latlon_buffer,latlon_interpsize,latlon_divsize,dec_degrees,False)
+
+    def _render_lat_lon_axis(self,m,p2,x1,x2,y1,y2,latlon_buffer,latlon_interpsize,latlon_divsize,dec_degrees,is_x_axis):
+        ctx=cairo.Context(self._s)
+        ctx.set_source_rgb(1,0,0)
+        ctx.set_line_width(1)
+        latlon_labelsize = 6
+        
+        ctx.translate(m2pt(self.map_box.minx),m2pt(self.map_box.miny))
+        ctx.rectangle(0,0,m2pt(self.map_box.width()),m2pt(self.map_box.height()))
+        ctx.clip()
+        
+        ctx.select_font_face("DejaVu", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL)
+        ctx.set_font_size(latlon_labelsize)
+        
+        box_top = self.map_box.height()
+        if not is_x_axis:
+            ctx.translate(m2pt(self.map_box.width()/2),m2pt(self.map_box.height()/2))
+            ctx.rotate(-math.pi/2)
+            ctx.translate(-m2pt(self.map_box.height()/2),-m2pt(self.map_box.width()/2))
+            box_top = self.map_box.width()
+        
+        for xvalue in round_grid_generator(x1 - latlon_buffer,x2 + latlon_buffer,latlon_divsize):
+            yvalue = y1 - latlon_buffer
+            start_cross = None
+            end_cross = None
+            while yvalue < y2+latlon_buffer:
+                if is_x_axis:
+                    start = m.view_transform().forward(p2.forward(Coord(xvalue,yvalue)))
+                else:
+                    temp = m.view_transform().forward(p2.forward(Coord(yvalue,xvalue)))
+                    start = Coord(m2pt(self.map_box.height())-temp.y,temp.x)
+                yvalue += latlon_interpsize
+                if is_x_axis:
+                    end = m.view_transform().forward(p2.forward(Coord(xvalue,yvalue)))
+                else:
+                    temp = m.view_transform().forward(p2.forward(Coord(yvalue,xvalue)))
+                    end = Coord(m2pt(self.map_box.height())-temp.y,temp.x)
+
+                ctx.move_to(start.x,start.y)
+                ctx.line_to(end.x,end.y)
+                ctx.stroke()
+                
+                if cmp(start.y, 0) != cmp(end.y,0):
+                    start_cross = end.x
+                if cmp(start.y,m2pt(self.map_box.height())) != cmp(end.y, m2pt(self.map_box.height())):
+                    end_cross = end.x
+            
+            if dec_degrees:
+                line_text = "%g" % (xvalue)
+            else:
+                line_text = format_deg_min_sec(xvalue)
+            if start_cross:
+                ctx.move_to(start_cross+2,latlon_labelsize)
+                ctx.show_text(line_text)
+            if end_cross:
+                ctx.move_to(end_cross+2,m2pt(box_top)-2)
+                ctx.show_text(line_text)
+
+    def render_on_map_scale(self,m):
+        (div_size,page_div_size) = self._get_sensible_scalebar_size(m)
+        
+        first_value_x = (math.floor(m.envelope().minx / div_size) + 1) * div_size
+        first_value_x_percent = (first_value_x-m.envelope().minx)/m.envelope().width()
+        self._render_scale_axis(first_value_x,first_value_x_percent,self.map_box.minx,self.map_box.maxx,page_div_size,div_size,self.map_box.miny,self.map_box.maxy,True)
+        
+        first_value_y = (math.floor(m.envelope().miny / div_size) + 1) * div_size
+        first_value_y_percent = (first_value_y-m.envelope().miny)/m.envelope().height()
+        self._render_scale_axis(first_value_y,first_value_y_percent,self.map_box.miny,self.map_box.maxy,page_div_size,div_size,self.map_box.minx,self.map_box.maxx,False)
+        
+        if self._use_ocg_layers:
+            self._s.show_page()
+            self._layer_names.append("Coordinate Grid Overlay")
+            
+    def _get_sensible_scalebar_size(self,m,width=-1):
+        # aim for about 8 divisions across the map
+        # also make sure we can fit the bar with in page area width if specified
+        div_size = sequence_scale(m.envelope().width()/8, [1,2,5])
+        page_div_size = self.map_box.width()*div_size/m.envelope().width()
+        while width > 0 and page_div_size > width:
+            div_size /=2
+            page_div_size /= 2
+        return (div_size,page_div_size)
+
+    def _render_box(self,ctx,x,y,w,h,text=None,stroke_color=(0,0,0),fill_color=(0,0,0)):
+        ctx.set_line_width(1)
+        ctx.set_source_rgb(*fill_color)
+        ctx.rectangle(x,y,w,h)
+        ctx.fill()
+
+        ctx.set_source_rgb(*stroke_color)
+        ctx.rectangle(x,y,w,h)
+        ctx.stroke()
+        
+        if text:
+            ctx.move_to(x+1,y)
+            self.write_text(ctx,text,fill_color=[1-z for z in fill_color],size=h-2)
+
+    def _render_scale_axis(self,first,first_percent,start,end,page_div_size,div_size,boundary_start,boundary_end,is_x_axis):
+        prev = start
+        text = None
+        fill=(0,0,0)
+        border_size=8
+        value = first_percent * (end-start) + start
+        label_value = first-div_size
+        if self._is_latlon and label_value < -180:
+            label_value += 360
+        
+        ctx=cairo.Context(self._s)
+        
+        if not is_x_axis:
+            ctx.translate(m2pt(self.map_box.center().x),m2pt(self.map_box.center().y))
+            ctx.rotate(-math.pi/2)
+            ctx.translate(-m2pt(self.map_box.center().y),-m2pt(self.map_box.center().x))
+        
+        while value < end:
+            ctx.move_to(m2pt(value),m2pt(boundary_start))
+            ctx.line_to(m2pt(value),m2pt(boundary_end))
+            ctx.set_source_rgb(0.5,0.5,0.5)
+            ctx.set_line_width(1)
+            ctx.stroke()
+
+            for bar in (m2pt(boundary_start)-border_size,m2pt(boundary_end)):
+                self._render_box(ctx,m2pt(prev),bar,m2pt(value-prev),border_size,text,fill_color=fill)
+            
+            prev = value
+            value+=page_div_size
+            fill = [1-z for z in fill]
+            label_value += div_size 
+            if self._is_latlon and label_value > 180:
+                label_value -= 360
+            text = "%d" % label_value
+        else:
+            for bar in (m2pt(boundary_start)-border_size,m2pt(boundary_end)):
+                self._render_box(ctx,m2pt(prev),bar,m2pt(end-prev),border_size,fill_color=fill)
+
+    
+    def render_scale(self,m,ctx=None,width=0.05):
+        """ m: map to render scale for
+        ctx: A cairo context to render the scale to. If this is None (the default) then
+            automatically create a context and choose the best location for the scale bar.
+        width: Width of area available to render scale bar in (in m)
+        
+        will return the size of the rendered scale block in pts
+        """
+        
+        (w,h) = (0,0)
+        
+        # don't render scale if we are lat lon
+        # dont report scale if we have warped the aspect ratio
+        if self._preserve_aspect and not self._is_latlon:
+            bar_size=8.0
+            box_count=3
+            if ctx is None:
+                ctx=cairo.Context(self._s)
+                (tx,ty) = self._get_meta_info_corner((self.map_box.width(),self.map_box.height()),m)
+                ctx.translate(tx,ty)
+            
+            (div_size,page_div_size) = self._get_sensible_scalebar_size(m, width/box_count)
+
+    
+            div_unit = "m"
+            if div_size > 1000:
+                div_size /= 1000
+                div_unit = "km"
+            
+            text = "0%s" % div_unit
+            ctx.save()
+            if width > 0:
+                ctx.translate(m2pt(width-box_count*page_div_size)/2,0)
+            for ii in range(box_count):
+                fill=(ii%2,)*3
+                self._render_box(ctx, m2pt(ii*page_div_size), h, m2pt(page_div_size), bar_size, text, fill_color=fill)
+                fill = [1-z for z in fill]
+                text = "%g%s" % ((ii+1)*div_size,div_unit)
+            #else:
+            #    self._render_box(ctx, m2pt(box_count*page_div_size), h, m2pt(page_div_size), bar_size, text, fill_color=(1,1,1), stroke_color=(1,1,1))
+            w = (box_count)*page_div_size
+            h += bar_size
+            ctx.restore()
+
+            if width > 0:
+                box_width=m2pt(width)
+            else:
+                box_width = None
+
+            font_size=6
+            ctx.move_to(0,h)
+            if HAS_PANGOCAIRO_MODULE:
+                alignment = pango.ALIGN_CENTER
+            else:
+                alignment = None
+
+            text_ext=self.write_text(ctx,"Scale 1:%d" % self.scale,box_width=box_width,size=font_size, alignment=alignment)
+            h+=text_ext[3]+2
+        
+        return (w,h)
+
+    def render_legend(self,m, page_break=False, ctx=None, collumns=1,width=None, height=None, item_per_rule=False, attribution={}, legend_item_box_size=(0.015,0.0075)):
+        """ m: map to render legend for
+        ctx: A cairo context to render the legend to. If this is None (the default) then
+            automatically create a context and choose the best location for the legend.
+        width: Width of area available to render legend in (in m)
+        page_break: move to next page if legen over flows this one
+        collumns: number of collumns available in legend box
+        attribution: additional text that will be rendered in gray under the layer name. keyed by layer name
+        legend_item_box_size:  two tuple with width and height of legend item box size in meters
+        
+        will return the size of the rendered block in pts
+        """
+
+        (w,h) = (0,0)
+        if self._s:
+            if ctx is None:
+                ctx=cairo.Context(self._s)
+                (tx,ty) = self._get_meta_info_corner((self.map_box.width(),self.map_box.height()),m)
+                ctx.translate(m2pt(tx),m2pt(ty))
+                width = self._pagesize[0]-2*tx
+                height = self._pagesize[1]-self._margin-ty
+
+            x=0
+            y=0
+            if width:
+                cwidth = width/collumns
+                w=m2pt(width)
+            else:
+                cwidth = None
+            current_collumn = 0
+            
+            processed_layers = []
+            for l in reversed(m.layers):
+                have_layer_header = False
+                added_styles={}
+                layer_title = l.title or l.name
+                if layer_title in processed_layers:
+                    continue
+                processed_layers.append(layer_title)
+                
+                # check through the features to find which combinations of styles are active
+                # for each unique combination add a legend entry
+                for f in l.datasource.all_features():
+                    if f.num_geometries() > 0:
+                        active_rules = []
+                        rule_text = ""
+                        for s in l.styles:
+                            st = m.find_style(s)
+                            for r in st.rules:
+                                # we need to do the scale test here as well so we don't
+                                # add unused scale rules to the legend description
+                                if ((not r.filter) or r.filter.evaluate(f) == '1') and \
+                                    r.min_scale <= m.scale_denominator() and m.scale_denominator() < r.max_scale:
+                                    active_rules.append((s,r.name))
+                                    if r.filter and str(r.filter) != "true":
+                                        if len(rule_text) > 0:
+                                            rule_text += " AND "
+                                        if r.title:
+                                            rule_text += r.title
+                                        else:
+                                            rule_text += str(r.filter)
+                        active_rules = tuple(active_rules)
+                        if added_styles.has_key(active_rules):
+                            continue
+                        
+                        added_styles[active_rules] = (f,rule_text)
+                        if not item_per_rule:
+                            break
+                    else:
+                        added_styles[l] = (None,None)
+                
+                legend_items = added_styles.keys()
+                legend_items.sort()
+                for li in legend_items:
+                    if True:
+                        (f,rule_text) = added_styles[li]
+                    
+                        
+                        legend_map_size = (int(m2pt(legend_item_box_size[0])),int(m2pt(legend_item_box_size[1])))
+                        lemap=Map(legend_map_size[0],legend_map_size[1],srs=m.srs)
+                        if m.background:
+                            lemap.background = m.background
+                        # the buffer is needed to ensure that text labels that overflow the edge of the
+                        # map still render for the legend
+                        lemap.buffer_size=1000
+                        for s in l.styles:
+                            sty=m.find_style(s)
+                            lestyle = Style()
+                            for r in sty.rules:
+                                for sym in r.symbols:
+                                    try:
+                                        sym.avoid_edges=False
+                                    except:
+                                        print "**** Cant set avoid edges for rule", r.name
+                                if r.min_scale <= m.scale_denominator() and m.scale_denominator() < r.max_scale:
+                                    lerule = r
+                                    lerule.min_scale = 0
+                                    lerule.max_scale = float("inf")
+                                    lestyle.rules.append(lerule)
+                            lemap.append_style(s,lestyle)
+
+                        ds = MemoryDatasource()
+                        if f is None:
+                            ds=l.datasource
+                            layer_srs = l.srs
+                        elif f.envelope().width() == 0:
+                            ds.add_feature(Feature(f.id(),Geometry2d.from_wkt("POINT(0 0)"),**f.attributes))
+                            lemap.zoom_to_box(Box2d(-1,-1,1,1))
+                            layer_srs = m.srs
+                        else:
+                            ds.add_feature(f)
+                            layer_srs = l.srs
+
+                        lelayer = Layer("LegendLayer",layer_srs)
+                        lelayer.datasource = ds
+                        for s in l.styles:
+                            lelayer.styles.append(s)
+                        lemap.layers.append(lelayer)
+                        
+                        if f is None or f.envelope().width() != 0:
+                            lemap.zoom_all()
+                            lemap.zoom(1.1)
+                        
+                        item_size = legend_map_size[1]
+                        if not have_layer_header:
+                            item_size += 8
+
+                        if y+item_size > m2pt(height):
+                            current_collumn += 1
+                            y=0
+                            if current_collumn >= collumns:
+                                if page_break:
+                                    self._s.show_page()
+                                    x=0
+                                    current_collumn = 0
+                                else:
+                                    break
+
+                        if not have_layer_header and item_per_rule:
+                            ctx.move_to(x+m2pt(current_collumn*cwidth),y)
+                            e=self.write_text(ctx, l.name, m2pt(cwidth), 8)
+                            y+=e[3]+2
+                            have_layer_header = True
+                        ctx.save()
+                        ctx.translate(x+m2pt(current_collumn*cwidth),y)
+                        #extra save around map render as it sets up a clip box and doesn't clear it
+                        ctx.save()
+                        render(lemap, ctx)
+                        ctx.restore()
+                        
+                        ctx.rectangle(0,0,*legend_map_size)
+                        ctx.set_source_rgb(0.5,0.5,0.5)
+                        ctx.set_line_width(1)
+                        ctx.stroke()
+                        ctx.restore()
+
+                        ctx.move_to(x+legend_map_size[0]+m2pt(current_collumn*cwidth)+2,y)
+                        legend_entry_size = legend_map_size[1]
+                        legend_text_size = 0
+                        if not item_per_rule:
+                            rule_text = layer_title
+                        if rule_text:
+                            e=self.write_text(ctx, rule_text, m2pt(cwidth-legend_item_box_size[0]-0.005), 6)
+                            legend_text_size += e[3]
+                            ctx.rel_move_to(0,e[3])
+                        if attribution.has_key(layer_title):
+                            e=self.write_text(ctx, attribution[layer_title], m2pt(cwidth-legend_item_box_size[0]-0.005), 6, fill_color=(0.5,0.5,0.5))
+                            legend_text_size += e[3]
+                        
+                        if legend_text_size > legend_entry_size:
+                            legend_entry_size=legend_text_size
+                        
+                        y+=legend_entry_size +2
+                        if y > h:
+                            h = y
+        return (w,h)
+        
diff --git a/bindings/python/mapnik_color.cpp b/bindings/python/mapnik_color.cpp
index ff3a891..dd3543b 100644
--- a/bindings/python/mapnik_color.cpp
+++ b/bindings/python/mapnik_color.cpp
@@ -44,51 +44,52 @@ void export_color ()
 {
     using namespace boost::python;
     class_<color>("Color", init<int,int,int,int>(
-        ( arg("r"), arg("g"), arg("b"), arg("a") ),
-        "Creates a new color from its RGB components\n"
-        "and an alpha value.\n"
-        "All values between 0 and 255.\n")
+                      ( arg("r"), arg("g"), arg("b"), arg("a") ),
+                      "Creates a new color from its RGB components\n"
+                      "and an alpha value.\n"
+                      "All values between 0 and 255.\n")
         )
-  .def(init<int,int,int>(
-        ( arg("r"), arg("g"), arg("b") ),
-        "Creates a new color from its RGB components.\n"
-        "All values between 0 and 255.\n")
-        )
-  .def(init<std::string>(
-        ( arg("color_string") ),
-        "Creates a new color from its CSS string representation.\n"
-        "The string may be a CSS color name (e.g. 'blue')\n"
-        "or a hex color string (e.g. '#0000ff').\n")
-        )
-  .add_property("r",
-        &color::red,
-        &color::set_red,
-        "Gets or sets the red component.\n"
-        "The value is between 0 and 255.\n")
-  .add_property("g",
-        &color::green,
-        &color::set_green,
-        "Gets or sets the green component.\n"
-        "The value is between 0 and 255.\n")
-  .add_property("b",
-        &color::blue,
-        &color::set_blue,
-        "Gets or sets the blue component.\n"
-        "The value is between 0 and 255.\n")
-  .add_property("a",
-        &color::alpha,
-        &color::set_alpha,
-        "Gets or sets the alpha component.\n"
-        "The value is between 0 and 255.\n")
-  .def(self == self)
-  .def_pickle(color_pickle_suite())
-  .def("__str__",&color::to_string)
-  .def("to_hex_string",&color::to_hex_string,
-        "Returns the hexadecimal representation of this color.\n"
-        "\n"
-        "Example:\n"
-        ">>> c = Color('blue')\n"
-        ">>> c.to_hex_string()\n"
-        "'#0000ff'\n")
-  ;
+        .def(init<int,int,int>(
+                 ( arg("r"), arg("g"), arg("b") ),
+                 "Creates a new color from its RGB components.\n"
+                 "All values between 0 and 255.\n")
+            )
+        .def(init<std::string>(
+                 ( arg("color_string") ),
+                 "Creates a new color from its CSS string representation.\n"
+                 "The string may be a CSS color name (e.g. 'blue')\n"
+                 "or a hex color string (e.g. '#0000ff').\n")
+            )
+        .add_property("r",
+                      &color::red,
+                      &color::set_red,
+                      "Gets or sets the red component.\n"
+                      "The value is between 0 and 255.\n")
+        .add_property("g",
+                      &color::green,
+                      &color::set_green,
+                      "Gets or sets the green component.\n"
+                      "The value is between 0 and 255.\n")
+        .add_property("b",
+                      &color::blue,
+                      &color::set_blue,
+                      "Gets or sets the blue component.\n"
+                      "The value is between 0 and 255.\n")
+        .add_property("a",
+                      &color::alpha,
+                      &color::set_alpha,
+                      "Gets or sets the alpha component.\n"
+                      "The value is between 0 and 255.\n")
+        .def(self == self)
+        .def(self != self)
+        .def_pickle(color_pickle_suite())
+        .def("__str__",&color::to_string)
+        .def("to_hex_string",&color::to_hex_string,
+             "Returns the hexadecimal representation of this color.\n"
+             "\n"
+             "Example:\n"
+             ">>> c = Color('blue')\n"
+             ">>> c.to_hex_string()\n"
+             "'#0000ff'\n")
+        ;
 }
diff --git a/bindings/python/mapnik_coord.cpp b/bindings/python/mapnik_coord.cpp
index 0891134..8a49707 100644
--- a/bindings/python/mapnik_coord.cpp
+++ b/bindings/python/mapnik_coord.cpp
@@ -43,9 +43,9 @@ void export_coord()
 {
     using namespace boost::python;
     class_<coord<double,2> >("Coord",init<double, double>( 
-              // class docstring is in mapnik/__init__.py, class _Coord
-              (arg("x"), arg("y")),
-              "Constructs a new point with the given coordinates.\n")
+                                 // class docstring is in mapnik/__init__.py, class _Coord
+                                 (arg("x"), arg("y")),
+                                 "Constructs a new point with the given coordinates.\n")
         )
         .def_pickle(coord_pickle_suite())
         .def_readwrite("x", &coord<double,2>::x,
diff --git a/bindings/python/mapnik_datasource.cpp b/bindings/python/mapnik_datasource.cpp
index 3aff2e4..cc9cf23 100644
--- a/bindings/python/mapnik_datasource.cpp
+++ b/bindings/python/mapnik_datasource.cpp
@@ -28,7 +28,7 @@
 #include <vector>
 
 // mapnik
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 #include <mapnik/datasource.hpp>
 #include <mapnik/datasource_cache.hpp>
 #include <mapnik/feature_layer_desc.hpp>
@@ -37,101 +37,127 @@
 
 using mapnik::datasource;
 using mapnik::point_datasource;
+using mapnik::memory_datasource;
 using mapnik::layer_descriptor;
 using mapnik::attribute_descriptor;
 
 namespace  
 {
-    //user-friendly wrapper that uses Python dictionary
-    using namespace boost::python;
-    boost::shared_ptr<mapnik::datasource> create_datasource(const dict& d)
+//user-friendly wrapper that uses Python dictionary
+using namespace boost::python;
+boost::shared_ptr<mapnik::datasource> create_datasource(const dict& d)
+{
+    bool bind=true;
+    mapnik::parameters params;
+    boost::python::list keys=d.keys();
+    for (int i=0; i<len(keys); ++i)
     {
-        mapnik::parameters params;
-        boost::python::list keys=d.keys();
-        for (int i=0; i<len(keys); ++i)
+        std::string key = extract<std::string>(keys[i]);
+        object obj = d[key];
+        
+        if (key == "bind")
         {
-            std::string key = extract<std::string>(keys[i]);
-            object obj = d[key];
-            extract<std::string> ex0(obj);
-            extract<int> ex1(obj);
-            extract<double> ex2(obj);
-            
-            if (ex0.check())
-            {
-               params[key] = ex0();
-            }
-            else if (ex1.check())
-            {
-               params[key] = ex1();
-            }
-            else if (ex2.check())
-            {
-               params[key] = ex2();
-            }
+            bind = extract<bool>(obj)();
+            continue;
         }
         
-        return mapnik::datasource_cache::create(params);
-    }
-    
-    std::string describe(boost::shared_ptr<mapnik::datasource> const& ds)
-    {
-        std::stringstream ss;
-        if (ds)
+        extract<std::string> ex0(obj);
+        extract<int> ex1(obj);
+        extract<double> ex2(obj);
+            
+        if (ex0.check())
         {
-            ss << ds->get_descriptor() << "\n";
+            params[key] = ex0();
         }
-        else
+        else if (ex1.check())
         {
-            ss << "Null\n";
+            params[key] = ex1();
+        }
+        else if (ex2.check())
+        {
+            params[key] = ex2();
         }
-        return ss.str();
     }
+        
+    return mapnik::datasource_cache::create(params, bind);
+}
     
-    std::string encoding(boost::shared_ptr<mapnik::datasource> const& ds)
+std::string describe(boost::shared_ptr<mapnik::datasource> const& ds)
+{
+    std::stringstream ss;
+    if (ds)
     {
-            layer_descriptor ld = ds->get_descriptor();
-            return ld.get_encoding();
+        ss << ds->get_descriptor() << "\n";
     }
-
-    std::string name(boost::shared_ptr<mapnik::datasource> const& ds)
+    else
     {
-            layer_descriptor ld = ds->get_descriptor();
-            return ld.get_name();
+        ss << "Null\n";
     }
+    return ss.str();
+}
+    
+std::string encoding(boost::shared_ptr<mapnik::datasource> const& ds)
+{
+    layer_descriptor ld = ds->get_descriptor();
+    return ld.get_encoding();
+}
 
-    boost::python::list fields(boost::shared_ptr<mapnik::datasource> const& ds)
+std::string name(boost::shared_ptr<mapnik::datasource> const& ds)
+{
+    layer_descriptor ld = ds->get_descriptor();
+    return ld.get_name();
+}
+
+boost::python::list fields(boost::shared_ptr<mapnik::datasource> const& ds)
+{
+    boost::python::list flds;
+    if (ds)
     {
-        boost::python::list flds;
-        if (ds)
+        layer_descriptor ld = ds->get_descriptor();
+        std::vector<attribute_descriptor> const& desc_ar = ld.get_descriptors();
+        std::vector<attribute_descriptor>::const_iterator it = desc_ar.begin();
+        std::vector<attribute_descriptor>::const_iterator end = desc_ar.end();
+        for (; it != end; ++it)
         {
-            layer_descriptor ld = ds->get_descriptor();
-            std::vector<attribute_descriptor> const& desc_ar = ld.get_descriptors();
-            std::vector<attribute_descriptor>::const_iterator it = desc_ar.begin();
-            std::vector<attribute_descriptor>::const_iterator end = desc_ar.end();
-            for (; it != end; ++it)
-            {
-               flds.append(it->get_name());
-            }
+            flds.append(it->get_name());
         }
-        return flds;
     }
-    boost::python::list field_types(boost::shared_ptr<mapnik::datasource> const& ds)
+    return flds;
+}
+boost::python::list field_types(boost::shared_ptr<mapnik::datasource> const& ds)
+{
+    boost::python::list fld_types;
+    if (ds)
     {
-        boost::python::list fld_types;
-        if (ds)
-        {
-            layer_descriptor ld = ds->get_descriptor();
-            std::vector<attribute_descriptor> const& desc_ar = ld.get_descriptors();
-            std::vector<attribute_descriptor>::const_iterator it = desc_ar.begin();
-            std::vector<attribute_descriptor>::const_iterator end = desc_ar.end();
-            for (; it != end; ++it)
-            {  
-               unsigned type = it->get_type();
-               fld_types.append(type);
-            }
+        layer_descriptor ld = ds->get_descriptor();
+        std::vector<attribute_descriptor> const& desc_ar = ld.get_descriptors();
+        std::vector<attribute_descriptor>::const_iterator it = desc_ar.begin();
+        std::vector<attribute_descriptor>::const_iterator end = desc_ar.end();
+        for (; it != end; ++it)
+        {  
+            unsigned type = it->get_type();
+            if (type == mapnik::Integer)
+                // this crashes, so send back strings instead
+                //fld_types.append(boost::python::object(boost::python::handle<>(&PyInt_Type)));
+                fld_types.append(boost::python::str("int"));
+            else if (type == mapnik::Float)
+                fld_types.append(boost::python::str("float"));
+            else if (type == mapnik::Double)
+                fld_types.append(boost::python::str("float"));
+            else if (type == mapnik::String)
+                fld_types.append(boost::python::str("str"));
+            else if (type == mapnik::Boolean)
+                fld_types.append(boost::python::str("bool"));
+            else if (type == mapnik::Geometry)
+                fld_types.append(boost::python::str("geometry"));
+            else if (type == mapnik::Object)
+                fld_types.append(boost::python::str("object"));
+            else
+                fld_types.append(boost::python::str("unknown"));
         }
-        return fld_types;
-    }}
+    }
+    return fld_types;
+}}
 
 void export_datasource()
 {
@@ -142,8 +168,9 @@ void export_datasource()
         .def("envelope",&datasource::envelope)
         .def("descriptor",&datasource::get_descriptor) //todo
         .def("features",&datasource::features)
+        .def("bind",&datasource::bind)
         .def("fields",&fields)
-        .def("_field_types",&field_types)
+        .def("field_types",&field_types)
         .def("encoding",&encoding) //todo expose as property
         .def("name",&name)
         .def("features_at_point",&datasource::features_at_point)
@@ -158,4 +185,14 @@ void export_datasource()
     class_<point_datasource, bases<datasource>, boost::noncopyable>("PointDatasource", init<>())
         .def("add_point",&point_datasource::add_point)
         ;
+
+
+    class_<memory_datasource, bases<datasource>, boost::noncopyable>("MemoryDatasource", init<>())
+        .def("add_feature",&memory_datasource::push,
+             "Adds a Feature:\n"
+             ">>> ms = MemoryDatasource()\n"
+             ">>> feature = Feature(1)\n"
+             ">>> ms.add_feature(Feature(1))\n")
+        .def("num_features",&memory_datasource::size)
+        ;
 }
diff --git a/bindings/python/mapnik_enumeration.hpp b/bindings/python/mapnik_enumeration.hpp
index c3310cd..21a5e1a 100644
--- a/bindings/python/mapnik_enumeration.hpp
+++ b/bindings/python/mapnik_enumeration.hpp
@@ -26,61 +26,62 @@ namespace mapnik {
 
 template <typename EnumWrapper>
 class enumeration_ :
-    public boost::python::enum_<typename EnumWrapper::native_type> 
+        public boost::python::enum_<typename EnumWrapper::native_type> 
 {
-        // some short cuts
-        typedef boost::python::enum_<typename EnumWrapper::native_type> base_type;
-        typedef typename EnumWrapper::native_type native_type;
-    public:
-        enumeration_() :
-            base_type( EnumWrapper::get_name().c_str() )
-        {
-            init();
-        }
-        enumeration_(const char * python_alias) :
-            base_type( python_alias )
-        {
-            init();
-        }
-        enumeration_(const char * python_alias, const char * doc) :
+    // some short cuts
+    typedef boost::python::enum_<typename EnumWrapper::native_type> base_type;
+    typedef typename EnumWrapper::native_type native_type;
+public:
+    enumeration_() :
+        base_type( EnumWrapper::get_name().c_str() )
+    {
+        init();
+    }
+    enumeration_(const char * python_alias) :
+        base_type( python_alias )
+    {
+        init();
+    }
 #if BOOST_VERSION >= 103500
-            base_type( python_alias, doc )
+    enumeration_(const char * python_alias, const char * doc) :
+        base_type( python_alias, doc )
 #else
-            // Boost.Python < 1.35.0 doesn't support
-            // docstrings for enums so we ignore it.
-            base_type( python_alias )
+    enumeration_(const char * python_alias, const char * /*doc*/) :
+        // Boost.Python < 1.35.0 doesn't support
+        // docstrings for enums so we ignore it.
+        base_type( python_alias )
 #endif
-        {
-            init();
-        }
+    {
+        init();
+    }
 
-    private:
-        struct converter
+private:
+    struct converter
+    {
+        static PyObject* convert(EnumWrapper const& v)
         {
-            static PyObject* convert(EnumWrapper const& v)
-            {
-                // Redirect conversion to a static method of our base class's
-                // base class. A free template converter will not work because
-                // the base_type::base typedef is protected.
-                // Lets hope MSVC agrees that this is legal C++
-                using namespace boost::python::converter;
-                return base_type::base::to_python(
-                        registered<native_type>::converters.m_class_object
-                        ,  static_cast<long>( v ));
+            // Redirect conversion to a static method of our base class's
+            // base class. A free template converter will not work because
+            // the base_type::base typedef is protected.
+            // Lets hope MSVC agrees that this is legal C++
+            using namespace boost::python::converter;
+            return base_type::base::to_python(
+                registered<native_type>::converters.m_class_object
+                ,  static_cast<long>( v ));
 
-            }
-        };
+        }
+    };
 
-        void init() {
-            boost::python::implicitly_convertible<native_type, EnumWrapper>();
-            boost::python::to_python_converter<EnumWrapper, converter >();
+    void init() {
+        boost::python::implicitly_convertible<native_type, EnumWrapper>();
+        boost::python::to_python_converter<EnumWrapper, converter >();
 
-            for (unsigned i = 0; i < EnumWrapper::MAX; ++i)
-            {
-                // Register the strings allready defined for this enum.
-               base_type::value( EnumWrapper::get_string( i ), native_type( i ) );
-            }
+        for (unsigned i = 0; i < EnumWrapper::MAX; ++i)
+        {
+            // Register the strings already defined for this enum.
+            base_type::value( EnumWrapper::get_string( i ), native_type( i ) );
         }
+    }
 
 };
 
diff --git a/bindings/python/mapnik_envelope.cpp b/bindings/python/mapnik_envelope.cpp
index 46c6d05..edef9cc 100644
--- a/bindings/python/mapnik_envelope.cpp
+++ b/bindings/python/mapnik_envelope.cpp
@@ -25,151 +25,206 @@
 #include <boost/python.hpp>
 
 // mapnik
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
+#include <mapnik/value_error.hpp>
 
 using mapnik::coord;
-using mapnik::Envelope;
+using mapnik::box2d;
 
 struct envelope_pickle_suite : boost::python::pickle_suite
 {
     static boost::python::tuple
-    getinitargs(const Envelope<double>& e)
+    getinitargs(const box2d<double>& e)
     {
         using namespace boost::python;
         return boost::python::make_tuple(e.minx(),e.miny(),e.maxx(),e.maxy());
     }
 };
 
+box2d<double> from_string(std::string const& s)
+{
+    box2d<double> bbox;
+    bool success = bbox.from_string(s);
+    if (success)
+    {
+        return bbox;
+    }
+    else
+    {
+        std::stringstream ss;
+        ss << "Could not parse bbox from string: '" << s << "'";
+        throw mapnik::value_error(ss.str());
+    }
+}
+
 //define overloads here
-void (Envelope<double>::*width_p1)(double) = &Envelope<double>::width;
-double (Envelope<double>::*width_p2)() const = &Envelope<double>::width;
+void (box2d<double>::*width_p1)(double) = &box2d<double>::width;
+double (box2d<double>::*width_p2)() const = &box2d<double>::width;
 
-void (Envelope<double>::*height_p1)(double) = &Envelope<double>::height;
-double (Envelope<double>::*height_p2)() const = &Envelope<double>::height;
+void (box2d<double>::*height_p1)(double) = &box2d<double>::height;
+double (box2d<double>::*height_p2)() const = &box2d<double>::height;
 
-void (Envelope<double>::*expand_to_include_p1)(double,double) = &Envelope<double>::expand_to_include;
-void (Envelope<double>::*expand_to_include_p2)(coord<double,2> const& ) = &Envelope<double>::expand_to_include;
-void (Envelope<double>::*expand_to_include_p3)(Envelope<double> const& ) = &Envelope<double>::expand_to_include;
+void (box2d<double>::*expand_to_include_p1)(double,double) = &box2d<double>::expand_to_include;
+void (box2d<double>::*expand_to_include_p2)(coord<double,2> const& ) = &box2d<double>::expand_to_include;
+void (box2d<double>::*expand_to_include_p3)(box2d<double> const& ) = &box2d<double>::expand_to_include;
 
-bool (Envelope<double>::*contains_p1)(double,double) const = &Envelope<double>::contains;
-bool (Envelope<double>::*contains_p2)(coord<double,2> const&) const = &Envelope<double>::contains;
-bool (Envelope<double>::*contains_p3)(Envelope<double> const&) const = &Envelope<double>::contains;
+bool (box2d<double>::*contains_p1)(double,double) const = &box2d<double>::contains;
+bool (box2d<double>::*contains_p2)(coord<double,2> const&) const = &box2d<double>::contains;
+bool (box2d<double>::*contains_p3)(box2d<double> const&) const = &box2d<double>::contains;
 
 //intersects
-bool (Envelope<double>::*intersects_p1)(double,double) const = &Envelope<double>::intersects;
-bool (Envelope<double>::*intersects_p2)(coord<double,2> const&) const = &Envelope<double>::intersects;
-bool (Envelope<double>::*intersects_p3)(Envelope<double> const&) const = &Envelope<double>::intersects;
+bool (box2d<double>::*intersects_p1)(double,double) const = &box2d<double>::intersects;
+bool (box2d<double>::*intersects_p2)(coord<double,2> const&) const = &box2d<double>::intersects;
+bool (box2d<double>::*intersects_p3)(box2d<double> const&) const = &box2d<double>::intersects;
 
 // intersect
-Envelope<double> (Envelope<double>::*intersect)(Envelope<double> const&) const = &Envelope<double>::intersect;
+box2d<double> (box2d<double>::*intersect)(box2d<double> const&) const = &box2d<double>::intersect;
+
+// re_center
+void (box2d<double>::*re_center_p1)(double,double) = &box2d<double>::re_center;
+void (box2d<double>::*re_center_p2)(coord<double,2> const& ) = &box2d<double>::re_center;
+
+// clip
+void (box2d<double>::*clip)(box2d<double> const&) = &box2d<double>::clip;
 
 void export_envelope()
 {
     using namespace boost::python;
-    class_<Envelope<double> >("Envelope",
-                              // class docstring is in mapnik/__init__.py, class _Coord
-                              init<double,double,double,double>(
+    class_<box2d<double> >("Box2d",
+                           // class docstring is in mapnik/__init__.py, class _Coord
+                           init<double,double,double,double>(
                                (arg("minx"),arg("miny"),arg("maxx"),arg("maxy")),
                                "Constructs a new envelope from the coordinates\n"
                                "of its lower left and upper right corner points.\n"))
-        .def(init<>("Equivalent to Envelope(0, 0, -1, -1).\n"))
+        .def(init<>("Equivalent to Box2d(0, 0, -1, -1).\n"))
         .def(init<const coord<double,2>&, const coord<double,2>&>(
-              (arg("ll"),arg("ur")),
-              "Equivalent to Envelope(ll.x, ll.y, ur.x, ur.y).\n"))
-        .add_property("minx", &Envelope<double>::minx, 
+                 (arg("ll"),arg("ur")),
+                 "Equivalent to Box2d(ll.x, ll.y, ur.x, ur.y).\n"))
+        .def("from_string",from_string)
+        .staticmethod("from_string")
+        .add_property("minx", &box2d<double>::minx, 
                       "X coordinate for the lower left corner")
-        .add_property("miny", &Envelope<double>::miny, 
+        .add_property("miny", &box2d<double>::miny, 
                       "Y coordinate for the lower left corner")
-        .add_property("maxx", &Envelope<double>::maxx,
+        .add_property("maxx", &box2d<double>::maxx,
                       "X coordinate for the upper right corner")
-        .add_property("maxy", &Envelope<double>::maxy, 
+        .add_property("maxy", &box2d<double>::maxy, 
                       "Y coordinate for the upper right corner")
-        .def("center", &Envelope<double>::center,
+        .def("center", &box2d<double>::center,
              "Returns the coordinates of the center of the bounding box.\n"
              "\n"
              "Example:\n"
-             ">>> e = Envelope(0, 0, 100, 100)\n"
+             ">>> e = Box2d(0, 0, 100, 100)\n"
              ">>> e.center()\n"
              "Coord(50, 50)\n")
-        .def("center", &Envelope<double>::re_center,
+        .def("center", re_center_p1,
              (arg("x"), arg("y")),
              "Moves the envelope so that the given coordinates become its new center.\n"
              "The width and the height are preserved.\n"
              "\n "
              "Example:\n"
-             ">>> e = Envelope(0, 0, 100, 100)\n"
+             ">>> e = Box2d(0, 0, 100, 100)\n"
              ">>> e.center(60, 60)\n"
              ">>> e.center()\n"
              "Coord(60.0,60.0)\n"
              ">>> (e.width(), e.height())\n"
              "(100.0, 100.0)\n"
              ">>> e\n"
-             "Envelope(10.0, 10.0, 110.0, 110.0)\n"
-             )
+             "Box2d(10.0, 10.0, 110.0, 110.0)\n"
+            )
+        .def("center", re_center_p2,
+             (arg("Coord")),
+             "Moves the envelope so that the given coordinates become its new center.\n"
+             "The width and the height are preserved.\n"
+             "\n "
+             "Example:\n"
+             ">>> e = Box2d(0, 0, 100, 100)\n"
+             ">>> e.center(Coord60, 60)\n"
+             ">>> e.center()\n"
+             "Coord(60.0,60.0)\n"
+             ">>> (e.width(), e.height())\n"
+             "(100.0, 100.0)\n"
+             ">>> e\n"
+             "Box2d(10.0, 10.0, 110.0, 110.0)\n"
+            )
+        .def("clip", clip,
+             (arg("other")),
+             "Clip the envelope based on the bounds of another envelope.\n"
+             "\n "
+             "Example:\n"
+             ">>> e = Box2d(0, 0, 100, 100)\n"
+             ">>> e.center(Coord60, 60)\n"
+             ">>> e.center()\n"
+             "Coord(60.0,60.0)\n"
+             ">>> (e.width(), e.height())\n"
+             "(100.0, 100.0)\n"
+             ">>> e\n"
+             "Box2d(10.0, 10.0, 110.0, 110.0)\n"
+            )
         .def("width", width_p1,
              (arg("new_width")),
              "Sets the width to new_width of the envelope preserving its center.\n"
              "\n "
              "Example:\n"
-             ">>> e = Envelope(0, 0, 100, 100)\n"
+             ">>> e = Box2d(0, 0, 100, 100)\n"
              ">>> e.width(120)\n"
              ">>> e.center()\n"
              "Coord(50.0,50.0)\n"
              ">>> e\n"
-             "Envelope(-10.0, 0.0, 110.0, 100.0)\n"
-             )
+             "Box2d(-10.0, 0.0, 110.0, 100.0)\n"
+            )
         .def("width", width_p2,
              "Returns the width of this envelope.\n"
-             )
+            )
         .def("height", height_p1,
              (arg("new_height")),
              "Sets the height to new_height of the envelope preserving its center.\n"
              "\n "
              "Example:\n"
-             ">>> e = Envelope(0, 0, 100, 100)\n"
+             ">>> e = Box2d(0, 0, 100, 100)\n"
              ">>> e.height(120)\n"
              ">>> e.center()\n"
              "Coord(50.0,50.0)\n"
              ">>> e\n"
-             "Envelope(0.0, -10.0, 100.0, 110.0)\n"
-             )
+             "Box2d(0.0, -10.0, 100.0, 110.0)\n"
+            )
         .def("height", height_p2,
              "Returns the height of this envelope.\n"
-             )
+            )
         .def("expand_to_include",expand_to_include_p1,
              (arg("x"),arg("y")),
              "Expands this envelope to include the point given by x and y.\n"
              "\n"
              "Example:\n",
-             ">>> e = Envelope(0, 0, 100, 100)\n"
+             ">>> e = Box2d(0, 0, 100, 100)\n"
              ">>> e.expand_to_include(110, 110)\n"
              ">>> e\n"
-             "Envelope(0.0, 00.0, 110.0, 110.0)\n"
-             )
+             "Box2d(0.0, 00.0, 110.0, 110.0)\n"
+            )
         .def("expand_to_include",expand_to_include_p2,
              (arg("p")),
              "Equivalent to expand_to_include(p.x, p.y)\n"
-             )
+            )
         .def("expand_to_include",expand_to_include_p3,
              (arg("other")),
              "Equivalent to:\n"
              "  expand_to_include(other.minx, other.miny)\n"
              "  expand_to_include(other.maxx, other.maxy)\n"
-             )
+            )
         .def("contains",contains_p1,
              (arg("x"),arg("y")),
              "Returns True iff this envelope contains the point\n"
              "given by x and y.\n"
-             )
+            )
         .def("contains",contains_p2,
              (arg("p")),
              "Equivalent to contains(p.x, p.y)\n"
-             )
+            )
         .def("contains",contains_p3,
              (arg("other")),
              "Equivalent to:\n"
              "  contains(other.minx, other.miny) and contains(other.maxx, other.maxy)\n"
-             )
+            )
         .def("intersects",intersects_p1,
              (arg("x"),arg("y")),
              "Returns True iff this envelope intersects the point\n"
@@ -178,7 +233,7 @@ void export_envelope()
              "Note: For points, intersection is equivalent\n"
              "to containment, i.e. the following holds:\n"
              "   e.contains(x, y) == e.intersects(x, y)\n"
-             )
+            )
         .def("intersects",intersects_p2,
              (arg("p")),
              "Equivalent to contains(p.x, p.y)\n")
@@ -188,30 +243,33 @@ void export_envelope()
              "This relationship is symmetric."
              "\n"
              "Example:\n"
-             ">>> e1 = Envelope(0, 0, 100, 100)\n"
-             ">>> e2 = Envelope(50, 50, 150, 150)\n"
+             ">>> e1 = Box2d(0, 0, 100, 100)\n"
+             ">>> e2 = Box2d(50, 50, 150, 150)\n"
              ">>> e1.intersects(e2)\n"
              "True\n"
              ">>> e1.contains(e2)\n"
              "False\n"
-             )
+            )
         .def("intersect",intersect,
              (arg("other")),
              "Returns the overlap of this envelope and the other envelope\n"
              "as a new envelope.\n"
              "\n"
              "Example:\n"
-             ">>> e1 = Envelope(0, 0, 100, 100)\n"
-             ">>> e2 = Envelope(50, 50, 150, 150)\n"
+             ">>> e1 = Box2d(0, 0, 100, 100)\n"
+             ">>> e2 = Box2d(50, 50, 150, 150)\n"
              ">>> e1.intersect(e2)\n"
-             "Envelope(50.0, 50.0, 100.0, 100.0)\n"     
-             )
+             "Box2d(50.0, 50.0, 100.0, 100.0)\n"     
+            )
         .def(self == self) // __eq__
+        .def(self != self) // __neq__
         .def(self + self)  // __add__
-        .def(self - self)  // __sub__
+        //.def(self - self)  // __sub__
         .def(self * float()) // __mult__
         .def(float() * self) 
         .def(self / float()) // __div__
+        .def("__getitem__",&box2d<double>::operator[])
+        .def("valid",&box2d<double>::valid)
         .def_pickle(envelope_pickle_suite())
         ;
 }
diff --git a/bindings/python/mapnik_expression.cpp b/bindings/python/mapnik_expression.cpp
new file mode 100644
index 0000000..49ec24e
--- /dev/null
+++ b/bindings/python/mapnik_expression.cpp
@@ -0,0 +1,90 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#include <boost/python.hpp>
+// mapnik
+#include <mapnik/feature.hpp>
+#include <mapnik/filter_factory.hpp>
+#include <mapnik/expression_string.hpp>
+#include <mapnik/expression_evaluator.hpp>
+#include <mapnik/parse_path.hpp>
+#include <mapnik/value.hpp>
+
+#include <boost/variant.hpp>
+
+using mapnik::Feature;
+using mapnik::expression_ptr;
+using mapnik::parse_expression;
+using mapnik::to_expression_string;
+using mapnik::path_expression_ptr;
+
+
+// expression
+expression_ptr parse_expression_(std::string const& wkt)
+{
+    return parse_expression(wkt,"utf8");
+}
+
+mapnik::value expression_evaluate_(mapnik::expr_node const& expr, mapnik::Feature const& f)
+{
+    // will be auto-converted to proper python type by `mapnik_value_to_python`
+    return boost::apply_visitor(mapnik::evaluate<mapnik::Feature,mapnik::value>(f),expr);
+}
+
+// path expression
+path_expression_ptr parse_path_(std::string const& path)
+{
+    return mapnik::parse_path(path);
+}
+
+std::string path_to_string_(mapnik::path_expression const& expr)
+{
+    return mapnik::path_processor_type::to_string(expr);
+}
+
+std::string path_evaluate_(mapnik::path_expression const& expr, mapnik::Feature const& f)
+{
+    return mapnik::path_processor_type::evaluate(expr, f);
+}
+
+void export_expression()
+{
+    using namespace boost::python;
+    class_<mapnik::expr_node ,boost::noncopyable>("Expression",
+                                                  "TODO"
+                                                  "",no_init)
+        .def("evaluate", &expression_evaluate_)
+        .def("__str__",&to_expression_string);
+    ;
+    
+    def("Expression",&parse_expression_,(arg("expr")),"Expression string");
+
+    class_<mapnik::path_expression ,boost::noncopyable>("PathExpression",
+                                                        "TODO"
+                                                        "",no_init)
+        .def("evaluate", &path_evaluate_) // note: "pass" is a reserved word in Python
+        .def("__str__",&path_to_string_);
+    ;
+    
+    def("PathExpression",&parse_path_,(arg("expr")),"PathExpression string");
+}
diff --git a/bindings/python/mapnik_feature.cpp b/bindings/python/mapnik_feature.cpp
index 734a90f..898540d 100644
--- a/bindings/python/mapnik_feature.cpp
+++ b/bindings/python/mapnik_feature.cpp
@@ -28,199 +28,245 @@
 #include <boost/python/tuple.hpp>
 #include <boost/python.hpp>
 #include <boost/scoped_array.hpp>
+
 // mapnik
 #include <mapnik/feature.hpp>
+#include <mapnik/datasource.hpp>
+#include <mapnik/wkb.hpp>
+#include <mapnik/wkt/wkt_factory.hpp>
+#include "mapnik_value_converter.hpp"
+
+mapnik::geometry_type & (mapnik::Feature::*get_geom1)(unsigned) = &mapnik::Feature::get_geometry;
 
-mapnik::geometry2d & (mapnik::Feature::*get_geom1)(unsigned) = &mapnik::Feature::get_geometry;
+namespace {
+
+using mapnik::Feature;
+using mapnik::geometry_utils;
+using mapnik::from_wkt;
+
+void feature_add_geometries_from_wkb(Feature &feature, std::string wkb)
+{
+    geometry_utils::from_wkb(feature.paths(), wkb.c_str(), wkb.size(), true);
+}
+
+void feature_add_geometries_from_wkt(Feature &feature, std::string wkt)
+{
+    bool result = mapnik::from_wkt(wkt, feature.paths());
+    if (!result) throw std::runtime_error("Failed to parse WKT");
+}
+
+} // end anonymous namespace
 
 namespace boost { namespace python {
-      struct value_converter : public boost::static_visitor<PyObject*>
-      {
-            PyObject * operator() (int val) const
-            {
-               return ::PyInt_FromLong(val);
-            }
-            
-            PyObject * operator() (double val) const
-            {
-               return ::PyFloat_FromDouble(val);
-            }
-            
-            PyObject * operator() (UnicodeString const& s) const
-            {
-                std::string buffer;
-                mapnik::to_utf8(s,buffer);
-                PyObject *obj = Py_None;
-                obj = ::PyUnicode_DecodeUTF8(buffer.c_str(),implicit_cast<ssize_t>(buffer.length()),0);                
-                return obj;
-            }
-            
-            PyObject * operator() (mapnik::value_null const& s) const
-            {
-               return NULL;
-            }
-      };
-      
-      struct mapnik_value_to_python
-      {
-            static PyObject* convert(mapnik::value const& v)
-            {
-               return boost::apply_visitor(value_converter(),v.base());
-            }
-      };
-      
-      // Forward declaration
-      template <class Container, bool NoProxy, class DerivedPolicies>
-      class map_indexing_suite2;
-
-      namespace detail
-      {
-         template <class Container, bool NoProxy>
-         class final_map_derived_policies
-            : public map_indexing_suite2<Container,
-                                         NoProxy, final_map_derived_policies<Container, NoProxy> > {};
-      }
+
+// Forward declaration
+    template <class Container, bool NoProxy, class DerivedPolicies>
+    class map_indexing_suite2;
+
+    namespace detail
+    {
+    template <class Container, bool NoProxy>
+    class final_map_derived_policies
+        : public map_indexing_suite2<Container,
+                                     NoProxy, final_map_derived_policies<Container, NoProxy> > {};
+    }
     
-      template <
-         class Container,
-         bool NoProxy = false,
-         class DerivedPolicies
-         = detail::final_map_derived_policies<Container, NoProxy> >
-      class map_indexing_suite2
-         : public indexing_suite<
-         Container
-         , DerivedPolicies
-         , NoProxy
-         , true
-         , typename Container::value_type::second_type
-         , typename Container::key_type
-         , typename Container::key_type
-         >
-      {
-         public:
-
-            typedef typename Container::value_type value_type;
-            typedef typename Container::value_type::second_type data_type;
-            typedef typename Container::key_type key_type;
-            typedef typename Container::key_type index_type;
-            typedef typename Container::size_type size_type;
-            typedef typename Container::difference_type difference_type;
-
-            template <class Class>
-            static void
-            extension_def(Class& cl)
-            {
+    template <class Container,bool NoProxy = false,
+              class DerivedPolicies = detail::final_map_derived_policies<Container, NoProxy> >
+    class map_indexing_suite2
+        : public indexing_suite<
+    Container
+    , DerivedPolicies
+    , NoProxy
+    , true
+    , typename Container::value_type::second_type
+    , typename Container::key_type
+    , typename Container::key_type
+    >
+    {
+    public:
+
+        typedef typename Container::value_type value_type;
+        typedef typename Container::value_type::second_type data_type;
+        typedef typename Container::key_type key_type;
+        typedef typename Container::key_type index_type;
+        typedef typename Container::size_type size_type;
+        typedef typename Container::difference_type difference_type;
+
+        template <class Class>
+        static void
+        extension_def(Class& /*cl*/)
+        {
                
-            }
+        }
 
-            static data_type&
-            get_item(Container& container, index_type i_)
+        static data_type&
+        get_item(Container& container, index_type i_)
+        {
+            typename Container::iterator i = container.props().find(i_);
+            if (i == container.end())
             {
-               typename Container::iterator i = container.find(i_);
-               if (i == container.end())
-               {
-                  PyErr_SetString(PyExc_KeyError, "Invalid key");
-                  throw_error_already_set();
-               }
-               return i->second;
+                PyErr_SetString(PyExc_KeyError, "Invalid key");
+                throw_error_already_set();
             }
+            return i->second;
+        }
             
-            static void
-            set_item(Container& container, index_type i, data_type const& v)
-            {
-               container[i] = v;
-            }
+        static void
+        set_item(Container& container, index_type i, data_type const& v)
+        {
+            container[i] = v;
+        }
             
-            static void
-            delete_item(Container& container, index_type i)
-            {
-               container.erase(i);
-            }
+        static void
+        delete_item(Container& container, index_type i)
+        {
+            container.props().erase(i);
+        }
+          
+        static size_t
+        size(Container& container)
+        {
+            return container.props().size();
+        }
+          
+        static bool
+        contains(Container& container, key_type const& key)
+        {
+            return container.props().find(key) != container.end();
+        }
             
-            static size_t
-            size(Container& container)
-            {
-               return container.size();
-            }
+        static bool
+        compare_index(Container& container, index_type a, index_type b)
+        {
+            return container.props().key_comp()(a, b);
+        }
             
-            static bool
-            contains(Container& container, key_type const& key)
+        static index_type
+        convert_index(Container& /*container*/, PyObject* i_)
+        {
+            extract<key_type const&> i(i_);
+            if (i.check())
             {
-               return container.find(key) != container.end();
+                return i();
             }
-            
-            static bool
-            compare_index(Container& container, index_type a, index_type b)
+            else
             {
-               return container.key_comp()(a, b);
+                extract<key_type> i(i_);
+                if (i.check())
+                    return i();
             }
-            
-            static index_type
-            convert_index(Container& /*container*/, PyObject* i_)
-            {
-               extract<key_type const&> i(i_);
-               if (i.check())
-               {
-                  return i();
-               }
-               else
-               {
-                  extract<key_type> i(i_);
-                  if (i.check())
-                     return i();
-               }
                
-               PyErr_SetString(PyExc_TypeError, "Invalid index type");
-               throw_error_already_set();
-               return index_type();
-            }
-      };
+            PyErr_SetString(PyExc_TypeError, "Invalid index type");
+            throw_error_already_set();
+            return index_type();
+        }
+    };
       
 
-      template <typename T1, typename T2>
-      struct std_pair_to_tuple
-      {
-            static PyObject* convert(std::pair<T1, T2> const& p)
-            {
-               return boost::python::incref(
-                  boost::python::make_tuple(p.first, p.second).ptr());
-            }
-      };
+    template <typename T1, typename T2>
+    struct std_pair_to_tuple
+    {
+        static PyObject* convert(std::pair<T1, T2> const& p)
+        {
+            return boost::python::incref(
+                boost::python::make_tuple(p.first, p.second).ptr());
+        }
+    };
       
-      template <typename T1, typename T2>
-      struct std_pair_to_python_converter
-      {
-            std_pair_to_python_converter()
-            {
-               boost::python::to_python_converter<
-               std::pair<T1, T2>,
-                  std_pair_to_tuple<T1, T2> >();
+    template <typename T1, typename T2>
+    struct std_pair_to_python_converter
+    {
+        std_pair_to_python_converter()
+        {
+            boost::python::to_python_converter<
+                std::pair<T1, T2>,
+                std_pair_to_tuple<T1, T2> >();
+        }
+    };
+
+    }}
+
+struct UnicodeString_from_python_str
+{
+    UnicodeString_from_python_str()
+    {
+        boost::python::converter::registry::push_back(
+            &convertible,
+            &construct,
+            boost::python::type_id<UnicodeString>());
+    }
+
+    static void* convertible(PyObject* obj_ptr)
+    {
+        if (!(
+#if PY_VERSION_HEX >= 0x03000000
+                PyBytes_Check(obj_ptr) 
+#else
+                PyString_Check(obj_ptr) 
+#endif
+                || PyUnicode_Check(obj_ptr)))
+            return 0;
+        return obj_ptr;
+    }
+
+    static void construct(
+        PyObject* obj_ptr,
+        boost::python::converter::rvalue_from_python_stage1_data* data)
+    {
+        char * value=0;
+        if (PyUnicode_Check(obj_ptr)) {
+            PyObject *encoded = PyUnicode_AsEncodedString(obj_ptr, "utf8", "replace");
+            if (encoded) {
+#if PY_VERSION_HEX >= 0x03000000
+                value = PyBytes_AsString(encoded);
+#else
+                value = PyString_AsString(encoded);
+#endif
+                Py_DecRef(encoded);
             }
-      };
-   }
-}
+        } else {
+#if PY_VERSION_HEX >= 0x03000000
+            value = PyBytes_AsString(obj_ptr);
+#else
+            value = PyString_AsString(obj_ptr);
+#endif
+        }
+        if (value == 0) boost::python::throw_error_already_set();
+        void* storage = (
+            (boost::python::converter::rvalue_from_python_storage<UnicodeString>*)
+            data)->storage.bytes;
+        new (storage) UnicodeString(value);
+        data->convertible = storage;
+    }
+};
 
 void export_feature()
 {
-   using namespace boost::python;
-   using mapnik::Feature;
+    using namespace boost::python;
+    using mapnik::Feature;
+      
+    implicitly_convertible<int,mapnik::value>();
+    implicitly_convertible<double,mapnik::value>();
+    implicitly_convertible<UnicodeString,mapnik::value>();
+    implicitly_convertible<bool,mapnik::value>();
+
+    std_pair_to_python_converter<std::string const,mapnik::value>();
+    UnicodeString_from_python_str();
    
-   std_pair_to_python_converter<std::string const,mapnik::value>();
-   to_python_converter<mapnik::value,mapnik_value_to_python>();
-   class_<Feature,boost::shared_ptr<Feature>,
-      boost::noncopyable>("Feature",no_init)
-      .def("id",&Feature::id)
-      .def("__str__",&Feature::to_string)
-      .add_property("properties", 
-                    make_function(&Feature::props,return_value_policy<reference_existing_object>()))
-//      .def("add_geometry", // TODO define more mapnik::Feature methods
-      .def("num_geometries",&Feature::num_geometries)
-      .def("get_geometry", make_function(get_geom1,return_value_policy<reference_existing_object>()))
-      .def("envelope", &Feature::envelope)
-      ;
-
-   class_<std::map<std::string, mapnik::value> >("Properties")
-      .def(map_indexing_suite2<std::map<std::string, mapnik::value>, true >())
-      .def("iteritems",iterator<std::map<std::string,mapnik::value> > ())
-      ;
+    class_<Feature,boost::shared_ptr<Feature>,
+        boost::noncopyable>("Feature",init<int>("Default ctor."))
+        .def("id",&Feature::id)
+        .def("__str__",&Feature::to_string)
+        .def("add_geometries_from_wkb", &feature_add_geometries_from_wkb)
+        .def("add_geometries_from_wkt", &feature_add_geometries_from_wkt)
+        //.def("add_geometry", add_geometry)
+        //.def("num_geometries",&Feature::num_geometries)
+        //.def("get_geometry", make_function(get_geom1,return_value_policy<reference_existing_object>()))
+        .def("geometries",make_function(&Feature::paths,return_value_policy<reference_existing_object>()))
+        .def("envelope", &Feature::envelope)
+        .def(map_indexing_suite2<Feature, true >())
+        .def("iteritems",iterator<Feature> ())
+        // TODO define more mapnik::Feature methods
+        ;
 }
diff --git a/bindings/python/mapnik_featureset.cpp b/bindings/python/mapnik_featureset.cpp
index 0ded88b..84e04f6 100644
--- a/bindings/python/mapnik_featureset.cpp
+++ b/bindings/python/mapnik_featureset.cpp
@@ -28,22 +28,36 @@
 #include <mapnik/datasource.hpp>
 
 namespace {
-    using namespace boost::python;
+using namespace boost::python;
 
-    list features(mapnik::featureset_ptr const& itr)
+inline list features(mapnik::featureset_ptr const& itr)
+{
+    list l;
+    while (true)
     {
-        list l;
-        while (true)
+        mapnik::feature_ptr fp = itr->next();
+        if (!fp)
         {
-            mapnik::feature_ptr fp = itr->next();
-            if (!fp)
-            {
-                break;
-            }
-            l.append(fp);
+            break;
         }
-        return l;
+        l.append(fp);
     }
+    return l;
+}
+
+inline object pass_through(object const& o) { return o; }
+
+inline mapnik::feature_ptr next(mapnik::featureset_ptr const& itr)
+{
+    if (!itr)
+    {
+        PyErr_SetString(PyExc_StopIteration, "No more features.");
+        boost::python::throw_error_already_set();
+    }
+
+    return itr->next();
+}
+
 }
 
 void export_featureset()
@@ -54,6 +68,18 @@ void export_featureset()
     
     class_<Featureset,boost::shared_ptr<Featureset>,
         boost::noncopyable>("Featureset",no_init)
-        .add_property("features",features)
+        .def("__iter__",pass_through)
+        .def("next",next)
+        .add_property("features",features,
+            "The list of features.\n"
+            "\n"
+            "Usage:\n"
+            ">>> m.query_map_point(0, 10, 10)\n"
+            "<mapnik2._mapnik2.Featureset object at 0x1004d2938>\n"
+            ">>> fs = m.query_map_point(0, 10, 10)\n"
+            ">>> for f in fs.features:\n"
+            ">>>     print f\n"
+            "<mapnik2.Feature object at 0x105e64140>\n"
+            )
         ;
 }
diff --git a/bindings/python/mapnik_filter.cpp b/bindings/python/mapnik_filter.cpp
deleted file mode 100644
index cc5522f..0000000
--- a/bindings/python/mapnik_filter.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-//$Id$
-
-#include <boost/python.hpp>
-
-#include <mapnik/spatial.hpp>
-#include <mapnik/logical.hpp>
-#include <mapnik/comparison.hpp>
-#include <mapnik/regex_filter.hpp>
-#include <mapnik/filter.hpp>
-#include <mapnik/filter_factory.hpp>
-
-using mapnik::filter;
-using mapnik::filter_ptr;
-using mapnik::filter_factory;
-using mapnik::Feature;
-using mapnik::create_filter;
-
-filter_ptr create_filter_(std::string const& wkt)
-{
-   return create_filter(wkt,"utf8");
-}
-
-void export_filter()
-{
-    using namespace boost::python;
-    class_<filter<Feature>,boost::noncopyable>("Filter",
-                                               "An expression which allows "
-                                               "to select features.",no_init)
-       .def("passes", &filter<Feature>::pass) // note: "pass" is a reserved word in Python
-       .def("__str__",&filter<Feature>::to_string);
-    ;
-    
-    def("Filter",&create_filter_);
-}
diff --git a/bindings/python/mapnik_font_engine.cpp b/bindings/python/mapnik_font_engine.cpp
index 5b25d91..fb09ef3 100644
--- a/bindings/python/mapnik_font_engine.cpp
+++ b/bindings/python/mapnik_font_engine.cpp
@@ -32,15 +32,16 @@ void export_font_engine()
     using namespace boost::python;
     class_<singleton<freetype_engine,CreateStatic>,boost::noncopyable>("Singleton",no_init)
         .def("instance",&singleton<freetype_engine,CreateStatic>::instance,
-	     return_value_policy<reference_existing_object>())
+             return_value_policy<reference_existing_object>())
         .staticmethod("instance")
         ;
 
-	class_<freetype_engine,bases<singleton<freetype_engine,CreateStatic> >,
-  		boost::noncopyable>("FontEngine",no_init)
-		.def("register_font",&freetype_engine::register_font)
-		.def("face_names",&freetype_engine::face_names)
-		.staticmethod("register_font")
-		.staticmethod("face_names")
+    class_<freetype_engine,bases<singleton<freetype_engine,CreateStatic> >,
+        boost::noncopyable>("FontEngine",no_init)
+        .def("register_font",&freetype_engine::register_font)
+        .def("register_fonts",&freetype_engine::register_fonts)
+        .def("face_names",&freetype_engine::face_names)
+        .staticmethod("register_font")
+        .staticmethod("face_names")
         ;
 }
diff --git a/bindings/python/mapnik_geometry.cpp b/bindings/python/mapnik_geometry.cpp
index 76ab62e..0883c25 100644
--- a/bindings/python/mapnik_geometry.cpp
+++ b/bindings/python/mapnik_geometry.cpp
@@ -22,19 +22,71 @@
 // boost
 #include <boost/python.hpp>
 #include <boost/python/def.hpp>
+#include <boost/python/exception_translator.hpp>
+#include <boost/python/manage_new_object.hpp>
+#include <boost/python/iterator.hpp>
+#include <boost/ptr_container/ptr_vector.hpp>
 
 // mapnik
 #include <mapnik/geometry.hpp>
+#include <mapnik/wkt/wkt_factory.hpp>
+#include <mapnik/wkb.hpp>
+
+namespace {
+
+using mapnik::from_wkt;
+using mapnik::geometry_type;
+
+typedef boost::ptr_vector<geometry_type> path_type;
+
+geometry_type const& getitem_impl(path_type & p, int key)
+{
+    if (key >=0 && key < p.size())
+        return p[key];
+    PyErr_SetString(PyExc_IndexError, "Index is out of range");
+    throw boost::python::error_already_set();
+}
+
+void from_wkt_impl(path_type& p, std::string const& wkt)
+{
+    bool result = mapnik::from_wkt(wkt, p);
+    if (!result) throw std::runtime_error("Failed to parse WKT");
+}
+
+void from_wkb_impl(path_type& p, std::string const& wkb)
+{
+    mapnik::geometry_utils::from_wkb(p, wkb.c_str(), wkb.size(), true);
+}
+
+}
 
 void export_geometry()
 {
-   using namespace boost::python;
-   using mapnik::geometry2d;
-   
-   class_<geometry2d, boost::noncopyable>("Geometry2d",no_init)
-      .def("envelope",&geometry2d::envelope)
-       // .def("__str__",&geometry2d::to_string)
-       .def("type",&geometry2d::type)
-       // TODO add other geometry2d methods
-      ;
+    using namespace boost::python;
+    
+    enum_<mapnik::eGeomType>("GeometryType")
+        .value("Point",mapnik::Point)
+        .value("LineString",mapnik::LineString)
+        .value("Polygon",mapnik::Polygon)
+        .value("MultiPoint",mapnik::MultiPoint)
+        .value("MultiLineString",mapnik::MultiLineString)
+        .value("MultiPolygon",mapnik::MultiPolygon)
+        ;
+    
+    using mapnik::geometry_type;
+    class_<geometry_type, std::auto_ptr<geometry_type>,boost::noncopyable>("Geometry2d",no_init)
+        .def("envelope",&geometry_type::envelope)
+        // .def("__str__",&geometry_type::to_string)
+        .def("type",&geometry_type::type)
+        .def("area",&geometry_type::area)
+        // TODO add other geometry_type methods
+        ;
+    
+    class_<path_type,boost::noncopyable>("Path")
+        .def("__getitem__", getitem_impl,return_value_policy<reference_existing_object>())
+        .def("__len__", &path_type::size)
+        .def("from_wkt",from_wkt_impl)
+        .def("from_wkb",from_wkb_impl)
+        ;
+    
 }
diff --git a/bindings/python/mapnik_glyph_symbolizer.cpp b/bindings/python/mapnik_glyph_symbolizer.cpp
new file mode 100644
index 0000000..c23c7a8
--- /dev/null
+++ b/bindings/python/mapnik_glyph_symbolizer.cpp
@@ -0,0 +1,121 @@
+#include <boost/python.hpp>
+
+#include <mapnik/glyph_symbolizer.hpp>
+#include "mapnik_enumeration.hpp"
+#include <boost/tuple/tuple.hpp>
+
+using mapnik::glyph_symbolizer;
+using mapnik::position;
+using mapnik::enumeration_;
+using mapnik::angle_mode_e;
+using mapnik::AZIMUTH;
+using mapnik::TRIGONOMETRIC;
+using namespace boost::python;
+
+namespace {
+using namespace boost::python;
+
+tuple get_displacement(const glyph_symbolizer& s)
+{
+    boost::tuple<double,double> pos = s.get_displacement();
+    return boost::python::make_tuple(boost::get<0>(pos),boost::get<1>(pos));
+}
+
+void set_displacement(glyph_symbolizer & s, boost::python::tuple arg)
+{
+    s.set_displacement(extract<double>(arg[0]),extract<double>(arg[1]));
+}
+
+}
+
+void export_glyph_symbolizer()
+{
+    enumeration_<angle_mode_e>("angle_mode")
+        .value("AZIMUTH", AZIMUTH)
+        .value("TRIGONOMETRIC", TRIGONOMETRIC)
+        ;
+
+    class_<glyph_symbolizer>("GlyphSymbolizer",
+                             init<std::string,mapnik::expression_ptr>())
+        .add_property("face_name",
+                      make_function(&glyph_symbolizer::get_face_name,
+                                    return_value_policy<copy_const_reference>()),
+                      &glyph_symbolizer::set_face_name,
+                      "Get/Set the name of the font face (eg:\"DejaVu Sans "
+                      "Book\") which contains the glyph"
+            )
+        .add_property("char",
+                      &glyph_symbolizer::get_char,
+                      &glyph_symbolizer::set_char,
+                      "Get/Set the char expression. The char is the unicode "
+                      "character indexing the glyph in the font referred by "
+                      "face_name."
+            )
+        .add_property("allow_overlap",
+                      &glyph_symbolizer::get_allow_overlap,
+                      &glyph_symbolizer::set_allow_overlap,
+                      "Get/Set the flag which controls if glyphs should "
+                      "overlap any symbols previously rendered"
+            )
+        .add_property("avoid_edges",
+                      &glyph_symbolizer::get_avoid_edges,
+                      &glyph_symbolizer::set_avoid_edges,
+                      "Get/Set the flag which controls if glyphs should be "
+                      "partially drawn beside the edge of a tile."
+            )
+        .add_property("displacement",
+                      &get_displacement,
+                      &set_displacement)
+
+        .add_property("halo_fill",
+                      make_function(&glyph_symbolizer::get_halo_fill,
+                                    return_value_policy<copy_const_reference>()),
+                      &glyph_symbolizer::set_halo_fill)
+
+        .add_property("halo_radius",
+                      &glyph_symbolizer::get_halo_radius, 
+                      &glyph_symbolizer::set_halo_radius)
+
+        .add_property("size",
+                      &glyph_symbolizer::get_size,
+                      &glyph_symbolizer::set_size,
+                      "Get/Set the size expression used to size the glyph."
+            )
+
+        .add_property("angle",
+                      &glyph_symbolizer::get_angle,
+                      &glyph_symbolizer::set_angle,
+                      "Get/Set the angle expression used to rotate the glyph "
+                      "along its center."
+            )
+        .add_property("angle_mode",
+                      &glyph_symbolizer::get_angle_mode,
+                      &glyph_symbolizer::set_angle_mode,
+                      "Get/Set the angle_mode property. This controls how the "
+                      "angle is interpreted. Valid values are AZIMUTH and  "
+                      "TRIGONOMETRIC."
+            )
+        .add_property("value",
+                      &glyph_symbolizer::get_value,
+                      &glyph_symbolizer::set_value,
+                      "Get/set the value expression which will be used to "
+                      "retrieve a a value for the colorizer to use to choose "
+                      "a color."
+            )
+        .add_property("color",
+                      &glyph_symbolizer::get_color,
+                      &glyph_symbolizer::set_color,
+                      "Get/Set the color expression used to color the glyph. "
+                      "(See also the 'colorizer' attribute)"
+
+            )
+        .add_property("colorizer",
+                      &glyph_symbolizer::get_colorizer,
+                      &glyph_symbolizer::set_colorizer,
+                      "Get/Set the RasterColorizer used to color the glyph "
+                      "depending on the 'value' expression (which must be "
+                      "defined).\n"
+                      "Only needed if no explicit color is provided"
+            )
+        ;    
+}
diff --git a/bindings/python/mapnik_grid.cpp b/bindings/python/mapnik_grid.cpp
new file mode 100644
index 0000000..0a5f3b8
--- /dev/null
+++ b/bindings/python/mapnik_grid.cpp
@@ -0,0 +1,69 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// boost
+#include <boost/python.hpp>
+#include <boost/python/module.hpp>
+#include <boost/python/def.hpp>
+
+// mapnik
+#include <mapnik/grid/grid.hpp>
+#include "python_grid_utils.hpp"
+
+using namespace boost::python;
+
+// help compiler see template definitions
+static dict (*encode)( mapnik::grid const&, std::string, bool, unsigned int) = mapnik::grid_encode;
+
+bool painted(mapnik::grid const& grid)
+{
+    return grid.painted();
+}
+
+void export_grid()
+{
+    class_<mapnik::grid,boost::shared_ptr<mapnik::grid> >(
+            "Grid",
+            "This class represents a feature hitgrid.",
+            init<int,int,std::string,unsigned>(
+              ( arg("width"),arg("height"),arg("key")="__id__",arg("resolution")=1 ),
+            "Create a mapnik.Grid object\n"
+            ))
+        .def("painted",&painted)
+        .def("width",&mapnik::grid::width)
+        .def("height",&mapnik::grid::height)
+        .def("view",&mapnik::grid::get_view)
+        .def("encode",encode,
+            ( arg("encoding")="utf",arg("features")=true,arg("resolution")=4 ),
+            "Encode the grid as as optimized json\n"
+            )
+        .add_property("key",
+            make_function(&mapnik::grid::get_key,return_value_policy<copy_const_reference>()),
+            &mapnik::grid::set_key,
+            "Get/Set key to be used as unique indentifier for features\n"
+            "The value should either be __id__ to refer to the feature.id()\n"
+            "or some globally unique integer or string attribute field\n"
+         )
+        ;
+
+}
diff --git a/bindings/python/mapnik_grid_view.cpp b/bindings/python/mapnik_grid_view.cpp
new file mode 100644
index 0000000..88c35d7
--- /dev/null
+++ b/bindings/python/mapnik_grid_view.cpp
@@ -0,0 +1,52 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// boost
+#include <boost/python.hpp>
+#include <boost/python/module.hpp>
+#include <boost/python/def.hpp>
+
+// mapnik
+#include <string>
+#include <mapnik/grid/grid_view.hpp>
+#include <mapnik/grid/grid.hpp>
+#include "python_grid_utils.hpp"
+
+using namespace boost::python;
+
+// help compiler see template definitions
+static dict (*encode)( mapnik::grid_view const&, std::string, bool, unsigned int) = mapnik::grid_encode;
+
+void export_grid_view()
+{
+    class_<mapnik::grid_view,
+            boost::shared_ptr<mapnik::grid_view> >("GridView",
+            "This class represents a feature hitgrid subset.",no_init)
+        .def("width",&mapnik::grid_view::width)
+        .def("height",&mapnik::grid_view::height)
+        .def("encode",encode,
+            ( arg("encoding")="utf",arg("add_features")=true,arg("resolution")=4 ),
+            "Encode the grid as as optimized json\n"
+            )
+        ;
+}
diff --git a/bindings/python/mapnik_image.cpp b/bindings/python/mapnik_image.cpp
index 27d8274..71068b6 100644
--- a/bindings/python/mapnik_image.cpp
+++ b/bindings/python/mapnik_image.cpp
@@ -30,65 +30,134 @@ extern "C"
 #include <boost/python.hpp>
 #include <boost/python/module.hpp>
 #include <boost/python/def.hpp>
+#include <boost/make_shared.hpp>
+
 // mapnik
 #include <mapnik/graphics.hpp>
+#include <mapnik/palette.hpp>
 #include <mapnik/image_util.hpp>
-#include <mapnik/jpeg_io.hpp>
 #include <mapnik/png_io.hpp>
 #include <mapnik/image_reader.hpp>
+#include <mapnik/image_compositing.hpp>
+
+// stl
 #include <sstream>
+
+// jpeg
+#if defined(HAVE_JPEG)
+#include <mapnik/jpeg_io.hpp>
+#endif
+
 // cairo
 #if defined(HAVE_CAIRO) && defined(HAVE_PYCAIRO)
 #include <cairomm/surface.h>
 #include <pycairo.h>
 #endif
 
-using mapnik::Image32;
-using mapnik::ImageReader;
+using mapnik::image_32;
+using mapnik::image_reader;
 using mapnik::get_image_reader;
 using mapnik::type_from_filename;
-using namespace boost::python;
 using mapnik::save_to_file;
+using mapnik::save_to_string;
+
+using namespace boost::python;
 
 // output 'raw' pixels
-PyObject* tostring1( Image32 const& im)
+PyObject* tostring1( image_32 const& im)
 {
     int size = im.width() * im.height() * 4;
-    return ::PyString_FromStringAndSize((const char*)im.raw_data(),size);
+    return
+#if PY_VERSION_HEX >= 0x03000000 
+        ::PyBytes_FromStringAndSize
+#else
+        ::PyString_FromStringAndSize
+#endif
+        ((const char*)im.raw_data(),size);
 }
 
 // encode (png,jpeg)
-PyObject* tostring2(Image32 const & im, std::string const& format)
+PyObject* tostring2(image_32 const & im, std::string const& format)
+{
+    mapnik::rgba_palette pal;
+    std::string s = save_to_string(im, format, pal);
+    return
+#if PY_VERSION_HEX >= 0x03000000 
+        ::PyBytes_FromStringAndSize
+#else
+        ::PyString_FromStringAndSize
+#endif
+    (s.data(),s.size());
+}
+
+PyObject* tostring3(image_32 const & im, std::string const& format, mapnik::rgba_palette const& pal)
+{
+    std::string s = save_to_string(im, format, pal);
+    return
+#if PY_VERSION_HEX >= 0x03000000 
+        ::PyBytes_FromStringAndSize
+#else
+        ::PyString_FromStringAndSize
+#endif
+    (s.data(),s.size());
+}
+
+
+void save_to_file1(mapnik::image_32 const& im, std::string const& filename)
 {
-   std::string s = save_to_string(im, format);
-   return ::PyString_FromStringAndSize(s.data(),s.size());
+    save_to_file(im,filename);
 }
 
-void (*save_to_file1)( mapnik::Image32 const&, std::string const&,std::string const&) = mapnik::save_to_file;
-void (*save_to_file2)( mapnik::Image32 const&, std::string const&) = mapnik::save_to_file;
+void save_to_file2(mapnik::image_32 const& im, std::string const& filename, std::string const& type)
+{
+    save_to_file(im,filename,type);
+}
 
-boost::shared_ptr<Image32> open_from_file(std::string const& filename)
+void save_to_file3(mapnik::image_32 const& im, std::string const& filename, std::string const& type, mapnik::rgba_palette const& pal)
 {
-   std::auto_ptr<ImageReader> reader(get_image_reader(filename,type_from_filename(filename)));
-   if (reader.get())
-   {
-      boost::shared_ptr<Image32> image_ptr(new Image32(reader->width(),reader->height()));
-      reader->read(0,0,image_ptr->data());
-      return image_ptr;
-   }
-   throw mapnik::ImageReaderException("FIXME: " + filename);  
+    save_to_file(im,filename,type,pal);
 }
 
-void blend (Image32 & im, unsigned x, unsigned y, Image32 const& im2, float opacity)
+bool painted(mapnik::image_32 const& im)
 {
-   im.set_rectangle_alpha2(im2.data(),x,y,opacity);
+    return im.painted();
+}
+
+
+boost::shared_ptr<image_32> open_from_file(std::string const& filename)
+{
+    boost::optional<std::string> type = type_from_filename(filename);
+    if (type)
+    {
+        std::auto_ptr<image_reader> reader(get_image_reader(filename,*type));
+        if (reader.get())
+        {
+            
+            boost::shared_ptr<image_32> image_ptr = boost::make_shared<image_32>(reader->width(),reader->height());
+            reader->read(0,0,image_ptr->data());
+            return image_ptr;
+        }
+        throw mapnik::image_reader_exception("Failed to load: " + filename);  
+    }
+    throw mapnik::image_reader_exception("Unsupported image format:" + filename);
+}
+    
+void blend (image_32 & im, unsigned x, unsigned y, image_32 const& im2, float opacity)
+{
+    im.set_rectangle_alpha2(im2.data(),x,y,opacity);
+}
+
+
+void composite(image_32 & im, image_32 & im2, mapnik::composite_mode_e mode)
+{
+    mapnik::composite(im.data(),im2.data(),mode);
 }
 
 #if defined(HAVE_CAIRO) && defined(HAVE_PYCAIRO)
-boost::shared_ptr<Image32> from_cairo(PycairoSurface* surface)
+boost::shared_ptr<image_32> from_cairo(PycairoSurface* surface)
 {
     Cairo::RefPtr<Cairo::ImageSurface> s(new Cairo::ImageSurface(surface->surface));
-    boost::shared_ptr<Image32> image_ptr(new Image32(s));
+    boost::shared_ptr<image_32> image_ptr = boost::make_shared<image_32>(s);
     return image_ptr;
 }
 #endif
@@ -96,24 +165,64 @@ boost::shared_ptr<Image32> from_cairo(PycairoSurface* surface)
 void export_image()
 {
     using namespace boost::python;
-    class_<Image32,boost::shared_ptr<Image32> >("Image","This class represents a 32 bit RGBA image.",init<int,int>())
-       .def("width",&Image32::width)
-       .def("height",&Image32::height)
-       .def("view",&Image32::get_view)
-       .add_property("background",make_function
-                     (&Image32::getBackground,return_value_policy<copy_const_reference>()),
-                     &Image32::setBackground, "The background color of the image.")
-       .def("blend",&blend)
-       .def("tostring",&tostring1)
-       .def("tostring",&tostring2)
-       .def("save", save_to_file1)
-       .def("save", save_to_file2)
-       .def("open",open_from_file)
-       .staticmethod("open")
+    enum_<mapnik::composite_mode_e>("CompositeOp")
+        .value("clear", mapnik::clear)
+        .value("src", mapnik::src)
+        .value("dst", mapnik::dst)
+        .value("src_over", mapnik::src_over)
+        .value("dst_over", mapnik::dst_over)        
+        .value("src_in", mapnik::src_in)
+        .value("dst_in", mapnik::dst_in)
+        .value("src_out", mapnik::src_out)
+        .value("dst_out", mapnik::dst_out)
+        .value("src_atop", mapnik::src_atop)
+        .value("dst_atop", mapnik::dst_atop)
+        .value("xor", mapnik::_xor)
+        .value("plus", mapnik::plus)
+        .value("minus", mapnik::minus)
+        .value("multiply", mapnik::multiply)
+        .value("screen", mapnik::screen)
+        .value("overlay", mapnik::overlay)
+        .value("darken", mapnik::darken)
+        .value("lighten", mapnik::lighten)
+        .value("color_dodge", mapnik::color_dodge)
+        .value("color_burn", mapnik::color_burn)
+        .value("hard_light", mapnik::hard_light)
+        .value("soft_light", mapnik::soft_light)
+        .value("difference", mapnik::difference)
+        .value("exclusion", mapnik::exclusion)
+        .value("contrast", mapnik::contrast)
+        .value("invert", mapnik::invert)
+        .value("invert_rgb", mapnik::invert_rgb)
+        ;
+    
+    class_<image_32,boost::shared_ptr<image_32> >("Image","This class represents a 32 bit RGBA image.",init<int,int>())
+        .def("width",&image_32::width)
+        .def("height",&image_32::height)
+        .def("view",&image_32::get_view)
+        .def("painted",&painted)
+        .add_property("background",make_function
+                      (&image_32::get_background,return_value_policy<copy_const_reference>()),
+                      &image_32::set_background, "The background color of the image.")
+        .def("set_grayscale_to_alpha",&image_32::set_grayscale_to_alpha, "Set the grayscale values to the alpha channel of the Image")
+        .def("set_color_to_alpha",&image_32::set_color_to_alpha, "Set a given color to the alpha channel of the Image")
+        .def("set_alpha",&image_32::set_alpha, "Set the overall alpha channel of the Image")
+        .def("blend",&blend)
+        .def("composite",&composite)
+        //TODO(haoyu) The method name 'tostring' might be confusing since they actually return bytes in Python 3
+        
+        .def("tostring",&tostring1)
+        .def("tostring",&tostring2)
+        .def("tostring",&tostring3)
+        .def("save", &save_to_file1)
+        .def("save", &save_to_file2)
+        .def("save", &save_to_file3)
+        .def("open",open_from_file)
+        .staticmethod("open")
 #if defined(HAVE_CAIRO) && defined(HAVE_PYCAIRO)
-       .def("from_cairo",&from_cairo)
-       .staticmethod("from_cairo")
+        .def("from_cairo",&from_cairo)
+        .staticmethod("from_cairo")
 #endif
-       ;    
+        ;    
     
 }
diff --git a/bindings/python/mapnik_image_view.cpp b/bindings/python/mapnik_image_view.cpp
index 816ef6c..7ff819e 100644
--- a/bindings/python/mapnik_image_view.cpp
+++ b/bindings/python/mapnik_image_view.cpp
@@ -28,46 +28,97 @@ extern "C"
 
 #include <boost/python.hpp>
 #include <mapnik/image_util.hpp>
+#include <mapnik/palette.hpp>
 #include <mapnik/image_view.hpp>
-#include <mapnik/jpeg_io.hpp>
 #include <mapnik/png_io.hpp>
 #include <sstream>
 
-using mapnik::ImageData32;
+// jpeg
+#if defined(HAVE_JPEG)
+#include <mapnik/jpeg_io.hpp>
+#endif
+
+using mapnik::image_data_32;
 using mapnik::image_view;
 using mapnik::save_to_file;
 
 // output 'raw' pixels
-PyObject* view_tostring1(image_view<ImageData32> const& view)
+PyObject* view_tostring1(image_view<image_data_32> const& view)
 {
-   std::ostringstream ss(std::ios::out|std::ios::binary);
-   for (unsigned i=0;i<view.height();i++)
-   {
-      ss.write(reinterpret_cast<const char*>(view.getRow(i)), 
-               view.width() * sizeof(image_view<ImageData32>::pixel_type));
-   }
-   return ::PyString_FromStringAndSize((const char*)ss.str().c_str(),ss.str().size());
+    std::ostringstream ss(std::ios::out|std::ios::binary);
+    for (unsigned i=0;i<view.height();i++)
+    {
+        ss.write(reinterpret_cast<const char*>(view.getRow(i)), 
+                 view.width() * sizeof(image_view<image_data_32>::pixel_type));
+    }
+    return 
+#if PY_VERSION_HEX >= 0x03000000
+        ::PyBytes_FromStringAndSize
+#else
+        ::PyString_FromStringAndSize
+#endif
+        ((const char*)ss.str().c_str(),ss.str().size());
 }
 
 // encode (png,jpeg)
-PyObject* view_tostring2(image_view<ImageData32> const & view, std::string const& format)
+PyObject* view_tostring2(image_view<image_data_32> const & view, std::string const& format)
+{
+    mapnik::rgba_palette pal;
+    std::string s = save_to_string(view, format, pal);
+    return 
+#if PY_VERSION_HEX >= 0x03000000
+        ::PyBytes_FromStringAndSize
+#else
+        ::PyString_FromStringAndSize
+#endif
+        (s.data(),s.size());
+}
+
+PyObject* view_tostring3(image_view<image_data_32> const & view, std::string const& format, mapnik::rgba_palette const& pal)
+{
+    std::string s = save_to_string(view, format, pal);
+    return 
+#if PY_VERSION_HEX >= 0x03000000
+        ::PyBytes_FromStringAndSize
+#else
+        ::PyString_FromStringAndSize
+#endif
+        (s.data(),s.size());
+}
+
+void save_view1(image_view<image_data_32> const& view, 
+                std::string const& filename)
+{
+    save_to_file(view,filename);
+}
+
+void save_view2(image_view<image_data_32> const& view, 
+                std::string const& filename, 
+                std::string const& type)
+{
+    save_to_file(view,filename,type);
+}
+
+void save_view3(image_view<image_data_32> const& view, 
+                std::string const& filename, 
+                std::string const& type, 
+                mapnik::rgba_palette const& pal)
 {
-   std::string s = save_to_string(view, format);
-   return ::PyString_FromStringAndSize(s.data(),s.size());
+    save_to_file(view,filename,type,pal);
 }
 
-void (*save_view1)(image_view<ImageData32> const&, std::string const&,std::string const&) = mapnik::save_to_file;
-void (*save_view2)(image_view<ImageData32> const&, std::string const&) = mapnik::save_to_file;
 
 void export_image_view()
 {
     using namespace boost::python;
-    class_<image_view<ImageData32> >("ImageView","A view into an image.",no_init)
-       .def("width",&image_view<ImageData32>::width)
-       .def("height",&image_view<ImageData32>::height)
-       .def("tostring",&view_tostring1)
-       .def("tostring",&view_tostring2)
-       .def("save",save_view1)
-       .def("save",save_view2)
-       ;
+    class_<image_view<image_data_32> >("ImageView","A view into an image.",no_init)
+        .def("width",&image_view<image_data_32>::width)
+        .def("height",&image_view<image_data_32>::height)
+        .def("tostring",&view_tostring1)
+        .def("tostring",&view_tostring2)
+        .def("tostring",&view_tostring3)
+        .def("save",&save_view1)
+        .def("save",&save_view2)
+        .def("save",&save_view3)
+        ;
 }
diff --git a/bindings/python/mapnik_inmem_metawriter.cpp b/bindings/python/mapnik_inmem_metawriter.cpp
new file mode 100644
index 0000000..70009b0
--- /dev/null
+++ b/bindings/python/mapnik_inmem_metawriter.cpp
@@ -0,0 +1,68 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// boost
+#include <boost/python.hpp>
+#include <boost/python/module.hpp>
+#include <boost/python/def.hpp>
+
+// mapnik
+#include <mapnik/metawriter_inmem.hpp>
+
+using mapnik::metawriter_inmem;
+using mapnik::metawriter_inmem_ptr;
+
+namespace {
+std::map<std::string, mapnik::value>::const_iterator 
+mapnik_value_map_begin(const std::map<std::string, mapnik::value> &m) {
+  return m.begin();
+}
+
+std::map<std::string, mapnik::value>::const_iterator 
+mapnik_value_map_end(const std::map<std::string, mapnik::value> &m) {
+  return m.end();
+}
+}
+
+void export_inmem_metawriter() {
+  using namespace boost::python;
+
+  class_<std::map<std::string, mapnik::value> >
+    ("MapnikProperties", "Retarded.", init<>())
+    .def("__iter__", range(&mapnik_value_map_begin, &mapnik_value_map_end))
+    ;
+
+  class_<metawriter_inmem::meta_instance>
+    ("MetaInstance", "Single rendered instance of meta-information.", no_init)
+    .def_readonly("box", &metawriter_inmem::meta_instance::box)
+    .def_readonly("properties", &metawriter_inmem::meta_instance::properties)
+    ;
+
+  class_<metawriter_inmem, metawriter_inmem_ptr, boost::noncopyable>
+    ("MetaWriterInMem", 
+     "Collects meta-information about elements rendered.",
+     no_init)
+    .def("__iter__", range(&metawriter_inmem::inst_begin,
+                           &metawriter_inmem::inst_end))
+    ;
+}
diff --git a/bindings/python/mapnik_layer.cpp b/bindings/python/mapnik_layer.cpp
index d0f67d9..3626926 100644
--- a/bindings/python/mapnik_layer.cpp
+++ b/bindings/python/mapnik_layer.cpp
@@ -32,304 +32,298 @@
 #include <mapnik/datasource.hpp>
 #include <mapnik/datasource_cache.hpp>
 
-using mapnik::Layer;
+using mapnik::layer;
 using mapnik::parameters;
 using mapnik::datasource_cache;
 
 
 struct layer_pickle_suite : boost::python::pickle_suite
 {
-   static boost::python::tuple
-   getinitargs(const Layer& l)
-   {
-      return boost::python::make_tuple(l.name(),l.srs());
-   }
+    static boost::python::tuple
+    getinitargs(const layer& l)
+    {
+        return boost::python::make_tuple(l.name(),l.srs());
+    }
 
-   static  boost::python::tuple
-   getstate(const Layer& l)
-   {
+    static  boost::python::tuple
+    getstate(const layer& l)
+    {
         boost::python::list s;
         std::vector<std::string> const& style_names = l.styles();
         for (unsigned i = 0; i < style_names.size(); ++i)
         {
             s.append(style_names[i]);
         }      
-        return boost::python::make_tuple(l.abstract(),l.title(),l.clear_label_cache(),l.getMinZoom(),l.getMaxZoom(),l.isQueryable(),l.datasource()->params(),s);
-   }
+        return boost::python::make_tuple(l.abstract(),l.title(),l.clear_label_cache(),l.getMinZoom(),l.getMaxZoom(),l.isQueryable(),l.datasource()->params(),l.cache_features(),s);
+    }
 
-   static void
-   setstate (Layer& l, boost::python::tuple state)
-   {
+    static void
+    setstate (layer& l, boost::python::tuple state)
+    {
         using namespace boost::python;
-        if (len(state) != 8)
+        if (len(state) != 9)
         {
-         PyErr_SetObject(PyExc_ValueError,
-                         ("expected 8-item tuple in call to __setstate__; got %s"
-                          % state).ptr()
-            );
-         throw_error_already_set();
+            PyErr_SetObject(PyExc_ValueError,
+                            ("expected 9-item tuple in call to __setstate__; got %s"
+                             % state).ptr()
+                );
+            throw_error_already_set();
         }
 
-        if (state[0])
-        {
-            l.set_abstract(extract<std::string>(state[0]));
-        }
+        l.set_abstract(extract<std::string>(state[0]));
 
-        if (state[1])
-        {
-            l.set_title(extract<std::string>(state[1]));
-        }
+        l.set_title(extract<std::string>(state[1]));
 
-        if (state[2])
-        {
-            l.set_clear_label_cache(extract<bool>(state[2]));
-        }
+        l.set_clear_label_cache(extract<bool>(state[2]));
 
-        if (state[3])
-        {
-            l.setMinZoom(extract<double>(state[3]));
-        }
+        l.setMinZoom(extract<double>(state[3]));
 
-        if (state[4])
-        {
-            l.setMaxZoom(extract<double>(state[4]));
-        }
+        l.setMaxZoom(extract<double>(state[4]));
 
-        if (state[5])
-        {
-            l.setQueryable(extract<bool>(state[5]));
-        }
+        l.setQueryable(extract<bool>(state[5]));
 
-        if (state[6])
-        {
-            mapnik::parameters params = extract<parameters>(state[6]);
-            l.set_datasource(datasource_cache::instance()->create(params));
-        }
+        mapnik::parameters params = extract<parameters>(state[6]);
+        l.set_datasource(datasource_cache::instance()->create(params));
         
         boost::python::list s = extract<boost::python::list>(state[7]);
         for (int i=0;i<len(s);++i)
         {
-           l.add_style(extract<std::string>(s[i]));
+            l.add_style(extract<std::string>(s[i]));
         }
-   }
+
+        l.set_cache_features(extract<bool>(state[8]));
+    }
 };
 
-std::vector<std::string> & (mapnik::Layer::*_styles_)() = &mapnik::Layer::styles;
+std::vector<std::string> & (mapnik::layer::*_styles_)() = &mapnik::layer::styles;
 
 void export_layer()
 {
     using namespace boost::python;
     class_<std::vector<std::string> >("Names")
-    	.def(vector_indexing_suite<std::vector<std::string>,true >())
-    	;
+        .def(vector_indexing_suite<std::vector<std::string>,true >())
+        ;
     
-    class_<Layer>("Layer", "A Mapnik map layer.", init<std::string const&,optional<std::string const&> >(
-                "Create a Layer with a named string and, optionally, an srs string.\n"
-                "\n"
-                "The srs can be either a Proj.4 epsg code ('+init=epsg:<code>') or\n"
-                "of a Proj.4 literal ('+proj=<literal>').\n"
-                "If no srs is specified it will default to '+proj=latlong +datum=WGS84'\n"
-                "\n"
-                "Usage:\n"
-                ">>> from mapnik import Layer\n"
-                ">>> lyr = Layer('My Layer','+proj=latlong +datum=WGS84')\n"
-                ">>> lyr\n"
-                "<mapnik._mapnik.Layer object at 0x6a270>\n"
-                ))
+    class_<layer>("Layer", "A Mapnik map layer.", init<std::string const&,optional<std::string const&> >(
+                      "Create a Layer with a named string and, optionally, an srs string.\n"
+                      "\n"
+                      "The srs can be either a Proj.4 epsg code ('+init=epsg:<code>') or\n"
+                      "of a Proj.4 literal ('+proj=<literal>').\n"
+                      "If no srs is specified it will default to '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> from mapnik import Layer\n"
+                      ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr\n"
+                      "<mapnik._mapnik.Layer object at 0x6a270>\n"
+                      ))
 
         .def_pickle(layer_pickle_suite())
          
-        .def("envelope",&Layer::envelope, 
-                "Return the geographic envelope/bounding box."
-                "\n"
-                "Determined based on the layer datasource.\n"
-                "\n"
-                "Usage:\n"
-                ">>> from mapnik import Layer\n"
-                ">>> lyr = Layer('My Layer','+proj=latlong +datum=WGS84')\n"
-                ">>> lyr.envelope()\n"
-                "Envelope(-1.0,-1.0,0.0,0.0) # default until a datasource is loaded\n"
-                )
+        .def("envelope",&layer::envelope, 
+             "Return the geographic envelope/bounding box."
+             "\n"
+             "Determined based on the layer datasource.\n"
+             "\n"
+             "Usage:\n"
+             ">>> from mapnik import Layer\n"
+             ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+             ">>> lyr.envelope()\n"
+             "box2d(-1.0,-1.0,0.0,0.0) # default until a datasource is loaded\n"
+            )
         
-        .def("visible", &Layer::isVisible,
-                "Return True if this layer's data is active and visible at a given scale.\n"
-                "\n"
-                "Otherwise returns False.\n"
-                "Accepts a scale value as an integer or float input.\n"
-                "Will return False if:\n"
-                "\tscale >= minzoom - 1e-6\n"
-                "\tor:\n"
-                "\tscale < maxzoom + 1e-6\n"
-                "\n"
-                "Usage:\n"
-                ">>> from mapnik import Layer\n"
-                ">>> lyr = Layer('My Layer','+proj=latlong +datum=WGS84')\n"
-                ">>> lyr.visible(1.0/1000000)\n"
-                "True\n"
-                ">>> lyr.active = False\n"
-                ">>> lyr.visible(1.0/1000000)\n"
-                "False\n"
-                )
+        .def("visible", &layer::isVisible,
+             "Return True if this layer's data is active and visible at a given scale.\n"
+             "\n"
+             "Otherwise returns False.\n"
+             "Accepts a scale value as an integer or float input.\n"
+             "Will return False if:\n"
+             "\tscale >= minzoom - 1e-6\n"
+             "\tor:\n"
+             "\tscale < maxzoom + 1e-6\n"
+             "\n"
+             "Usage:\n"
+             ">>> from mapnik import Layer\n"
+             ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+             ">>> lyr.visible(1.0/1000000)\n"
+             "True\n"
+             ">>> lyr.active = False\n"
+             ">>> lyr.visible(1.0/1000000)\n"
+             "False\n"
+            )
                 
         .add_property("abstract", 
-                make_function(&Layer::abstract,return_value_policy<copy_const_reference>()),
-                &Layer::set_abstract,
-                "Get/Set the abstract of the layer.\n"
-                "\n"
-                "Usage:\n"
-                ">>> from mapnik import Layer\n"
-                ">>> lyr = Layer('My Layer','+proj=latlong +datum=WGS84')\n"
-                ">>> lyr.abstract\n"
-                "'' # default is en empty string\n"
-                ">>> lyr.abstract = 'My Shapefile rendered with Mapnik'\n"
-                ">>> lyr.abstract\n"
-                "'My Shapefile rendered with Mapnik'\n"
-                )
+                      make_function(&layer::abstract,return_value_policy<copy_const_reference>()),
+                      &layer::set_abstract,
+                      "Get/Set the abstract of the layer.\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> from mapnik import Layer\n"
+                      ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr.abstract\n"
+                      "'' # default is en empty string\n"
+                      ">>> lyr.abstract = 'My Shapefile rendered with Mapnik'\n"
+                      ">>> lyr.abstract\n"
+                      "'My Shapefile rendered with Mapnik'\n"
+            )
 
         .add_property("active",
-                &Layer::isActive,
-                &Layer::setActive,
-                "Get/Set whether this layer is active and will be rendered.\n"
-                "\n"
-                "Usage:\n"
-                ">>> from mapnik import Layer\n"
-                ">>> lyr = Layer('My Layer','+proj=latlong +datum=WGS84')\n"
-                ">>> lyr.active\n"
-                "True # Active by default\n"
-                ">>> lyr.active = False # set False to disable layer rendering\n"
-                ">>> lyr.active\n"
-                "False\n"
-                )
+                      &layer::isActive,
+                      &layer::setActive,
+                      "Get/Set whether this layer is active and will be rendered.\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> from mapnik import Layer\n"
+                      ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr.active\n"
+                      "True # Active by default\n"
+                      ">>> lyr.active = False # set False to disable layer rendering\n"
+                      ">>> lyr.active\n"
+                      "False\n"
+            )
                 
         .add_property("clear_label_cache",
-                &Layer::clear_label_cache,
-                &Layer::set_clear_label_cache,
-                "Get/Set whether this layer's labels are cached.\n"
-                "\n"
-                "Usage:\n"
-                "TODO\n" 
-                )
+                      &layer::clear_label_cache,
+                      &layer::set_clear_label_cache,
+                      "Get/Set whether to clear the label collision detector cache for this layer during rendering\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> lyr.clear_label_cache\n"
+                      "False # False by default, meaning label positions from other layers will impact placement \n"
+                      ">>> lyr.clear_label_cache = True # set to True to clear the label collision detector cache\n" 
+            )
+
+        .add_property("cache_features",
+                      &layer::cache_features,
+                      &layer::set_cache_features,
+                      "Get/Set whether features should be cached during rendering if used between multiple styles\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> lyr.cache_features\n"
+                      "False # False by default\n"
+                      ">>> lyr.cache_features = True # set to True to enable feature caching\n" 
+            )
         
         .add_property("datasource",
-                &Layer::datasource,
-                &Layer::set_datasource,
-                "The datasource attached to this layer.\n"
-                "\n"
-                "Usage:\n"
-                ">>> from mapnik import Layer, Datasource\n"
-                ">>> lyr = Layer('My Layer','+proj=latlong +datum=WGS84')\n"
-                ">>> lyr.datasource = Datasource(type='shape',file='world_borders')\n"
-                ">>> lyr.datasource\n"
-                "<mapnik.Datasource object at 0x65470>\n"
-                )
+                      &layer::datasource,
+                      &layer::set_datasource,
+                      "The datasource attached to this layer.\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> from mapnik import Layer, Datasource\n"
+                      ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr.datasource = Datasource(type='shape',file='world_borders')\n"
+                      ">>> lyr.datasource\n"
+                      "<mapnik.Datasource object at 0x65470>\n"
+            )
 
         .add_property("maxzoom",
-                &Layer::getMaxZoom,
-                &Layer::setMaxZoom,
-                "Get/Set the maximum zoom lever of the layer.\n"
-                "\n"
-                "Usage:\n"
-                ">>> from mapnik import Layer\n"
-                ">>> lyr = Layer('My Layer','+proj=latlong +datum=WGS84')\n"
-                ">>> lyr.maxzoom\n"
-                "1.7976931348623157e+308 # default is the numerical maximum\n"
-                ">>> lyr.maxzoom = 1.0/1000000\n"
-                ">>> lyr.maxzoom\n"
-                "9.9999999999999995e-07\n"
-                )
+                      &layer::getMaxZoom,
+                      &layer::setMaxZoom,
+                      "Get/Set the maximum zoom lever of the layer.\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> from mapnik import Layer\n"
+                      ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr.maxzoom\n"
+                      "1.7976931348623157e+308 # default is the numerical maximum\n"
+                      ">>> lyr.maxzoom = 1.0/1000000\n"
+                      ">>> lyr.maxzoom\n"
+                      "9.9999999999999995e-07\n"
+            )
         
         .add_property("minzoom",
-                &Layer::getMinZoom,
-                &Layer::setMinZoom,
-                "Get/Set the minimum zoom lever of the layer.\n"
-                "\n"
-                "Usage:\n"
-                ">>> from mapnik import Layer\n"
-                ">>> lyr = Layer('My Layer','+proj=latlong +datum=WGS84')\n"
-                ">>> lyr.minzoom # default is 0\n"
-                "0.0\n"
-                ">>> lyr.minzoom = 1.0/1000000\n"
-                ">>> lyr.minzoom\n"
-                "9.9999999999999995e-07\n"
-                )     
+                      &layer::getMinZoom,
+                      &layer::setMinZoom,
+                      "Get/Set the minimum zoom lever of the layer.\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> from mapnik import Layer\n"
+                      ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr.minzoom # default is 0\n"
+                      "0.0\n"
+                      ">>> lyr.minzoom = 1.0/1000000\n"
+                      ">>> lyr.minzoom\n"
+                      "9.9999999999999995e-07\n"
+            )     
 
         .add_property("name", 
-                make_function(&Layer::name, return_value_policy<copy_const_reference>()),
-                &Layer::set_name,
-                "Get/Set the name of the layer.\n"
-                "\n"
-                "Usage:\n"
-                ">>> from mapnik import Layer\n"
-                ">>> lyr = Layer('My Layer','+proj=latlong +datum=WGS84')\n"
-                ">>> lyr.name\n"
-                "'My Layer'\n"
-                ">>> lyr.name = 'New Name'\n"
-                ">>> lyr.name\n"
-                "'New Name'\n"
-                )
+                      make_function(&layer::name, return_value_policy<copy_const_reference>()),
+                      &layer::set_name,
+                      "Get/Set the name of the layer.\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> from mapnik import Layer\n"
+                      ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr.name\n"
+                      "'My Layer'\n"
+                      ">>> lyr.name = 'New Name'\n"
+                      ">>> lyr.name\n"
+                      "'New Name'\n"
+            )
 
         .add_property("queryable",
-                &Layer::isQueryable,
-                &Layer::setQueryable,
-                "Get/Set whether this layer is queryable.\n"
-                "\n"
-                "Usage:\n"
-                ">>> from mapnik import Layer\n"
-                ">>> lyr = Layer('My Layer','+proj=latlong +datum=WGS84')\n"
-                ">>> lyr.queryable\n"
-                "False # Not queryable by default\n"
-                ">>> lyr.queryable = True\n"
-                ">>> lyr.queryable\n"
-                "True\n"
-                )
+                      &layer::isQueryable,
+                      &layer::setQueryable,
+                      "Get/Set whether this layer is queryable.\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> from mapnik import layer\n"
+                      ">>> lyr = layer('My layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr.queryable\n"
+                      "False # Not queryable by default\n"
+                      ">>> lyr.queryable = True\n"
+                      ">>> lyr.queryable\n"
+                      "True\n"
+            )
 
         .add_property("srs", 
-                make_function(&Layer::srs,return_value_policy<copy_const_reference>()),
-                &Layer::set_srs,
-                "Get/Set the SRS of the layer.\n"
-                "\n"
-                "Usage:\n"
-                ">>> from mapnik import Layer\n"
-                ">>> lyr = Layer('My Layer','+proj=latlong +datum=WGS84')\n"
-                ">>> lyr.srs\n"
-                "'+proj=latlong +datum=WGS84' # The default srs if not initialized with custom srs\n"
-                ">>> # set to google mercator with Proj.4 literal\n"
-                "... \n"
-                ">>> lyr.srs = '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs +over'\n"
-                )
+                      make_function(&layer::srs,return_value_policy<copy_const_reference>()),
+                      &layer::set_srs,
+                      "Get/Set the SRS of the layer.\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> from mapnik import layer\n"
+                      ">>> lyr = layer('My layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr.srs\n"
+                      "'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs' # The default srs if not initialized with custom srs\n"
+                      ">>> # set to google mercator with Proj.4 literal\n"
+                      "... \n"
+                      ">>> lyr.srs = '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs +over'\n"
+            )
 
         .add_property("styles",
-                make_function(_styles_,return_value_policy<reference_existing_object>()),
-                "The styles list attached to this layer.\n"
-                "\n"
-                "Usage:\n"
-                ">>> from mapnik import Layer\n"
-                ">>> lyr = Layer('My Layer','+proj=latlong +datum=WGS84')\n"
-                ">>> lyr.styles\n"
-                "<mapnik._mapnik.Names object at 0x6d3e8>\n"
-                ">>> len(lyr.styles)\n"
-                "0\n # no styles until you append them\n"
-                "lyr.styles.append('My Style') # mapnik uses named styles for flexibility\n"
-                ">>> len(lyr.styles)\n"
-                "1\n"
-                ">>> lyr.styles[0]\n"
-                "'My Style'\n"
-                )
+                      make_function(_styles_,return_value_policy<reference_existing_object>()),
+                      "The styles list attached to this layer.\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> from mapnik import layer\n"
+                      ">>> lyr = layer('My layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr.styles\n"
+                      "<mapnik._mapnik.Names object at 0x6d3e8>\n"
+                      ">>> len(lyr.styles)\n"
+                      "0\n # no styles until you append them\n"
+                      "lyr.styles.append('My Style') # mapnik uses named styles for flexibility\n"
+                      ">>> len(lyr.styles)\n"
+                      "1\n"
+                      ">>> lyr.styles[0]\n"
+                      "'My Style'\n"
+            )
                                                             
         .add_property("title",
-                make_function(&Layer::title, return_value_policy<copy_const_reference>()),
-                &Layer::set_title,
-                "Get/Set the title of the layer.\n"
-                "\n"
-                "Usage:\n"
-                ">>> from mapnik import Layer\n"
-                ">>> lyr = Layer('My Layer','+proj=latlong +datum=WGS84')\n"
-                ">>> lyr.title\n"
-                "''\n"
-                ">>> lyr.title = 'My first layer'\n"
-                ">>> lyr.title\n"
-                "'My first layer'\n"
-                )
+                      make_function(&layer::title, return_value_policy<copy_const_reference>()),
+                      &layer::set_title,
+                      "Get/Set the title of the layer.\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> from mapnik import layer\n"
+                      ">>> lyr = layer('My layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr.title\n"
+                      "''\n"
+                      ">>> lyr.title = 'My first layer'\n"
+                      ">>> lyr.title\n"
+                      "'My first layer'\n"
+            )
  
         ;
 }
diff --git a/bindings/python/mapnik_line_pattern_symbolizer.cpp b/bindings/python/mapnik_line_pattern_symbolizer.cpp
index 3e02658..766eeeb 100644
--- a/bindings/python/mapnik_line_pattern_symbolizer.cpp
+++ b/bindings/python/mapnik_line_pattern_symbolizer.cpp
@@ -22,20 +22,43 @@
 //$Id$
 
 #include <boost/python.hpp>
-#include <mapnik/image_util.hpp>
+
 #include <mapnik/line_pattern_symbolizer.hpp>
+#include <mapnik/parse_path.hpp>
+#include <mapnik/image_util.hpp>
+#include "mapnik_svg.hpp"
 
 using mapnik::line_pattern_symbolizer;
+using mapnik::path_processor_type;
+using mapnik::path_expression_ptr;
+using mapnik::guess_type;
+using mapnik::parse_path;
+
+
+namespace {
+using namespace boost::python;
+
+const std::string get_filename(line_pattern_symbolizer const& t) 
+{ 
+    return path_processor_type::to_string(*t.get_filename()); 
+}
+
+void set_filename(line_pattern_symbolizer & t, std::string const& file_expr) 
+{ 
+    t.set_filename(parse_path(file_expr)); 
+}
+
+}
 
 struct line_pattern_symbolizer_pickle_suite : boost::python::pickle_suite
 {
-   static boost::python::tuple
-   getinitargs(const line_pattern_symbolizer& l)
-   {
-      boost::shared_ptr<mapnik::ImageData32> img = l.get_image();
-      const std::string & filename = l.get_filename();
-      return boost::python::make_tuple(filename,mapnik::guess_type(filename),img->width(),img->height());
-   }
+    static boost::python::tuple
+    getinitargs(const line_pattern_symbolizer& l)
+    {
+        std::string filename = path_processor_type::to_string(*l.get_filename());
+        // FIXME : Do we need "type" parameter at all ?  
+        return boost::python::make_tuple(filename, guess_type(filename));
+    }
 };
 
 void export_line_pattern_symbolizer()
@@ -43,8 +66,14 @@ void export_line_pattern_symbolizer()
     using namespace boost::python;
     
     class_<line_pattern_symbolizer>("LinePatternSymbolizer",
-				    init<std::string const&,
-				    std::string const&,unsigned,unsigned>("TODO"))
-        .def_pickle(line_pattern_symbolizer_pickle_suite())
-	;    
+                                    init<path_expression_ptr>
+                                    ("<image file expression>"))
+        //.def_pickle(line_pattern_symbolizer_pickle_suite())
+        .add_property("transform",
+              mapnik::get_svg_transform<line_pattern_symbolizer>,
+              mapnik::set_svg_transform<line_pattern_symbolizer>)
+        .add_property("filename",
+                      &get_filename,
+                      &set_filename)
+        ;    
 }
diff --git a/bindings/python/mapnik_line_symbolizer.cpp b/bindings/python/mapnik_line_symbolizer.cpp
index 8c20a65..b0875ac 100644
--- a/bindings/python/mapnik_line_symbolizer.cpp
+++ b/bindings/python/mapnik_line_symbolizer.cpp
@@ -22,19 +22,21 @@
 //$Id$
 
 #include <boost/python.hpp>
+#include "mapnik_enumeration.hpp"
 #include <mapnik/line_symbolizer.hpp>
 
+using namespace mapnik;
 using mapnik::line_symbolizer;
 using mapnik::stroke;
 using mapnik::color;
 
 struct line_symbolizer_pickle_suite : boost::python::pickle_suite
 {
-   static boost::python::tuple
-   getinitargs(const line_symbolizer& l)
-   {
-      return boost::python::make_tuple(l.get_stroke());
-   }
+    static boost::python::tuple
+    getinitargs(const line_symbolizer& l)
+    {
+        return boost::python::make_tuple(l.get_stroke());
+    }
 
 };
 
@@ -42,14 +44,23 @@ void export_line_symbolizer()
 {
     using namespace boost::python;
     
+    enumeration_<line_rasterizer_e>("line_rasterizer")
+        .value("FULL",RASTERIZER_FULL)
+        .value("FAST",RASTERIZER_FAST)
+        ;
+
     class_<line_symbolizer>("LineSymbolizer",
                             init<>("Default LineSymbolizer - 1px solid black"))
         .def(init<stroke const&>("TODO"))
         .def(init<color const& ,float>())
         .def_pickle(line_symbolizer_pickle_suite())
+        .add_property("rasterizer",
+                      &line_symbolizer::get_rasterizer,
+                      &line_symbolizer::set_rasterizer,
+                      "Set/get the rasterization method of the line of the point")
         .add_property("stroke",make_function
                       (&line_symbolizer::get_stroke,
                        return_value_policy<copy_const_reference>()),
                       &line_symbolizer::set_stroke)
-	;    
+        ;    
 }
diff --git a/bindings/python/mapnik_map.cpp b/bindings/python/mapnik_map.cpp
index dc36bae..3a69f0b 100644
--- a/bindings/python/mapnik_map.cpp
+++ b/bindings/python/mapnik_map.cpp
@@ -30,29 +30,30 @@
 #include <mapnik/layer.hpp>
 #include <mapnik/map.hpp>
 #include <mapnik/feature_type_style.hpp>
+#include <mapnik/metawriter_inmem.hpp>
 
 #include "mapnik_enumeration.hpp"
 #include "python_optional.hpp"
 
 using mapnik::color;
 using mapnik::coord;
-using mapnik::Envelope;
-using mapnik::Layer;
+using mapnik::box2d;
+using mapnik::layer;
 using mapnik::Map;
 
 struct map_pickle_suite : boost::python::pickle_suite
 {
-   static boost::python::tuple
-   getinitargs(const Map& m)
-   {
-        return boost::python::make_tuple(m.getWidth(),m.getHeight(),m.srs());
-   }
+    static boost::python::tuple
+    getinitargs(const Map& m)
+    {
+        return boost::python::make_tuple(m.width(),m.height(),m.srs());
+    }
 
-   static  boost::python::tuple
-   getstate(const Map& m)
-   {
+    static  boost::python::tuple
+    getstate(const Map& m)
+    {
         boost::python::list l;
-        for (unsigned i=0;i<m.layerCount();++i)
+        for (unsigned i=0;i<m.layer_count();++i)
         {
             l.append(m.getLayer(i));
         }
@@ -68,24 +69,24 @@ struct map_pickle_suite : boost::python::pickle_suite
             s.append(style_pair);
         }
 
-      return boost::python::make_tuple(m.getCurrentExtent(),m.background(),l,s);
-   }
+        return boost::python::make_tuple(m.get_current_extent(),m.background(),l,s,m.base_path());
+    }
 
-   static void
-   setstate (Map& m, boost::python::tuple state)
-   {
+    static void
+    setstate (Map& m, boost::python::tuple state)
+    {
         using namespace boost::python;
-        if (len(state) != 4)
+        if (len(state) != 5)
         {
             PyErr_SetObject(PyExc_ValueError,
-                         ("expected 4-item tuple in call to __setstate__; got %s"
-                          % state).ptr()
-            );
+                            ("expected 5-item tuple in call to __setstate__; got %s"
+                             % state).ptr()
+                );
             throw_error_already_set();
         }
 
-        Envelope<double> ext = extract<Envelope<double> >(state[0]);
-        m.zoomToBox(ext);
+        box2d<double> ext = extract<box2d<double> >(state[0]);
+        m.zoom_to_box(ext);
         if (state[1])
         {
             color bg = extract<color>(state[1]);
@@ -95,7 +96,7 @@ struct map_pickle_suite : boost::python::pickle_suite
         boost::python::list l=extract<boost::python::list>(state[2]);
         for (int i=0;i<len(l);++i)
         {
-            m.addLayer(extract<Layer>(l[i]));
+            m.addLayer(extract<layer>(l[i]));
         }
         
         boost::python::list s=extract<boost::python::list>(state[3]);
@@ -104,341 +105,462 @@ struct map_pickle_suite : boost::python::pickle_suite
             boost::python::tuple style_pair=extract<boost::python::tuple>(s[i]);
             std::string name = extract<std::string>(style_pair[0]);
             mapnik::feature_type_style style = extract<mapnik::feature_type_style>(style_pair[1]);
-            m.insert_style(name, style);          
+            m.insert_style(name, style);
         }
-   }
+
+        if (state[4])
+        {
+            std::string base_path = extract<std::string>(state[4]);
+            m.set_base_path(base_path);
+        }    
+    }
 };
 
-std::vector<Layer>& (Map::*layers_nonconst)() =  &Map::layers;
-std::vector<Layer> const& (Map::*layers_const)() const =  &Map::layers;
+std::vector<layer>& (Map::*layers_nonconst)() =  &Map::layers;
+std::vector<layer> const& (Map::*layers_const)() const =  &Map::layers;
 
 
 mapnik::feature_type_style find_style (mapnik::Map const& m, std::string const& name)
 {
-   boost::optional<mapnik::feature_type_style const&> style = m.find_style(name);
-   if (!style)
-   {
-      PyErr_SetString(PyExc_KeyError, "Invalid style name");
-      boost::python::throw_error_already_set();
-   }
-   return *style;
+    boost::optional<mapnik::feature_type_style const&> style = m.find_style(name);
+    if (!style)
+    {
+        PyErr_SetString(PyExc_KeyError, "Invalid style name");
+        boost::python::throw_error_already_set();
+    }
+    return *style;
+}
+
+bool has_metawriter(mapnik::Map const& m)
+{
+    if (m.metawriters().size() >=1)
+        return true;
+    return false;
+}
+
+// returns empty shared_ptr when the metawriter isn't found, or is 
+// of the wrong type. empty pointers make it back to Python as a None.
+mapnik::metawriter_inmem_ptr find_inmem_metawriter(const mapnik::Map &m, const std::string &name) {
+  mapnik::metawriter_ptr metawriter = m.find_metawriter(name);
+  mapnik::metawriter_inmem_ptr inmem;
+
+  if (metawriter) {
+    inmem = boost::dynamic_pointer_cast<mapnik::metawriter_inmem>(metawriter);
+  }
+ 
+  return inmem;
+}
+
+// TODO - we likely should allow indexing by negative number from python
+// for now, protect against negative values and kindly throw
+mapnik::featureset_ptr query_point(mapnik::Map const& m, int index, double x, double y)
+{
+    if (index < 0){
+        PyErr_SetString(PyExc_IndexError, "Please provide a layer index >= 0");
+        boost::python::throw_error_already_set();    
+    }
+    unsigned idx = index;
+    return m.query_point(idx, x, y);
+}
+
+mapnik::featureset_ptr query_map_point(mapnik::Map const& m, int index, double x, double y)
+{
+    if (index < 0){
+        PyErr_SetString(PyExc_IndexError, "Please provide a layer index >= 0");
+        boost::python::throw_error_already_set();    
+    }
+    unsigned idx = index;
+    return m.query_map_point(idx, x, y);
 }
 
 void export_map() 
 {
-   using namespace boost::python;
+    using namespace boost::python;
    
-   // aspect ratio fix modes
-   mapnik::enumeration_<mapnik::aspect_fix_mode_e>("aspect_fix_mode")
-      .value("GROW_BBOX", mapnik::Map::GROW_BBOX)
-      .value("GROW_CANVAS",mapnik::Map::GROW_CANVAS)
-      .value("SHRINK_BBOX",mapnik::Map::SHRINK_BBOX)
-      .value("SHRINK_CANVAS",mapnik::Map::SHRINK_CANVAS)
-      .value("ADJUST_BBOX_WIDTH",mapnik::Map::ADJUST_BBOX_WIDTH)
-      .value("ADJUST_BBOX_HEIGHT",mapnik::Map::ADJUST_BBOX_HEIGHT)
-      .value("ADJUST_CANVAS_WIDTH",mapnik::Map::ADJUST_CANVAS_WIDTH)
-      .value("ADJUST_CANVAS_HEIGHT", mapnik::Map::ADJUST_CANVAS_HEIGHT)
-      ;
+    // aspect ratio fix modes
+    mapnik::enumeration_<mapnik::aspect_fix_mode_e>("aspect_fix_mode")
+        .value("GROW_BBOX", mapnik::Map::GROW_BBOX)
+        .value("GROW_CANVAS",mapnik::Map::GROW_CANVAS)
+        .value("SHRINK_BBOX",mapnik::Map::SHRINK_BBOX)
+        .value("SHRINK_CANVAS",mapnik::Map::SHRINK_CANVAS)
+        .value("ADJUST_BBOX_WIDTH",mapnik::Map::ADJUST_BBOX_WIDTH)
+        .value("ADJUST_BBOX_HEIGHT",mapnik::Map::ADJUST_BBOX_HEIGHT)
+        .value("ADJUST_CANVAS_WIDTH",mapnik::Map::ADJUST_CANVAS_WIDTH)
+        .value("ADJUST_CANVAS_HEIGHT", mapnik::Map::ADJUST_CANVAS_HEIGHT)
+        ;
    
-   python_optional<mapnik::color> ();
-   class_<std::vector<Layer> >("Layers")
-      .def(vector_indexing_suite<std::vector<Layer> >())
-      ;
+    python_optional<mapnik::color> ();
+    class_<std::vector<layer> >("Layers")
+        .def(vector_indexing_suite<std::vector<layer> >())
+        ;
     
-   class_<Map>("Map","The map object.",init<int,int,optional<std::string const&> >(
-                  ( arg("width"),arg("height"),arg("srs") ),
-                  "Create a Map with a width and height as integers and, optionally,\n"
-                  "an srs string either with a Proj.4 epsg code ('+init=epsg:<code>')\n"
-                  "or with a Proj.4 literal ('+proj=<literal>').\n"
-                  "If no srs is specified the map will default to '+proj=latlong +datum=WGS84'\n"
-                  "\n"
-                  "Usage:\n"
-                  ">>> from mapnik import Map\n"
-                  ">>> m = Map(600,400)\n"
-                  ">>> m\n"
-                  "<mapnik._mapnik.Map object at 0x6a240>\n"
-                  ">>> m.srs\n"
-                  "'+proj=latlong +datum=WGS84'\n"
-                  ))
+    class_<Map>("Map","The map object.",init<int,int,optional<std::string const&> >(
+                    ( arg("width"),arg("height"),arg("srs") ),
+                    "Create a Map with a width and height as integers and, optionally,\n"
+                    "an srs string either with a Proj.4 epsg code ('+init=epsg:<code>')\n"
+                    "or with a Proj.4 literal ('+proj=<literal>').\n"
+                    "If no srs is specified the map will default to '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'\n"
+                    "\n"
+                    "Usage:\n"
+                    ">>> from mapnik import Map\n"
+                    ">>> m = Map(600,400)\n"
+                    ">>> m\n"
+                    "<mapnik._mapnik.Map object at 0x6a240>\n"
+                    ">>> m.srs\n"
+                    "'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'\n"
+                    ))
         
-      .def_pickle(map_pickle_suite()
-         )
+        .def_pickle(map_pickle_suite()
+            )
         
-      .def("append_style",&Map::insert_style,
-           "Insert a Mapnik Style onto the map by appending it.\n"
-           "\n"
-           "Usage:\n"
-           ">>> sty\n"
-           "<mapnik._mapnik.Style object at 0x6a330>\n"
-           ">>> m.append_style('Style Name', sty)\n"
-           "True # style object added to map by name\n"
-           ">>> m.append_style('Style Name', sty)\n"
-           "False # you can only append styles with unique names\n"
-         )
+        .def("append_style",&Map::insert_style,
+             (arg("style_name"),arg("style_object")),
+             "Insert a Mapnik Style onto the map by appending it.\n"
+             "\n"
+             "Usage:\n"
+             ">>> sty\n"
+             "<mapnik._mapnik.Style object at 0x6a330>\n"
+             ">>> m.append_style('Style Name', sty)\n"
+             "True # style object added to map by name\n"
+             ">>> m.append_style('Style Name', sty)\n"
+             "False # you can only append styles with unique names\n"
+            )
 
-      .def("buffered_envelope",
-           &Map::get_buffered_extent,
-           "Get the Envelope() of the Map given\n"
-           "the Map.buffer_size.\n"
-           "\n"
-           "Usage:\n"
-           ">>> m = Map(600,400)\n"
-           ">>> m.envelope()\n"
-           "Envelope(-1.0,-1.0,0.0,0.0)\n"
-           ">>> m.buffered_envelope()\n"
-           "Envelope(-1.0,-1.0,0.0,0.0)\n"
-           ">>> m.buffer_size = 1\n"
-           ">>> m.buffered_envelope()\n"
-           "Envelope(-1.02222222222,-1.02222222222,0.0222222222222,0.0222222222222)\n"
-         )
+        .def("buffered_envelope",
+             &Map::get_buffered_extent,
+             "Get the Box2d() of the Map given\n"
+             "the Map.buffer_size.\n"
+             "\n"
+             "Usage:\n"
+             ">>> m = Map(600,400)\n"
+             ">>> m.envelope()\n"
+             "Box2d(-1.0,-1.0,0.0,0.0)\n"
+             ">>> m.buffered_envelope()\n"
+             "Box2d(-1.0,-1.0,0.0,0.0)\n"
+             ">>> m.buffer_size = 1\n"
+             ">>> m.buffered_envelope()\n"
+             "Box2d(-1.02222222222,-1.02222222222,0.0222222222222,0.0222222222222)\n"
+            )
 
-      .def("envelope",
-           make_function(&Map::getCurrentExtent,
-                         return_value_policy<copy_const_reference>()),
-           "Return the Map Envelope object\n"
-           "and print the string representation\n"
-           "of the current extent of the map.\n"
-           "\n"
-           "Usage:\n"
-           ">>> m.envelope()\n"
-           "Envelope(-0.185833333333,-0.96,0.189166666667,-0.71)\n"
-           ">>> dir(m.envelope())\n"
-           "...'center', 'contains', 'expand_to_include', 'forward',\n"
-           "...'height', 'intersect', 'intersects', 'inverse', 'maxx',\n"
-           "...'maxy', 'minx', 'miny', 'width'\n"
-         )
+        .def("envelope",
+             make_function(&Map::get_current_extent,
+                           return_value_policy<copy_const_reference>()),
+             "Return the Map Box2d object\n"
+             "and print the string representation\n"
+             "of the current extent of the map.\n"
+             "\n"
+             "Usage:\n"
+             ">>> m.envelope()\n"
+             "Box2d(-0.185833333333,-0.96,0.189166666667,-0.71)\n"
+             ">>> dir(m.envelope())\n"
+             "...'center', 'contains', 'expand_to_include', 'forward',\n"
+             "...'height', 'intersect', 'intersects', 'inverse', 'maxx',\n"
+             "...'maxy', 'minx', 'miny', 'width'\n"
+            )
 
-      .def("find_style",
-           find_style,             
-           "Query the Map for a style by name and return\n"
-           "a style object if found or raise KeyError\n"
-           "style if not found.\n"
-           "\n"
-           "Usage:\n"
-           ">>> m.find_style('Style Name')\n"
-           "<mapnik._mapnik.Style object at 0x654f0>\n"
-         )
-        
-      .def("get_aspect_fix_mode",&Map::getAspectFixMode,
-           "Get aspect fix mode.\n"
-           "Usage:\n"
-           "\n"
-           ">>> m.get_aspect_fix_mode()\n"
-         )
+        .def("find_style",
+             find_style,
+             (arg("style_name")),
+             "Query the Map for a style by name and return\n"
+             "a style object if found or raise KeyError\n"
+             "style if not found.\n"
+             "\n"
+             "Usage:\n"
+             ">>> m.find_style('Style Name')\n"
+             "<mapnik._mapnik.Style object at 0x654f0>\n"
+            )
 
-      .def("pan",&Map::pan,
-           "Set the Map center at a given x,y location\n"
-           "as integers in the coordinates of the pixmap or map surface.\n"
-           "\n"
-           "Usage:\n"
-           ">>> m = Map(600,400)\n"
-           ">>> m.envelope().center()\n"
-           "Coord(-0.5,-0.5) # default Map center\n"
-           ">>> m.pan(-1,-1)\n"
-           ">>> m.envelope().center()\n"
-           "Coord(0.00166666666667,-0.835)\n"
-         )
+        .def("has_metawriter",
+             has_metawriter,
+             "Check if the Map has any active metawriters\n"
+             "\n"
+             "Usage:\n"
+             ">>> m.has_metawriter()\n"
+             "False\n"
+            )
+        
+        .def("pan",&Map::pan,
+             (arg("x"),arg("y")),
+             "Set the Map center at a given x,y location\n"
+             "as integers in the coordinates of the pixmap or map surface.\n"
+             "\n"
+             "Usage:\n"
+             ">>> m = Map(600,400)\n"
+             ">>> m.envelope().center()\n"
+             "Coord(-0.5,-0.5) # default Map center\n"
+             ">>> m.pan(-1,-1)\n"
+             ">>> m.envelope().center()\n"
+             "Coord(0.00166666666667,-0.835)\n"
+            )
         
-      .def("pan_and_zoom",&Map::pan_and_zoom,
-           "Set the Map center at a given x,y location\n"
-           "and zoom factor as a float.\n"
-           "\n"
-           "Usage:\n"
-           ">>> m = Map(600,400)\n"
-           ">>> m.envelope().center()\n"
-           "Coord(-0.5,-0.5) # default Map center\n"
-           ">>> m.scale()\n"
-           "-0.0016666666666666668\n"
-           ">>> m.pan_and_zoom(-1,-1,0.25)\n"
-           ">>> m.scale()\n"
-           "0.00062500000000000001\n"
-         )
+        .def("pan_and_zoom",&Map::pan_and_zoom,
+             (arg("x"),arg("y"),arg("factor")),
+             "Set the Map center at a given x,y location\n"
+             "and zoom factor as a float.\n"
+             "\n"
+             "Usage:\n"
+             ">>> m = Map(600,400)\n"
+             ">>> m.envelope().center()\n"
+             "Coord(-0.5,-0.5) # default Map center\n"
+             ">>> m.scale()\n"
+             "-0.0016666666666666668\n"
+             ">>> m.pan_and_zoom(-1,-1,0.25)\n"
+             ">>> m.scale()\n"
+             "0.00062500000000000001\n"
+            )
         
-      .def("query_map_point",&Map::query_map_point,
-           "Query a Map Layer (by layer index) for features \n"
-           "intersecting the given x,y location in the coordinates\n"
-           "of the pixmap or map surface.\n"
-           "Will return a Mapnik Featureset if successful\n"
-           "otherwise will return None.\n"
-           "\n"
-           "Usage:\n"
-           ">>> featureset = m.query_map_point(0,200,200)\n"
-           ">>> featureset\n"
-           "<mapnik._mapnik.Featureset object at 0x23b0b0>\n"
-           ">>> featureset.features\n"
-           ">>> [<mapnik.Feature object at 0x3995630>]\n"
-         )
+        .def("query_map_point",query_map_point,
+             (arg("layer_idx"),arg("pixel_x"),arg("pixel_y")),
+             "Query a Map Layer (by layer index) for features \n"
+             "intersecting the given x,y location in the pixel\n"
+             "coordinates of the rendered map image.\n"
+             "Layer index starts at 0 (first layer in map).\n"
+             "Will return a Mapnik Featureset if successful\n"
+             "otherwise will return None.\n"
+             "\n"
+             "Usage:\n"
+             ">>> featureset = m.query_map_point(0,200,200)\n"
+             ">>> featureset\n"
+             "<mapnik._mapnik.Featureset object at 0x23b0b0>\n"
+             ">>> featureset.features\n"
+             ">>> [<mapnik.Feature object at 0x3995630>]\n"
+            )
         
-      .def("query_point",&Map::query_point,
-           "Query a Map Layer (by layer index) for features \n"
-           "intersecting the given x,y location in the coordinates\n"
-           "of map projection.\n"
-           "Will return a Mapnik Featureset if successful\n"
-           "otherwise will return None.\n"
-           "\n"
-           "Usage:\n"
-           ">>> featureset = m.query_point(0,-122,48)\n"
-           ">>> featureset\n"
-           "<mapnik._mapnik.Featureset object at 0x23b0b0>\n"
-           ">>> featureset.features\n"
-           ">>> [<mapnik.Feature object at 0x3995630>]\n"
-         )
+        .def("query_point",query_point,
+             (arg("layer idx"),arg("x"),arg("y")),
+             "Query a Map Layer (by layer index) for features \n"
+             "intersecting the given x,y location in the coordinates\n"
+             "of map projection.\n"
+             "Layer index starts at 0 (first layer in map).\n"
+             "Will return a Mapnik Featureset if successful\n"
+             "otherwise will return None.\n"
+             "\n"
+             "Usage:\n"
+             ">>> featureset = m.query_point(0,-122,48)\n"
+             ">>> featureset\n"
+             "<mapnik._mapnik.Featureset object at 0x23b0b0>\n"
+             ">>> featureset.features\n"
+             ">>> [<mapnik.Feature object at 0x3995630>]\n"
+            )
 
-      .def("remove_all",&Map::remove_all,
-           "Remove all Mapnik Styles and Layers from the Map.\n"
-           "\n"
-           "Usage:\n"
-           ">>> m.remove_all()\n"
-         )
+        .def("remove_all",&Map::remove_all,
+             "Remove all Mapnik Styles and layers from the Map.\n"
+             "\n"
+             "Usage:\n"
+             ">>> m.remove_all()\n"
+            )
         
-      .def("remove_style",&Map::remove_style,
-           "Remove a Mapnik Style from the map.\n"
-           "\n"
-           "Usage:\n"
-           ">>> m.remove_style('Style Name')\n"
-         )
+        .def("remove_style",&Map::remove_style,
+             (arg("style_name")),
+             "Remove a Mapnik Style from the map.\n"
+             "\n"
+             "Usage:\n"
+             ">>> m.remove_style('Style Name')\n"
+            )
 
-      .def("resize",&Map::resize,
-           "Resize a Mapnik Map.\n"
-           "\n"
-           "Usage:\n"
-           ">>> m.resize(64,64)\n"
-         )
+        .def("resize",&Map::resize,
+             (arg("width"),arg("height")),
+             "Resize a Mapnik Map.\n"
+             "\n"
+             "Usage:\n"
+             ">>> m.resize(64,64)\n"
+            )
         
-      .def("scale", &Map::scale,
-           "Return the Map Scale.\n"
-           "Usage:\n"
-           "\n"
-           ">>> m.scale()\n"
-         )
+        .def("scale", &Map::scale,
+             "Return the Map Scale.\n"
+             "Usage:\n"
+             "\n"
+             ">>> m.scale()\n"
+            )
 
-      .def("scale_denominator", &Map::scale_denominator,
-           "Return the Map Scale Denominator.\n"
-           "Usage:\n"
-           "\n"
-           ">>> m.scale_denominator\n"
-         )
+        .def("scale_denominator", &Map::scale_denominator,
+             "Return the Map Scale Denominator.\n"
+             "Usage:\n"
+             "\n"
+             ">>> m.scale_denominator()\n"
+            )
       
-      .def("view_transform",&Map::view_transform,
-                   "Map CoordinateTransform object.\n"
-                   "\n"
-                   "Usage:\n"
-                   ">>> m.view_transform()\n"         
-         )
+        .def("view_transform",&Map::view_transform,
+             "Return the map ViewTransform object\n"
+             "which is used internally to convert between\n"
+             "geographic coordinates and screen coordinates.\n"
+             "\n"
+             "Usage:\n"
+             ">>> m.view_transform()\n"         
+            )
       
-      .def("zoom",&Map::zoom,
-           "Zoom in by a given factor.\n"
-           "Usage:\n"
-           "\n"
-           ">>> m.zoom(0.25)\n"
-         )
+        .def("zoom",&Map::zoom,
+             (arg("factor")),
+             "Zoom in or out by a given factor.\n"
+             "Positive number zooms in, negative number\n"
+             "zooms out.\n"
+             "\n"
+             "Usage:\n"
+             "\n"
+             ">>> m.zoom(0.25)\n"
+            )
         
-      .def("zoom_all",&Map::zoom_all,
-           "Set the geographical extent of the map\n"
-           "to the combined extents of all active layers.\n"
-           "\n"
-           "Usage:\n"
-           ">>> m.zoom_all()\n"
-         )
+        .def("zoom_all",&Map::zoom_all,
+             "Set the geographical extent of the map\n"
+             "to the combined extents of all active layers.\n"
+             "\n"
+             "Usage:\n"
+             ">>> m.zoom_all()\n"
+            )
         
-      .def("zoom_to_box",&Map::zoomToBox,
-           "Set the geographical extent of the map\n"
-           "by specifying a Mapnik Envelope.\n"
-           "\n"
-           "Usage:\n"
-           ">>> extext = Envelope(-180.0, -90.0, 180.0, 90.0)\n"
-           ">>> m.zoom_to_box(extent)\n"
-         )   
+        .def("zoom_to_box",&Map::zoom_to_box,
+             (arg("Boxd2")),
+             "Set the geographical extent of the map\n"
+             "by specifying a Mapnik Box2d.\n"
+             "\n"
+             "Usage:\n"
+             ">>> extext = Box2d(-180.0, -90.0, 180.0, 90.0)\n"
+             ">>> m.zoom_to_box(extent)\n"
+            )
+        .def("get_metawriter_property", &Map::get_metawriter_property,
+            (arg("name")),
+            "Reads a metawriter property.\n"
+            "These properties are completely user-defined and can be used to"
+            "create filenames, etc.\n"
+            "\n"
+            "Usage:\n"
+            ">>> map.set_metawriter_property(\"x\", \"10\")\n"
+            ">>> map.get_metawriter_property(\"x\")\n"
+            "10\n"
+        )
+        .def("set_metawriter_property", &Map::set_metawriter_property,
+            (arg("name"),arg("value")),
+            "Sets a metawriter property.\n"
+            "These properties are completely user-defined and can be used to"
+            "create filenames, etc.\n"
+            "\n"
+            "Usage:\n"
+            ">>> map.set_metawriter_property(\"x\", str(x))\n"
+            ">>> map.set_metawriter_property(\"y\", str(y))\n"
+            ">>> map.set_metawriter_property(\"z\", str(z))\n"
+            "\n"
+            "Use a path like \"[z]/[x]/[y].json\" to create filenames.\n"
+        )
+        .def("find_inmem_metawriter", find_inmem_metawriter,
+            (arg("name")),
+            "Gets an inmem metawriter, or None if no such metawriter "
+            "exists.\n"
+            "Use this after the map has been rendered to retrieve information "
+            "about the hit areas rendered on the map.\n"
+          )
+        
+        .def("extra_attributes",&Map::get_extra_attributes,return_value_policy<copy_const_reference>(),"TODO")
 
-      .add_property("aspect_fix_mode",
-                    &Map::getAspectFixMode,
-                    &Map::setAspectFixMode,
-                    "Get/Set aspect fix mode.\n"
-                    "Usage:\n"
-                    "\n"
-                    ">>> m.aspect_fix_mode = aspect_fix_mode.GROW_BBOX\n"
-         )      
+        .add_property("aspect_fix_mode",
+                      &Map::get_aspect_fix_mode,
+                      &Map::set_aspect_fix_mode,
+                      // TODO - how to add arg info to properties?
+                      //(arg("aspect_fix_mode")),
+                      "Get/Set aspect fix mode.\n"
+                      "Usage:\n"
+                      "\n"
+                      ">>> m.aspect_fix_mode = aspect_fix_mode.GROW_BBOX\n"
+            )      
         
-      .add_property("background",make_function
-                    (&Map::background,return_value_policy<copy_const_reference>()),
-                    &Map::set_background,
-                    "The background color of the map.\n"
-                    "\n"
-                    "Usage:\n"
-                    ">>> m.background = Color('steelblue')\n"
-         )
+        .add_property("background",make_function
+                      (&Map::background,return_value_policy<copy_const_reference>()),
+                      &Map::set_background,
+                      "The background color of the map.\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> m.background = Color('steelblue')\n"
+            )
+
+        .add_property("base",
+                      make_function(&Map::base_path,return_value_policy<copy_const_reference>()),
+                      &Map::set_base_path,
+                      "The base path of the map where any files using relative \n"
+                      "paths will be interpreted as relative to.\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> m.base_path = '.'\n"
+            )
         
-      .add_property("buffer_size",
-                    &Map::buffer_size,
-                    &Map::set_buffer_size,
-                    "Get/Set the size of buffer around map in pixels.\n"
-                    "\n"
-                    "Usage:\n"
-                    ">>> m.buffer_size\n"
-                    "0 # zero by default\n"
-                    ">>> m.buffer_size = 2\n"
-                    ">>> m.buffer_size\n"
-                    "2\n"
-         )
+        .add_property("buffer_size",
+                      &Map::buffer_size,
+                      &Map::set_buffer_size,
+                      "Get/Set the size of buffer around map in pixels.\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> m.buffer_size\n"
+                      "0 # zero by default\n"
+                      ">>> m.buffer_size = 2\n"
+                      ">>> m.buffer_size\n"
+                      "2\n"
+            )
          
-      .add_property("height",
-                    &Map::getHeight,
-                    &Map::setHeight,
-                    "Get/Set the height of the map in pixels.\n"
-                    "Minimum settable size is 16 pixels.\n"
-                    "\n"
-                    "Usage:\n"
-                    ">>> m.height\n"
-                    "400\n"
-                    ">>> m.height = 600\n"
-                    ">>> m.height\n"
-                    "600\n"
-         )
+        .add_property("height",
+                      &Map::height,
+                      &Map::set_height,
+                      "Get/Set the height of the map in pixels.\n"
+                      "Minimum settable size is 16 pixels.\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> m.height\n"
+                      "400\n"
+                      ">>> m.height = 600\n"
+                      ">>> m.height\n"
+                      "600\n"
+            )
         
-      .add_property("layers",make_function
-                    (layers_nonconst,return_value_policy<reference_existing_object>()), 
-                    "The list of map layers.\n"
-                    "\n"
-                    "Usage:\n"
-                    ">>> m.layers\n"
-                    "<mapnik._mapnik.Layers object at 0x6d458>"
-                    ">>> m.layers[0]\n"
-                    "<mapnik._mapnik.Layer object at 0x5fe130>\n"
-         )
+        .add_property("layers",make_function
+                      (layers_nonconst,return_value_policy<reference_existing_object>()), 
+                      "The list of map layers.\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> m.layers\n"
+                      "<mapnik._mapnik.layers object at 0x6d458>"
+                      ">>> m.layers[0]\n"
+                      "<mapnik._mapnik.layer object at 0x5fe130>\n"
+            )
 
-      .add_property("srs",
-                    make_function(&Map::srs,return_value_policy<copy_const_reference>()),
-                    &Map::set_srs,
-                    "Spatial reference in Proj.4 format.\n"
-                    "Either an epsg code or proj literal.\n"
-                    "For example, a proj literal:\n"
-                    "\t'+proj=latlong +datum=WGS84'\n"
-                    "and a proj epsg code:\n"
-                    "\t'+init=epsg:4326'\n"
-                    "\n"
-                    "Note: using epsg codes requires the installation of\n"
-                    "the Proj.4 'epsg' data file normally found in '/usr/local/share/proj'\n"
-                    "\n"
-                    "Usage:\n"
-                    ">>> m.srs\n"
-                    "'+proj=latlong +datum=WGS84' # The default srs if not initialized with custom srs\n"
-                    ">>> # set to google mercator with Proj.4 literal\n"
-                    "... \n"
-                    ">>> m.srs = '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs +over'\n"
-         )
+        .add_property("maximum_extent",make_function
+                      (&Map::maximum_extent,return_value_policy<copy_const_reference>()),
+                      &Map::set_maximum_extent,
+                      "The maximum extent of the map.\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> m.maximum_extent = Box2d(-180,-90,180,90)\n"
+            )
+
+        .add_property("srs",
+                      make_function(&Map::srs,return_value_policy<copy_const_reference>()),
+                      &Map::set_srs,
+                      "Spatial reference in Proj.4 format.\n"
+                      "Either an epsg code or proj literal.\n"
+                      "For example, a proj literal:\n"
+                      "\t'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'\n"
+                      "and a proj epsg code:\n"
+                      "\t'+init=epsg:4326'\n"
+                      "\n"
+                      "Note: using epsg codes requires the installation of\n"
+                      "the Proj.4 'epsg' data file normally found in '/usr/local/share/proj'\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> m.srs\n"
+                      "'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs' # The default srs if not initialized with custom srs\n"
+                      ">>> # set to google mercator with Proj.4 literal\n"
+                      "... \n"
+                      ">>> m.srs = '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs +over'\n"
+            )
         
-      .add_property("width",
-                    &Map::getWidth,
-                    &Map::setWidth,
-                    "Get/Set the width of the map in pixels.\n"
-                    "Minimum settable size is 16 pixels.\n"
-                    "\n"
-                    "Usage:\n"
-                    ">>> m.width\n"
-                    "600\n"
-                    ">>> m.width = 800\n"
-                    ">>> m.width\n"
-                    "800\n"
-         )
-      ;
+        .add_property("width",
+                      &Map::width,
+                      &Map::set_width,
+                      "Get/Set the width of the map in pixels.\n"
+                      "Minimum settable size is 16 pixels.\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> m.width\n"
+                      "600\n"
+                      ">>> m.width = 800\n"
+                      ">>> m.width\n"
+                      "800\n"
+            )
+        ;
 }
diff --git a/bindings/python/mapnik_markers_symbolizer.cpp b/bindings/python/mapnik_markers_symbolizer.cpp
new file mode 100644
index 0000000..71d76c2
--- /dev/null
+++ b/bindings/python/mapnik_markers_symbolizer.cpp
@@ -0,0 +1,115 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#include <boost/python.hpp>
+#include <mapnik/graphics.hpp>
+#include <mapnik/image_util.hpp>
+#include <mapnik/markers_symbolizer.hpp>
+#include <mapnik/parse_path.hpp>
+#include "mapnik_svg.hpp"
+
+using mapnik::markers_symbolizer;
+using mapnik::symbolizer_with_image;
+using mapnik::path_processor_type;
+using mapnik::parse_path;
+
+namespace  { 
+using namespace boost::python;
+
+std::string get_filename(mapnik::markers_symbolizer const& symbolizer) 
+{ 
+    return path_processor_type::to_string(*symbolizer.get_filename()); 
+} 
+
+void set_filename(mapnik::markers_symbolizer & symbolizer, std::string const& file_expr) 
+{ 
+    symbolizer.set_filename(parse_path(file_expr)); 
+} 
+
+}
+
+struct markers_symbolizer_pickle_suite : boost::python::pickle_suite
+{
+    static boost::python::tuple
+    getinitargs(markers_symbolizer const& p)
+    {
+        std::string filename = path_processor_type::to_string(*p.get_filename());
+        return boost::python::make_tuple(filename,mapnik::guess_type(filename));
+    }
+
+    static  boost::python::tuple
+    getstate(markers_symbolizer const& p)
+    {
+        return boost::python::make_tuple(p.get_allow_overlap());//,p.get_opacity());
+    }
+
+    static void
+    setstate (markers_symbolizer& p, boost::python::tuple state)
+    {
+        using namespace boost::python;
+        if (len(state) != 2)
+        {
+            PyErr_SetObject(PyExc_ValueError,
+                            ("expected 2-item tuple in call to __setstate__; got %s"
+                             % state).ptr()
+                );
+            throw_error_already_set();
+        }
+                
+        p.set_allow_overlap(extract<bool>(state[0]));
+        //p.set_opacity(extract<float>(state[1]));
+        
+    }
+
+};
+
+
+void export_markers_symbolizer()
+{
+    using namespace boost::python;
+    
+    class_<markers_symbolizer>("MarkersSymbolizer",
+                             init<>("Default Markers Symbolizer - blue arrow"))
+        .def (init<mapnik::path_expression_ptr>("<path expression ptr>"))
+        //.def_pickle(markers_symbolizer_pickle_suite())
+        .add_property("filename",
+                      &get_filename,
+                      &set_filename)   
+        .add_property("allow_overlap",
+                      &markers_symbolizer::get_allow_overlap,
+                      &markers_symbolizer::set_allow_overlap)
+        .add_property("spacing",
+                      &markers_symbolizer::get_spacing,
+                      &markers_symbolizer::set_spacing)
+        .add_property("max_error",
+                      &markers_symbolizer::get_max_error,
+                      &markers_symbolizer::set_max_error)
+        .add_property("opacity",
+                      &markers_symbolizer::get_opacity,
+                      &markers_symbolizer::set_opacity,
+                      "Set/get the text opacity")
+        .add_property("transform",
+                      &mapnik::get_svg_transform<markers_symbolizer>,
+                      &mapnik::set_svg_transform<markers_symbolizer>)
+        ;
+}
diff --git a/bindings/python/mapnik_palette.cpp b/bindings/python/mapnik_palette.cpp
new file mode 100644
index 0000000..cb40e15
--- /dev/null
+++ b/bindings/python/mapnik_palette.cpp
@@ -0,0 +1,53 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// boost
+#include <boost/python.hpp>
+#include <boost/make_shared.hpp>
+
+//mapnik
+#include <mapnik/palette.hpp>
+
+static boost::shared_ptr<mapnik::rgba_palette> make_palette( const std::string& palette, const std::string& format )
+{
+    mapnik::rgba_palette::palette_type type = mapnik::rgba_palette::PALETTE_RGBA;
+    if (format == "rgb")
+        type = mapnik::rgba_palette::PALETTE_RGB;
+    else if (format == "act")
+        type = mapnik::rgba_palette::PALETTE_ACT;
+    else
+        throw std::runtime_error("invalid type passed for mapnik.Palette: must be either rgba, rgb, or act");
+    return boost::make_shared<mapnik::rgba_palette>(palette, type);
+}
+
+void export_palette () 
+{
+    using namespace boost::python;
+    class_<boost::shared_ptr<mapnik::rgba_palette> >("Palette",no_init)
+                     /*, init<std::string,std::string>(
+                      ( arg("palette"), arg("type")),
+                      "Creates a new color palette from a file\n"
+                      )*/
+                     .def( "__init__", boost::python::make_constructor( &make_palette)) 
+    ;
+}
diff --git a/bindings/python/mapnik_parameters.cpp b/bindings/python/mapnik_parameters.cpp
index def9783..9492c6f 100644
--- a/bindings/python/mapnik_parameters.cpp
+++ b/bindings/python/mapnik_parameters.cpp
@@ -32,27 +32,27 @@ using mapnik::parameters;
 
 struct pickle_value : public boost::static_visitor<>
 {
-    public:
-        pickle_value( boost::python::list vals): 
+public:
+    pickle_value( boost::python::list vals): 
         vals_(vals) {}
             
-        void operator () ( int val )
-        {
-            vals_.append(val);
-        }
+    void operator () ( int val )
+    {
+        vals_.append(val);
+    }
         
-        void operator () ( double val )
-        {
-            vals_.append(val);
-        }
+    void operator () ( double val )
+    {
+        vals_.append(val);
+    }
 
-        void operator () ( std::string val )
-        {
-            vals_.append(val);
-        }
+    void operator () ( std::string val )
+    {
+        vals_.append(val);
+    }
         
-    private:
-        boost::python::list vals_;
+private:
+    boost::python::list vals_;
 
 };
 
@@ -92,9 +92,9 @@ struct parameters_pickle_suite : boost::python::pickle_suite
         if (len(state) != 1)
         {
             PyErr_SetObject(PyExc_ValueError,
-			    ("expected 1-item tuple in call to __setstate__; got %s"
-			     % state).ptr()
-			    );
+                            ("expected 1-item tuple in call to __setstate__; got %s"
+                             % state).ptr()
+                );
             throw_error_already_set();
         }
         
@@ -110,21 +110,21 @@ struct parameters_pickle_suite : boost::python::pickle_suite
             
             if (ex0.check())
             {
-               p[key] = ex0();
+                p[key] = ex0();
             }
             else if (ex1.check())
             {
-               p[key] = ex1();
+                p[key] = ex1();
             }
             else if (ex2.check())
             {
-               p[key] = ex2();
+                p[key] = ex2();
             }           
             
             /*
-            extract_value serializer( p, key );
-            mapnik::value_holder val = extract<mapnik::value_holder>(d[key]);
-            boost::apply_visitor( serializer, val );
+              extract_value serializer( p, key );
+              mapnik::value_holder val = extract<mapnik::value_holder>(d[key]);
+              boost::apply_visitor( serializer, val );
             */
         }        
     }
@@ -188,4 +188,4 @@ void export_parameters()
         .def("as_dict",dict_params)
         .def("as_list",list_params)
         ;
-}
\ No newline at end of file
+}
diff --git a/bindings/python/mapnik_point_symbolizer.cpp b/bindings/python/mapnik_point_symbolizer.cpp
index 736b8c0..ef30e9d 100644
--- a/bindings/python/mapnik_point_symbolizer.cpp
+++ b/bindings/python/mapnik_point_symbolizer.cpp
@@ -22,85 +22,107 @@
 //$Id$
 
 #include <boost/python.hpp>
+#include "mapnik_enumeration.hpp"
 #include <mapnik/graphics.hpp>
 #include <mapnik/image_util.hpp>
 #include <mapnik/point_symbolizer.hpp>
+#include <mapnik/parse_path.hpp>
+#include "mapnik_svg.hpp"
 
-
+using namespace mapnik;
 using mapnik::point_symbolizer;
 using mapnik::symbolizer_with_image;
+using mapnik::path_processor_type;
+using mapnik::parse_path;
+
+
+namespace {
+using namespace boost::python;
+
+const std::string get_filename(point_symbolizer const& t) 
+{ 
+    return path_processor_type::to_string(*t.get_filename()); 
+}
+
+void set_filename(point_symbolizer & t, std::string const& file_expr) 
+{ 
+    t.set_filename(parse_path(file_expr)); 
+}
+
+}
 
 struct point_symbolizer_pickle_suite : boost::python::pickle_suite
 {
-   static boost::python::tuple
-   getinitargs(const point_symbolizer& p)
-   {
-      boost::shared_ptr<mapnik::ImageData32> img = p.get_image();
-      const std::string & filename = p.get_filename();
-      
-      if ( ! filename.empty() ) {
-          return boost::python::make_tuple(filename,mapnik::guess_type(filename),img->width(),img->height());
-      } else {
-          return boost::python::make_tuple();
-      }
-      
-   }
+    static boost::python::tuple
+    getinitargs(const point_symbolizer& p)
+    {
+        std::string filename = path_processor_type::to_string(*p.get_filename());
+        return boost::python::make_tuple(filename,mapnik::guess_type(filename));
+    }
 
-   static  boost::python::tuple
-   getstate(const point_symbolizer& p)
-   {
-        return boost::python::make_tuple(p.get_allow_overlap(),p.get_opacity());
-   }
+    static  boost::python::tuple
+    getstate(const point_symbolizer& p)
+    {
+        return boost::python::make_tuple(p.get_allow_overlap(),
+                                         p.get_opacity(),
+                                         p.get_ignore_placement(),
+                                         p.get_point_placement());
+    }
 
-   static void
-   setstate (point_symbolizer& p, boost::python::tuple state)
-   {
+    static void
+    setstate (point_symbolizer& p, boost::python::tuple state)
+    {
         using namespace boost::python;
-        if (len(state) != 2)
+        if (len(state) != 4)
         {
             PyErr_SetObject(PyExc_ValueError,
-                         ("expected 2-item tuple in call to __setstate__; got %s"
-                          % state).ptr()
-            );
+                            ("expected 4-item tuple in call to __setstate__; got %s"
+                             % state).ptr()
+                );
             throw_error_already_set();
         }
                 
         p.set_allow_overlap(extract<bool>(state[0]));
         p.set_opacity(extract<float>(state[1]));
+        p.set_ignore_placement(extract<bool>(state[2]));
+        p.set_point_placement(extract<point_placement_e>(state[3]));
         
-   }
+    }
 
 };
 
-namespace  
-{ 
-    using namespace boost::python;
-
-	  const char *get_filename(mapnik::point_symbolizer& symbolizer) 
-	  { 
-	      return symbolizer.get_filename().c_str(); 
-	  } 
-}
 
 void export_point_symbolizer()
 {
     using namespace boost::python;
+
+    enumeration_<point_placement_e>("point_placement")
+        .value("CENTROID",CENTROID_POINT_PLACEMENT)
+        .value("INTERIOR",INTERIOR_POINT_PLACEMENT)
+        ;
     
     class_<point_symbolizer>("PointSymbolizer",
                              init<>("Default Point Symbolizer - 4x4 black square"))
-        .def (init<std::string const&,
-              std::string const&,unsigned,unsigned>("TODO"))
+        .def (init<mapnik::path_expression_ptr>("<path expression ptr>"))
         .def_pickle(point_symbolizer_pickle_suite())
         .add_property("filename",
-            // DS - Using workaround as the normal make_function does not work for unknown reasons...
-            //make_function(&point_symbolizer::get_filename,return_value_policy<copy_const_reference>()),
-            get_filename,
-            &point_symbolizer::set_filename)   
+                      &get_filename,
+                      &set_filename)
         .add_property("allow_overlap",
-              &point_symbolizer::get_allow_overlap,
-              &point_symbolizer::set_allow_overlap)
+                      &point_symbolizer::get_allow_overlap,
+                      &point_symbolizer::set_allow_overlap)
         .add_property("opacity",
-              &point_symbolizer::get_opacity,
-              &point_symbolizer::set_opacity)
+                      &point_symbolizer::get_opacity,
+                      &point_symbolizer::set_opacity)
+        .add_property("ignore_placement",
+                      &point_symbolizer::get_ignore_placement,
+                      &point_symbolizer::set_ignore_placement)
+        .add_property("placement",
+                      &point_symbolizer::get_point_placement,
+                      &point_symbolizer::set_point_placement,
+                      "Set/get the placement of the point")
+        .add_property("transform",
+                      mapnik::get_svg_transform<point_symbolizer>,
+                      mapnik::set_svg_transform<point_symbolizer>)
         ;
 }
diff --git a/bindings/python/mapnik_polygon_pattern_symbolizer.cpp b/bindings/python/mapnik_polygon_pattern_symbolizer.cpp
index 0d731a4..72f7539 100644
--- a/bindings/python/mapnik_polygon_pattern_symbolizer.cpp
+++ b/bindings/python/mapnik_polygon_pattern_symbolizer.cpp
@@ -24,27 +24,90 @@
 #include <boost/python.hpp>
 #include <mapnik/image_util.hpp>
 #include <mapnik/polygon_pattern_symbolizer.hpp>
+#include "mapnik_enumeration.hpp"
+#include <mapnik/parse_path.hpp>
+#include "mapnik_svg.hpp"
 
+using namespace mapnik;
 using mapnik::polygon_pattern_symbolizer;
+using mapnik::path_expression_ptr;
+using mapnik::path_processor_type;
+using mapnik::parse_path;
+using mapnik::guess_type;
+
+namespace {
+using namespace boost::python;
+
+const std::string get_filename(polygon_pattern_symbolizer const& t) 
+{ 
+    return path_processor_type::to_string(*t.get_filename()); 
+}
+
+void set_filename(polygon_pattern_symbolizer & t, std::string const& file_expr) 
+{ 
+    t.set_filename(parse_path(file_expr)); 
+}
+
+}
 
 struct polygon_pattern_symbolizer_pickle_suite : boost::python::pickle_suite
 {
-   static boost::python::tuple
-   getinitargs(const polygon_pattern_symbolizer& p)
-   {
-      boost::shared_ptr<mapnik::ImageData32> img = p.get_image();
-      const std::string & filename = p.get_filename();
-      return boost::python::make_tuple(filename,mapnik::guess_type(filename),img->width(),img->height());
-   }
+    static boost::python::tuple
+    getinitargs(const polygon_pattern_symbolizer& p)
+    {
+        std::string filename = path_processor_type::to_string(*p.get_filename());
+        return boost::python::make_tuple(filename,guess_type(filename));
+    }
+
+    static boost::python::tuple
+    getstate(const polygon_pattern_symbolizer& p)
+    {
+        return boost::python::make_tuple(p.get_alignment(),p.get_gamma());
+    }
+
+    static void
+    setstate (polygon_pattern_symbolizer& p, boost::python::tuple state)
+    {
+        using namespace boost::python;
+        if (len(state) != 2)
+        {
+            PyErr_SetObject(PyExc_ValueError,
+                            ("expected 2-item tuple in call to __setstate__; got %s"
+                             % state).ptr()
+                );
+            throw_error_already_set();
+        }
+                
+        p.set_alignment(extract<pattern_alignment_e>(state[0]));
+        p.set_gamma(extract<float>(state[1]));
+    }
+
 };
 
 void export_polygon_pattern_symbolizer()
 {
     using namespace boost::python;
+
+    enumeration_<pattern_alignment_e>("pattern_alignment")
+        .value("LOCAL",LOCAL_ALIGNMENT)
+        .value("GLOBAL",GLOBAL_ALIGNMENT)
+        ;
     
     class_<polygon_pattern_symbolizer>("PolygonPatternSymbolizer",
-				       init<std::string const&,
-				       std::string const&,
-				       unsigned,unsigned>("TODO"))
-        .def_pickle(polygon_pattern_symbolizer_pickle_suite())	;    
+                                       init<path_expression_ptr>("<path_expression_ptr>"))
+        .def_pickle(polygon_pattern_symbolizer_pickle_suite())
+        .add_property("alignment",
+              &polygon_pattern_symbolizer::get_alignment,
+              &polygon_pattern_symbolizer::set_alignment,
+              "Set/get the alignment of the pattern")
+        .add_property("transform",
+              mapnik::get_svg_transform<polygon_pattern_symbolizer>,
+              mapnik::set_svg_transform<polygon_pattern_symbolizer>)
+        .add_property("filename",
+                      &get_filename,
+                      &set_filename)
+        .add_property("gamma",
+                      &polygon_pattern_symbolizer::get_gamma,
+                      &polygon_pattern_symbolizer::set_gamma)
+        ;    
 }
diff --git a/bindings/python/mapnik_polygon_symbolizer.cpp b/bindings/python/mapnik_polygon_symbolizer.cpp
index b5fec86..dc16344 100644
--- a/bindings/python/mapnik_polygon_symbolizer.cpp
+++ b/bindings/python/mapnik_polygon_symbolizer.cpp
@@ -29,34 +29,34 @@ using mapnik::color;
 
 struct polygon_symbolizer_pickle_suite : boost::python::pickle_suite
 {
-   static boost::python::tuple
-   getinitargs(const polygon_symbolizer& p)
-   {
-      return boost::python::make_tuple(p.get_fill());  
-   }
+    static boost::python::tuple
+    getinitargs(const polygon_symbolizer& p)
+    {
+        return boost::python::make_tuple(p.get_fill());  
+    }
 
-   static  boost::python::tuple
-   getstate(const polygon_symbolizer& p)
-   {
+    static  boost::python::tuple
+    getstate(const polygon_symbolizer& p)
+    {
         return boost::python::make_tuple(p.get_opacity(),p.get_gamma());
-   }
+    }
 
-   static void
-   setstate (polygon_symbolizer& p, boost::python::tuple state)
-   {
+    static void
+    setstate (polygon_symbolizer& p, boost::python::tuple state)
+    {
         using namespace boost::python;
         if (len(state) != 2)
         {
             PyErr_SetObject(PyExc_ValueError,
-                         ("expected 2-item tuple in call to __setstate__; got %s"
-                          % state).ptr()
-            );
+                            ("expected 2-item tuple in call to __setstate__; got %s"
+                             % state).ptr()
+                );
             throw_error_already_set();
         }
                 
         p.set_opacity(extract<float>(state[0]));
         p.set_gamma(extract<float>(state[1]));
-   }
+    }
 
 };
 
@@ -65,7 +65,7 @@ void export_polygon_symbolizer()
     using namespace boost::python;
         
     class_<polygon_symbolizer>("PolygonSymbolizer",
-				    init<>("Default PolygonSymbolizer - solid fill grey"))
+                               init<>("Default PolygonSymbolizer - solid fill grey"))
         .def(init<color const&>("TODO"))
         .def_pickle(polygon_symbolizer_pickle_suite())
         .add_property("fill",make_function
diff --git a/bindings/python/mapnik_proj_transform.cpp b/bindings/python/mapnik_proj_transform.cpp
index 3e06130..8924003 100644
--- a/bindings/python/mapnik_proj_transform.cpp
+++ b/bindings/python/mapnik_proj_transform.cpp
@@ -41,47 +41,82 @@ struct proj_transform_pickle_suite : boost::python::pickle_suite
 
 namespace  {
 
-   mapnik::coord2d forward_transform_c(mapnik::proj_transform& t, mapnik::coord2d const& c)
-   {
-      double x = c.x;
-      double y = c.y;
-      double z = 0.0;
-      t.forward(x,y,z);
-      return mapnik::coord2d(x,y);
-   }
+mapnik::coord2d forward_transform_c(mapnik::proj_transform& t, mapnik::coord2d const& c)
+{
+    double x = c.x;
+    double y = c.y;
+    double z = 0.0;
+    if (!t.forward(x,y,z)) {
+        std::ostringstream s;
+        s << "Failed to forward project "
+          << c << " from " << t.source().params() << " to: " << t.dest().params();
+        throw std::runtime_error(s.str());
+    }
+    return mapnik::coord2d(x,y);
+}
    
-   mapnik::coord2d backward_transform_c(mapnik::proj_transform& t, mapnik::coord2d const& c)
-   {
-      double x = c.x;
-      double y = c.y;
-      double z = 0.0;
-      t.backward(x,y,z);
-      return mapnik::coord2d(x,y);
-   }
+mapnik::coord2d backward_transform_c(mapnik::proj_transform& t, mapnik::coord2d const& c)
+{
+    double x = c.x;
+    double y = c.y;
+    double z = 0.0;
+    if (!t.backward(x,y,z)) {
+        std::ostringstream s;
+        s << "Failed to back project "
+          << c << " from " <<  t.dest().params() << " to: " << t.source().params();
+        throw std::runtime_error(s.str());
+    }
+    return mapnik::coord2d(x,y);
+}
 
-   mapnik::Envelope<double> forward_transform_env(mapnik::proj_transform& t, mapnik::Envelope<double> const & box)
-   {
-      double minx = box.minx();
-      double miny = box.miny();
-      double maxx = box.maxx();
-      double maxy = box.maxy();
-      double z = 0.0;
-      t.forward(minx,miny,z);
-      t.forward(maxx,maxy,z);
-      return mapnik::Envelope<double>(minx,miny,maxx,maxy);
-   }
+mapnik::box2d<double> forward_transform_env(mapnik::proj_transform& t, mapnik::box2d<double> const & box)
+{
+    mapnik::box2d<double> new_box = box;
+    if (!t.forward(new_box)) {
+        std::ostringstream s;
+        s << "Failed to forward project "
+          << box << " from " << t.source().params() << " to: " << t.dest().params();
+        throw std::runtime_error(s.str());
+    }
+    return new_box;
+}
+
+mapnik::box2d<double> backward_transform_env(mapnik::proj_transform& t, mapnik::box2d<double> const & box)
+{
+    mapnik::box2d<double> new_box = box;
+    if (!t.backward(new_box)){
+        std::ostringstream s;
+        s << "Failed to back project "
+          << box << " from " <<  t.dest().params() << " to: " << t.source().params();
+        throw std::runtime_error(s.str());
+    }
+    return new_box;
+}
+
+mapnik::box2d<double> forward_transform_env_p(mapnik::proj_transform& t, mapnik::box2d<double> const & box, unsigned int points)
+{
+    mapnik::box2d<double> new_box = box;
+    if (!t.forward(new_box,points)) {
+        std::ostringstream s;
+        s << "Failed to forward project "
+          << box << " from " << t.source().params() << " to: " << t.dest().params();
+        throw std::runtime_error(s.str());
+    }
+    return new_box;
+}
+
+mapnik::box2d<double> backward_transform_env_p(mapnik::proj_transform& t, mapnik::box2d<double> const & box, unsigned int points)
+{
+    mapnik::box2d<double> new_box = box;
+    if (!t.backward(new_box,points)){
+        std::ostringstream s;
+        s << "Failed to back project "
+          << box << " from " <<  t.dest().params() << " to: " << t.source().params();
+        throw std::runtime_error(s.str());
+    }
+    return new_box;
+}
 
-   mapnik::Envelope<double> backward_transform_env(mapnik::proj_transform& t, mapnik::Envelope<double> const & box)
-   {
-      double minx = box.minx();
-      double miny = box.miny();
-      double maxx = box.maxx();
-      double maxy = box.maxy();
-      double z = 0.0;
-      t.backward(minx,miny,z);
-      t.backward(maxx,maxy,z);
-      return mapnik::Envelope<double>(minx,miny,maxx,maxy);
-   }   
 }
 
 void export_proj_transform ()
@@ -89,11 +124,13 @@ void export_proj_transform ()
     using namespace boost::python;
     
     class_<proj_transform, boost::noncopyable>("ProjTransform", init< projection const&, projection const& >())
-       .def_pickle(proj_transform_pickle_suite())
-       .def("forward", forward_transform_c)
-       .def("backward",backward_transform_c)
-       .def("forward", forward_transform_env)
-       .def("backward",backward_transform_env)
-       ;
+        .def_pickle(proj_transform_pickle_suite())
+        .def("forward", forward_transform_c)
+        .def("backward",backward_transform_c)
+        .def("forward", forward_transform_env)
+        .def("backward",backward_transform_env)
+        .def("forward", forward_transform_env_p)
+        .def("backward",backward_transform_env_p)
+        ;
     
 }
diff --git a/bindings/python/mapnik_projection.cpp b/bindings/python/mapnik_projection.cpp
index 9e246a4..92231c2 100644
--- a/bindings/python/mapnik_projection.cpp
+++ b/bindings/python/mapnik_projection.cpp
@@ -41,47 +41,47 @@ struct projection_pickle_suite : boost::python::pickle_suite
 };
 
 namespace {
-    mapnik::coord2d forward_pt(mapnik::coord2d const& pt, 
-                            mapnik::projection const& prj)
-    {
-        double x = pt.x;
-        double y = pt.y;
-        prj.forward(x,y);
-        return mapnik::coord2d(x,y);
-    }
+mapnik::coord2d forward_pt(mapnik::coord2d const& pt, 
+                           mapnik::projection const& prj)
+{
+    double x = pt.x;
+    double y = pt.y;
+    prj.forward(x,y);
+    return mapnik::coord2d(x,y);
+}
     
-    mapnik::coord2d inverse_pt(mapnik::coord2d const& pt, 
-                            mapnik::projection const& prj)
-    {
-        double x = pt.x;
-        double y = pt.y;
-        prj.inverse(x,y);
-        return mapnik::coord2d(x,y);
-    }
+mapnik::coord2d inverse_pt(mapnik::coord2d const& pt, 
+                           mapnik::projection const& prj)
+{
+    double x = pt.x;
+    double y = pt.y;
+    prj.inverse(x,y);
+    return mapnik::coord2d(x,y);
+}
    
-   mapnik::Envelope<double> forward_env(mapnik::Envelope<double> const & box,
-                                    mapnik::projection const& prj)
-   {
-      double minx = box.minx();
-      double miny = box.miny();
-      double maxx = box.maxx();
-      double maxy = box.maxy();
-      prj.forward(minx,miny);
-      prj.forward(maxx,maxy);
-      return mapnik::Envelope<double>(minx,miny,maxx,maxy);
-   }
+mapnik::box2d<double> forward_env(mapnik::box2d<double> const & box,
+                                  mapnik::projection const& prj)
+{
+    double minx = box.minx();
+    double miny = box.miny();
+    double maxx = box.maxx();
+    double maxy = box.maxy();
+    prj.forward(minx,miny);
+    prj.forward(maxx,maxy);
+    return mapnik::box2d<double>(minx,miny,maxx,maxy);
+}
    
-   mapnik::Envelope<double> inverse_env(mapnik::Envelope<double> const & box,
-                                    mapnik::projection const& prj)
-   {
-      double minx = box.minx();
-      double miny = box.miny();
-      double maxx = box.maxx();
-      double maxy = box.maxy();
-      prj.inverse(minx,miny);
-      prj.inverse(maxx,maxy);
-      return mapnik::Envelope<double>(minx,miny,maxx,maxy);
-   }
+mapnik::box2d<double> inverse_env(mapnik::box2d<double> const & box,
+                                  mapnik::projection const& prj)
+{
+    double minx = box.minx();
+    double miny = box.miny();
+    double maxx = box.maxx();
+    double maxy = box.maxy();
+    prj.inverse(minx,miny);
+    prj.inverse(maxx,maxy);
+    return mapnik::box2d<double>(minx,miny,maxx,maxy);
+}
    
 }
 
@@ -90,23 +90,25 @@ void export_projection ()
     using namespace boost::python; 
 
     class_<projection>("Projection", "Represents a map projection.",init<optional<std::string const&> >(
-              (arg("proj4_string")),
-              "Constructs a new projection from its PROJ.4 string representation.\n"
-              "\n"
-              "The parameterless version of this constructor is equivalent to\n"      
-              "   Projection('+proj=latlong +ellps=WGS84')\n"
-              "\n"
-              "The constructor will throw a RuntimeError in case the projection\n"
-              "cannot be initialized.\n"
-              )
+                           (arg("proj4_string")),
+                           "Constructs a new projection from its PROJ.4 string representation.\n"
+                           "\n"
+                           "The parameterless version of this constructor is equivalent to\n"      
+                           "   Projection('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                           "\n"
+                           "The constructor will throw a RuntimeError in case the projection\n"
+                           "cannot be initialized.\n"
+                           )
         )
         .def_pickle(projection_pickle_suite())
         .def ("params", make_function(&projection::params,
-              return_value_policy<copy_const_reference>()),
+                                      return_value_policy<copy_const_reference>()),
               "Returns the PROJ.4 string for this projection.\n")
+        .def ("expanded",&projection::expanded,
+              "normalize PROJ.4 definition by expanding +init= syntax\n")
         .add_property ("geographic", &projection::is_geographic,
-              "This property is True if the projection is a geographic projection\n"
-              "(i.e. it uses lon/lat coordinates)\n")
+                       "This property is True if the projection is a geographic projection\n"
+                       "(i.e. it uses lon/lat coordinates)\n")
         ;
     
     def("forward_",&forward_pt);
diff --git a/bindings/python/mapnik_python.cpp b/bindings/python/mapnik_python.cpp
index 6e578a8..9d36aeb 100644
--- a/bindings/python/mapnik_python.cpp
+++ b/bindings/python/mapnik_python.cpp
@@ -34,11 +34,14 @@ void export_parameters();
 void export_envelope();
 void export_query();
 void export_geometry();
+void export_palette();
 void export_image();
 void export_image_view();
+void export_grid();
+void export_grid_view();
 void export_map();
 void export_python();
-void export_filter();
+void export_expression();
 void export_rule();
 void export_style();
 void export_stroke();
@@ -47,6 +50,7 @@ void export_featureset();
 void export_datasource();
 void export_datasource_cache();
 void export_symbolizer();
+void export_markers_symbolizer();
 void export_point_symbolizer();
 void export_line_symbolizer();
 void export_line_pattern_symbolizer();
@@ -59,8 +63,12 @@ void export_font_engine();
 void export_projection();
 void export_proj_transform();
 void export_view_transform();
+void export_raster_colorizer();
+void export_glyph_symbolizer();
+void export_inmem_metawriter();
 
 #include <mapnik/version.hpp>
+#include <mapnik/value_error.hpp>
 #include <mapnik/map.hpp>
 #include <mapnik/agg_renderer.hpp>
 #ifdef HAVE_CAIRO
@@ -70,19 +78,38 @@ void export_view_transform();
 #include <mapnik/image_util.hpp>
 #include <mapnik/load_map.hpp>
 #include <mapnik/config_error.hpp>
+#include <mapnik/scale_denominator.hpp>
+#include <mapnik/value_error.hpp>
 #include <mapnik/save_map.hpp>
+#include "python_grid_utils.hpp"
 
 #if defined(HAVE_CAIRO) && defined(HAVE_PYCAIRO)
 #include <pycairo.h>
 static Pycairo_CAPI_t *Pycairo_CAPI;
 #endif
 
-void render(const mapnik::Map& map,mapnik::Image32& image, unsigned offset_x = 0, unsigned offset_y = 0)
+
+namespace boost { namespace python {
+
+    struct mapnik_value_to_python
+    {
+        static PyObject* convert(mapnik::value const& v)
+        {
+            return boost::apply_visitor(value_converter(),v.base());
+        }
+    };
+}}
+
+void render(const mapnik::Map& map,
+    mapnik::image_32& image,
+    double scale_factor = 1.0,
+    unsigned offset_x = 0u,
+    unsigned offset_y = 0u)
 {
     Py_BEGIN_ALLOW_THREADS
     try
     {
-        mapnik::agg_renderer<mapnik::Image32> ren(map,image,offset_x, offset_y);
+        mapnik::agg_renderer<mapnik::image_32> ren(map,image,scale_factor,offset_x, offset_y);
         ren.apply();
     }
     catch (...)
@@ -93,13 +120,26 @@ void render(const mapnik::Map& map,mapnik::Image32& image, unsigned offset_x = 0
     Py_END_ALLOW_THREADS
 }
 
-void render2(const mapnik::Map& map,mapnik::Image32& image)
+void render_layer2(const mapnik::Map& map,
+    mapnik::image_32& image,
+    unsigned layer_idx)
 {
+    std::vector<mapnik::layer> const& layers = map.layers();
+    std::size_t layer_num = layers.size();
+    if (layer_idx >= layer_num) {
+        std::ostringstream s;
+        s << "Zero-based layer index '" << layer_idx << "' not valid, only '"
+          << layer_num << "' layers are in map\n";
+        throw std::runtime_error(s.str());
+    }
+
     Py_BEGIN_ALLOW_THREADS
     try
     {
-        mapnik::agg_renderer<mapnik::Image32> ren(map,image);
-        ren.apply();
+        mapnik::layer const& layer = layers[layer_idx];
+        mapnik::agg_renderer<mapnik::image_32> ren(map,image,1.0,0,0);
+        std::set<std::string> names;
+        ren.apply(layer,names);
     }
     catch (...)
     {
@@ -111,7 +151,10 @@ void render2(const mapnik::Map& map,mapnik::Image32& image)
 
 #if defined(HAVE_CAIRO) && defined(HAVE_PYCAIRO)
 
-void render3(const mapnik::Map& map,PycairoSurface* surface, unsigned offset_x = 0, unsigned offset_y = 0)
+void render3(const mapnik::Map& map,
+    PycairoSurface* surface,
+    unsigned offset_x = 0,
+    unsigned offset_y = 0)
 {
     Py_BEGIN_ALLOW_THREADS
     try
@@ -128,7 +171,7 @@ void render3(const mapnik::Map& map,PycairoSurface* surface, unsigned offset_x =
     Py_END_ALLOW_THREADS
 }
 
-void render4(const mapnik::Map& map,PycairoSurface* surface)
+void render4(const mapnik::Map& map, PycairoSurface* surface)
 {
     Py_BEGIN_ALLOW_THREADS
     try
@@ -145,7 +188,10 @@ void render4(const mapnik::Map& map,PycairoSurface* surface)
     Py_END_ALLOW_THREADS
 }
 
-void render5(const mapnik::Map& map,PycairoContext* context, unsigned offset_x = 0, unsigned offset_y = 0)
+void render5(const mapnik::Map& map,
+    PycairoContext* context,
+    unsigned offset_x = 0,
+    unsigned offset_y = 0)
 {
     Py_BEGIN_ALLOW_THREADS
     try
@@ -162,7 +208,7 @@ void render5(const mapnik::Map& map,PycairoContext* context, unsigned offset_x =
     Py_END_ALLOW_THREADS
 }
 
-void render6(const mapnik::Map& map,PycairoContext* context)
+void render6(const mapnik::Map& map, PycairoContext* context)
 {
     Py_BEGIN_ALLOW_THREADS
     try
@@ -181,20 +227,21 @@ void render6(const mapnik::Map& map,PycairoContext* context)
 
 #endif
 
+
 void render_tile_to_file(const mapnik::Map& map, 
                          unsigned offset_x, unsigned offset_y,
                          unsigned width, unsigned height,
                          const std::string& file,
                          const std::string& format)
 {
-    mapnik::Image32 image(width,height);
-    render(map,image,offset_x, offset_y);
+    mapnik::image_32 image(width,height);
+    render(map,image,1.0,offset_x, offset_y);
     mapnik::save_to_file(image.data(),file,format);
 }
 
 void render_to_file1(const mapnik::Map& map,
-                    const std::string& filename,
-                    const std::string& format)
+                     const std::string& filename,
+                     const std::string& format)
 {
     if (format == "pdf" || format == "svg" || format =="ps" || format == "ARGB32" || format == "RGB24")
     {
@@ -206,8 +253,8 @@ void render_to_file1(const mapnik::Map& map,
     }
     else 
     {
-        mapnik::Image32 image(map.getWidth(),map.getHeight());
-        render(map,image,0,0);
+        mapnik::image_32 image(map.width(),map.height());
+        render(map,image,1.0,0,0);
         mapnik::save_to_file(image,filename,format); 
     }
 }
@@ -225,21 +272,48 @@ void render_to_file2(const mapnik::Map& map,const std::string& filename)
     }
     else 
     {
-        mapnik::Image32 image(map.getWidth(),map.getHeight());
-        render(map,image,0,0);
+        mapnik::image_32 image(map.width(),map.height());
+        render(map,image,1.0,0,0);
         mapnik::save_to_file(image,filename); 
     }
 }
 
+void render_to_file3(const mapnik::Map& map,
+                     const std::string& filename,
+                     const std::string& format,
+                     double scale_factor = 1.0
+                     )
+{
+    if (format == "pdf" || format == "svg" || format =="ps" || format == "ARGB32" || format == "RGB24")
+    {
+#if defined(HAVE_CAIRO)
+        mapnik::save_to_cairo_file(map,filename,format);
+#else
+        throw mapnik::ImageWriterException("Cairo backend not available, cannot write to format: " + format);
+#endif
+    }
+    else 
+    {
+        mapnik::image_32 image(map.width(),map.height());
+        render(map,image,scale_factor,0,0);
+        mapnik::save_to_file(image,filename,format); 
+    }
+}
+
 double scale_denominator(mapnik::Map const &map, bool geographic)
 {
     return mapnik::scale_denominator(map, geographic);
 }
 
-void translator(mapnik::config_error const & ex) {
+// http://docs.python.org/c-api/exceptions.html#standard-exceptions
+void config_error_translator(mapnik::config_error const & ex) {
     PyErr_SetString(PyExc_RuntimeError, ex.what());
 }
 
+void value_error_translator(mapnik::value_error const & ex) {
+    PyErr_SetString(PyExc_ValueError, ex.what());
+}
+
 unsigned mapnik_version()
 {
     return MAPNIK_VERSION;
@@ -248,9 +322,19 @@ unsigned mapnik_version()
 unsigned mapnik_svn_revision()
 {
 #if defined(SVN_REVISION)
-  return SVN_REVISION;
+    return SVN_REVISION;
+#else
+    return 0;
+#endif
+}
+
+// indicator for jpeg read/write support within libmapnik
+bool has_jpeg()
+{
+#if defined(HAVE_JPEG)
+  return true;
 #else
-  return 0;
+  return false;
 #endif
 }
 
@@ -258,9 +342,9 @@ unsigned mapnik_svn_revision()
 bool has_cairo()
 {
 #if defined(HAVE_CAIRO)
-  return true;
+    return true;
 #else
-  return false;
+    return false;
 #endif
 }
 
@@ -268,27 +352,30 @@ bool has_cairo()
 bool has_pycairo()
 {
 #if defined(HAVE_CAIRO) && defined(HAVE_PYCAIRO)
-   Pycairo_IMPORT;
-   /*!
-   Case where pycairo support has been compiled into
-   mapnik but at runtime the cairo python module 
-   is unable to be imported and therefore Pycairo surfaces 
-   and contexts cannot be passed to mapnik.render() 
-   */ 
-   if (Pycairo_CAPI == NULL) return false;
-   return true;
+    Pycairo_CAPI = (Pycairo_CAPI_t*) PyCObject_Import(const_cast<char *>("cairo"), const_cast<char *>("CAPI"));
+    if (Pycairo_CAPI == NULL){
+        /*
+          Case where pycairo support has been compiled into
+          mapnik but at runtime the cairo python module 
+          is unable to be imported and therefore Pycairo surfaces 
+          and contexts cannot be passed to mapnik.render() 
+        */ 
+        return false;
+    }
+    return true;
 #else
-   return false;
+    return false;
 #endif
 }
 
 
-BOOST_PYTHON_FUNCTION_OVERLOADS(load_map_overloads, load_map, 2, 3);
-BOOST_PYTHON_FUNCTION_OVERLOADS(load_map_string_overloads, load_map_string, 2, 4);
-BOOST_PYTHON_FUNCTION_OVERLOADS(save_map_overloads, save_map, 2, 3);
-BOOST_PYTHON_FUNCTION_OVERLOADS(save_map_to_string_overloads, save_map_to_string, 1, 2);
+BOOST_PYTHON_FUNCTION_OVERLOADS(load_map_overloads, load_map, 2, 3)
+BOOST_PYTHON_FUNCTION_OVERLOADS(load_map_string_overloads, load_map_string, 2, 4)
+BOOST_PYTHON_FUNCTION_OVERLOADS(save_map_overloads, save_map, 2, 3)
+BOOST_PYTHON_FUNCTION_OVERLOADS(save_map_to_string_overloads, save_map_to_string, 1, 2)
+BOOST_PYTHON_FUNCTION_OVERLOADS(render_overloads, render, 2, 5)
 
-BOOST_PYTHON_MODULE(_mapnik)
+BOOST_PYTHON_MODULE(_mapnik2)
 {
  
     using namespace boost::python;
@@ -297,8 +384,10 @@ BOOST_PYTHON_MODULE(_mapnik)
     using mapnik::load_map_string;
     using mapnik::save_map;
     using mapnik::save_map_to_string;
-
-    register_exception_translator<mapnik::config_error>(translator);
+    using mapnik::render_grid;
+    
+    register_exception_translator<mapnik::config_error>(&config_error_translator);
+    register_exception_translator<mapnik::value_error>(&value_error_translator);
     register_cairo();
     export_query();
     export_geometry();
@@ -308,15 +397,19 @@ BOOST_PYTHON_MODULE(_mapnik)
     export_parameters();
     export_color(); 
     export_envelope();   
+    export_palette();
     export_image();
     export_image_view();
-    export_filter();
+    export_grid();
+    export_grid_view();
+    export_expression();
     export_rule();
     export_style();    
     export_layer();
     export_stroke();
     export_datasource_cache();
     export_symbolizer();
+    export_markers_symbolizer();
     export_point_symbolizer();
     export_line_symbolizer();
     export_line_pattern_symbolizer();
@@ -331,7 +424,19 @@ BOOST_PYTHON_MODULE(_mapnik)
     export_view_transform();
     export_coord();
     export_map();
-
+    export_raster_colorizer();
+    export_glyph_symbolizer();
+    export_inmem_metawriter();
+
+    def("render_grid",&render_grid,
+      ( arg("map"),
+        arg("layer"),
+        args("key")="__id__",
+        arg("resolution")=4,
+        arg("fields")=boost::python::list()
+      )
+    );
+    
     def("render_to_file",&render_to_file1,
         "\n"
         "Render Map to file using explicit image type.\n"
@@ -362,39 +467,50 @@ BOOST_PYTHON_MODULE(_mapnik)
         "\n"
         );
 
-    def("render_tile_to_file",&render_tile_to_file,
+    def("render_to_file",&render_to_file3,
         "\n"
-        "TODO\n"
-        "\n"
-        ); 
-
-    
-    def("render",&render,
-        "\n"
-        "Render Map to an AGG Image32 using offsets\n"
+        "Render Map to file using explicit image type and scale factor.\n"
         "\n"
         "Usage:\n"
-        ">>> from mapnik import Map, Image, render, load_map\n"
+        ">>> from mapnik import Map, render_to_file, load_map\n"
         ">>> m = Map(256,256)\n"
-        ">>> load_map(m,'mapfile.xml')\n"
-        ">>> im = Image(m.width,m.height)\n"
-        ">>> render(m,im,1,1)\n"
-        "\n"
-        ); 
-
-    def("render",&render2,
+        ">>> scale_factor = 4\n"
+        ">>> render_to_file(m,'image.jpeg',scale_factor)\n"
         "\n"
-        "Render Map to an AGG Image32\n"
+        );
+        
+    def("render_tile_to_file",&render_tile_to_file,
         "\n"
-        "Usage:\n"
-        ">>> from mapnik import Map, Image, render, load_map\n"
-        ">>> m = Map(256,256)\n"
-        ">>> load_map(m,'mapfile.xml')\n"
-        ">>> im = Image(m.width,m.height)\n"
-        ">>> render(m,im)\n"
+        "TODO\n"
         "\n"
-        );
+        ); 
 
+    
+    def("render", &render, render_overloads(
+            "\n" 
+            "Render Map to an AGG image_32 using offsets\n"
+            "\n"
+            "Usage:\n"
+            ">>> from mapnik import Map, Image, render, load_map\n"
+            ">>> m = Map(256,256)\n"
+            ">>> load_map(m,'mapfile.xml')\n"
+            ">>> im = Image(m.width,m.height)\n"
+            ">>> scale_factor=2.0\n"
+            ">>> offset = [100,50]\n"
+            ">>> render(m,im)\n"
+            ">>> render(m,im,scale_factor)\n"
+            ">>> render(m,im,scale_factor,offset[0],offset[1])\n"
+            "\n"
+            )); 
+
+    def("render_layer", &render_layer2,
+      (arg("map"),arg("image"),args("layer"))
+    ); 
+
+    def("render_layer", &mapnik::render_layer_for_grid,
+      (arg("map"),arg("grid"),args("layer"),arg("fields")=boost::python::list())
+    ); 
+    
 #if defined(HAVE_CAIRO) && defined(HAVE_PYCAIRO)
     def("render",&render3,
         "\n"
@@ -467,32 +583,35 @@ BOOST_PYTHON_MODULE(_mapnik)
         "\n"
         );
    
-    def("load_map", & load_map, load_map_overloads());
+    def("load_map", &load_map, load_map_overloads());
 
-    def("load_map_from_string", & load_map_string, load_map_string_overloads());
+    def("load_map_from_string", &load_map_string, load_map_string_overloads());
 
-    def("save_map", & save_map, save_map_overloads());
+    def("save_map", &save_map, save_map_overloads());
 /*
-        "\n"
-        "Save Map object to XML file\n"
-        "\n"
-        "Usage:\n"
-        ">>> from mapnik import Map, load_map, save_map\n"
-        ">>> m = Map(256,256)\n"
-        ">>> load_map(m,'mapfile_wgs84.xml')\n"
-        ">>> m.srs\n"
-        "'+proj=latlong +datum=WGS84'\n"
-        ">>> m.srs = '+init=espg:3395'\n"
-        ">>> save_map(m,'mapfile_mercator.xml')\n"
-        "\n"
-        );
+  "\n"
+  "Save Map object to XML file\n"
+  "\n"
+  "Usage:\n"
+  ">>> from mapnik import Map, load_map, save_map\n"
+  ">>> m = Map(256,256)\n"
+  ">>> load_map(m,'mapfile_wgs84.xml')\n"
+  ">>> m.srs\n"
+  "'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'\n"
+  ">>> m.srs = '+init=espg:3395'\n"
+  ">>> save_map(m,'mapfile_mercator.xml')\n"
+  "\n"
+  );
 */
     
-    def("save_map_to_string", & save_map_to_string, save_map_to_string_overloads());
+    def("save_map_to_string", &save_map_to_string, save_map_to_string_overloads());
     def("mapnik_version", &mapnik_version,"Get the Mapnik version number");
     def("mapnik_svn_revision", &mapnik_svn_revision,"Get the Mapnik svn revision");
+    def("has_jpeg", &has_jpeg, "Get jpeg read/write support status");
     def("has_cairo", &has_cairo, "Get cairo library status");
     def("has_pycairo", &has_pycairo, "Get pycairo module status");
 
-    register_ptr_to_python<mapnik::filter_ptr>();
+    register_ptr_to_python<mapnik::expression_ptr>();
+    register_ptr_to_python<mapnik::path_expression_ptr>();
+    to_python_converter<mapnik::value,mapnik_value_to_python>();
 }
diff --git a/bindings/python/mapnik_query.cpp b/bindings/python/mapnik_query.cpp
index d28d0ac..93ae150 100644
--- a/bindings/python/mapnik_query.cpp
+++ b/bindings/python/mapnik_query.cpp
@@ -23,17 +23,17 @@
 
 #include <boost/python.hpp>
 #include <mapnik/query.hpp>
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 using mapnik::query;
-using mapnik::Envelope;
+using mapnik::box2d;
 
 struct query_pickle_suite : boost::python::pickle_suite
 {
-   static boost::python::tuple
-   getinitargs(const query& q)
-   {
-      return boost::python::make_tuple(q.get_bbox(),q.resolution());  
-   }
+    static boost::python::tuple
+    getinitargs(query const& q)
+    {
+        return boost::python::make_tuple(q.get_bbox(),q.resolution());  
+    }
 };
 
 void export_query()
@@ -41,9 +41,11 @@ void export_query()
     using namespace boost::python;
 
     class_<query>("Query", "a spatial query data object", 
-		  init<Envelope<double>,double>() )
+                  init<box2d<double>,query::resolution_type const&,double>() )
+        .def(init<box2d<double> >())
         .def_pickle(query_pickle_suite())
-        .add_property("resolution", &query::resolution)
+        .add_property("resolution",make_function(&query::resolution,
+                                                 return_value_policy<copy_const_reference>()))
         .add_property("bbox", make_function(&query::get_bbox,
                                             return_value_policy<copy_const_reference>()) )
         .add_property("property_names", make_function(&query::property_names,
diff --git a/bindings/python/mapnik_raster_colorizer.cpp b/bindings/python/mapnik_raster_colorizer.cpp
new file mode 100644
index 0000000..ee19c51
--- /dev/null
+++ b/bindings/python/mapnik_raster_colorizer.cpp
@@ -0,0 +1,206 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#include <boost/python.hpp>
+#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
+#include <mapnik/raster_colorizer.hpp>
+
+using mapnik::raster_colorizer;
+using mapnik::raster_colorizer_ptr;
+using mapnik::colorizer_stop;
+using mapnik::colorizer_stops;
+using mapnik::colorizer_mode_enum;
+using mapnik::color;
+using mapnik::COLORIZER_INHERIT;
+using mapnik::COLORIZER_LINEAR;
+using mapnik::COLORIZER_DISCRETE;
+using mapnik::COLORIZER_EXACT;
+
+
+namespace {
+void add_stop(raster_colorizer_ptr & rc, colorizer_stop & stop)
+{
+    rc->add_stop(stop);
+}
+void add_stop2(raster_colorizer_ptr & rc, float v) {
+    colorizer_stop stop(v, rc->get_default_mode(), rc->get_default_color());
+    rc->add_stop(stop);
+}
+void add_stop3(raster_colorizer_ptr &rc, float v, color c) {
+    colorizer_stop stop(v, rc->get_default_mode(), c);
+    rc->add_stop(stop);
+}
+void add_stop4(raster_colorizer_ptr &rc, float v, colorizer_mode_enum m) {
+    colorizer_stop stop(v, m, rc->get_default_color());
+    rc->add_stop(stop);
+}
+void add_stop5(raster_colorizer_ptr &rc, float v, colorizer_mode_enum m, color c) {
+    colorizer_stop stop(v, m, c);
+    rc->add_stop(stop);
+}
+colorizer_stops const& get_stops(raster_colorizer_ptr & rc)
+{
+    return rc->get_stops();
+}
+}
+
+void export_raster_colorizer()
+{
+    using namespace boost::python;
+
+    class_<raster_colorizer,raster_colorizer_ptr>("RasterColorizer",
+            "A Raster Colorizer object.",
+            init<colorizer_mode_enum, color>(args("default_mode","default_color"))
+            )
+        .def(init<>())
+        .add_property("default_color", 
+                        make_function(&raster_colorizer::get_default_color, return_value_policy<reference_existing_object>()), 
+                        &raster_colorizer::set_default_color,
+                        "The default color for stops added without a color (mapnik.Color).\n")
+        .add_property("default_mode", 
+                        &raster_colorizer::get_default_mode_enum,
+                        &raster_colorizer::set_default_mode_enum,
+                        "The default mode (mapnik.ColorizerMode).\n"
+                        "\n"
+                        "If a stop is added without a mode, then it will inherit this default mode\n")
+        .add_property("stops",
+                        make_function(get_stops,return_value_policy<reference_existing_object>()),
+                        "The list of stops this RasterColorizer contains\n")
+        .add_property("epsilon",
+                        &raster_colorizer::get_epsilon,
+                        &raster_colorizer::set_epsilon,
+                        "Comparison epsilon value for exact mode\n"
+                        "\n"
+                        "When comparing values in exact mode, values need only be within epsilon to match.\n")
+                        
+                        
+        .def("add_stop", add_stop,
+            (arg("ColorizerStop")),
+            "Add a colorizer stop to the raster colorizer.\n"
+            "\n"
+            "Usage:\n"
+            ">>> colorizer = mapnik.RasterColorizer()\n"
+            ">>> color = mapnik.Color(\"#0044cc\")\n"
+            ">>> stop = mapnik.ColorizerStop(3, mapnik.COLORIZER_INHERIT, color)\n"
+            ">>> colorizer.add_stop(stop)\n"
+            )
+        .def("add_stop", add_stop2,
+            (arg("value")),
+            "Add a colorizer stop to the raster colorizer, using the default mode and color.\n"
+            "\n"
+            "Usage:\n"
+            ">>> default_color = mapnik.Color(\"#0044cc\")\n"
+            ">>> colorizer = mapnik.RasterColorizer(mapnik2.COLORIZER_LINEAR, default_color)\n"
+            ">>> colorizer.add_stop(100)\n"
+            )
+        .def("add_stop", add_stop3,
+            (arg("value")),
+            "Add a colorizer stop to the raster colorizer, using the default mode.\n"
+            "\n"
+            "Usage:\n"
+            ">>> default_color = mapnik.Color(\"#0044cc\")\n"
+            ">>> colorizer = mapnik.RasterColorizer(mapnik2.COLORIZER_LINEAR, default_color)\n"
+            ">>> colorizer.add_stop(100, mapnik.Color(\"#123456\"))\n"
+            )
+        .def("add_stop", add_stop4,
+            (arg("value")),
+            "Add a colorizer stop to the raster colorizer, using the default color.\n"
+            "\n"
+            "Usage:\n"
+            ">>> default_color = mapnik.Color(\"#0044cc\")\n"
+            ">>> colorizer = mapnik.RasterColorizer(mapnik2.COLORIZER_LINEAR, default_color)\n"
+            ">>> colorizer.add_stop(100, mapnik2.COLORIZER_EXACT)\n"
+            )
+        .def("add_stop", add_stop5,
+            (arg("value")),
+            "Add a colorizer stop to the raster colorizer.\n"
+            "\n"
+            "Usage:\n"
+            ">>> default_color = mapnik.Color(\"#0044cc\")\n"
+            ">>> colorizer = mapnik.RasterColorizer(mapnik2.COLORIZER_LINEAR, default_color)\n"
+            ">>> colorizer.add_stop(100, mapnik.COLORIZER_DISCRETE, mapnik.Color(\"#112233\"))\n"
+            )
+        .def("get_color", &raster_colorizer::get_color, 
+            "Get the color assigned to a certain value in raster data.\n"
+            "\n"
+            "Usage:\n"
+            ">>> colorizer = mapnik.RasterColorizer()\n"
+            ">>> color = mapnik.Color(\"#0044cc\")\n"
+            ">>> colorizer.add_stop(0, mapnik2.COLORIZER_DISCRETE, mapnik.Color(\"#000000\"))\n"
+            ">>> colorizer.add_stop(100, mapnik2.COLORIZER_DISCRETE, mapnik.Color(\"#0E0A06\"))\n"
+            ">>> colorizer.get_color(50)\n"
+            "Color('#070503')\n"
+            )
+        ;    
+
+
+
+    class_<colorizer_stops>("ColorizerStops",
+        "A RasterColorizer's collection of ordered color stops.\n"
+        "This class is not meant to be instantiated from python. However, "
+        "it can be accessed at a RasterColorizer's \"stops\" attribute for "
+        "introspection purposes",
+        no_init)
+        .def(vector_indexing_suite<colorizer_stops>())
+        ;
+
+    enum_<colorizer_mode_enum>("ColorizerMode")
+        .value("COLORIZER_INHERIT", COLORIZER_INHERIT)
+        .value("COLORIZER_LINEAR", COLORIZER_LINEAR)
+        .value("COLORIZER_DISCRETE", COLORIZER_DISCRETE)
+        .value("COLORIZER_EXACT", COLORIZER_EXACT)
+        .export_values()
+        ;
+
+
+    class_<colorizer_stop>("ColorizerStop",init<float, colorizer_mode_enum, color const&>(
+                       "A Colorizer Stop object.\n"
+                       "Create with a value, ColorizerMode, and Color\n"
+                       "\n"
+                       "Usage:"
+                       ">>> color = mapnik.Color(\"#fff000\")\n"
+                       ">>> stop= mapnik.ColorizerStop(42.42, mapnik.COLORIZER_LINEAR, color)\n"
+          ))
+        .add_property("color", 
+                        make_function(&colorizer_stop::get_color, return_value_policy<reference_existing_object>()), 
+                        &colorizer_stop::set_color,
+                        "The stop color (mapnik.Color).\n")
+        .add_property("value", 
+                        &colorizer_stop::get_value, 
+                        &colorizer_stop::set_value,
+                        "The stop value.\n")
+        .add_property("label", 
+                        make_function(&colorizer_stop::get_label, return_value_policy<copy_const_reference>()),
+                        &colorizer_stop::set_label,
+                        "The stop label.\n")
+        .add_property("mode", 
+                        &colorizer_stop::get_mode_enum,
+                        &colorizer_stop::set_mode_enum,
+                        "The stop mode (mapnik.ColorizerMode).\n"
+                        "\n"
+                        "If this is COLORIZER_INHERIT then it will inherit the default mode\n"
+                        " from the RasterColorizer it is added to.\n")
+        .def(self == self)
+        .def("__str__",&colorizer_stop::to_string)
+        ;
+}
diff --git a/bindings/python/mapnik_raster_symbolizer.cpp b/bindings/python/mapnik_raster_symbolizer.cpp
index 711d08e..2d4bdb6 100644
--- a/bindings/python/mapnik_raster_symbolizer.cpp
+++ b/bindings/python/mapnik_raster_symbolizer.cpp
@@ -28,37 +28,39 @@ using mapnik::raster_symbolizer;
 
 struct raster_symbolizer_pickle_suite : boost::python::pickle_suite
 {
-   /*
-   static boost::python::tuple
-   getinitargs(const raster_symbolizer& r)
-   {
+    /*
+      static boost::python::tuple
+      getinitargs(const raster_symbolizer& r)
+      {
       return boost::python::make_tuple();  
-   }
-   */
+      }
+    */
 
-   static  boost::python::tuple
-   getstate(const raster_symbolizer& r)
-   {
-        return boost::python::make_tuple(r.get_mode(),r.get_scaling(),r.get_opacity());
-   }
+    static  boost::python::tuple
+    getstate(const raster_symbolizer& r)
+    {
+        return boost::python::make_tuple(r.get_mode(),r.get_scaling(),r.get_opacity(),r.get_filter_factor(),r.get_mesh_size());
+    }
 
-   static void
-   setstate (raster_symbolizer& r, boost::python::tuple state)
-   {
+    static void
+    setstate (raster_symbolizer& r, boost::python::tuple state)
+    {
         using namespace boost::python;
-        if (len(state) != 3)
+        if (len(state) != 5)
         {
             PyErr_SetObject(PyExc_ValueError,
-                         ("expected 3-item tuple in call to __setstate__; got %s"
-                          % state).ptr()
-            );
+                            ("expected 5-item tuple in call to __setstate__; got %s"
+                             % state).ptr()
+                );
             throw_error_already_set();
         }
-                
+        
         r.set_mode(extract<std::string>(state[0]));
         r.set_scaling(extract<std::string>(state[1]));
         r.set_opacity(extract<float>(state[2]));
-   }
+        r.set_filter_factor(extract<float>(state[3]));
+        r.set_mesh_size(extract<unsigned>(state[4]));
+    }
 
 };
 
@@ -67,49 +69,98 @@ void export_raster_symbolizer()
     using namespace boost::python;
 
     class_<raster_symbolizer>("RasterSymbolizer",
-				    init<>("Default ctor"))
-				    
-    .def_pickle(raster_symbolizer_pickle_suite())
+                              init<>("Default ctor"))
+                                    
+        .def_pickle(raster_symbolizer_pickle_suite())
     
-    .add_property("mode",
-            make_function(&raster_symbolizer::get_mode,return_value_policy<copy_const_reference>()),
-            &raster_symbolizer::set_mode,
-            "Get/Set merging mode.\n"
-            "Possible values are:\n"
-            "normal, grain_merge, grain_merge2, multiply,\n"
-            "multiply2, divide, divide2, screen, and hard_light\n"
-            "\n"
-            "Usage:\n"
-            "\n"
-            ">>> from mapnik import RasterSymbolizer\n"
-            ">>> r = RasterSymbolizer()\n"
-            ">>> r.mode = 'grain_merge2'\n"
+        .add_property("mode",
+                      make_function(&raster_symbolizer::get_mode,return_value_policy<copy_const_reference>()),
+                      &raster_symbolizer::set_mode,
+                      "Get/Set merging mode.\n"
+                      "Possible values are:\n"
+                      "normal, grain_merge, grain_merge2, multiply,\n"
+                      "multiply2, divide, divide2, screen, and hard_light\n"
+                      "\n"
+                      "Usage:\n"
+                      "\n"
+                      ">>> from mapnik import RasterSymbolizer\n"
+                      ">>> r = RasterSymbolizer()\n"
+                      ">>> r.mode = 'grain_merge2'\n"
             )
             
-    .add_property("scaling",
-            make_function(&raster_symbolizer::get_scaling,return_value_policy<copy_const_reference>()),
-            &raster_symbolizer::set_scaling,
-            "Get/Set scaling algorithm.\n"
-            "Possible values are:\n"
-            "fast, bilinear, and bilinear8\n"
-            "\n"
-            "Usage:\n"
-            "\n"
-            ">>> from mapnik import RasterSymbolizer\n"
-            ">>> r = RasterSymbolizer()\n"
-            ">>> r.scaling = 'bilinear8'\n"
+        .add_property("scaling",
+                      make_function(&raster_symbolizer::get_scaling,return_value_policy<copy_const_reference>()),
+                      &raster_symbolizer::set_scaling,
+                      "Get/Set scaling algorithm.\n"
+                      "Possible values are:\n"
+                      "fast, bilinear, and bilinear8\n"
+                      "\n"
+                      "Usage:\n"
+                      "\n"
+                      ">>> from mapnik import RasterSymbolizer\n"
+                      ">>> r = RasterSymbolizer()\n"
+                      ">>> r.scaling = 'bilinear8'\n"
             )
             
-    .add_property("opacity",
-            &raster_symbolizer::get_opacity,
-            &raster_symbolizer::set_opacity,
-            "Get/Set opacity.\n"
-            "\n"
-            "Usage:\n"
-            "\n"
-            ">>> from mapnik import RasterSymbolizer\n"
-            ">>> r = RasterSymbolizer()\n"
-            ">>> r.opacity = .5\n"
+        .add_property("opacity",
+                      &raster_symbolizer::get_opacity,
+                      &raster_symbolizer::set_opacity,
+                      "Get/Set opacity.\n"
+                      "\n"
+                      "Usage:\n"
+                      "\n"
+                      ">>> from mapnik import RasterSymbolizer\n"
+                      ">>> r = RasterSymbolizer()\n"
+                      ">>> r.opacity = .5\n"
             )
-	;    
+        .add_property("colorizer",
+                      &raster_symbolizer::get_colorizer,
+                      &raster_symbolizer::set_colorizer,
+                      "Get/Set the RasterColorizer used to color data rasters.\n"
+                      "\n"
+                      "Usage:\n"
+                      "\n"
+                      ">>> from mapnik import RasterSymbolizer, RasterColorizer\n"
+                      ">>> r = RasterSymbolizer()\n"
+                      ">>> r.colorizer = RasterColorizer()\n"
+                      ">>> for value, color in [\n"
+                      "...     (0, \"#000000\"),\n"
+                      "...     (10, \"#ff0000\"),\n"
+                      "...     (40, \"#00ff00\"),\n"
+                      "... ]:\n"
+                      "...      r.colorizer.append_band(value, color)\n"
+            )
+        .add_property("filter_factor",
+                      &raster_symbolizer::get_filter_factor,
+                      &raster_symbolizer::set_filter_factor,
+                      "Get/Set the filter factor used by the datasource.\n"
+                      "\n"
+                      "This is used by the Raster or Gdal datasources to pre-downscale\n"
+                      "images using overviews.\n"
+                      "Higher numbers can sometimes cause much better scaled image\n"
+                      "output, at the cost of speed.\n"
+                      "\n"
+                      "Examples:\n"
+                      " -1.0 : (Default) A suitable value will be determined from the\n"
+                      "        chosen scaling method during rendering.\n"
+                      "  1.0 : The datasource will take care of all the scaling\n"
+                      "        (using nearest neighbor interpolation)\n"
+                      "  2.0 : The datasource will scale the datasource to\n"
+                      "        2.0x the desired size, and mapnik will scale the rest\n"
+                      "        of the way using the interpolation defined in self.scaling.\n"
+            )
+        .add_property("mesh_size",
+                      &raster_symbolizer::get_mesh_size,
+                      &raster_symbolizer::set_mesh_size,
+                      "Get/Set warping mesh size.\n"
+                      "Larger values result in faster warping times but might "
+                      "result in distorted maps.\n"
+                      "\n"
+                      "Usage:\n"
+                      "\n"
+                      ">>> from mapnik import RasterSymbolizer\n"
+                      ">>> r = RasterSymbolizer()\n"
+                      ">>> r.mesh_size = 32\n"
+            )
+        ;    
 }
diff --git a/bindings/python/mapnik_rule.cpp b/bindings/python/mapnik_rule.cpp
index 87ddc26..67912f1 100644
--- a/bindings/python/mapnik_rule.cpp
+++ b/bindings/python/mapnik_rule.cpp
@@ -28,11 +28,11 @@
 
 #include <mapnik/rule.hpp>
 #include <mapnik/filter_factory.hpp>
+#include <mapnik/expression_string.hpp>
 
-using mapnik::rule_type;
-using mapnik::filter;
-using mapnik::filter_ptr;
-using mapnik::filter_factory;
+using mapnik::rule;
+using mapnik::expr_node;
+using mapnik::expression_ptr;
 using mapnik::Feature;
 using mapnik::point_symbolizer;
 using mapnik::line_symbolizer;
@@ -44,8 +44,9 @@ using mapnik::shield_symbolizer;
 using mapnik::text_symbolizer;
 using mapnik::building_symbolizer;
 using mapnik::markers_symbolizer;
+using mapnik::glyph_symbolizer;
 using mapnik::symbolizer;
-using mapnik::symbolizers;
+using mapnik::to_expression_string;
 
 struct pickle_symbolizer : public boost::static_visitor<>
 {
@@ -56,7 +57,7 @@ public:
     template <typename T>
     void operator () ( T const& sym )
     {
-	syms_.append(sym);
+        syms_.append(sym);
     }
     
 private:
@@ -67,53 +68,53 @@ private:
 struct extract_symbolizer : public boost::static_visitor<>
 {
 public:
-    extract_symbolizer( rule_type& r): 
+    extract_symbolizer( rule& r): 
         r_(r) {}
         
     template <typename T>
     void operator () ( T const& sym )
     {
-	r_.append(sym);
+        r_.append(sym);
     }
 private:
-    rule_type& r_;
+    rule& r_;
     
 };
 
 struct rule_pickle_suite : boost::python::pickle_suite
 {
     static boost::python::tuple
-    getinitargs(const rule_type& r)
+    getinitargs(const rule& r)
     {
-	return boost::python::make_tuple(r.get_name(),r.get_title(),r.get_min_scale(),r.get_max_scale());
+        return boost::python::make_tuple(r.get_name(),r.get_title(),r.get_min_scale(),r.get_max_scale());
     }
 
     static  boost::python::tuple
-    getstate(const rule_type& r)
+    getstate(const rule& r)
     {
         boost::python::list syms;
         
-        symbolizers::const_iterator begin = r.get_symbolizers().begin();
-        symbolizers::const_iterator end = r.get_symbolizers().end();        
+        rule::symbolizers::const_iterator begin = r.get_symbolizers().begin();
+        rule::symbolizers::const_iterator end = r.get_symbolizers().end();        
         pickle_symbolizer serializer( syms );
         std::for_each( begin, end , boost::apply_visitor( serializer ));
         
-        // Here the filter string is used rather than the actual Filter object
-        // Need to look into how to get the Filter object
-        std::string filter_expr = r.get_filter()->to_string();
-        return boost::python::make_tuple(r.get_abstract(),filter_expr,r.has_else_filter(),syms);
+        // We serialize filter expressions AST as strings
+        std::string filter_expr = to_expression_string(*r.get_filter());
+        
+        return boost::python::make_tuple(r.get_abstract(),filter_expr,r.has_else_filter(),r.has_also_filter(),syms);
     }
 
     static void
-    setstate (rule_type& r, boost::python::tuple state)
+    setstate (rule& r, boost::python::tuple state)
     {
         using namespace boost::python;
         if (len(state) != 4)
         {
             PyErr_SetObject(PyExc_ValueError,
-			    ("expected 4-item tuple in call to __setstate__; got %s"
-			     % state).ptr()
-		);
+                            ("expected 4-item tuple in call to __setstate__; got %s"
+                             % state).ptr()
+                );
             throw_error_already_set();
         }
                 
@@ -124,12 +125,12 @@ struct rule_pickle_suite : boost::python::pickle_suite
 
         if (state[1])
         {
-            rule_type dfl;
+            rule dfl;
             std::string filter = extract<std::string>(state[1]);
-            std::string default_filter = dfl.get_filter()->to_string();
+            std::string default_filter = "<TODO>";//dfl.get_filter()->to_string();
             if ( filter != default_filter)
             {
-                r.set_filter(mapnik::create_filter(filter,"utf8"));
+                r.set_filter(mapnik::parse_expression(filter,"utf8"));
             }
         }    
 
@@ -137,8 +138,13 @@ struct rule_pickle_suite : boost::python::pickle_suite
         {
             r.set_else(true);
         }    
+
+        if (state[3])
+        {
+            r.set_also(true);
+        }
         
-        boost::python::list syms=extract<boost::python::list>(state[3]);
+        boost::python::list syms=extract<boost::python::list>(state[4]);
         extract_symbolizer serializer( r );
         for (int i=0;i<len(syms);++i)
         {
@@ -161,35 +167,39 @@ void export_rule()
     implicitly_convertible<raster_symbolizer,symbolizer>();
     implicitly_convertible<shield_symbolizer,symbolizer>();
     implicitly_convertible<text_symbolizer,symbolizer>();
+    implicitly_convertible<glyph_symbolizer,symbolizer>();
+    implicitly_convertible<markers_symbolizer,symbolizer>();
     
-    class_<symbolizers>("Symbolizers",init<>("TODO"))
-    	.def(vector_indexing_suite<symbolizers>())
-    	;
+    class_<rule::symbolizers>("Symbolizers",init<>("TODO"))
+        .def(vector_indexing_suite<rule::symbolizers>())
+        ;
     
-    class_<rule_type>("Rule",init<>("default constructor"))
+    class_<rule>("Rule",init<>("default constructor"))
         .def(init<std::string const&,
              boost::python::optional<std::string const&,double,double> >())
         .def_pickle(rule_pickle_suite())
         .add_property("name",make_function
-                      (&rule_type::get_name,
+                      (&rule::get_name,
                        return_value_policy<copy_const_reference>()),
-                      &rule_type::set_name)
+                      &rule::set_name)
         .add_property("title",make_function
-                      (&rule_type::get_title,return_value_policy<copy_const_reference>()),
-                      &rule_type::set_title)
+                      (&rule::get_title,return_value_policy<copy_const_reference>()),
+                      &rule::set_title)
         .add_property("abstract",make_function
-                      (&rule_type::get_abstract,return_value_policy<copy_const_reference>()),
-                      &rule_type::set_abstract)
+                      (&rule::get_abstract,return_value_policy<copy_const_reference>()),
+                      &rule::set_abstract)
         .add_property("filter",make_function
-                      (&rule_type::get_filter,return_value_policy<copy_const_reference>()),
-                      &rule_type::set_filter)
-        .add_property("min_scale",&rule_type::get_min_scale,&rule_type::set_min_scale)
-        .add_property("max_scale",&rule_type::get_max_scale,&rule_type::set_max_scale)
-        .def("set_else",&rule_type::set_else)
-        .def("has_else",&rule_type::has_else_filter)
-        .def("active",&rule_type::active)
+                      (&rule::get_filter,return_value_policy<copy_const_reference>()),
+                      &rule::set_filter)
+        .add_property("min_scale",&rule::get_min_scale,&rule::set_min_scale)
+        .add_property("max_scale",&rule::get_max_scale,&rule::set_max_scale)
+        .def("set_else",&rule::set_else)
+        .def("has_else",&rule::has_else_filter)
+        .def("set_also",&rule::set_also)
+        .def("has_also",&rule::has_also_filter)
+        .def("active",&rule::active)
         .add_property("symbols",make_function
-                      (&rule_type::get_symbolizers,return_value_policy<reference_existing_object>()))
+                      (&rule::get_symbolizers,return_value_policy<reference_existing_object>()))
         ;
 }
 
diff --git a/bindings/python/mapnik_shield_symbolizer.cpp b/bindings/python/mapnik_shield_symbolizer.cpp
index 04ea6a4..baa075e 100644
--- a/bindings/python/mapnik_shield_symbolizer.cpp
+++ b/bindings/python/mapnik_shield_symbolizer.cpp
@@ -25,59 +25,229 @@
 #include <boost/python.hpp>
 #include <mapnik/shield_symbolizer.hpp>
 #include <mapnik/image_util.hpp>
+#include <mapnik/path_expression_grammar.hpp>
+#include "mapnik_svg.hpp"
 
 using mapnik::color;
 using mapnik::shield_symbolizer;
 using mapnik::text_symbolizer;
 using mapnik::symbolizer_with_image;
+using mapnik::path_processor_type;
+using mapnik::path_expression_ptr;
+using mapnik::guess_type;
+using mapnik::expression_ptr;
+using mapnik::parse_path;
+
+
+namespace {
+using namespace boost::python;
+
+tuple get_shield_displacement(const shield_symbolizer& s)
+{
+    boost::tuple<double,double> pos = s.get_shield_displacement();
+    return boost::python::make_tuple(boost::get<0>(pos),boost::get<1>(pos));
+}
+
+void set_shield_displacement(shield_symbolizer & s, boost::python::tuple arg)
+{
+    s.set_shield_displacement(extract<double>(arg[0]),extract<double>(arg[1]));
+}
+
+tuple get_text_displacement(const shield_symbolizer& t)
+{
+    boost::tuple<double,double> pos = t.get_displacement();
+    return boost::python::make_tuple(boost::get<0>(pos),boost::get<1>(pos));
+}
+
+void set_text_displacement(shield_symbolizer & t, boost::python::tuple arg)
+{
+    t.set_displacement(extract<double>(arg[0]),extract<double>(arg[1]));
+}
+  
+tuple get_anchor(const shield_symbolizer& t)
+{
+    boost::tuple<double,double> pos = t.get_anchor();
+    return boost::python::make_tuple(boost::get<0>(pos),boost::get<1>(pos));
+}
+
+void set_anchor(shield_symbolizer & t, boost::python::tuple arg)
+{
+    t.set_anchor(extract<double>(arg[0]),extract<double>(arg[1]));
+}
+
+const std::string get_filename(shield_symbolizer const& t) 
+{ 
+    return path_processor_type::to_string(*t.get_filename()); 
+}
+
+void set_filename(shield_symbolizer & t, std::string const& file_expr) 
+{ 
+    t.set_filename(parse_path(file_expr)); 
+} 
+
+}
 
 struct shield_symbolizer_pickle_suite : boost::python::pickle_suite
 {
-   static boost::python::tuple
-   getinitargs(const shield_symbolizer& s)
-   {
-
-      boost::shared_ptr<mapnik::ImageData32> img = s.get_image();
-      const std::string & filename = s.get_filename();
-      //(name, font name, font size, font color, image file, image type, width, height)
-      return boost::python::make_tuple(s.get_name(),s.get_face_name(),s.get_text_size(),s.get_fill(),filename,mapnik::guess_type(filename),img->width(),img->height());
+    static boost::python::tuple
+    getinitargs(const shield_symbolizer& s)
+    {
+        std::string filename = path_processor_type::to_string(*s.get_filename());
+        //(name, font name, font size, font color, image file, image type, width, height)
+        return boost::python::make_tuple( "TODO",//s.get_name(),
+                                          s.get_face_name(),s.get_text_size(),s.get_fill(),filename,guess_type(filename));
       
-   }
+    }
 
-   static  boost::python::tuple
-   getstate(const shield_symbolizer& s)
-   {
+    static  boost::python::tuple
+    getstate(const shield_symbolizer& s)
+    {
         return boost::python::make_tuple(s.get_halo_fill(),s.get_halo_radius());
-   }
+    }
 
-   // TODO add lots more...
-   static void
-   setstate (shield_symbolizer& s, boost::python::tuple state)
-   {
+    // TODO add lots more...
+    static void
+    setstate (shield_symbolizer& s, boost::python::tuple state)
+    {
         using namespace boost::python;
         /*if (len(state) != 1)
-        {
-            PyErr_SetObject(PyExc_ValueError,
-                         ("expected 1-item tuple in call to __setstate__; got %s"
-                          % state).ptr()
-            );
-            throw_error_already_set();
-        }*/
+          {
+          PyErr_SetObject(PyExc_ValueError,
+          ("expected 1-item tuple in call to __setstate__; got %s"
+          % state).ptr()
+          );
+          throw_error_already_set();
+          }*/
                 
         s.set_halo_fill(extract<color>(state[0]));
         s.set_halo_radius(extract<float>(state[1]));
         
-   }
+    }
 
 };
 
+
 void export_shield_symbolizer()
 {
     using namespace boost::python;
     class_< shield_symbolizer, bases<text_symbolizer> >("ShieldSymbolizer",
-                                                        init< std::string const&, std::string const&, unsigned, mapnik::color const&,
-                                                        std::string const&, std::string const&,unsigned,unsigned>("TODO"))
-      .def_pickle(shield_symbolizer_pickle_suite())
+            init<expression_ptr,
+                std::string const&,
+                unsigned, mapnik::color const&,
+                path_expression_ptr>("TODO")
+        )
+        //.def_pickle(shield_symbolizer_pickle_suite())
+        .add_property("anchor",
+                      &get_anchor,
+                      &set_anchor)
+        .add_property("allow_overlap",
+                      &shield_symbolizer::get_allow_overlap,
+                      &shield_symbolizer::set_allow_overlap,
+                      "Set/get the allow_overlap property of the label")
+        .add_property("avoid_edges",
+                      &shield_symbolizer::get_avoid_edges,
+                      &shield_symbolizer::set_avoid_edges,
+                      "Set/get the avoid_edge property of the label")
+        .add_property("character_spacing",
+                      &shield_symbolizer::get_character_spacing,
+                      &shield_symbolizer::set_character_spacing,
+                      "Set/get the character_spacing property of the label")
+        .add_property("displacement",
+                      &get_text_displacement,
+                      &set_text_displacement)
+        .add_property("face_name",
+                      make_function(&shield_symbolizer::get_face_name,return_value_policy<copy_const_reference>()),
+                      &shield_symbolizer::set_face_name,
+                      "Set/get the face_name property of the label")
+        .add_property("fill",              
+                      make_function(&shield_symbolizer::get_fill,return_value_policy<copy_const_reference>()),
+                      &shield_symbolizer::set_fill)
+        .add_property("fontset",
+                      make_function(&shield_symbolizer::get_fontset,return_value_policy<copy_const_reference>()),
+                      &shield_symbolizer::set_fontset)
+        .add_property("force_odd_labels",
+                      &shield_symbolizer::get_force_odd_labels,
+                      &shield_symbolizer::set_force_odd_labels)
+        .add_property("halo_fill",
+                      make_function(&shield_symbolizer::get_halo_fill,return_value_policy<copy_const_reference>()),
+                      &shield_symbolizer::set_halo_fill)
+        .add_property("halo_radius",
+                      &shield_symbolizer::get_halo_radius, 
+                      &shield_symbolizer::set_halo_radius)
+        .add_property("horizontal_alignment",
+                      &shield_symbolizer::get_horizontal_alignment,
+                      &shield_symbolizer::set_horizontal_alignment,
+                      "Set/get the horizontal alignment of the label")
+        .add_property("justify_alignment",
+                      &shield_symbolizer::get_justify_alignment,
+                      &shield_symbolizer::set_justify_alignment,
+                      "Set/get the text justification")
+        .add_property("label_placement",
+                      &shield_symbolizer::get_label_placement,
+                      &shield_symbolizer::set_label_placement,
+                      "Set/get the placement of the label")
+        .add_property("label_position_tolerance",
+                      &shield_symbolizer::get_label_position_tolerance,
+                      &shield_symbolizer::set_label_position_tolerance)
+        .add_property("label_spacing",
+                      &shield_symbolizer::get_label_spacing,
+                      &shield_symbolizer::set_label_spacing)
+        .add_property("line_spacing",
+                      &shield_symbolizer::get_line_spacing,
+                      &shield_symbolizer::set_line_spacing)
+        .add_property("max_char_angle_delta",
+                      &shield_symbolizer::get_max_char_angle_delta,
+                      &shield_symbolizer::set_max_char_angle_delta)
+        .add_property("minimum_distance",
+                      &shield_symbolizer::get_minimum_distance,
+                      &shield_symbolizer::set_minimum_distance)
+        .add_property("name",&shield_symbolizer::get_name,
+                      &shield_symbolizer::set_name)
+        .add_property("opacity",
+                      &shield_symbolizer::get_opacity,
+                      &shield_symbolizer::set_opacity,
+                      "Set/get the shield opacity")
+        .add_property("shield_displacement",
+                      get_shield_displacement,
+                      set_shield_displacement)
+        .add_property("text_opacity",
+                      &shield_symbolizer::get_text_opacity,
+                      &shield_symbolizer::set_text_opacity,
+                      "Set/get the text opacity")
+        .add_property("text_transform",
+                      &shield_symbolizer::get_text_transform,
+                      &shield_symbolizer::set_text_transform,
+                      "Set/get the text conversion method")
+        .add_property("text_ratio",
+                      &shield_symbolizer::get_text_ratio,
+                      &shield_symbolizer::set_text_ratio)
+        .add_property("text_size",
+                      &shield_symbolizer::get_text_size,
+                      &shield_symbolizer::set_text_size)
+        .add_property("vertical_alignment",
+                      &shield_symbolizer::get_vertical_alignment,
+                      &shield_symbolizer::set_vertical_alignment,
+                      "Set/get the vertical alignment of the label")
+        .add_property("wrap_width",
+                      &shield_symbolizer::get_wrap_width,
+                      &shield_symbolizer::set_wrap_width)
+        .add_property("wrap_character",
+                      &shield_symbolizer::get_wrap_char_string,
+                      &shield_symbolizer::set_wrap_char_from_string)
+        .add_property("wrap_before",
+                      &shield_symbolizer::get_wrap_before,
+                      &shield_symbolizer::set_wrap_before)
+        .add_property("no_text",
+                      &shield_symbolizer::get_no_text,
+                      &shield_symbolizer::set_no_text)
+        .add_property("unlock_image",
+                      &shield_symbolizer::get_unlock_image,
+                      &shield_symbolizer::set_unlock_image)
+        .add_property("filename",
+                      &get_filename,
+                      &set_filename)
+        .add_property("transform",
+                      mapnik::get_svg_transform<shield_symbolizer>,
+                      mapnik::set_svg_transform<shield_symbolizer>)
         ;
-    
 }
diff --git a/bindings/python/mapnik_stroke.cpp b/bindings/python/mapnik_stroke.cpp
index 2fcf0ec..b045ec1 100644
--- a/bindings/python/mapnik_stroke.cpp
+++ b/bindings/python/mapnik_stroke.cpp
@@ -31,52 +31,56 @@
 using namespace mapnik;
 
 namespace {
-  using namespace boost::python;
+using namespace boost::python;
 
-  list get_dashes_list(const stroke& stroke)
-  {
+list get_dashes_list(const stroke& stroke)
+{
     list l;
 
     if (stroke.has_dash()) {
-      mapnik::dash_array const& dash = stroke.get_dash_array();
-      mapnik::dash_array::const_iterator iter = dash.begin();
-      mapnik::dash_array::const_iterator end = dash.end();
-      for (; iter != end; ++iter) {
-          l.append(make_tuple(iter->first, iter->second));
-      }
+        mapnik::dash_array const& dash = stroke.get_dash_array();
+        mapnik::dash_array::const_iterator iter = dash.begin();
+        mapnik::dash_array::const_iterator end = dash.end();
+        for (; iter != end; ++iter) {
+            l.append(make_tuple(iter->first, iter->second));
+        }
     }
 
     return l;
-  }
+}
 }
 
 struct stroke_pickle_suite : boost::python::pickle_suite
 {
-   static boost::python::tuple
-   getinitargs(const stroke& s)
-   {
+    static boost::python::tuple
+    getinitargs(const stroke& s)
+    {
 
-      return boost::python::make_tuple(s.get_color(),s.get_width());
+        return boost::python::make_tuple(s.get_color(),s.get_width());
       
-   }
+    }
 
-   static  boost::python::tuple
-   getstate(const stroke& s)
-   {
+    static  boost::python::tuple
+    getstate(const stroke& s)
+    {
         boost::python::list dashes = get_dashes_list(s);
-        return boost::python::make_tuple(s.get_opacity(),dashes,s.get_line_cap(),s.get_line_join());
-   }
+        return boost::python::make_tuple(s.get_opacity(),
+                                         dashes,
+                                         s.get_line_cap(),
+                                         s.get_line_join(),
+                                         s.get_gamma());
+    }
 
-   static void
-   setstate (stroke& s, boost::python::tuple state)
-   {
+    static void
+    setstate (stroke& s, boost::python::tuple state)
+    {
         using namespace boost::python;
-        if (len(state) != 4)
+        if (len(state) != 5)
         {
             PyErr_SetObject(PyExc_ValueError,
-                         ("expected 4-item tuple in call to __setstate__; got %s"
-                          % state).ptr()
-            );
+                            ("expected 5-item tuple in call to __setstate__; got %s"
+                             % state).ptr()
+                );
             throw_error_already_set();
         }
 
@@ -84,19 +88,19 @@ struct stroke_pickle_suite : boost::python::pickle_suite
 
         if (state[1])
         {
-          list dashes = extract<list>(state[1]);
-          for(boost::python::ssize_t i=0; i<len(dashes); i++) {
-              double ds1 = extract<double>(dashes[i][0]);
-              double ds2 = extract<double>(dashes[i][1]);
-              s.add_dash(ds1,ds2);
-          }
+            list dashes = extract<list>(state[1]);
+            for(boost::python::ssize_t i=0; i<len(dashes); i++) {
+                double ds1 = extract<double>(dashes[i][0]);
+                double ds2 = extract<double>(dashes[i][1]);
+                s.add_dash(ds1,ds2);
+            }
         }
 
         s.set_line_cap(extract<line_cap_e>(state[2]));
-
         s.set_line_join(extract<line_join_e>(state[3]));
+        s.set_gamma(extract<double>(state[4]));
 
-   }
+    }
 
 };
 
@@ -106,15 +110,15 @@ void export_stroke ()
     using namespace boost::python;
 
     enumeration_<line_cap_e>("line_cap",
-        "The possible values for a line cap used when drawing\n"
-        "with a stroke.\n")
+                             "The possible values for a line cap used when drawing\n"
+                             "with a stroke.\n")
         .value("BUTT_CAP",BUTT_CAP)
         .value("SQUARE_CAP",SQUARE_CAP)
         .value("ROUND_CAP",ROUND_CAP)
         ;
     enumeration_<line_join_e>("line_join",
-        "The possible values for the line joining mode\n"
-        "when drawing with a stroke.\n")
+                              "The possible values for the line joining mode\n"
+                              "when drawing with a stroke.\n")
         .value("MITER_JOIN",MITER_JOIN)
         .value("MITER_REVERT_JOIN",MITER_REVERT_JOIN)
         .value("ROUND_JOIN",ROUND_JOIN)
@@ -122,39 +126,48 @@ void export_stroke ()
         ;
 
     class_<stroke>("Stroke",init<>(
-        "Creates a new default black stroke with the width of 1.\n"))
+                       "Creates a new default black stroke with the width of 1.\n"))
         .def(init<color,float>(
-              (arg("color"),arg("width")),
-              "Creates a new stroke object with a specified color and width.\n")
-        )
+                 (arg("color"),arg("width")),
+                 "Creates a new stroke object with a specified color and width.\n")
+            )
         .def_pickle(stroke_pickle_suite())
         .add_property("color",make_function
-              (&stroke::get_color,return_value_policy<copy_const_reference>()),
-              &stroke::set_color,
-              "Gets or sets the stroke color.\n"
-              "Returns a new Color object on retrieval.\n")
+                      (&stroke::get_color,return_value_policy<copy_const_reference>()),
+                      &stroke::set_color,
+                      "Gets or sets the stroke color.\n"
+                      "Returns a new Color object on retrieval.\n")
         .add_property("width",
-              &stroke::get_width,
-              &stroke::set_width,
-              "Gets or sets the stroke width in pixels.\n") 
+                      &stroke::get_width,
+                      &stroke::set_width,
+                      "Gets or sets the stroke width in pixels.\n") 
         .add_property("opacity",
-              &stroke::get_opacity,
-              &stroke::set_opacity, 
-              "Gets or sets the opacity of this stroke.\n"
-              "The value is a float between 0 and 1.\n")
+                      &stroke::get_opacity,
+                      &stroke::set_opacity, 
+                      "Gets or sets the opacity of this stroke.\n"
+                      "The value is a float between 0 and 1.\n")
+        .add_property("gamma",
+                      &stroke::get_gamma,
+                      &stroke::set_gamma, 
+                      "Gets or sets the gamma of this stroke.\n"
+                      "The value is a float between 0 and 1.\n")
         .add_property("line_cap",
-              &stroke::get_line_cap,
-              &stroke::set_line_cap,
-              "Gets or sets the line cap of this stroke.\n")
+                      &stroke::get_line_cap,
+                      &stroke::set_line_cap,
+                      "Gets or sets the line cap of this stroke.\n")
         .add_property("line_join",
-              &stroke::get_line_join,
-              &stroke::set_line_join,
-              "Returns the line join mode of this stroke.\n")
+                      &stroke::get_line_join,
+                      &stroke::set_line_join,
+                      "Returns the line join mode of this stroke.\n")
         // todo consider providing a single get/set property
         .def("add_dash",&stroke::add_dash,
-              (arg("length"),arg("gap")),
-              "Adds a dash segment to the dash patterns of this stroke.\n")
+             (arg("length"),arg("gap")),
+             "Adds a dash segment to the dash patterns of this stroke.\n")
         .def("get_dashes", get_dashes_list,
-              "Returns the list of dash segments for this stroke.\n")
+             "Returns the list of dash segments for this stroke.\n")
+        .add_property("dash_offset",
+                      &stroke::dash_offset,
+                      &stroke::set_dash_offset,
+                      "Gets or sets dash offset of this stroke.\n")
         ;
 }
diff --git a/bindings/python/mapnik_style.cpp b/bindings/python/mapnik_style.cpp
index b95bfb3..e8109d7 100644
--- a/bindings/python/mapnik_style.cpp
+++ b/bindings/python/mapnik_style.cpp
@@ -24,17 +24,18 @@
 #include <boost/python.hpp>
 #include <boost/python/suite/indexing/vector_indexing_suite.hpp>
 
+#include "mapnik_enumeration.hpp"
 #include <mapnik/feature_type_style.hpp>
 
 using mapnik::feature_type_style;
 using mapnik::rules;
-using mapnik::rule_type;
+using mapnik::rule;
 
 struct style_pickle_suite : boost::python::pickle_suite
 {
-   static boost::python::tuple
-   getstate(const feature_type_style& s)
-   {
+    static boost::python::tuple
+    getstate(const feature_type_style& s)
+    {
         boost::python::list rule_list;
 
         rules::const_iterator it = s.get_rules().begin();
@@ -44,28 +45,28 @@ struct style_pickle_suite : boost::python::pickle_suite
             rule_list.append( *it );    
         }
 
-      return boost::python::make_tuple(rule_list);
-   }
+        return boost::python::make_tuple(rule_list);
+    }
 
-   static void
-   setstate (feature_type_style& s, boost::python::tuple state)
-   {
+    static void
+    setstate (feature_type_style& s, boost::python::tuple state)
+    {
         using namespace boost::python;
         if (len(state) != 1)
         {
             PyErr_SetObject(PyExc_ValueError,
-                         ("expected 1-item tuple in call to __setstate__; got %s"
-                          % state).ptr()
-            );
+                            ("expected 1-item tuple in call to __setstate__; got %s"
+                             % state).ptr()
+                );
             throw_error_already_set();
         }
         
         boost::python::list rules = extract<boost::python::list>(state[0]);
         for (int i=0; i<len(rules); ++i)
         {
-            s.add_rule(extract<rule_type>(rules[i]));
+            s.add_rule(extract<rule>(rules[i]));
         }
-   }
+    }
    
 };
 
@@ -73,17 +74,34 @@ void export_style()
 {
     using namespace boost::python;
 
+    mapnik::enumeration_<mapnik::filter_mode_e>("filter_mode")
+        .value("ALL",mapnik::FILTER_ALL)
+        .value("FIRST",mapnik::FILTER_FIRST)
+        ;
+
     class_<rules>("Rules",init<>("default ctor"))
         .def(vector_indexing_suite<rules>())
         ;
     class_<feature_type_style>("Style",init<>("default style constructor"))
 
         .def_pickle(style_pickle_suite()
-           )
+            )
 
         .add_property("rules",make_function
                       (&feature_type_style::get_rules,
-                       return_value_policy<reference_existing_object>()))
+                       return_value_policy<reference_existing_object>()),
+                      "List of rules belonging to a style as rule objects.\n"
+                      "\n"
+                      "Usage:\n"
+                      ">>> for r in m.find_style('style 1').rules:\n"
+                      ">>>    print r\n"
+                      "<mapnik2._mapnik2.Rule object at 0x100549910>\n"
+                      "<mapnik2._mapnik2.Rule object at 0x100549980>\n"
+                   )
+        .add_property("filter_mode",
+                      &feature_type_style::get_filter_mode,
+                      &feature_type_style::set_filter_mode,
+                      "Set/get the placement of the label")
         ;
     
 }
diff --git a/bindings/python/mapnik_svg.hpp b/bindings/python/mapnik_svg.hpp
new file mode 100644
index 0000000..3fb8ef3
--- /dev/null
+++ b/bindings/python/mapnik_svg.hpp
@@ -0,0 +1,59 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Robert Coup
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+#ifndef MAPNIK_PYTHON_BINDING_SVG_INCLUDED
+#define MAPNIK_PYTHON_BINDING_SVG_INCLUDED
+
+// mapnik
+#include <mapnik/symbolizer.hpp>
+#include <mapnik/svg/svg_path_parser.hpp>
+#include <mapnik/value_error.hpp>
+
+// agg
+#include "agg_trans_affine.h"
+
+namespace mapnik {
+using namespace boost::python;
+
+template <class T>
+const std::string get_svg_transform(T& symbolizer)
+{
+    return symbolizer.get_transform_string();
+}
+
+template <class T>
+void set_svg_transform(T& symbolizer, std::string const& transform_wkt)
+{
+    agg::trans_affine tr;
+    if (!mapnik::svg::parse_transform(transform_wkt, tr))
+    {
+        std::stringstream ss;
+        ss << "Could not parse transform from '" << transform_wkt << "', expected string like: 'matrix(1, 0, 0, 1, 0, 0)'";
+        throw mapnik::value_error(ss.str());    
+    }
+    mapnik::transform_type matrix;
+    tr.store_to(&matrix[0]);
+    symbolizer.set_transform(matrix);
+}
+
+} // end of namespace mapnik
+
+#endif // MAPNIK_PYTHON_BINDING_SVG_INCLUDED
diff --git a/bindings/python/mapnik_symbolizer.cpp b/bindings/python/mapnik_symbolizer.cpp
index 84a8fd1..26e07b0 100644
--- a/bindings/python/mapnik_symbolizer.cpp
+++ b/bindings/python/mapnik_symbolizer.cpp
@@ -28,7 +28,7 @@
 
 using mapnik::symbolizer;
 
-using mapnik::rule_type;
+using mapnik::rule;
 using mapnik::point_symbolizer;
 using mapnik::line_symbolizer;
 using mapnik::line_pattern_symbolizer;
@@ -39,69 +39,75 @@ using mapnik::shield_symbolizer;
 using mapnik::text_symbolizer;
 using mapnik::building_symbolizer;
 using mapnik::markers_symbolizer;
+using mapnik::glyph_symbolizer;
 
 struct get_symbolizer_type : public boost::static_visitor<std::string>
 {
-    public:
-        get_symbolizer_type() {}
+public:
+    get_symbolizer_type() {}
         
-        std::string operator () ( const  point_symbolizer & sym )
-        {
-            return "point";
-        }
+    std::string operator () ( const  point_symbolizer & /*sym*/ )
+    {
+        return "point";
+    }
     
-        std::string operator () ( const line_symbolizer & sym )
-        {
-            return "line";
-        }
+    std::string operator () ( const line_symbolizer & /*sym*/ )
+    {
+        return "line";
+    }
     
-        std::string operator () ( const line_pattern_symbolizer & sym )
-        {
-            return "line_pattern";
-        }
+    std::string operator () ( const line_pattern_symbolizer & /*sym*/ )
+    {
+        return "line_pattern";
+    }
     
-        std::string operator () ( const polygon_symbolizer & sym )
-        {
-            return "polygon";
-        }
+    std::string operator () ( const polygon_symbolizer & /*sym*/ )
+    {
+        return "polygon";
+    }
     
-        std::string operator () ( const polygon_pattern_symbolizer & sym )
-        {
-            return "polygon_pattern";
-        }
+    std::string operator () ( const polygon_pattern_symbolizer & /*sym*/ )
+    {
+        return "polygon_pattern";
+    }
     
-        std::string operator () ( const raster_symbolizer & sym )
-        {
-            return "raster";
-        }
+    std::string operator () ( const raster_symbolizer & /*sym*/ )
+    {
+        return "raster";
+    }
     
-        std::string operator () ( const shield_symbolizer & sym )
-        {
-            return "shield";
-        }
+    std::string operator () ( const shield_symbolizer & /*sym*/ )
+    {
+        return "shield";
+    }
     
-        std::string operator () ( const text_symbolizer & sym )
-        {
-            return "text";
-        }
+    std::string operator () ( const text_symbolizer & /*sym*/ )
+    {
+        return "text";
+    }
     
-        std::string operator () ( const building_symbolizer & sym )
-        {
-            return "building";
-        }
+    std::string operator () ( const building_symbolizer & /*sym*/ )
+    {
+        return "building";
+    }
     
-        std::string operator () ( const markers_symbolizer & sym )
-        {
-            return "markers";
-        }
+    std::string operator () ( const markers_symbolizer & /*sym*/ )
+    {
+        return "markers";
+    }
+
+    std::string operator () ( const glyph_symbolizer & /*sym*/ )
+    {
+        return "glyph";
+    }
 
 };
 
 std::string get_symbol_type(const symbolizer& symbol)
 {
-   get_symbolizer_type serializer;
-   std::string type = boost::apply_visitor( serializer, symbol );
-   return type;
+    get_symbolizer_type serializer;
+    std::string type = boost::apply_visitor( serializer, symbol );
+    return type;
 }
 
 const point_symbolizer& point_( const symbolizer& symbol )
@@ -154,6 +160,11 @@ const markers_symbolizer& markers_( const symbolizer& symbol )
     return boost::get<markers_symbolizer>(symbol);
 }
 
+const glyph_symbolizer& glyph_( const symbolizer& symbol )
+{
+    return boost::get<glyph_symbolizer>(symbol);
+}
+
 void export_symbolizer()
 {
     using namespace boost::python;
@@ -163,35 +174,38 @@ void export_symbolizer()
         .def("type",get_symbol_type)
 
         .def("point",point_,
-            return_value_policy<copy_const_reference>())
+             return_value_policy<copy_const_reference>())
 
         .def("line",line_,
-            return_value_policy<copy_const_reference>())
+             return_value_policy<copy_const_reference>())
 
         .def("line_pattern",line_pattern_,
-            return_value_policy<copy_const_reference>())
+             return_value_policy<copy_const_reference>())
 
         .def("polygon",polygon_,
-            return_value_policy<copy_const_reference>())
+             return_value_policy<copy_const_reference>())
 
         .def("polygon_pattern",polygon_pattern_,
-            return_value_policy<copy_const_reference>())
+             return_value_policy<copy_const_reference>())
 
         .def("raster",raster_,
-            return_value_policy<copy_const_reference>())
+             return_value_policy<copy_const_reference>())
 
         .def("shield",shield_,
-            return_value_policy<copy_const_reference>())
+             return_value_policy<copy_const_reference>())
 
         .def("text",text_,
-            return_value_policy<copy_const_reference>())
+             return_value_policy<copy_const_reference>())
 
         .def("building",building_,
-            return_value_policy<copy_const_reference>())
+             return_value_policy<copy_const_reference>())
 
         .def("markers",markers_,
-            return_value_policy<copy_const_reference>())
+             return_value_policy<copy_const_reference>())
+
+        .def("glyph",glyph_,
+             return_value_policy<copy_const_reference>())
 
-    ;
+        ;
 }
 
diff --git a/bindings/python/mapnik_text_symbolizer.cpp b/bindings/python/mapnik_text_symbolizer.cpp
index da22fd2..2f844a0 100644
--- a/bindings/python/mapnik_text_symbolizer.cpp
+++ b/bindings/python/mapnik_text_symbolizer.cpp
@@ -25,52 +25,58 @@
 
 #include <mapnik/text_symbolizer.hpp>
 #include "mapnik_enumeration.hpp"
+#include <mapnik/expression_string.hpp>
 
 using namespace mapnik;
 using mapnik::color;
 using mapnik::text_symbolizer;
+using mapnik::expr_node;
+using mapnik::expression_ptr;
+using mapnik::to_expression_string;
 
 namespace {
-  using namespace boost::python;
+using namespace boost::python;
 
-  list get_displacement_list(const text_symbolizer& t)
-  {
+tuple get_text_displacement(const text_symbolizer& t)
+{
     position pos = t.get_displacement();
-    double dx = boost::get<0>(pos);
-    double dy = boost::get<1>(pos);
-    boost::python::list disp;
-    disp.append(dx);
-    disp.append(dy);
-    return disp;
-  }
-  
-  list get_anchor_list(const text_symbolizer& t)
-  {
-    position anch = t.get_anchor();
-    double x = boost::get<0>(anch);
-    double y = boost::get<1>(anch);
-    boost::python::list anchor;
-    anchor.append(x);
-    anchor.append(y);
-    return anchor;
-  }
+    return boost::python::make_tuple(boost::get<0>(pos),boost::get<1>(pos));
+}
+
+void set_text_displacement(text_symbolizer & t, boost::python::tuple arg)
+{
+    t.set_displacement(extract<double>(arg[0]),extract<double>(arg[1]));
+}
+
+tuple get_anchor(const text_symbolizer& t)
+{
+    position pos = t.get_anchor();
+    return boost::python::make_tuple(boost::get<0>(pos),boost::get<1>(pos));
+}
+
+void set_anchor(text_symbolizer & t, boost::python::tuple arg)
+{
+    t.set_anchor(extract<double>(arg[0]),extract<double>(arg[1]));
+}
+
 }
 
 struct text_symbolizer_pickle_suite : boost::python::pickle_suite
 {
-   static boost::python::tuple
-   getinitargs(const text_symbolizer& t)
-   {
+    static boost::python::tuple
+    getinitargs(const text_symbolizer& t)
+    {
 
-      return boost::python::make_tuple(t.get_name(),t.get_face_name(),t.get_text_size(),t.get_fill());
-      
-   }
+        return boost::python::make_tuple("TODO",//t.get_name(),
+                                         t.get_face_name(),t.get_text_size(),t.get_fill());
+       
+    }
 
-   static  boost::python::tuple
-   getstate(const text_symbolizer& t)
-   {
-        boost::python::list disp = get_displacement_list(t);
-        boost::python::list anchor = get_anchor_list(t);
+    static  boost::python::tuple
+    getstate(const text_symbolizer& t)
+    {
+        boost::python::tuple disp = get_text_displacement(t);
+        boost::python::tuple anchor = get_anchor(t);
         
         // so we do not exceed max args accepted by make_tuple,
         // lets put the increasing list of parameters in a list
@@ -78,34 +84,36 @@ struct text_symbolizer_pickle_suite : boost::python::pickle_suite
         extras.append(t.get_wrap_char_string());
         extras.append(t.get_line_spacing());
         extras.append(t.get_character_spacing());
-        extras.append(t.get_text_convert());
+        extras.append(t.get_text_transform());
         extras.append(t.get_wrap_before());
         extras.append(t.get_horizontal_alignment());
         extras.append(t.get_justify_alignment());
-        extras.append(t.get_opacity());
+        extras.append(t.get_text_opacity());
+        extras.append(t.get_minimum_padding());
+        extras.append(t.get_minimum_path_length());
                 
         return boost::python::make_tuple(disp,t.get_label_placement(),
-        t.get_vertical_alignment(),t.get_halo_radius(),t.get_halo_fill(),t.get_text_ratio(),
-        t.get_wrap_width(),t.get_label_spacing(),t.get_minimum_distance(),t.get_allow_overlap(),
-        anchor,t.get_force_odd_labels(),t.get_max_char_angle_delta(),extras
-        );
-   }
+               t.get_vertical_alignment(),t.get_halo_radius(),t.get_halo_fill(),t.get_text_ratio(),
+               t.get_wrap_width(),t.get_label_spacing(),t.get_minimum_distance(),t.get_allow_overlap(),
+               anchor,t.get_force_odd_labels(),t.get_max_char_angle_delta(),extras
+            );
+    }
 
-   static void
-   setstate (text_symbolizer& t, boost::python::tuple state)
-   {
+    static void
+    setstate (text_symbolizer& t, boost::python::tuple state)
+    {
         using namespace boost::python;
         
         if (len(state) != 14)
         {
             PyErr_SetObject(PyExc_ValueError,
-                         ("expected 15-item tuple in call to __setstate__; got %s"
-                          % state).ptr()
-            );
+                            ("expected 15-item tuple in call to __setstate__; got %s"
+                             % state).ptr()
+                );
             throw_error_already_set();
         }
         
-        list disp = extract<list>(state[0]);
+        tuple disp = extract<tuple>(state[0]);
         double dx = extract<double>(disp[0]);
         double dy = extract<double>(disp[1]);
         t.set_displacement(dx,dy);
@@ -128,7 +136,7 @@ struct text_symbolizer_pickle_suite : boost::python::pickle_suite
 
         t.set_allow_overlap(extract<bool>(state[9]));
         
-        list anch = extract<list>(state[10]);
+        tuple anch = extract<tuple>(state[10]);
         double x = extract<double>(anch[0]);
         double y = extract<double>(anch[1]);
         t.set_anchor(x,y);
@@ -136,33 +144,36 @@ struct text_symbolizer_pickle_suite : boost::python::pickle_suite
         t.set_force_odd_labels(extract<bool>(state[11]));
         
         t.set_max_char_angle_delta(extract<double>(state[12]));
-        
         list extras = extract<list>(state[13]);
         t.set_wrap_char_from_string(extract<std::string>(extras[0]));
         t.set_line_spacing(extract<unsigned>(extras[1]));
         t.set_character_spacing(extract<unsigned>(extras[2]));
-        t.set_text_convert(extract<text_convert_e>(extras[3]));
+        t.set_text_transform(extract<text_transform_e>(extras[3]));
         t.set_wrap_before(extract<bool>(extras[4]));
         t.set_horizontal_alignment(extract<horizontal_alignment_e>(extras[5]));
         t.set_justify_alignment(extract<justify_alignment_e>(extras[6]));
-        t.set_opacity(extract<double>(extras[7]));
-   }
+        t.set_text_opacity(extract<double>(extras[7]));
+        t.set_minimum_padding(extract<double>(extras[8]));
+        t.set_minimum_path_length(extract<double>(extras[9]));
+    }
 };
 
 
 void export_text_symbolizer()
 {
-using namespace boost::python;
+    using namespace boost::python;
 
     enumeration_<label_placement_e>("label_placement")
         .value("LINE_PLACEMENT",LINE_PLACEMENT)
         .value("POINT_PLACEMENT",POINT_PLACEMENT)
         .value("VERTEX_PLACEMENT",VERTEX_PLACEMENT)
+        .value("INTERIOR_PLACEMENT",INTERIOR_PLACEMENT)
         ;
     enumeration_<vertical_alignment_e>("vertical_alignment")
-        .value("TOP",TOP)
-        .value("MIDDLE",MIDDLE)
-        .value("BOTTOM",BOTTOM)
+        .value("TOP",V_TOP)
+        .value("MIDDLE",V_MIDDLE)
+        .value("BOTTOM",V_BOTTOM)
+        .value("AUTO",V_AUTO)
         ;
 
     enumeration_<horizontal_alignment_e>("horizontal_alignment")
@@ -177,105 +188,127 @@ using namespace boost::python;
         .value("RIGHT",J_RIGHT)
         ;
                 
-    enumeration_<text_convert_e>("text_convert")
+    enumeration_<text_transform_e>("text_transform")
         .value("NONE",NONE)
-        .value("TOUPPER",TOUPPER)
-        .value("TOLOWER",TOLOWER)
+        .value("UPPERCASE",UPPERCASE)
+        .value("LOWERCASE",LOWERCASE)
+        .value("CAPITALIZE",CAPITALIZE)
         ;
 
-class_<text_symbolizer>("TextSymbolizer",init<std::string const&,std::string const&, unsigned,color const&>())
-    .def_pickle(text_symbolizer_pickle_suite())
-    .def("anchor",&text_symbolizer::set_anchor)
-    .def("displacement",&text_symbolizer::set_displacement)
-    .def("get_anchor",get_anchor_list)
-    .def("get_displacement",get_displacement_list)
-    .add_property("allow_overlap",
-                  &text_symbolizer::get_allow_overlap,
-                  &text_symbolizer::set_allow_overlap,
-                  "Set/get the allow_overlap property of the label")
-    .add_property("avoid_edges",
-                  &text_symbolizer::get_avoid_edges,
-                  &text_symbolizer::set_avoid_edges,
-                  "Set/get the avoid_edge property of the label")
-    .add_property("character_spacing",
-                  &text_symbolizer::get_character_spacing,
-                  &text_symbolizer::set_character_spacing,
-                  "Set/get the character_spacing property of the label")
-    .add_property("face_name",
-                  make_function(&text_symbolizer::get_face_name,return_value_policy<copy_const_reference>()),
-                  &text_symbolizer::set_face_name,
-                  "Set/get the face_name property of the label")
-    .add_property("fill",              
-                  make_function(&text_symbolizer::get_fill,return_value_policy<copy_const_reference>()),
-                  &text_symbolizer::set_fill)
-    .add_property("fontset",
-                  make_function(&text_symbolizer::get_fontset,return_value_policy<copy_const_reference>()),
-                  &text_symbolizer::set_fontset)
-    .add_property("force_odd_labels",
-                  &text_symbolizer::get_force_odd_labels,
-                  &text_symbolizer::set_force_odd_labels)
-    .add_property("halo_fill",
-                  make_function(&text_symbolizer::get_halo_fill,return_value_policy<copy_const_reference>()),
-                  &text_symbolizer::set_halo_fill)
-    .add_property("halo_radius",
-                  &text_symbolizer::get_halo_radius, 
-                  &text_symbolizer::set_halo_radius)
-    .add_property("horizontal_alignment",
-                  &text_symbolizer::get_horizontal_alignment,
-                  &text_symbolizer::set_horizontal_alignment,
-                  "Set/get the horizontal alignment of the label")
-    .add_property("justify_alignment",
-                  &text_symbolizer::get_justify_alignment,
-                  &text_symbolizer::set_justify_alignment,
-                  "Set/get the text justification")
-    .add_property("label_placement",
-                  &text_symbolizer::get_label_placement,
-                  &text_symbolizer::set_label_placement,
-                  "Set/get the placement of the label")
-    .add_property("label_position_tolerance",
-                  &text_symbolizer::get_label_position_tolerance,
-                  &text_symbolizer::set_label_position_tolerance)
-    .add_property("label_spacing",
-                  &text_symbolizer::get_label_spacing,
-                  &text_symbolizer::set_label_spacing)
-    .add_property("line_spacing",
-                  &text_symbolizer::get_line_spacing,
-                  &text_symbolizer::set_line_spacing)
-    .add_property("max_char_angle_delta",
-                  &text_symbolizer::get_max_char_angle_delta,
-                  &text_symbolizer::set_max_char_angle_delta)
-    .add_property("minimum_distance",
-                  &text_symbolizer::get_minimum_distance,
-                  &text_symbolizer::set_minimum_distance)
-    .add_property("name",
-                  make_function(&text_symbolizer::get_name,return_value_policy<copy_const_reference>()),
-                  &text_symbolizer::set_name)
-    .add_property("opacity",
-                  &text_symbolizer::get_opacity,
-                  &text_symbolizer::set_opacity,
-                  "Set/get the text opacity")
-    .add_property("text_convert",
-                  &text_symbolizer::get_text_convert,
-                  &text_symbolizer::set_text_convert,
-                  "Set/get the text conversion method")
-    .add_property("text_ratio",
-                  &text_symbolizer::get_text_ratio,
-                  &text_symbolizer::set_text_ratio)
-    .add_property("text_size",
-                  &text_symbolizer::get_text_size,
-                  &text_symbolizer::set_text_size)
-    .add_property("vertical_alignment",
-                  &text_symbolizer::get_vertical_alignment,
-                  &text_symbolizer::set_vertical_alignment,
-                  "Set/get the vertical alignment of the label")
-    .add_property("wrap_width",
-                  &text_symbolizer::get_wrap_width,
-                  &text_symbolizer::set_wrap_width)
-    .add_property("wrap_character",
-                  &text_symbolizer::get_wrap_char_string,
-                  &text_symbolizer::set_wrap_char_from_string)
-    .add_property("wrap_before",
-                  &text_symbolizer::get_wrap_before,
-                  &text_symbolizer::set_wrap_before)
-    ;
+    class_<text_symbolizer>("TextSymbolizer",init<expression_ptr,std::string const&, unsigned,color const&>())
+    /*
+    // todo - all python classes can have kwargs and default constructors
+    class_<text_symbolizer>("TextSymbolizer",
+        init<expression_ptr,std::string const&, unsigned,color const&>(
+          (
+            arg("name"),
+            arg("font_face")="DejaVu Sans Book",
+            arg("size")=10,
+            arg("color")=color("black")
+          ),
+        "Create a TextSymbolizer\n"
+        ))
+    */
+
+        //.def_pickle(text_symbolizer_pickle_suite())
+        .add_property("anchor",
+                      &get_anchor,
+                      &set_anchor)
+        .add_property("allow_overlap",
+                      &text_symbolizer::get_allow_overlap,
+                      &text_symbolizer::set_allow_overlap,
+                      "Set/get the allow_overlap property of the label")
+        .add_property("displacement",
+                      &get_text_displacement,
+                      &set_text_displacement)
+        .add_property("avoid_edges",
+                      &text_symbolizer::get_avoid_edges,
+                      &text_symbolizer::set_avoid_edges,
+                      "Set/get the avoid_edge property of the label")
+        .add_property("character_spacing",
+                      &text_symbolizer::get_character_spacing,
+                      &text_symbolizer::set_character_spacing,
+                      "Set/get the character_spacing property of the label")
+        .add_property("face_name",
+                      make_function(&text_symbolizer::get_face_name,return_value_policy<copy_const_reference>()),
+                      &text_symbolizer::set_face_name,
+                      "Set/get the face_name property of the label")
+        .add_property("fill",              
+                      make_function(&text_symbolizer::get_fill,return_value_policy<copy_const_reference>()),
+                      &text_symbolizer::set_fill)
+        .add_property("fontset",
+                      make_function(&text_symbolizer::get_fontset,return_value_policy<copy_const_reference>()),
+                      &text_symbolizer::set_fontset)
+        .add_property("force_odd_labels",
+                      &text_symbolizer::get_force_odd_labels,
+                      &text_symbolizer::set_force_odd_labels)
+        .add_property("halo_fill",
+                      make_function(&text_symbolizer::get_halo_fill,return_value_policy<copy_const_reference>()),
+                      &text_symbolizer::set_halo_fill)
+        .add_property("halo_radius",
+                      &text_symbolizer::get_halo_radius, 
+                      &text_symbolizer::set_halo_radius)
+        .add_property("horizontal_alignment",
+                      &text_symbolizer::get_horizontal_alignment,
+                      &text_symbolizer::set_horizontal_alignment,
+                      "Set/get the horizontal alignment of the label")
+        .add_property("justify_alignment",
+                      &text_symbolizer::get_justify_alignment,
+                      &text_symbolizer::set_justify_alignment,
+                      "Set/get the text justification")
+        .add_property("label_placement",
+                      &text_symbolizer::get_label_placement,
+                      &text_symbolizer::set_label_placement,
+                      "Set/get the placement of the label")
+        .add_property("label_position_tolerance",
+                      &text_symbolizer::get_label_position_tolerance,
+                      &text_symbolizer::set_label_position_tolerance)
+        .add_property("label_spacing",
+                      &text_symbolizer::get_label_spacing,
+                      &text_symbolizer::set_label_spacing)
+        .add_property("line_spacing",
+                      &text_symbolizer::get_line_spacing,
+                      &text_symbolizer::set_line_spacing)
+        .add_property("max_char_angle_delta",
+                      &text_symbolizer::get_max_char_angle_delta,
+                      &text_symbolizer::set_max_char_angle_delta)
+        .add_property("minimum_distance",
+                      &text_symbolizer::get_minimum_distance,
+                      &text_symbolizer::set_minimum_distance)
+        .add_property("minimum_padding",
+                      &text_symbolizer::get_minimum_padding,
+                      &text_symbolizer::set_minimum_padding)
+        .add_property("minimum_path_length",
+                      &text_symbolizer::get_minimum_path_length,
+                      &text_symbolizer::set_minimum_path_length)
+        .add_property("name",&text_symbolizer::get_name,
+                      &text_symbolizer::set_name)
+        .add_property("opacity",
+                      &text_symbolizer::get_text_opacity,
+                      &text_symbolizer::set_text_opacity,
+                      "Set/get the text opacity")
+        .add_property("text_transform",
+                      &text_symbolizer::get_text_transform,
+                      &text_symbolizer::set_text_transform,
+                      "Set/get the text conversion method")
+        .add_property("text_ratio",
+                      &text_symbolizer::get_text_ratio,
+                      &text_symbolizer::set_text_ratio)
+        .add_property("text_size",
+                      &text_symbolizer::get_text_size,
+                      &text_symbolizer::set_text_size)
+        .add_property("vertical_alignment",
+                      &text_symbolizer::get_vertical_alignment,
+                      &text_symbolizer::set_vertical_alignment,
+                      "Set/get the vertical alignment of the label")
+        .add_property("wrap_width",
+                      &text_symbolizer::get_wrap_width,
+                      &text_symbolizer::set_wrap_width)
+        .add_property("wrap_character",
+                      &text_symbolizer::get_wrap_char_string,
+                      &text_symbolizer::set_wrap_char_from_string)
+        .add_property("wrap_before",
+                      &text_symbolizer::get_wrap_before,
+                      &text_symbolizer::set_wrap_before)
+        ;
 }
diff --git a/bindings/python/mapnik_value_converter.hpp b/bindings/python/mapnik_value_converter.hpp
new file mode 100644
index 0000000..85765e6
--- /dev/null
+++ b/bindings/python/mapnik_value_converter.hpp
@@ -0,0 +1,69 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+#ifndef MAPNIK_PYTHON_BINDING_VALUE_CONVERTER_INCLUDED
+#define MAPNIK_PYTHON_BINDING_VALUE_CONVERTER_INCLUDED
+
+// boost
+#include <boost/python.hpp>
+#include <boost/implicit_cast.hpp>
+
+namespace boost { namespace python {
+    struct value_converter : public boost::static_visitor<PyObject*>
+    {
+        PyObject * operator() (int val) const
+        {
+#if PY_VERSION_HEX >= 0x03000000
+            return ::PyLong_FromLong(val);
+#else
+            return ::PyInt_FromLong(val);
+#endif
+        }
+
+        PyObject * operator() (double val) const
+        {
+            return ::PyFloat_FromDouble(val);
+        }
+
+        PyObject * operator() (bool val) const
+        {
+            return ::PyBool_FromLong(val);
+        }
+            
+        PyObject * operator() (UnicodeString const& s) const
+        {
+            std::string buffer;
+            mapnik::to_utf8(s,buffer);
+            PyObject *obj = Py_None;
+            obj = ::PyUnicode_DecodeUTF8(buffer.c_str(),implicit_cast<ssize_t>(buffer.length()),0);                
+            return obj;
+        }
+            
+        PyObject * operator() (mapnik::value_null const& /*s*/) const
+        {
+            return Py_None;
+        }
+    };
+
+}
+}
+
+#endif // MAPNIK_PYTHON_BINDING_VALUE_CONVERTER_INCLUDED
diff --git a/bindings/python/mapnik_view_transform.cpp b/bindings/python/mapnik_view_transform.cpp
index ed636d7..031f215 100644
--- a/bindings/python/mapnik_view_transform.cpp
+++ b/bindings/python/mapnik_view_transform.cpp
@@ -41,45 +41,45 @@ struct view_transform_pickle_suite : boost::python::pickle_suite
 
 namespace {
 
-   mapnik::coord2d forward_point(mapnik::CoordTransform const& t, mapnik::coord2d const& in)
-   {
-      mapnik::coord2d out(in);
-      t.forward(out);
-      return out;
-   }
+mapnik::coord2d forward_point(mapnik::CoordTransform const& t, mapnik::coord2d const& in)
+{
+    mapnik::coord2d out(in);
+    t.forward(out);
+    return out;
+}
    
-   mapnik::coord2d backward_point(mapnik::CoordTransform const& t, mapnik::coord2d const& in)
-   {
-      mapnik::coord2d out(in);
-      t.backward(out);
-      return out;
-   }
+mapnik::coord2d backward_point(mapnik::CoordTransform const& t, mapnik::coord2d const& in)
+{
+    mapnik::coord2d out(in);
+    t.backward(out);
+    return out;
+}
    
-   mapnik::Envelope<double> forward_envelope(mapnik::CoordTransform const& t, mapnik::Envelope<double> const& in)
-   {
-      return t.forward(in);
-   }
+mapnik::box2d<double> forward_envelope(mapnik::CoordTransform const& t, mapnik::box2d<double> const& in)
+{
+    return t.forward(in);
+}
    
-   mapnik::Envelope<double> backward_envelope(mapnik::CoordTransform const& t, mapnik::Envelope<double> const& in)
-   {
-      return t.backward(in);
-   }
+mapnik::box2d<double> backward_envelope(mapnik::CoordTransform const& t, mapnik::box2d<double> const& in)
+{
+    return t.backward(in);
+}
 }
 
 void export_view_transform() 
 {
-   using namespace boost::python;
-   using mapnik::Envelope;
-   using mapnik::coord2d;
+    using namespace boost::python;
+    using mapnik::box2d;
+    using mapnik::coord2d;
    
-   class_<CoordTransform>("ViewTransform",init<int,int,Envelope<double> const& > (
-      "Create a ViewTransform with a width and height as integers and extent"))
-      .def_pickle(view_transform_pickle_suite())
-      .def("forward", forward_point)
-      .def("backward",backward_point)
-      .def("forward", forward_envelope)
-      .def("backward",backward_envelope)
-      .def("scale_x",&CoordTransform::scale_x)
-      .def("scale_y",&CoordTransform::scale_y)
-      ;
+    class_<CoordTransform>("ViewTransform",init<int,int,box2d<double> const& > (
+                               "Create a ViewTransform with a width and height as integers and extent"))
+        .def_pickle(view_transform_pickle_suite())
+        .def("forward", forward_point)
+        .def("backward",backward_point)
+        .def("forward", forward_envelope)
+        .def("backward",backward_envelope)
+        .def("scale_x",&CoordTransform::scale_x)
+        .def("scale_y",&CoordTransform::scale_y)
+        ;
 }
diff --git a/bindings/python/python_cairo.cpp b/bindings/python/python_cairo.cpp
index 30bcc16..e5420c1 100644
--- a/bindings/python/python_cairo.cpp
+++ b/bindings/python/python_cairo.cpp
@@ -32,36 +32,35 @@ static Pycairo_CAPI_t *Pycairo_CAPI;
 
 static void *extract_surface(PyObject* op)
 {
-   if (PyObject_TypeCheck(op, const_cast<PyTypeObject*>(Pycairo_CAPI->Surface_Type)))
-   {
-      return op;
-   }
-   else
-   {
-      return 0;
-   }
+    if (PyObject_TypeCheck(op, const_cast<PyTypeObject*>(Pycairo_CAPI->Surface_Type)))
+    {
+        return op;
+    }
+    else
+    {
+        return 0;
+    }
 }
 
 static void *extract_context(PyObject* op)
 {
-   if (PyObject_TypeCheck(op, const_cast<PyTypeObject*>(Pycairo_CAPI->Context_Type)))
-   {
-      return op;
-   }
-   else
-   {
-      return 0;
-   }
+    if (PyObject_TypeCheck(op, const_cast<PyTypeObject*>(Pycairo_CAPI->Context_Type)))
+    {
+        return op;
+    }
+    else
+    {
+        return 0;
+    }
 }
 
 void register_cairo()
 {
-   Pycairo_IMPORT;
-   
-   if (Pycairo_CAPI == NULL) return;
+    Pycairo_CAPI = (Pycairo_CAPI_t*) PyCObject_Import(const_cast<char *>("cairo"), const_cast<char *>("CAPI"));
+    if (Pycairo_CAPI == NULL) return;
 
-   boost::python::converter::registry::insert(&extract_surface, boost::python::type_id<PycairoSurface>());
-   boost::python::converter::registry::insert(&extract_context, boost::python::type_id<PycairoContext>());
+    boost::python::converter::registry::insert(&extract_surface, boost::python::type_id<PycairoSurface>());
+    boost::python::converter::registry::insert(&extract_context, boost::python::type_id<PycairoContext>());
 }
 
 #else
diff --git a/bindings/python/python_grid_utils.hpp b/bindings/python/python_grid_utils.hpp
new file mode 100644
index 0000000..ee78f2c
--- /dev/null
+++ b/bindings/python/python_grid_utils.hpp
@@ -0,0 +1,468 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+#ifndef MAPNIK_PYTHON_BINDING_GRID_UTILS_INCLUDED
+#define MAPNIK_PYTHON_BINDING_GRID_UTILS_INCLUDED
+
+// boost
+#include <boost/python.hpp>
+#include <boost/scoped_array.hpp>
+#include <boost/foreach.hpp>
+
+// mapnik
+#include <mapnik/grid/grid_renderer.hpp>
+#include <mapnik/grid/grid.hpp>
+#include <mapnik/grid/grid_util.hpp>
+#include <mapnik/grid/grid_view.hpp>
+#include <mapnik/value_error.hpp>
+#include "mapnik_value_converter.hpp"
+
+
+namespace mapnik {
+
+
+template <typename T>
+static void grid2utf(T const& grid_type, 
+    boost::python::list& l,
+    std::vector<grid::lookup_type>& key_order)
+{
+    typename T::data_type const& data = grid_type.data();
+    typename T::feature_key_type const& feature_keys = grid_type.get_feature_keys();
+    typename T::key_type keys;
+    typename T::key_type::const_iterator key_pos;
+    typename T::feature_key_type::const_iterator feature_pos;
+    // start counting at utf8 codepoint 32, aka space character
+    uint16_t codepoint = 32;
+    
+    unsigned array_size = data.width();
+    for (unsigned y = 0; y < data.height(); ++y)
+    {
+        uint16_t idx = 0;
+        boost::scoped_array<Py_UNICODE> line(new Py_UNICODE[array_size]);
+        typename T::value_type const* row = data.getRow(y);
+        for (unsigned x = 0; x < data.width(); ++x)
+        {
+            feature_pos = feature_keys.find(row[x]);
+            if (feature_pos != feature_keys.end())
+            {
+                mapnik::grid::lookup_type val = feature_pos->second;
+                key_pos = keys.find(val);
+                if (key_pos == keys.end())
+                {
+                    // Create a new entry for this key. Skip the codepoints that
+                    // can't be encoded directly in JSON.
+                    if (codepoint == 34) ++codepoint;      // Skip "
+                    else if (codepoint == 92) ++codepoint; // Skip backslash
+                
+                    keys[val] = codepoint;
+                    key_order.push_back(val);
+                    line[idx++] = static_cast<Py_UNICODE>(codepoint);
+                    ++codepoint;
+                }
+                else
+                {
+                    line[idx++] = static_cast<Py_UNICODE>(key_pos->second);
+                }
+            }
+            // else, shouldn't get here...
+        }
+        l.append(boost::python::object(
+                    boost::python::handle<>(
+                        PyUnicode_FromUnicode(line.get(), array_size))));
+    }
+}
+
+
+template <typename T>
+static void grid2utf(T const& grid_type, 
+    boost::python::list& l,
+    std::vector<typename T::lookup_type>& key_order,
+    unsigned int resolution)
+{
+    //typename T::data_type const& data = grid_type.data();
+    typename T::feature_key_type const& feature_keys = grid_type.get_feature_keys();
+    typename T::key_type keys;
+    typename T::key_type::const_iterator key_pos;
+    typename T::feature_key_type::const_iterator feature_pos;
+    // start counting at utf8 codepoint 32, aka space character
+    uint16_t codepoint = 32;
+
+    // TODO - use double?
+    unsigned array_size = static_cast<unsigned int>(grid_type.width()/resolution);
+    for (unsigned y = 0; y < grid_type.height(); y=y+resolution)
+    {
+        uint16_t idx = 0;
+        boost::scoped_array<Py_UNICODE> line(new Py_UNICODE[array_size]);
+        mapnik::grid::value_type const* row = grid_type.getRow(y);
+        for (unsigned x = 0; x < grid_type.width(); x=x+resolution)
+        {
+            feature_pos = feature_keys.find(row[x]);
+            if (feature_pos != feature_keys.end())
+            {
+                mapnik::grid::lookup_type val = feature_pos->second;
+                key_pos = keys.find(val);
+                if (key_pos == keys.end())
+                {
+                    // Create a new entry for this key. Skip the codepoints that
+                    // can't be encoded directly in JSON.
+                    if (codepoint == 34) ++codepoint;      // Skip "
+                    else if (codepoint == 92) ++codepoint; // Skip backslash
+                    keys[val] = codepoint;
+                    key_order.push_back(val);
+                    line[idx++] = static_cast<Py_UNICODE>(codepoint);
+                    ++codepoint;
+                }
+                else
+                {
+                    line[idx++] = static_cast<Py_UNICODE>(key_pos->second);
+                }
+            }
+            // else, shouldn't get here...
+        }
+        l.append(boost::python::object(
+                    boost::python::handle<>(
+                        PyUnicode_FromUnicode(line.get(), array_size))));
+    }
+}
+
+
+template <typename T>
+static void grid2utf2(T const& grid_type, 
+    boost::python::list& l,
+    std::vector<typename T::lookup_type>& key_order,
+    unsigned int resolution)
+{
+    typename T::data_type const& data = grid_type.data();
+    typename T::feature_key_type const& feature_keys = grid_type.get_feature_keys();
+    typename T::key_type keys;
+    typename T::key_type::const_iterator key_pos;
+    typename T::feature_key_type::const_iterator feature_pos;
+    // start counting at utf8 codepoint 32, aka space character
+    uint16_t codepoint = 32;
+
+    mapnik::grid::data_type target(data.width()/resolution,data.height()/resolution);
+    mapnik::scale_grid(target,grid_type.data(),0.0,0.0);
+
+    unsigned array_size = target.width();
+    for (unsigned y = 0; y < target.height(); ++y)
+    {
+        uint16_t idx = 0;
+        boost::scoped_array<Py_UNICODE> line(new Py_UNICODE[array_size]);
+        mapnik::grid::value_type * row = target.getRow(y);
+        unsigned x;
+        for (x = 0; x < target.width(); ++x)
+        {
+            feature_pos = feature_keys.find(row[x]);
+            if (feature_pos != feature_keys.end())
+            {
+                mapnik::grid::lookup_type val = feature_pos->second;
+                key_pos = keys.find(val);
+                if (key_pos == keys.end())
+                {
+                    // Create a new entry for this key. Skip the codepoints that
+                    // can't be encoded directly in JSON.
+                    if (codepoint == 34) ++codepoint;      // Skip "
+                    else if (codepoint == 92) ++codepoint; // Skip backslash
+                    keys[val] = codepoint;
+                    key_order.push_back(val);
+                    line[idx++] = static_cast<Py_UNICODE>(codepoint);
+                    ++codepoint;
+                }
+                else
+                {
+                    line[idx++] = static_cast<Py_UNICODE>(key_pos->second);
+                }
+            }
+            // else, shouldn't get here...
+        }
+        l.append(boost::python::object(
+                    boost::python::handle<>(
+                        PyUnicode_FromUnicode(line.get(), array_size))));
+    }
+}
+
+
+template <typename T>
+static void write_features(T const& grid_type,
+    boost::python::dict& feature_data,
+    std::vector<typename T::lookup_type> const& key_order)
+{
+    std::string const& key = grid_type.get_key();
+    std::set<std::string> const& attributes = grid_type.property_names();
+    typename T::feature_type const& g_features = grid_type.get_grid_features();
+    typename T::feature_type::const_iterator feat_itr = g_features.begin();
+    typename T::feature_type::const_iterator feat_end = g_features.end();
+    bool include_key = (attributes.find(key) != attributes.end());
+    for (; feat_itr != feat_end; ++feat_itr)
+    {
+        std::map<std::string,mapnik::value> const& props = feat_itr->second;
+        std::map<std::string,mapnik::value>::const_iterator const& itr = props.find(key);
+        if (itr != props.end())
+        {
+            typename T::lookup_type const& join_value = itr->second.to_string();
+    
+            // only serialize features visible in the grid
+            if(std::find(key_order.begin(), key_order.end(), join_value) != key_order.end()) {
+                boost::python::dict feat;
+                std::map<std::string,mapnik::value>::const_iterator it = props.begin();
+                std::map<std::string,mapnik::value>::const_iterator end = props.end();
+                bool found = false;
+                for (; it != end; ++it)
+                {
+                    std::string const& key_name = it->first;
+                    if (key_name == key) {
+                        // drop key unless requested
+                        if (include_key) {
+                            found = true;
+                            feat[it->first] = boost::python::object(
+                                boost::python::handle<>(
+                                    boost::apply_visitor(
+                                        boost::python::value_converter(),
+                                            it->second.base())));
+                        }
+                    }
+                    else if ( (attributes.find(key_name) != attributes.end()) )
+                    {
+                        found = true;
+                        feat[it->first] = boost::python::object(
+                            boost::python::handle<>(
+                                boost::apply_visitor(
+                                    boost::python::value_converter(),
+                                        it->second.base())));
+                    }
+                }
+                if (found)
+                {
+                    feature_data[feat_itr->first] = feat;
+                }
+            }
+        }
+        else
+        {
+            std::clog << "should not get here: key '" << key << "' not found in grid feature properties\n";
+        }
+    }
+}
+
+template <typename T>
+static void grid_encode_utf(T const& grid_type,
+    boost::python::dict & json,
+    bool add_features,
+    unsigned int resolution)
+{
+    // convert buffer to utf and gather key order
+    boost::python::list l;
+    std::vector<typename T::lookup_type> key_order;
+    
+    if (resolution != 1) {
+        // resample on the fly - faster, less accurate
+        mapnik::grid2utf<T>(grid_type,l,key_order,resolution);
+
+        // resample first - slower, more accurate
+        //mapnik::grid2utf2<T>(grid_type,l,key_order,resolution);
+    }
+    else
+    {
+        mapnik::grid2utf<T>(grid_type,l,key_order);    
+    }
+
+    // convert key order to proper python list
+    boost::python::list keys_a;
+    BOOST_FOREACH ( typename T::lookup_type const& key_id, key_order )
+    {
+        keys_a.append(key_id);
+    }
+
+    // gather feature data
+    boost::python::dict feature_data;
+    if (add_features) {
+        mapnik::write_features<T>(grid_type,feature_data,key_order);
+    }
+
+    json["grid"] = l;
+    json["keys"] = keys_a;
+    json["data"] = feature_data;
+
+}
+
+template <typename T>
+static boost::python::dict grid_encode( T const& grid, std::string format, bool add_features, unsigned int resolution)
+{
+    if (format == "utf") {
+        boost::python::dict json;
+        grid_encode_utf<T>(grid,json,add_features,resolution);
+        return json;
+    }
+    else
+    {
+        std::stringstream s;
+        s << "'utf' is currently the only supported encoding format.";
+        throw mapnik::value_error(s.str());
+    }
+}
+
+/* new approach: key comes from grid object
+ * grid size should be same as the map
+ * encoding, resizing handled as method on grid object
+ * whether features are dumped is determined by argument not 'fields'
+ */
+static void render_layer_for_grid(const mapnik::Map& map,
+    mapnik::grid& grid,
+    unsigned layer_idx, // TODO - layer by name or index
+    boost::python::list const& fields)
+{
+    std::vector<mapnik::layer> const& layers = map.layers();
+    std::size_t layer_num = layers.size();
+    if (layer_idx >= layer_num) {
+        std::ostringstream s;
+        s << "Zero-based layer index '" << layer_idx << "' not valid, only '"
+          << layer_num << "' layers are in map\n";
+        throw std::runtime_error(s.str());
+    }
+
+    // convert python list to std::vector
+    boost::python::ssize_t num_fields = boost::python::len(fields);
+    for(boost::python::ssize_t i=0; i<num_fields; i++) {
+        boost::python::extract<std::string> name(fields[i]);
+        if (name.check()) {
+            grid.add_property_name(name());
+        }
+        else
+        {
+          std::stringstream s;
+          s << "list of field names must be strings";
+          throw mapnik::value_error(s.str());    
+        }
+    }
+
+    // copy property names
+    std::set<std::string> attributes = grid.property_names();
+    std::string const& key = grid.get_key();
+
+    // if key is special __id__ keyword
+    if (key == grid.id_name_) 
+    {
+        // TODO - should feature.id() be a first class attribute?
+        
+        // if __id__ is requested to be dumped out
+        // remove it so that datasource queries will not break
+        if (attributes.find(key) != attributes.end())
+        {
+            attributes.erase(key);
+        }
+    }
+    // if key is not the special __id__ keyword
+    else if (attributes.find(key) == attributes.end())
+    {
+        // them make sure the datasource query includes this field
+        attributes.insert(key);
+    }
+    
+    mapnik::grid_renderer<mapnik::grid> ren(map,grid,1.0,0,0);
+    mapnik::layer const& layer = layers[layer_idx];
+    ren.apply(layer,attributes);
+}
+
+/* old, original impl - to be removed after further testing
+ * grid object is created on the fly at potentially reduced size
+ */
+static boost::python::dict render_grid(const mapnik::Map& map,
+    unsigned layer_idx, // layer
+    std::string const& key, // key_name
+    unsigned int step, // resolution
+    boost::python::list const& fields)
+{
+
+    std::vector<mapnik::layer> const& layers = map.layers();
+    std::size_t layer_num = layers.size();
+    if (layer_idx >= layer_num) {
+        std::ostringstream s;
+        s << "Zero-based layer index '" << layer_idx << "' not valid, only '"
+          << layer_num << "' layers are in map\n";
+        throw std::runtime_error(s.str());
+    }
+
+    unsigned int grid_width = map.width()/step;
+    unsigned int grid_height = map.height()/step;
+
+    // TODO - no need to pass step here
+    mapnik::grid grid(grid_width,grid_height,key,step);
+    
+    // convert python list to std::vector
+    boost::python::ssize_t num_fields = boost::python::len(fields);
+    for(boost::python::ssize_t i=0; i<num_fields; i++) {
+        boost::python::extract<std::string> name(fields[i]);
+        if (name.check()) {
+            grid.add_property_name(name());
+        }
+        else
+        {
+          std::stringstream s;
+          s << "list of field names must be strings";
+          throw mapnik::value_error(s.str());    
+        }
+    }
+
+    // copy property names
+    std::set<std::string> attributes = grid.property_names();
+    
+    // if key is special __id__ keyword
+    if (key == grid.id_name_) 
+    {
+        // TODO - should feature.id() be a first class attribute?
+        
+        // if __id__ is requested to be dumped out
+        // remove it so that datasource queries will not break
+        if (attributes.find(key) != attributes.end())
+        {
+            attributes.erase(key);
+        }
+    }
+    // if key is not the special __id__ keyword
+    else if (attributes.find(key) == attributes.end())
+    {
+        // them make sure the datasource query includes this field
+        attributes.insert(key);
+    }
+    
+    try
+    {
+        mapnik::grid_renderer<mapnik::grid> ren(map,grid,1.0,0,0);
+        mapnik::layer const& layer = layers[layer_idx];
+        ren.apply(layer,attributes);
+    }
+    catch (...)
+    {
+        throw;
+    }
+    
+    bool add_features = false;
+    if (num_fields > 0)
+        add_features = true;
+    // build dictionary and return to python
+    boost::python::dict json;
+    grid_encode_utf(grid,json,add_features,1);
+    return json;
+}
+
+}
+
+#endif // MAPNIK_PYTHON_BINDING_GRID_UTILS_INCLUDED
diff --git a/bindings/python/python_optional.hpp b/bindings/python/python_optional.hpp
index 54ab4ff..b88acbb 100644
--- a/bindings/python/python_optional.hpp
+++ b/bindings/python/python_optional.hpp
@@ -29,74 +29,74 @@
 template <typename T, typename TfromPy>
 struct object_from_python
 {
-      object_from_python() {
-         boost::python::converter::registry::push_back
+    object_from_python() {
+        boost::python::converter::registry::push_back
             (&TfromPy::convertible, &TfromPy::construct,
              boost::python::type_id<T>());
-      }
+    }
 };
 
 template <typename T, typename TtoPy, typename TfromPy>
 struct register_python_conversion
 {
-      register_python_conversion() {
-         boost::python::to_python_converter<T, TtoPy>();
-         object_from_python<T, TfromPy>();
-      }
+    register_python_conversion() {
+        boost::python::to_python_converter<T, TtoPy>();
+        object_from_python<T, TfromPy>();
+    }
 };
 
 template <typename T>
 struct python_optional : public boost::noncopyable
 {
-      struct optional_to_python
-      {
-            static PyObject * convert(const boost::optional<T>& value)
-            {
-               return (value ? boost::python::to_python_value<T>()(*value) :
-                       boost::python::detail::none());
-            }
-      };
+    struct optional_to_python
+    {
+        static PyObject * convert(const boost::optional<T>& value)
+        {
+            return (value ? boost::python::to_python_value<T>()(*value) :
+                    boost::python::detail::none());
+        }
+    };
 
-      struct optional_from_python
-      {
-            static void * convertible(PyObject * source)
-            {
-               using namespace boost::python::converter;
+    struct optional_from_python
+    {
+        static void * convertible(PyObject * source)
+        {
+            using namespace boost::python::converter;
 
-               if (source == Py_None)
-                  return source;
+            if (source == Py_None)
+                return source;
 
-               const registration& converters(registered<T>::converters);
+            const registration& converters(registered<T>::converters);
 
-               if (implicit_rvalue_convertible_from_python(source,  
-                                                           converters)) {
-                  rvalue_from_python_stage1_data data =
-                     rvalue_from_python_stage1(source, converters);
-                  return rvalue_from_python_stage2(source, data, converters);
-               }
-               return NULL;
+            if (implicit_rvalue_convertible_from_python(source,  
+                                                        converters)) {
+                rvalue_from_python_stage1_data data =
+                    rvalue_from_python_stage1(source, converters);
+                return rvalue_from_python_stage2(source, data, converters);
             }
+            return NULL;
+        }
 
-            static void construct(PyObject * source,
-                                  boost::python::converter::rvalue_from_python_stage1_data * data)
-            {
-               using namespace boost::python::converter;
+        static void construct(PyObject * source,
+                              boost::python::converter::rvalue_from_python_stage1_data * data)
+        {
+            using namespace boost::python::converter;
 
-               void * const storage = ((rvalue_from_python_storage<T> *)  
-                                       data)->storage.bytes;
+            void * const storage = ((rvalue_from_python_storage<T> *)  
+                                    data)->storage.bytes;
 
-               if (data->convertible == source)	    // == None
-                  new (storage) boost::optional<T>(); // A Boost uninitialized value
-               else
-                  new (storage) boost::optional<T>(*static_cast<T *>(data->convertible));
+            if (data->convertible == source)        // == None
+                new (storage) boost::optional<T>(); // A Boost uninitialized value
+            else
+                new (storage) boost::optional<T>(*static_cast<T *>(data->convertible));
 
-               data->convertible = storage;
-            }
-      };
+            data->convertible = storage;
+        }
+    };
 
-      explicit python_optional() {
-         register_python_conversion<boost::optional<T>,
+    explicit python_optional() {
+        register_python_conversion<boost::optional<T>,
             optional_to_python, optional_from_python>();
-      }
+    }
 };
 
diff --git a/boost/property_tree/cmdline_parser.hpp b/boost/property_tree/cmdline_parser.hpp
deleted file mode 100644
index 5c6f453..0000000
--- a/boost/property_tree/cmdline_parser.hpp
+++ /dev/null
@@ -1,85 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_CMDLINE_PARSER_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_CMDLINE_PARSER_HPP_INCLUDED
-
-#include <boost/property_tree/ptree.hpp>
-#include <boost/property_tree/detail/ptree_utils.hpp>
-
-namespace boost { namespace property_tree { namespace cmdline_parser
-{
-
-    template<class Ptree>
-    void read_cmdline(int argc, 
-                      typename Ptree::char_type *argv[], 
-                      const std::basic_string<typename Ptree::char_type> &metachars,
-                      Ptree &pt)
-    {
-
-        typedef typename Ptree::char_type Ch;
-        typedef std::basic_string<Ch> Str;
-
-        Ptree local;
-        
-        // For all arguments
-        for (int i = 0; i < argc; ++i)
-        {
-            Str text = detail::trim<Ch>(argv[i]);
-            if (!text.empty())
-                if (metachars.find(text[0]) != Str::npos)
-                {
-                    if (text.size() == 1)
-                    {
-                        Ptree &child = local.put(text, Str());
-                        Str key; 
-                        if (child.size() < 10) 
-                            key.push_back(typename Ptree::char_type('0' + child.size()));
-                        child.push_back(std::make_pair(key, Ptree(child.data())));
-                    }
-                    else if (text.size() == 2)
-                    {
-                        Ptree &child = local.put(text.substr(1, 1), Str());
-                        Str key; 
-                        if (child.size() < 10) 
-                            key.push_back(typename Ptree::char_type('0' + child.size()));
-                        child.push_back(std::make_pair(key, Ptree(child.data())));
-                    }
-                    else
-                    {
-                        Ptree &child = local.put(text.substr(1, 1), detail::trim<Ch>(text.substr(2, Str::npos)));
-                        Str key; 
-                        if (child.size() < 10) 
-                            key.push_back(typename Ptree::char_type('0' + child.size()));
-                        child.push_back(std::make_pair(key, Ptree(child.data())));
-                    }
-                }
-                else
-                {
-                    Ptree &child = local.put(Str(), detail::trim<Ch>(text));
-                    Str key; 
-                    if (child.size() < 10) 
-                        key.push_back(typename Ptree::char_type('0' + child.size()));
-                    child.push_back(std::make_pair(key, Ptree(child.data())));
-                }
-        }
-
-        // Swap local and pt
-        pt.swap(local);
-
-    }
-
-} } }
-
-namespace boost { namespace property_tree
-{
-    using cmdline_parser::read_cmdline;
-} }
-
-#endif
diff --git a/boost/property_tree/detail/file_parser_error.hpp b/boost/property_tree/detail/file_parser_error.hpp
deleted file mode 100644
index d4378b3..0000000
--- a/boost/property_tree/detail/file_parser_error.hpp
+++ /dev/null
@@ -1,88 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_DETAIL_FILE_PARSER_ERROR_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_DETAIL_FILE_PARSER_ERROR_HPP_INCLUDED
-
-#include <boost/property_tree/ptree.hpp>
-#include <string>
-
-namespace boost { namespace property_tree
-{
-
-    //! File parse error
-    class file_parser_error: public ptree_error
-    {
-
-    public:
-
-        ///////////////////////////////////////////////////////////////////////
-        // Construction & destruction
-        
-        // Construct error
-        file_parser_error(const std::string &message, 
-                          const std::string &filename, 
-                          unsigned long line): 
-            ptree_error(format_what(message, filename, line)), 
-            m_message(message), m_filename(filename), m_line(line)
-        { 
-        }
-
-        ~file_parser_error() throw()    
-            // gcc 3.4.2 complains about lack of throw specifier on compiler generated dtor
-        {
-        }
-
-        ///////////////////////////////////////////////////////////////////////
-        // Data access
-        
-        // Get error message (without line and file - use what() to get full message)
-        std::string message()
-        {
-            return m_message;
-        }
-        
-        // Get error filename
-        std::string filename()
-        {
-            return m_filename;
-        }
-
-        // Get error line number
-        unsigned long line() 
-        { 
-            return m_line; 
-        }
-
-    private:
-        
-        std::string m_message;
-        std::string m_filename;
-        unsigned long m_line;
-
-        // Format error message to be returned by std::runtime_error::what()
-        std::string format_what(const std::string &message,
-                                const std::string &filename, 
-                                unsigned long line)
-        {
-            std::stringstream stream;
-            if (line > 0)
-                stream << (filename.empty() ? "<unspecified file>" : filename.c_str()) << 
-                          '(' << line << "): " << message;
-            else
-                stream << (filename.empty() ? "<unspecified file>" : filename.c_str()) << 
-                          ": " << message;
-            return stream.str();
-        }
-
-    };
-
-} }
-
-#endif
diff --git a/boost/property_tree/detail/info_parser_error.hpp b/boost/property_tree/detail/info_parser_error.hpp
deleted file mode 100644
index 112a7da..0000000
--- a/boost/property_tree/detail/info_parser_error.hpp
+++ /dev/null
@@ -1,32 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_DETAIL_INFO_PARSER_ERROR_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_DETAIL_INFO_PARSER_ERROR_HPP_INCLUDED
-
-#include <boost/property_tree/detail/file_parser_error.hpp>
-#include <string>
-
-namespace boost { namespace property_tree { namespace info_parser
-{
-
-    class info_parser_error: public file_parser_error
-    {
-    public:
-        info_parser_error(const std::string &message, 
-                          const std::string &filename, 
-                          unsigned long line): 
-            file_parser_error(message, filename, line)
-        { 
-        }
-    };
-
-} } }
-
-#endif
diff --git a/boost/property_tree/detail/info_parser_read.hpp b/boost/property_tree/detail/info_parser_read.hpp
deleted file mode 100644
index 290b9e2..0000000
--- a/boost/property_tree/detail/info_parser_read.hpp
+++ /dev/null
@@ -1,369 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_DETAIL_INFO_PARSER_READ_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_DETAIL_INFO_PARSER_READ_HPP_INCLUDED
-
-#include "boost/property_tree/ptree.hpp"
-#include "boost/property_tree/detail/info_parser_error.hpp"
-#include "boost/property_tree/detail/info_parser_utils.hpp"
-#include <iterator>
-#include <string>
-#include <stack>
-#include <fstream>
-#include <cctype>
-
-namespace boost { namespace property_tree { namespace info_parser
-{
-    
-    // Expand known escape sequences
-    template<class It>
-    std::basic_string<typename std::iterator_traits<It>::value_type> 
-        expand_escapes(It b, It e)
-    {
-        typedef typename std::iterator_traits<It>::value_type Ch;
-        std::basic_string<Ch> result;
-        while (b != e)
-        {
-            if (*b == Ch('\\'))
-            {
-                ++b;
-                if (b == e)
-                    throw info_parser_error("character expected after backslash", "", 0);
-                else if (*b == Ch('0')) result += Ch('\0');
-                else if (*b == Ch('a')) result += Ch('\a');
-                else if (*b == Ch('b')) result += Ch('\b');
-                else if (*b == Ch('f')) result += Ch('\f');
-                else if (*b == Ch('n')) result += Ch('\n');
-                else if (*b == Ch('r')) result += Ch('\r');
-                else if (*b == Ch('t')) result += Ch('\t');
-                else if (*b == Ch('v')) result += Ch('\v');
-                else if (*b == Ch('"')) result += Ch('"');
-                else if (*b == Ch('\'')) result += Ch('\'');
-                else if (*b == Ch('\\')) result += Ch('\\');
-                else
-                    throw info_parser_error("unknown escape sequence", "", 0);
-            }
-            else
-                result += *b;
-            ++b;
-        }
-        return result;
-    }
-    
-    // Advance pointer past whitespace
-    template<class Ch>
-    void skip_whitespace(const Ch *&text)
-    {
-        using namespace std;
-        while (isspace(*text))
-            ++text;
-    }
-    
-    // Extract word (whitespace delimited) and advance pointer accordingly
-    template<class Ch>
-    std::basic_string<Ch> read_word(const Ch *&text)
-    {
-        using namespace std;
-        skip_whitespace(text);
-        const Ch *start = text;
-        while (!isspace(*text) && *text != Ch(';') && *text != Ch('\0'))
-            ++text;
-        return expand_escapes(start, text);
-    }
-
-    // Extract line (eol delimited) and advance pointer accordingly
-    template<class Ch>
-    std::basic_string<Ch> read_line(const Ch *&text)
-    {
-        using namespace std;
-        skip_whitespace(text);
-        const Ch *start = text;
-        while (*text != Ch('\0') && *text != Ch(';'))
-            ++text;
-        while (text > start && isspace(*(text - 1)))
-            --text;
-        return expand_escapes(start, text);
-    }
-
-    // Extract string (inside ""), and advance pointer accordingly
-    // Set need_more_lines to true if \ continuator found
-    template<class Ch>
-    std::basic_string<Ch> read_string(const Ch *&text, bool *need_more_lines)
-    {
-        skip_whitespace(text);
-        if (*text == Ch('\"'))
-        {
-            
-            // Skip "
-            ++text;
-            
-            // Find end of string, but skip escaped "
-            bool escaped = false;
-            const Ch *start = text;
-            while ((escaped || *text != Ch('\"')) && *text != Ch('\0'))
-            {
-                escaped = (!escaped && *text == Ch('\\'));
-                ++text;
-            }
-            
-            // If end of string found
-            if (*text == Ch('\"'))
-            {
-                std::basic_string<Ch> result = expand_escapes(start, text++);
-                skip_whitespace(text);
-                if (*text == Ch('\\'))
-                {
-                    if (!need_more_lines)
-                        throw info_parser_error("unexpected \\", "", 0);
-                    ++text;
-                    skip_whitespace(text);
-                    if (*text == Ch('\0') || *text == Ch(';'))
-                        *need_more_lines = true;
-                    else
-                        throw info_parser_error("expected end of line after \\", "", 0);
-                }
-                else
-                    if (need_more_lines)
-                        *need_more_lines = false;
-                return result;
-            }
-            else
-                throw info_parser_error("unexpected end of line", "", 0);
-
-        }
-        else
-            throw info_parser_error("expected \"", "", 0);
-    }
-    
-    // Extract key
-    template<class Ch>
-    std::basic_string<Ch> read_key(const Ch *&text)
-    {
-        skip_whitespace(text);
-        if (*text == Ch('\"'))
-            return read_string(text, NULL);
-        else
-            return read_word(text);
-    }
-
-    // Extract data
-    template<class Ch>
-    std::basic_string<Ch> read_data(const Ch *&text, bool *need_more_lines)
-    {
-        skip_whitespace(text);
-        if (*text == Ch('\"'))
-            return read_string(text, need_more_lines);
-        else
-        {
-            *need_more_lines = false;
-            return read_word(text);
-        }
-    }
-
-    // Build ptree from info stream
-    template<class Ptree>
-    void read_info_internal(std::basic_istream<typename Ptree::char_type> &stream, 
-                            Ptree &pt, 
-                            const std::string &filename,
-                            int include_depth)
-    {
-        
-        // Character type
-        typedef typename Ptree::char_type Ch;
-        
-        // Possible parser states
-        enum state_t { 
-            s_key,              // Parser expects key
-            s_data,             // Parser expects data
-            s_data_cont         // Parser expects data continuation
-        };
-        
-        unsigned long line_no = 0;
-        state_t state = s_key;          // Parser state
-        Ptree *last = NULL;             // Pointer to last created ptree
-        std::basic_string<Ch> line;     // Define line here to minimize reallocations
-            
-        // Initialize ptree stack (used to handle nesting)
-        std::stack<Ptree *> stack;
-        stack.push(&pt);                // Push root ptree on stack initially
-        
-        try
-        {
-        
-            // While there are characters in the stream
-            while (stream.good())
-            {
-            
-                // Read one line from stream
-                ++line_no;
-                std::getline(stream, line);
-                if (!stream.good() && !stream.eof())
-                    throw info_parser_error("read error", "", 0);
-                const Ch *text = line.c_str();
-
-                // If directive found
-                skip_whitespace(text);
-                if (*text == Ch('#'))
-                {
-                    
-                    // Determine directive type
-                    ++text;     // skip #
-                    std::basic_string<Ch> directive = read_word(text);
-                    if (directive == convert_chtype<Ch, char>("include"))     // #include
-                    {
-                        if (include_depth > 100)
-                            throw info_parser_error("include depth too large, probably recursive include", "", 0);
-                        std::basic_string<Ch> s = read_string(text, NULL);
-                        std::string inc_name = convert_chtype<char, Ch>(s.c_str());
-                        std::basic_ifstream<Ch> inc_stream(inc_name.c_str());
-                        if (!inc_stream.good())
-                            throw info_parser_error("cannot open include file " + inc_name, "", 0);
-                        read_info_internal(inc_stream, *stack.top(), inc_name, include_depth + 1);
-                    }
-                    else    // Unknown directive
-                        throw info_parser_error("unknown directive", "", 0);
-
-                    // Directive must be followed by end of line
-                    skip_whitespace(text);
-                    if (*text != Ch('\0'))
-                        throw info_parser_error("expected end of line", "", 0);
-
-                    // Go to next line
-                    continue;
-
-                }
-
-                // While there are characters left in line
-                while (1)
-                {
-
-                    // Stop parsing on end of line or comment
-                    skip_whitespace(text);
-                    if (*text == Ch('\0') || *text == Ch(';'))
-                    {
-                        if (state == s_data)    // If there was no data set state to s_key
-                            state = s_key;
-                        break; 
-                    }
-
-                    // Process according to current parser state
-                    switch (state)
-                    {
-
-                        // Parser expects key
-                        case s_key:
-                        {
-
-                            if (*text == Ch('{'))   // Brace opening found
-                            {
-                                if (!last)
-                                    throw info_parser_error("unexpected {", "", 0);
-                                stack.push(last);
-                                last = NULL;
-                                ++text;
-                            }
-                            else if (*text == Ch('}'))  // Brace closing found
-                            {
-                                if (stack.size() <= 1)
-                                    throw info_parser_error("unmatched }", "", 0);
-                                stack.pop();
-                                last = NULL;
-                                ++text;
-                            }
-                            else    // Key text found
-                            {
-                                std::basic_string<Ch> key = read_key(text);
-                                last = &stack.top()->push_back(std::make_pair(key, Ptree()))->second;
-                                state = s_data;
-                            }
-
-                        }; break;
-
-                        // Parser expects data
-                        case s_data:
-                        {
-                            
-                            // Last ptree must be defined because we are going to add data to it
-                            BOOST_ASSERT(last);
-                            
-                            if (*text == Ch('{'))   // Brace opening found
-                            {
-                                stack.push(last);
-                                last = NULL;
-                                ++text;
-                                state = s_key;
-                            }
-                            else if (*text == Ch('}'))  // Brace closing found
-                            {
-                                if (stack.size() <= 1)
-                                    throw info_parser_error("unmatched }", "", 0);
-                                stack.pop();
-                                last = NULL;
-                                ++text;
-                                state = s_key;
-                            }
-                            else    // Data text found
-                            {
-                                bool need_more_lines;
-                                std::basic_string<Ch> data = read_data(text, &need_more_lines);
-                                last->data() = data;
-                                state = need_more_lines ? s_data_cont : s_key;
-                            }
-
-
-                        }; break;
-
-                        // Parser expects continuation of data after \ on previous line
-                        case s_data_cont:
-                        {
-                            
-                            // Last ptree must be defined because we are going to update its data
-                            BOOST_ASSERT(last);
-                            
-                            if (*text == Ch('\"'))  // Continuation must start with "
-                            {
-                                bool need_more_lines;
-                                std::basic_string<Ch> data = read_string(text, &need_more_lines);
-                                last->put_own(last->template get_own<std::basic_string<Ch> >() + data);
-                                state = need_more_lines ? s_data_cont : s_key;
-                            }
-                            else
-                                throw info_parser_error("expected \" after \\ in previous line", "", 0);
-
-                        }; break;
-
-                        // Should never happen
-                        default:
-                            BOOST_ASSERT(0);
-
-                    }
-                }
-            }
-
-            // Check if stack has initial size, otherwise some {'s have not been closed
-            if (stack.size() != 1)
-                throw info_parser_error("unmatched {", "", 0);
-
-        }
-        catch (info_parser_error &e)
-        {
-            // If line undefined rethrow error with correct filename and line
-            if (e.line() == 0)
-                throw info_parser_error(e.message(), filename, line_no);
-            else
-                throw e;
-
-        }
-
-    }
-    
-} } }
-
-#endif
diff --git a/boost/property_tree/detail/info_parser_utils.hpp b/boost/property_tree/detail/info_parser_utils.hpp
deleted file mode 100644
index 0fdef3c..0000000
--- a/boost/property_tree/detail/info_parser_utils.hpp
+++ /dev/null
@@ -1,32 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_DETAIL_INFO_PARSER_CHCONV_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_DETAIL_INFO_PARSER_CHCONV_HPP_INCLUDED
-
-#include <string>
-
-namespace boost { namespace property_tree { namespace info_parser
-{
-
-    template<class ChDest, class ChSrc>
-    std::basic_string<ChDest> convert_chtype(const ChSrc *text)
-    {
-        std::basic_string<ChDest> result;
-        while (*text)
-        {
-            result += ChDest(*text);
-            ++text;
-        }
-        return result;
-    }
-
-} } }
-
-#endif
diff --git a/boost/property_tree/detail/info_parser_write.hpp b/boost/property_tree/detail/info_parser_write.hpp
deleted file mode 100644
index 4e023c1..0000000
--- a/boost/property_tree/detail/info_parser_write.hpp
+++ /dev/null
@@ -1,131 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_DETAIL_INFO_PARSER_WRITE_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_DETAIL_INFO_PARSER_WRITE_HPP_INCLUDED
-
-#include "boost/property_tree/ptree.hpp"
-#include "boost/property_tree/detail/info_parser_utils.hpp"
-#include <string>
-
-namespace boost { namespace property_tree { namespace info_parser
-{
-    
-    // Create necessary escape sequences from illegal characters
-    template<class Ch>
-    std::basic_string<Ch> create_escapes(const std::basic_string<Ch> &s)
-    {
-        std::basic_string<Ch> result;
-        typename std::basic_string<Ch>::const_iterator b = s.begin();
-        typename std::basic_string<Ch>::const_iterator e = s.end();
-        while (b != e)
-        {
-            if (*b == Ch('\0')) result += Ch('\\'), result += Ch('0');
-            else if (*b == Ch('\a')) result += Ch('\\'), result += Ch('a');
-            else if (*b == Ch('\b')) result += Ch('\\'), result += Ch('b');
-            else if (*b == Ch('\f')) result += Ch('\\'), result += Ch('f');
-            else if (*b == Ch('\n')) result += Ch('\\'), result += Ch('n');
-            else if (*b == Ch('\r')) result += Ch('\\'), result += Ch('r');
-            else if (*b == Ch('\v')) result += Ch('\\'), result += Ch('v');
-            else if (*b == Ch('"')) result += Ch('\\'), result += Ch('"');
-            else if (*b == Ch('\\')) result += Ch('\\'), result += Ch('\\');
-            else
-                result += *b;
-            ++b;
-        }
-        return result;
-    }
-
-    template<class Ch>
-    bool is_simple_key(const std::basic_string<Ch> &key)
-    {
-        const static std::basic_string<Ch> chars = convert_chtype<Ch, char>(" \t{};\n\"");
-        return !key.empty() && key.find_first_of(chars) == key.npos;
-    }
-    
-    template<class Ch>
-    bool is_simple_data(const std::basic_string<Ch> &data)
-    {
-        const static std::basic_string<Ch> chars = convert_chtype<Ch, char>(" \t{};\n\"");
-        return !data.empty() && data.find_first_of(chars) == data.npos;
-    }
-
-    template<class Ptree>
-    void write_info_helper(std::basic_ostream<typename Ptree::char_type> &stream, 
-                           const Ptree &pt, 
-                           int indent)
-    {
-
-        // Character type
-        typedef typename Ptree::char_type Ch;
-        
-        // Write data
-        if (indent >= 0)
-        {
-            if (!pt.data().empty())
-            {
-                std::basic_string<Ch> data = create_escapes(pt.template get_own<std::basic_string<Ch> >());
-                if (is_simple_data(data))
-                    stream << Ch(' ') << data << Ch('\n');
-                else
-                    stream << Ch(' ') << Ch('\"') << data << Ch('\"') << Ch('\n');
-            }
-            else if (pt.empty())
-                stream << Ch(' ') << Ch('\"') << Ch('\"') << Ch('\n');
-            else
-                stream << Ch('\n');
-        }
-        
-        // Write keys
-        if (!pt.empty())
-        {
-            
-            // Open brace
-            if (indent >= 0) 
-                stream << std::basic_string<Ch>(4 * indent, Ch(' ')) << Ch('{') << Ch('\n');
-            
-            // Write keys
-            typename Ptree::const_iterator it = pt.begin();
-            for (; it != pt.end(); ++it)
-            {
-
-                // Output key
-                std::basic_string<Ch> key = create_escapes(it->first);
-                stream << std::basic_string<Ch>(4 * (indent + 1), Ch(' '));
-                if (is_simple_key(key))
-                    stream << key;
-                else
-                    stream << Ch('\"') << key << Ch('\"');
-
-                // Output data and children  
-                write_info_helper(stream, it->second, indent + 1);
-
-            }
-            
-            // Close brace
-            if (indent >= 0) 
-                stream << std::basic_string<Ch>(4 * indent, Ch(' ')) << Ch('}') << Ch('\n');
-
-        }
-    }
-
-    // Write ptree to info stream
-    template<class Ptree>
-    void write_info_internal(std::basic_ostream<typename Ptree::char_type> &stream, 
-                             const Ptree &pt,
-                             const std::string &filename)
-    {
-        write_info_helper(stream, pt, -1);
-        if (!stream.good())
-            throw info_parser_error("write error", filename, 0);
-    }
-
-} } }
-
-#endif
diff --git a/boost/property_tree/detail/json_parser_error.hpp b/boost/property_tree/detail/json_parser_error.hpp
deleted file mode 100644
index c3fb295..0000000
--- a/boost/property_tree/detail/json_parser_error.hpp
+++ /dev/null
@@ -1,33 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_DETAIL_JSON_PARSER_ERROR_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_DETAIL_JSON_PARSER_ERROR_HPP_INCLUDED
-
-#include <boost/property_tree/detail/file_parser_error.hpp>
-#include <string>
-
-namespace boost { namespace property_tree { namespace json_parser
-{
-
-    //! Json parser error
-    class json_parser_error: public file_parser_error
-    {
-    public:
-        json_parser_error(const std::string &message, 
-                          const std::string &filename, 
-                          unsigned long line): 
-            file_parser_error(message, filename, line)
-        { 
-        }
-    };
-
-} } }
-
-#endif
diff --git a/boost/property_tree/detail/json_parser_read.hpp b/boost/property_tree/detail/json_parser_read.hpp
deleted file mode 100644
index d72a790..0000000
--- a/boost/property_tree/detail/json_parser_read.hpp
+++ /dev/null
@@ -1,316 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_DETAIL_JSON_PARSER_READ_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_DETAIL_JSON_PARSER_READ_HPP_INCLUDED
-
-//#define BOOST_SPIRIT_DEBUG
-
-#include <boost/property_tree/ptree.hpp>
-#include <boost/property_tree/detail/ptree_utils.hpp>
-#include <boost/property_tree/detail/json_parser_error.hpp>
-#include <boost/spirit.hpp>
-#include <string>
-#include <locale>
-#include <istream>
-#include <vector>
-#include <algorithm>
-
-namespace boost { namespace property_tree { namespace json_parser
-{
-
-    ///////////////////////////////////////////////////////////////////////
-    // Json parser context
-        
-    template<class Ptree>
-    struct context
-    {
-
-        typedef typename Ptree::char_type Ch;
-        typedef std::basic_string<Ch> Str;
-        typedef typename std::vector<Ch>::iterator It;
-        
-        Str string;
-        Str name;
-        Ptree root;
-        std::vector<Ptree *> stack;
-
-        struct a_object_s
-        {
-            context &c;
-            a_object_s(context &c): c(c) { }
-            void operator()(Ch) const
-            {
-                if (c.stack.empty())
-                    c.stack.push_back(&c.root);
-                else
-                {
-                    Ptree *parent = c.stack.back();
-                    Ptree *child = &parent->push_back(std::make_pair(c.name, Ptree()))->second;
-                    c.stack.push_back(child);
-                    c.name.clear();
-                }
-            }
-        };
-        
-        struct a_object_e
-        {
-            context &c;
-            a_object_e(context &c): c(c) { }
-            void operator()(Ch) const
-            {
-                BOOST_ASSERT(c.stack.size() >= 1);
-                c.stack.pop_back();
-            }
-        };
-
-        struct a_name
-        {
-            context &c;
-            a_name(context &c): c(c) { }
-            void operator()(It, It) const
-            {
-                c.name.swap(c.string);
-                c.string.clear();
-            }
-        };
-
-        struct a_string_val
-        {
-            context &c;
-            a_string_val(context &c): c(c) { }
-            void operator()(It, It) const
-            {
-                BOOST_ASSERT(c.stack.size() >= 1);
-                c.stack.back()->push_back(std::make_pair(c.name, Ptree(c.string)));
-                c.name.clear();
-                c.string.clear();
-            }
-        };
-
-        struct a_literal_val
-        {
-            context &c;
-            a_literal_val(context &c): c(c) { }
-            void operator()(It b, It e) const
-            {
-                BOOST_ASSERT(c.stack.size() >= 1);
-                c.stack.back()->push_back(std::make_pair(c.name, Str(b, e)));
-                c.name.clear();
-                c.string.clear();
-            }
-        };
-
-        struct a_char
-        {
-            context &c;
-            a_char(context &c): c(c) { }
-            void operator()(It b, It e) const
-            {
-                c.string += *b;
-            }
-        };
-
-        struct a_escape
-        {
-            context &c;
-            a_escape(context &c): c(c) { }
-            void operator()(Ch ch) const
-            {
-                switch (ch)
-                {
-                    case Ch('\"'): c.string += Ch('\"'); break;
-                    case Ch('\\'): c.string += Ch('\\'); break;
-                    case Ch('0'): c.string += Ch('\0'); break;
-                    case Ch('b'): c.string += Ch('\b'); break;
-                    case Ch('f'): c.string += Ch('\f'); break;
-                    case Ch('n'): c.string += Ch('\n'); break;
-                    case Ch('r'): c.string += Ch('\r'); break;
-                    case Ch('t'): c.string += Ch('\t'); break;
-                    default: BOOST_ASSERT(0);
-                }
-            }
-        };
-
-        struct a_unicode
-        {
-            context &c;
-            a_unicode(context &c): c(c) { }
-            void operator()(unsigned long u) const
-            {
-                u = (std::min)(u, static_cast<unsigned long>((std::numeric_limits<Ch>::max)()));
-                c.string += Ch(u);
-            }
-        };
-
-    };
-
-    ///////////////////////////////////////////////////////////////////////
-    // Json grammar
-        
-    template<class Ptree>
-    struct json_grammar: public boost::spirit::grammar<json_grammar<Ptree> >
-    {
-        
-        typedef context<Ptree> Context;
-        typedef typename Ptree::char_type Ch;
-
-        mutable Context c;
-        
-        template<class Scanner>
-        struct definition
-        {
-            
-            boost::spirit::rule<Scanner> root, object, member, array, item, value, string, number;
-            boost::spirit::rule<typename boost::spirit::lexeme_scanner<Scanner>::type> character, escape;
-
-            definition(const json_grammar &self)
-            {
-                
-                using namespace boost::spirit;
-
-                // Assertions
-                assertion<std::string> expect_object("expected object");
-                assertion<std::string> expect_eoi("expected end of input");
-                assertion<std::string> expect_objclose("expected ',' or '}'");
-                assertion<std::string> expect_arrclose("expected ',' or ']'");
-                assertion<std::string> expect_name("expected object name");
-                assertion<std::string> expect_colon("expected ':'");
-                assertion<std::string> expect_value("expected value");
-                assertion<std::string> expect_escape("invalid escape sequence");
-
-                // JSON grammar rules
-                root 
-                    =   expect_object(object) 
-                        >> expect_eoi(end_p)
-                        ;
-                
-                object 
-                    =   ch_p('{')[typename Context::a_object_s(self.c)]
-                        >> (ch_p('}')[typename Context::a_object_e(self.c)] 
-                           | (list_p(member, ch_p(','))
-                              >> expect_objclose(ch_p('}')[typename Context::a_object_e(self.c)])
-                             )
-                           )
-                        ;
-                
-                member 
-                    =   expect_name(string[typename Context::a_name(self.c)]) 
-                        >> expect_colon(ch_p(':')) 
-                        >> expect_value(value)
-                        ;
-                
-                array 
-                    =   ch_p('[')[typename Context::a_object_s(self.c)]
-                        >> (ch_p(']')[typename Context::a_object_e(self.c)] 
-                            | (list_p(item, ch_p(','))
-                               >> expect_arrclose(ch_p(']')[typename Context::a_object_e(self.c)])
-                              )
-                           )
-                    ;
-
-                item 
-                    =   expect_value(value)
-                        ;
-
-                value 
-                    =   string[typename Context::a_string_val(self.c)] 
-                        | (number | str_p("true") | "false" | "null")[typename Context::a_literal_val(self.c)]
-                        | object 
-                        | array
-                        ;
-                
-                number 
-                    =   strict_real_p 
-                        | int_p
-                        ;
-                
-                string 
-                    =   +(lexeme_d[confix_p('\"', *character, '\"')])
-                        ;
-                
-                character 
-                    =   (anychar_p - "\\" - "\"")[typename Context::a_char(self.c)] 
-                        | ch_p("\\") >> expect_escape(escape)
-                        ;
-                
-                escape 
-                    =   chset_p(detail::widen<Ch>("\"\\0bfnrt").c_str())[typename Context::a_escape(self.c)] 
-                        | 'u' >> uint_parser<unsigned long, 16, 4, 4>()[typename Context::a_unicode(self.c)]
-                        ;
-                
-                // Debug
-                BOOST_SPIRIT_DEBUG_RULE(root);
-                BOOST_SPIRIT_DEBUG_RULE(object);
-                BOOST_SPIRIT_DEBUG_RULE(member);
-                BOOST_SPIRIT_DEBUG_RULE(array);
-                BOOST_SPIRIT_DEBUG_RULE(item);
-                BOOST_SPIRIT_DEBUG_RULE(value);
-                BOOST_SPIRIT_DEBUG_RULE(string);
-                BOOST_SPIRIT_DEBUG_RULE(number);
-                BOOST_SPIRIT_DEBUG_RULE(escape);
-                BOOST_SPIRIT_DEBUG_RULE(character);
-
-            }
-
-            const boost::spirit::rule<Scanner> &start() const
-            {
-                return root;
-            }
-
-        };
-
-    };
-
-    template<class It, class Ch>
-    unsigned long count_lines(It begin, It end)
-    {
-        return static_cast<unsigned long>(std::count(begin, end, Ch('\n')) + 1);
-    }
-
-    template<class Ptree>
-    void read_json_internal(std::basic_istream<typename Ptree::char_type> &stream,
-                            Ptree &pt,
-                            const std::string &filename)
-    {
-
-        using namespace boost::spirit;
-        typedef typename Ptree::char_type Ch;
-        typedef typename std::vector<Ch>::iterator It;
-
-        // Load data into vector
-        std::vector<Ch> v(std::istreambuf_iterator<Ch>(stream.rdbuf()),
-                          std::istreambuf_iterator<Ch>());
-        if (!stream.good())
-            throw json_parser_error("read error", filename, 0);
-        
-        // Prepare grammar
-        json_grammar<Ptree> g;
-
-        // Parse
-        try
-        {
-            parse_info<It> pi = parse(v.begin(), v.end(), g, 
-                                      space_p | comment_p("//") | comment_p("/*", "*/"));
-            if (!pi.hit || !pi.full)
-                throw parser_error<std::string, It>(v.begin(), "syntax error");
-        }
-        catch (parser_error<std::string, It> &e)
-        {
-            throw json_parser_error(e.descriptor, filename, count_lines<It, Ch>(v.begin(), e.where));
-        }
-
-        // Swap grammar context root and pt
-        pt.swap(g.c.root);
-
-    }
-
-} } }
-
-#endif
diff --git a/boost/property_tree/detail/json_parser_write.hpp b/boost/property_tree/detail/json_parser_write.hpp
deleted file mode 100644
index 2361a69..0000000
--- a/boost/property_tree/detail/json_parser_write.hpp
+++ /dev/null
@@ -1,163 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_DETAIL_JSON_PARSER_WRITE_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_DETAIL_JSON_PARSER_WRITE_HPP_INCLUDED
-
-#include <boost/property_tree/ptree.hpp>
-#include <string>
-#include <ostream>
-#include <iomanip>
-
-namespace boost { namespace property_tree { namespace json_parser
-{
-
-    // Create necessary escape sequences from illegal characters
-    template<class Ch>
-    std::basic_string<Ch> create_escapes(const std::basic_string<Ch> &s,
-                                         const std::locale &loc)
-    {
-        std::basic_string<Ch> result;
-        typename std::basic_string<Ch>::const_iterator b = s.begin();
-        typename std::basic_string<Ch>::const_iterator e = s.end();
-        while (b != e)
-        {
-            if (*b == Ch('\0')) result += Ch('\\'), result += Ch('0');
-            else if (*b == Ch('\b')) result += Ch('\\'), result += Ch('b');
-            else if (*b == Ch('\f')) result += Ch('\\'), result += Ch('f');
-            else if (*b == Ch('\n')) result += Ch('\\'), result += Ch('n');
-            else if (*b == Ch('\r')) result += Ch('\\'), result += Ch('r');
-            else if (*b == Ch('"')) result += Ch('\\'), result += Ch('"');
-            else if (*b == Ch('\\')) result += Ch('\\'), result += Ch('\\');
-            else
-            {
-                if (std::isprint(*b, loc))
-                    result += *b;
-                else
-                {   
-                    const char *hexdigits = "0123456789ABCDEF";
-                    unsigned long u = (std::min)(static_cast<unsigned long>(*b), 0xFFFFul);
-                    int d1 = u / 4096; u -= d1 * 4096;
-                    int d2 = u / 256; u -= d2 * 256;
-                    int d3 = u / 16; u -= d3 * 16;
-                    int d4 = u;
-                    result += Ch('\\'); result += Ch('u');
-                    result += Ch(hexdigits[d1]); result += Ch(hexdigits[d2]);
-                    result += Ch(hexdigits[d3]); result += Ch(hexdigits[d4]);
-                }
-            }
-            ++b;
-        }
-        return result;
-    }
-
-    template<class Ptree>
-    void write_json_helper(std::basic_ostream<typename Ptree::char_type> &stream, 
-                           const Ptree &pt, 
-                           int indent)
-    {
-
-        typedef typename Ptree::char_type Ch;
-        typedef typename std::basic_string<Ch> Str;
-        
-        // Value or object or array
-        if (indent > 0 && pt.empty())
-        {
-            
-            // Write value
-            Str data = create_escapes(pt.template get_own<Str>(), stream.getloc());
-            stream << Ch('"') << data << Ch('"');
-
-        }
-        else if (indent > 0 && pt.count(Str()) == pt.size())
-        {
-                
-            // Write array
-            stream << Ch('[') << Ch('\n');
-            typename Ptree::const_iterator it = pt.begin();
-            for (; it != pt.end(); ++it)
-            {
-                stream << Str(4 * (indent + 1), Ch(' '));
-                write_json_helper(stream, it->second, indent + 1);
-                if (boost::next(it) != pt.end())
-                    stream << Ch(',');
-                stream << Ch('\n');
-            }
-            stream << Str(4 * indent, Ch(' ')) << Ch(']');
-
-        }
-        else
-        {
-        
-            // Write object
-            stream << Ch('{') << Ch('\n');
-            typename Ptree::const_iterator it = pt.begin();
-            for (; it != pt.end(); ++it)
-            {
-                stream << Str(4 * (indent + 1), Ch(' '));
-                stream << Ch('"') << create_escapes(it->first, stream.getloc()) << Ch('"') << Ch(':');
-                if (it->second.empty())
-                    stream << Ch(' ');
-                else
-                    stream << Ch('\n') << Str(4 * (indent + 1), Ch(' '));
-                write_json_helper(stream, it->second, indent + 1);
-                if (boost::next(it) != pt.end())
-                    stream << Ch(',');
-                stream << Ch('\n');
-            }
-            stream << Str(4 * indent, Ch(' ')) << Ch('}');
-
-        }
-
-    }
-
-    // Verify if ptree does not contain information that cannot be written to json
-    template<class Ptree>
-    bool verify_json(const Ptree &pt, int depth)
-    {
-
-        typedef typename Ptree::char_type Ch;
-        typedef typename std::basic_string<Ch> Str;
-
-        // Root ptree cannot have data
-        if (depth == 0 && !pt.template get_own<Str>().empty())
-            return false;
-        
-        // Ptree cannot have both children and data
-        if (!pt.template get_own<Str>().empty() && !pt.empty())
-            return false;
-
-        // Check children
-        typename Ptree::const_iterator it = pt.begin();
-        for (; it != pt.end(); ++it)
-            if (!verify_json(it->second, depth + 1))
-                return false;
-
-        // Success
-        return true;
-
-    }
-    
-    // Write ptree to json stream
-    template<class Ptree>
-    void write_json_internal(std::basic_ostream<typename Ptree::char_type> &stream, 
-                             const Ptree &pt,
-                             const std::string &filename)
-    {
-        if (!verify_json(pt, 0))
-            throw json_parser_error("ptree contains data that cannot be represented in JSON format", filename, 0);
-        write_json_helper(stream, pt, 0);
-        stream << std::endl;
-        if (!stream.good())
-            throw json_parser_error("write error", filename, 0);
-    }
-
-} } }
-
-#endif
diff --git a/boost/property_tree/detail/ptree_implementation.hpp b/boost/property_tree/detail/ptree_implementation.hpp
deleted file mode 100644
index 590394b..0000000
--- a/boost/property_tree/detail/ptree_implementation.hpp
+++ /dev/null
@@ -1,1002 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_DETAIL_PTREE_IMPLEMENTATION_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_DETAIL_PTREE_IMPLEMENTATION_HPP_INCLUDED
-
-#include <sstream>
-#include <locale>
-#include <algorithm>
-#include <limits>
-#include <stdexcept>
-#include <functional>               // for std::less
-#include <memory>                   // for std::auto_ptr
-#include <typeinfo>
-#include <boost/assert.hpp>
-#include <boost/static_assert.hpp>
-#include <boost/type_traits.hpp>
-#include <boost/utility.hpp>        // for boost::prior
-#include <boost/property_tree/detail/ptree_utils.hpp>
-
-//////////////////////////////////////////////////////////////////////////////
-// Debug macros
-
-#ifdef BOOST_PROPERTY_TREE_DEBUG
-
-    // Increment instances counter
-    #define BOOST_PROPERTY_TREE_DEBUG_INCREMENT_INSTANCES_COUNT()       \
-        {                                                               \
-            typedef boost::detail::lightweight_mutex::scoped_lock lock; \
-            lock l(debug_mutex);                                        \
-            ++debug_instances_count;                                    \
-        }
-
-    // Decrement instances counter
-    #define BOOST_PROPERTY_TREE_DEBUG_DECREMENT_INSTANCES_COUNT()       \
-        {                                                               \
-            typedef boost::detail::lightweight_mutex::scoped_lock lock; \
-            lock l(debug_mutex);                                        \
-            BOOST_ASSERT(debug_instances_count > 0);                    \
-            --debug_instances_count;                                    \
-        }
-
-#else // BOOST_PROPERTY_TREE_DEBUG
-
-    #define BOOST_PROPERTY_TREE_DEBUG_INCREMENT_INSTANCES_COUNT() static_cast<void>(0)
-    #define BOOST_PROPERTY_TREE_DEBUG_DECREMENT_INSTANCES_COUNT() static_cast<void>(0)
-
-#endif // BOOST_PROPERTY_TREE_DEBUG
-
-namespace boost { namespace property_tree
-{
-
-    namespace detail
-    {
-        
-        template<class T>
-        struct array_to_pointer_decay
-        {
-            typedef T type;
-        };
-
-        template<class T, std::size_t N>
-        struct array_to_pointer_decay<T[N]>
-        {
-            typedef const T *type;
-        };
-
-        ////////////////////////////////////////////////////////////////////////////
-        // Extractor and inserter
-
-        template<class Ch, class Type>
-        struct extractor
-        {
-            inline bool operator()(const std::basic_string<Ch> &data, 
-                                   Type &extracted,
-                                   const std::locale &loc) const
-            {
-                std::basic_istringstream<Ch> stream(data);
-                stream.imbue(loc);
-                stream >> extracted >> std::ws;
-                return stream.eof() && !stream.fail() && !stream.bad();
-            }
-        };
-
-        template<class Ch>
-        struct extractor<Ch, std::basic_string<Ch> >
-        {
-            inline bool operator()(const std::basic_string<Ch> &data, 
-                                   std::basic_string<Ch> &extracted,
-                                   const std::locale &loc) const
-            {
-                extracted = data;
-                return true;
-            }
-        };
-
-        template<class Ch, class Type>
-        struct inserter
-        {
-            inline bool operator()(std::basic_string<Ch> &data, 
-                                   const Type &to_insert,
-                                   const std::locale &loc) const
-            {
-                typedef typename detail::array_to_pointer_decay<Type>::type Type2;
-                std::basic_ostringstream<Ch> stream;
-                stream.imbue(loc);
-                if (std::numeric_limits<Type2>::is_specialized)
-                    stream.precision(std::numeric_limits<Type2>::digits10 + 1);
-                stream << to_insert;
-                data = stream.str();
-                return !stream.fail() && !stream.bad();
-            }
-        };
-
-        template<class Ch>
-        struct inserter<Ch, std::basic_string<Ch> >
-        {
-            inline bool operator()(std::basic_string<Ch> &data, 
-                                   const std::basic_string<Ch> &to_insert,
-                                   const std::locale &loc) const
-            {
-                data = to_insert;
-                return true;
-            }
-        };
-
-    }
-
-    ///////////////////////////////////////////////////////////////////////////
-    // Impl
-
-    template<class Tr>
-    struct basic_ptree<Tr>::impl
-    {
-        data_type m_data;
-        container_type m_container;
-        index_type m_index;
-    };
-
-    ////////////////////////////////////////////////////////////////////////////
-    // Traits
-
-    template<class Ch>
-    struct ptree_traits
-    {
-        typedef Ch char_type;
-        typedef std::basic_string<Ch> key_type;
-        typedef std::basic_string<Ch> data_type;
-        template<class Type>
-        struct extractor: public detail::extractor<Ch, Type> { };
-        template<class Type>
-        struct inserter: public detail::inserter<Ch, Type> { };
-        inline bool operator()(const key_type &key1, 
-                               const key_type &key2) const
-        {
-            return key1 < key2;
-        }
-    };
-
-    template<class Ch>
-    struct iptree_traits
-    {
-        std::locale loc;
-        typedef Ch char_type;
-        typedef std::basic_string<Ch> key_type;
-        typedef std::basic_string<Ch> data_type;
-        template<class Type>
-        struct extractor: public detail::extractor<Ch, Type> { };
-        template<class Type>
-        struct inserter: public detail::inserter<Ch, Type> { };
-        inline bool operator()(Ch c1, Ch c2) const      // Helper for comparing characters
-        {
-            return std::toupper(c1, loc) < std::toupper(c2, loc);
-        }
-        inline bool operator()(const key_type &key1, 
-                               const key_type &key2) const
-        {
-            return std::lexicographical_compare(key1.begin(), key1.end(), key2.begin(), key2.end(), *this);
-        }
-    };
-
-    ///////////////////////////////////////////////////////////////////////////
-    // Exceptions
-
-    class ptree_error: public std::runtime_error
-    {
-    public:
-        ptree_error(const std::string &what): std::runtime_error(what) { }
-        ~ptree_error() throw() { }
-    };
-
-    class ptree_bad_data: public ptree_error
-    {
-    public:
-        ptree_bad_data(const std::string &what): ptree_error(what) { }
-        ~ptree_bad_data() throw() { }
-    };
-    
-    class ptree_bad_path: public ptree_error
-    {
-    public:
-        ptree_bad_path(const std::string &what): ptree_error(what) { }
-        ~ptree_bad_path() throw() { }
-    };
-
-    ///////////////////////////////////////////////////////////////////////////
-    // Construction & destruction
-
-    template<class Tr>
-    basic_ptree<Tr>::basic_ptree()
-    {
-        m_impl = new impl;
-        BOOST_PROPERTY_TREE_DEBUG_INCREMENT_INSTANCES_COUNT();
-    }
-
-    template<class Tr>
-    basic_ptree<Tr>::basic_ptree(const data_type &rhs)
-    {
-        std::auto_ptr<impl> tmp(new impl);
-        tmp->m_data = rhs;
-        m_impl = tmp.release();
-        BOOST_PROPERTY_TREE_DEBUG_INCREMENT_INSTANCES_COUNT();
-    }
-
-    template<class Tr>
-    basic_ptree<Tr>::basic_ptree(const basic_ptree<Tr> &rhs)
-    {
-        std::auto_ptr<impl> tmp(new impl);
-        tmp->m_data = rhs.data();
-        m_impl = tmp.get();
-        insert(end(), rhs.begin(), rhs.end());
-        tmp.release();
-        BOOST_PROPERTY_TREE_DEBUG_INCREMENT_INSTANCES_COUNT();
-    }
-
-    template<class Tr>
-    basic_ptree<Tr>::~basic_ptree()
-    {
-        BOOST_PROPERTY_TREE_DEBUG_DECREMENT_INSTANCES_COUNT();
-        delete m_impl;
-    }
-
-    ///////////////////////////////////////////////////////////////////////////
-    // Iterator access
-
-    template<class Tr>
-    typename basic_ptree<Tr>::iterator 
-        basic_ptree<Tr>::begin()
-    {
-        return m_impl->m_container.begin();
-    }
-
-    template<class Tr>
-    typename basic_ptree<Tr>::const_iterator 
-        basic_ptree<Tr>::begin() const
-    {
-        return m_impl->m_container.begin();
-    }
-
-    template<class Tr>
-    typename basic_ptree<Tr>::iterator 
-        basic_ptree<Tr>::end()
-    {
-        return m_impl->m_container.end();
-    }
-
-    template<class Tr>
-    typename basic_ptree<Tr>::const_iterator 
-        basic_ptree<Tr>::end() const
-    {
-        return m_impl->m_container.end();
-    }
-
-    template<class Tr>
-    typename basic_ptree<Tr>::reverse_iterator 
-        basic_ptree<Tr>::rbegin()
-    {
-        return m_impl->m_container.rbegin();
-    }
-
-    template<class Tr>
-    typename basic_ptree<Tr>::const_reverse_iterator 
-        basic_ptree<Tr>::rbegin() const
-    {
-        return m_impl->m_container.rbegin();
-    }
-
-    template<class Tr>
-    typename basic_ptree<Tr>::reverse_iterator 
-        basic_ptree<Tr>::rend()
-    {
-        return m_impl->m_container.rend();
-    }
-
-    template<class Tr>
-    typename basic_ptree<Tr>::const_reverse_iterator 
-        basic_ptree<Tr>::rend() const
-    {
-        return m_impl->m_container.rend();
-    }
-
-    ///////////////////////////////////////////////////////////////////////////
-    // Data access
-
-    template<class Tr>
-    typename basic_ptree<Tr>::size_type 
-        basic_ptree<Tr>::size() const
-    {
-        return m_impl->m_index.size();
-    }
-
-    template<class Tr>
-    bool basic_ptree<Tr>::empty() const
-    {
-        return m_impl->m_index.empty();
-    }
-
-    template<class Tr>
-    typename basic_ptree<Tr>::data_type &
-        basic_ptree<Tr>::data()
-    {
-        return m_impl->m_data;
-    }
-
-    template<class Tr>
-    const typename basic_ptree<Tr>::data_type &
-        basic_ptree<Tr>::data() const
-    {
-        return m_impl->m_data;
-    }
-
-    template<class Tr>
-    typename basic_ptree<Tr>::value_type &
-        basic_ptree<Tr>::front()
-    {
-        return m_impl->m_container.front();
-    }
-    
-    template<class Tr>
-    const typename basic_ptree<Tr>::value_type &
-        basic_ptree<Tr>::front() const
-    {
-        return m_impl->m_container.front();
-    }
-
-    template<class Tr>
-    typename basic_ptree<Tr>::value_type &
-        basic_ptree<Tr>::back()
-    {
-        return m_impl->m_container.back();
-    }
-
-    template<class Tr>
-    const typename basic_ptree<Tr>::value_type &
-        basic_ptree<Tr>::back() const
-    {
-        return m_impl->m_container.back();
-    }
-
-    ///////////////////////////////////////////////////////////////////////////
-    // Operators
-
-    template<class Tr>
-    basic_ptree<Tr> &
-        basic_ptree<Tr>::operator =(const basic_ptree<Tr> &rhs)
-    {
-        if (&rhs != this)
-        {
-            clear();
-            data() = rhs.data();
-            insert(end(), rhs.begin(), rhs.end());
-        }
-        return *this;
-    }
-
-    template<class Tr>
-    bool basic_ptree<Tr>::operator ==(const basic_ptree<Tr> &rhs) const
-    {
-        
-        // Data and sizes must be equal
-        if (size() != rhs.size() || data() != rhs.data())
-            return false;
-
-        // Keys and children must be equal
-        Tr tr;
-        const_iterator it = begin();
-        const_iterator it_rhs = rhs.begin();
-        const_iterator it_end = end();
-        for (; it != it_end; ++it, ++it_rhs)
-            if (tr(it->first, it_rhs->first) || 
-                tr(it_rhs->first, it->first) || 
-                it->second != it_rhs->second)
-                return false;
-
-        // Equal
-        return true;
-
-    }
-
-    template<class Tr>
-    bool basic_ptree<Tr>::operator !=(const basic_ptree<Tr> &rhs) const
-    {
-        return !operator ==(rhs);
-    }
-
-    ///////////////////////////////////////////////////////////////////////////
-    // Container operations
-
-    template<class Tr>
-    typename basic_ptree<Tr>::iterator 
-        basic_ptree<Tr>::find(const key_type &key)
-    {
-        typename index_type::iterator it = m_impl->m_index.find(key);
-        return it == m_impl->m_index.end() ? end() : it->second;
-    }
-
-    template<class Tr>
-    typename basic_ptree<Tr>::const_iterator 
-        basic_ptree<Tr>::find(const key_type &key) const
-    {
-        typename index_type::const_iterator it = m_impl->m_index.find(key);
-        return it == m_impl->m_index.end() ? end() : it->second;
-    }
-
-    template<class Tr>
-    typename basic_ptree<Tr>::size_type 
-        basic_ptree<Tr>::count(const key_type &key) const
-    {
-        return m_impl->m_index.count(key);
-    }
-
-    template<class Tr>
-    void basic_ptree<Tr>::clear()
-    {
-        m_impl->m_data = data_type();
-        m_impl->m_container.clear();
-        m_impl->m_index.clear();
-    }
-
-    template<class Tr>
-    typename basic_ptree<Tr>::iterator 
-    basic_ptree<Tr>::insert(iterator where, 
-                                const value_type &value)
-    {
-
-        // Insert new value into container. If that throws nothing needs to be rolled back
-        where = m_impl->m_container.insert(where, value);
-
-        // Update index. If that throws we need to rollback the insert
-        try {
-            m_impl->m_index.insert(typename index_type::value_type(where->first, where));
-        } 
-        catch (...) {
-            m_impl->m_container.erase(where);   // rollback the insert
-            throw;
-        }
-
-        return where;
-    }
-
-    template<class Tr>
-    template<class It>
-    void basic_ptree<Tr>::insert(iterator where, 
-                                     It first, 
-                                     It last)
-    {
-        for (; first != last; ++first, ++where)
-            where = insert(where, value_type(first->first, first->second));
-    }
-
-    template<class Tr>
-    typename basic_ptree<Tr>::iterator 
-        basic_ptree<Tr>::erase(iterator where)
-    {
-
-        // Remove from index
-        typename index_type::iterator lo = m_impl->m_index.lower_bound(where->first);
-        typename index_type::iterator hi = m_impl->m_index.upper_bound(where->first);
-        for (; lo != hi; ++lo)
-            if (lo->second == where)
-            {
-                m_impl->m_index.erase(lo);
-                break;
-            }
-        
-        // Remove from container    
-        return m_impl->m_container.erase(where);
-
-    }
-
-    template<class Tr>
-    typename basic_ptree<Tr>::size_type 
-        basic_ptree<Tr>::erase(const key_type &key)
-    {
-        size_type count = 0;
-        typename index_type::iterator lo = m_impl->m_index.lower_bound(key);
-        if (lo != m_impl->m_index.end())
-        {
-            typename index_type::iterator hi = m_impl->m_index.upper_bound(key);
-            while (lo != hi)
-            {
-                typename index_type::iterator it = lo++;
-                erase(it->second);
-                ++count;
-            }
-        }
-        return count;
-    }
-
-    template<class Tr>
-    template<class It> 
-    typename basic_ptree<Tr>::iterator 
-        basic_ptree<Tr>::erase(It first, 
-                                   It last)
-    {
-        while (first != last)
-            first = erase(first);
-        return first;
-    }
-
-    template<class Tr>
-    typename basic_ptree<Tr>::iterator
-        basic_ptree<Tr>::push_front(const value_type &value)
-    {
-        return insert(begin(), value);
-    }
-
-    template<class Tr>
-    typename basic_ptree<Tr>::iterator
-        basic_ptree<Tr>::push_back(const value_type &value)
-    {
-        return insert(end(), value);
-    }
-
-    template<class Tr>
-    void basic_ptree<Tr>::pop_front()
-    {
-        erase(begin());
-    }
-
-    template<class Tr>
-    void basic_ptree<Tr>::pop_back()
-    {
-        erase(boost::prior(end()));
-    }
-        
-    template<class Tr>
-    void basic_ptree<Tr>::swap(basic_ptree<Tr> &rhs)
-    {
-        std::swap(m_impl, rhs.m_impl);
-    }
-
-    template<class Tr>
-    void basic_ptree<Tr>::reverse()
-    {
-        m_impl->m_container.reverse();
-    }
-    
-    template<class Tr>
-    template<class SortTr> 
-    void basic_ptree<Tr>::sort(SortTr tr)
-    {
-        m_impl->m_container.sort(tr);
-    }
-
-    ///////////////////////////////////////////////////////////////////////////
-    // ptree operations
-
-    // Get child ptree with custom separator
-    template<class Tr>
-    basic_ptree<Tr> &
-        basic_ptree<Tr>::get_child(char_type separator, 
-                                       const key_type &path)
-    {
-        if (optional<basic_ptree<Tr> &> result = get_child_optional(separator, path))
-            return result.get();
-        else
-            throw ptree_bad_path("key \"" + detail::narrow(path.c_str()) + "\" does not exist");
-    }
-
-    // Get child ptree with custom separator
-    template<class Tr>
-    const basic_ptree<Tr> &
-        basic_ptree<Tr>::get_child(char_type separator, 
-                                       const key_type &path) const
-    {
-        basic_ptree<Tr> *nc_this = const_cast<basic_ptree<Tr> *>(this);
-        return nc_this->get_child(separator, path);
-    }
-
-    // Get child ptree with custom separator
-    template<class Tr>
-    basic_ptree<Tr> &
-        basic_ptree<Tr>::get_child(char_type separator, 
-                                       const key_type &path, 
-                                       basic_ptree<Tr> &default_value)
-    {
-        if (optional<basic_ptree<Tr> &> result = get_child_optional(separator, path))
-            return result.get();
-        else
-            return default_value;
-    }
-
-    // Get child ptree with custom separator
-    template<class Tr>
-    const basic_ptree<Tr> &
-        basic_ptree<Tr>::get_child(char_type separator, 
-                                       const key_type &path, 
-                                       const basic_ptree<Tr> &default_value) const
-    {
-        basic_ptree<Tr> *nc_this = const_cast<basic_ptree<Tr> *>(this);
-        basic_ptree<Tr> &nc_default_value = const_cast<basic_ptree<Tr> &>(default_value);
-        return nc_this->get_child(separator, path, nc_default_value);
-    }
-
-
-    // Get child ptree with custom separator
-    template<class Tr>
-    optional<basic_ptree<Tr> &> 
-        basic_ptree<Tr>::get_child_optional(char_type separator, 
-                                                const key_type &path)
-    {
-        typename key_type::size_type n = path.find(separator);
-        if (n != key_type::npos)
-        {
-            key_type head = path.substr(0, n);
-            key_type tail = path.substr(n + 1, key_type::npos);
-            iterator it = find(head);
-            if (it != end())
-                return it->second.get_child_optional(separator, tail);
-            else
-                return optional<basic_ptree<Tr> &>();
-        }
-        else
-        {
-            iterator it = find(path);
-            if (it != end())
-                return it->second;
-            else
-                return optional<basic_ptree<Tr> &>();
-        }
-    }
-
-    // Get child ptree with custom separator
-    template<class Tr>
-    optional<const basic_ptree<Tr> &> 
-        basic_ptree<Tr>::get_child_optional(char_type separator, const key_type &path) const
-    {
-        basic_ptree<Tr> *nc_this = const_cast<basic_ptree<Tr> *>(this);
-        optional<basic_ptree<Tr> &> tmp = nc_this->get_child_optional(separator, path);
-        if (tmp)
-            return optional<const basic_ptree<Tr> &>(tmp.get());
-        else
-            return optional<const basic_ptree<Tr> &>();
-    }
-
-    // Get child ptree with default separator
-    template<class Tr>
-    basic_ptree<Tr> &
-        basic_ptree<Tr>::get_child(const key_type &path)
-    {
-        return get_child(char_type('.'), path);
-    }
-
-    // Get child ptree with default separator
-    template<class Tr>
-    const basic_ptree<Tr> &
-        basic_ptree<Tr>::get_child(const key_type &path) const
-    {
-        return get_child(char_type('.'), path);
-    }
-
-    // Get child ptree with default separator
-    template<class Tr>
-    basic_ptree<Tr> &
-        basic_ptree<Tr>::get_child(const key_type &path, 
-                                       basic_ptree<Tr> &default_value)
-    {
-        return get_child(char_type('.'), path, default_value);
-    }
-    
-    // Get child ptree with default separator
-    template<class Tr>
-    const basic_ptree<Tr> &
-        basic_ptree<Tr>::get_child(const key_type &path, 
-                                       const basic_ptree<Tr> &default_value) const
-    {
-        return get_child(char_type('.'), path, default_value);
-    }
-    
-    // Get child ptree with default separator
-    template<class Tr>
-    optional<basic_ptree<Tr> &> 
-        basic_ptree<Tr>::get_child_optional(const key_type &path)
-    {
-        return get_child_optional(char_type('.'), path);
-    }
-
-    // Get child ptree with default separator
-    template<class Tr>
-    optional<const basic_ptree<Tr> &> 
-        basic_ptree<Tr>::get_child_optional(const key_type &path) const
-    {
-        return get_child_optional(char_type('.'), path);
-    }
-
-    // Put child ptree with custom separator
-    template<class Tr>
-    basic_ptree<Tr> &
-        basic_ptree<Tr>::put_child(char_type separator, 
-                                   const key_type &path, 
-                                   const basic_ptree<Tr> &value,
-                                   bool do_not_replace)
-    {
-        typename key_type::size_type n = path.find(separator);
-        if (n == key_type::npos)
-        {
-            if (do_not_replace)
-                return push_back(value_type(path, value))->second;
-            else
-            {
-                iterator it = find(path);
-                if (it == end())
-                    return push_back(value_type(path, value))->second;
-                else
-                {
-                    it->second = value;
-                    return it->second;
-                }
-            }
-        }
-        else
-        {
-            key_type head = path.substr(0, n);
-            key_type tail = path.substr(n + 1, key_type::npos);
-            iterator it = find(head);
-            if (it == end())
-                it = push_back(value_type(head, basic_ptree<Tr>()));
-            return it->second.put_child(separator, tail, value, do_not_replace);
-        }
-    }
-
-    // Put child ptree with default separator
-    template<class Tr>
-    basic_ptree<Tr> &
-        basic_ptree<Tr>::put_child(const key_type &path,
-                                   const basic_ptree<Tr> &value,
-                                   bool do_not_replace)
-    {
-        return put_child(char_type('.'), path, value, do_not_replace);
-    }
-
-    // Get value from data of ptree
-    template<class Tr>
-    template<class Type>
-    Type basic_ptree<Tr>::get_own(const std::locale &loc) const
-    {
-        if (optional<Type> result = get_own_optional<Type>(loc))
-            return result.get();
-        else
-            throw ptree_bad_data(std::string("conversion of data into type '") + 
-                                 typeid(Type).name() + "' failed");
-    }
-
-    // Get value from data of ptree
-    template<class Tr>
-    template<class Type>
-    Type basic_ptree<Tr>::get_own(const Type &default_value, 
-                                      const std::locale &loc) const
-    {
-        if (optional<Type> result = get_own_optional<Type>(loc))
-            return result.get();
-        else
-            return default_value;
-    }
-
-    // Get value from data of ptree
-    template<class Tr>
-    template<class CharType>
-    std::basic_string<CharType> 
-        basic_ptree<Tr>::get_own(const CharType *default_value, 
-                                     const std::locale &loc) const
-    {
-        BOOST_STATIC_ASSERT((boost::is_same<char_type, CharType>::value == true)); // Character types must match
-        return get_own(std::basic_string<CharType>(default_value), loc);
-    }
-
-    // Get value from data of ptree
-    template<class Tr>
-    template<class Type>
-    optional<Type> 
-        basic_ptree<Tr>::get_own_optional(const std::locale &loc) const
-    {
-        BOOST_STATIC_ASSERT(boost::is_pointer<Type>::value == false);   // Disallow pointer types, they are unsafe
-        Type tmp;
-        if (typename traits_type::template extractor<Type>()(m_impl->m_data, tmp, loc))
-        {
-            return optional<Type>(tmp);
-        }
-        else
-            return optional<Type>();
-    }
-
-    // Get value from data of child ptree (custom path separator)
-    template<class Tr>
-    template<class Type>
-    Type basic_ptree<Tr>::get(char_type separator,
-                                  const key_type &path,
-                                  const std::locale &loc) const
-    {
-        return get_child(separator, path).get_own<Type>(loc);
-    }
-
-    // Get value from data of child ptree (custom path separator)
-    template<class Tr>
-    template<class Type>
-    Type basic_ptree<Tr>::get(char_type separator,
-                                  const key_type &path, 
-                                  const Type &default_value, 
-                                  const std::locale &loc) const
-    {
-        if (optional<Type> result = get_optional<Type>(separator, path, loc))
-            return *result;
-        else
-            return default_value;
-    }
-
-    // Get value from data of child ptree (custom path separator)
-    template<class Tr>
-    template<class CharType>
-    std::basic_string<CharType> 
-        basic_ptree<Tr>::get(char_type separator,
-                                 const key_type &path, 
-                                 const CharType *default_value,
-                                 const std::locale &loc) const
-    {
-        BOOST_STATIC_ASSERT((boost::is_same<char_type, CharType>::value == true)); // Character types must match
-        return get(separator, path, std::basic_string<CharType>(default_value), loc);
-    }
-
-    // Get value from data of child ptree (custom path separator)
-    template<class Tr>
-    template<class Type>
-    optional<Type> 
-        basic_ptree<Tr>::get_optional(char_type separator,
-                                          const key_type &path, 
-                                          const std::locale &loc) const
-    {
-        if (optional<const basic_ptree<Tr> &> child = get_child_optional(separator, path))
-            return child.get().get_own_optional<Type>(loc);
-        else
-            return optional<Type>();
-    }
-
-    // Get value from data of child ptree (default path separator)
-    template<class Tr>
-    template<class Type>
-    Type basic_ptree<Tr>::get(const key_type &path,
-                                  const std::locale &loc) const
-    {
-        return get<Type>(char_type('.'), path, loc);
-    }
-
-    // Get value from data of child ptree (default path separator)
-    template<class Tr>
-    template<class Type>
-    Type basic_ptree<Tr>::get(const key_type &path, 
-                                  const Type &default_value,
-                                  const std::locale &loc) const
-    {
-        return get(char_type('.'), path, default_value, loc);
-    }
-
-    // Get value from data of child ptree (default path separator)
-    template<class Tr>
-    template<class CharType>
-    std::basic_string<CharType> 
-        basic_ptree<Tr>::get(const key_type &path, 
-                                 const CharType *default_value,
-                                 const std::locale &loc) const
-    {
-        return get(char_type('.'), path, default_value, loc);
-    }
-
-    // Get value from data of child ptree (default path separator)
-    template<class Tr>
-    template<class Type>
-    optional<Type> 
-        basic_ptree<Tr>::get_optional(const key_type &path, 
-                                          const std::locale &loc) const
-    {
-        return get_optional<Type>(char_type('.'), path, loc);
-    }
-
-    // Put value in data of ptree
-    template<class Tr>
-    template<class Type> 
-    void basic_ptree<Tr>::put_own(const Type &value, const std::locale &loc)
-    {
-        using namespace boost;
-        // Make sure that no pointer other than char_type * is allowed
-        BOOST_STATIC_ASSERT((is_pointer<Type>::value == false ||
-                             is_same<char_type, typename remove_const<typename remove_pointer<Type>::type>::type>::value == true));
-#ifdef __SUNPRO_CC
-	// For the Sun Studio compiler the declaration needs to be within a statement.
-	if (typename traits_type::template inserter<Type>()(m_impl->m_data, value, loc)){}
-#else
-        typename traits_type::template inserter<Type>()(m_impl->m_data, value, loc);
-#endif
-    }
-
-    // Put value in data of child ptree (custom path separator)
-    template<class Tr>
-    template<class Type> 
-    basic_ptree<Tr> &
-        basic_ptree<Tr>::put(char_type separator,
-                             const key_type &path, 
-                             const Type &value,
-                             bool do_not_replace,
-                             const std::locale &loc)
-    {
-        optional<basic_ptree<Tr> &> child;
-        if (!do_not_replace &&
-            (child = get_child_optional(separator, path)))
-        {
-            child.get().put_own(value, loc);
-            return *child;
-        }
-        else
-        {
-            basic_ptree<Tr> &child2 = put_child(separator, path, empty_ptree<basic_ptree<Tr> >(), do_not_replace);
-            child2.put_own(value, loc);
-            return child2;
-        }
-    }
-
-    // Put value in data of child ptree (default path separator)
-    template<class Tr>
-    template<class Type> 
-    basic_ptree<Tr> &
-        basic_ptree<Tr>::put(const key_type &path, 
-                             const Type &value,
-                             bool do_not_replace,
-                             const std::locale &loc)
-    {
-        return put(char_type('.'), path, value, do_not_replace, loc);
-    }
-
-    ////////////////////////////////////////////////////////////////////////////
-    // Debugging
-
-#ifdef BOOST_PROPERTY_TREE_DEBUG
-
-    template<class Tr>
-    typename basic_ptree<Tr>::size_type 
-        basic_ptree<Tr>::debug_get_instances_count() 
-    { 
-        empty_ptree<basic_ptree<Tr> >();    // Make sure empty ptree exists
-        return debug_instances_count - 1;       // Do not count empty ptree
-    }
-
-    template<class Tr>
-    typename basic_ptree<Tr>::size_type 
-        basic_ptree<Tr>::debug_instances_count;
-
-    template<class Tr>
-    boost::detail::lightweight_mutex 
-        basic_ptree<Tr>::debug_mutex;
-
-#endif
-
-    ///////////////////////////////////////////////////////////////////////////
-    // Free functions
-
-    template<class Ptree> 
-    inline const Ptree &empty_ptree()
-    {
-        static Ptree pt;
-        return pt;
-    }
-
-    template<class Tr>
-    inline void swap(basic_ptree<Tr> &pt1, basic_ptree<Tr> &pt2)
-    {
-        pt1.swap(pt2);
-    }
-
-} }
-
-// Undefine debug macros
-#ifdef BOOST_PROPERTY_TREE_DEBUG
-#   undef BOOST_PROPERTY_TREE_DEBUG_INCREMENT_INSTANCES_COUNT
-#   undef BOOST_PROPERTY_TREE_DEBUG_DECREMENT_INSTANCES_COUNT
-#endif
-
-#endif
diff --git a/boost/property_tree/detail/ptree_interface.hpp b/boost/property_tree/detail/ptree_interface.hpp
deleted file mode 100644
index 9630709..0000000
--- a/boost/property_tree/detail/ptree_interface.hpp
+++ /dev/null
@@ -1,198 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_DETAIL_PTREE_INTERFACE_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_DETAIL_PTREE_INTERFACE_HPP_INCLUDED
-
-#include <boost/config.hpp>
-#include <boost/optional.hpp>
-#include <string>
-#include <list>
-#include <map>
-#include <utility>          // For std::pair
-#include <locale>
-
-#include "boost/property_tree/ptree_fwd.hpp"
-
-#ifdef BOOST_PROPERTY_TREE_DEBUG
-#   include <boost/detail/lightweight_mutex.hpp>   // For syncing debug instances counter
-#endif
-
-namespace boost { namespace property_tree
-{
-
-    ///////////////////////////////////////////////////////////////////////////
-    // basic_ptree class template
-
-    template<class Tr>
-    class basic_ptree
-    {
-
-    public:
-
-        // Basic types
-        typedef Tr traits_type;
-        typedef typename traits_type::char_type char_type;
-        typedef typename traits_type::key_type key_type;
-        typedef typename traits_type::data_type data_type;
-        
-        // Container-related types
-        typedef std::pair<key_type, basic_ptree<Tr> > value_type;
-        typedef std::list<value_type> container_type;
-        typedef typename container_type::size_type size_type;
-        typedef typename container_type::iterator iterator;
-        typedef typename container_type::const_iterator const_iterator;
-        typedef typename container_type::reverse_iterator reverse_iterator;
-        typedef typename container_type::const_reverse_iterator const_reverse_iterator;
-        
-        ///////////////////////////////////////////////////////////////////////////
-        // Construction & destruction
-
-        basic_ptree();
-        explicit basic_ptree(const data_type &data);
-        basic_ptree(const basic_ptree<Tr> &rhs);
-        ~basic_ptree();
-
-        ///////////////////////////////////////////////////////////////////////////
-        // Iterator access
-
-        iterator begin();
-        const_iterator begin() const;
-        iterator end();
-        const_iterator end() const;
-        reverse_iterator rbegin();
-        const_reverse_iterator rbegin() const;
-        reverse_iterator rend();
-        const_reverse_iterator rend() const;
-        
-        ///////////////////////////////////////////////////////////////////////////
-        // Data access
-
-        size_type size() const;
-        bool empty() const;
-        
-        data_type &data();
-        const data_type &data() const;
-
-        value_type &front();
-        const value_type &front() const;
-        value_type &back();
-        const value_type &back() const;
-
-        ///////////////////////////////////////////////////////////////////////////
-        // Operators
-
-        basic_ptree<Tr> &operator =(const basic_ptree<Tr> &rhs);
-
-        bool operator ==(const basic_ptree<Tr> &rhs) const;
-        bool operator !=(const basic_ptree<Tr> &rhs) const;
-
-        ///////////////////////////////////////////////////////////////////////////
-        // Container operations
-
-        iterator find(const key_type &key);
-        const_iterator find(const key_type &key) const;
-
-        size_type count(const key_type &key) const;
-
-        void clear();
-
-        iterator insert(iterator where, const value_type &value);
-        template<class It> void insert(iterator where, It first, It last);
-
-        iterator erase(iterator where);
-        size_type erase(const key_type &key);
-        template<class It> iterator erase(It first, It last);
-
-        iterator push_front(const value_type &value);
-        iterator push_back(const value_type &value);
-
-        void pop_front();
-        void pop_back();
-
-        void swap(basic_ptree<Tr> &rhs);
-
-        void reverse();
-        template<class SortTr> void sort(SortTr tr);
-
-        ///////////////////////////////////////////////////////////////////////////
-        // ptree operations
-
-        // Get child ptree with custom separator
-        basic_ptree<Tr> &get_child(char_type separator, const key_type &path);
-        const basic_ptree<Tr> &get_child(char_type separator, const key_type &path) const;
-        basic_ptree<Tr> &get_child(char_type separator, const key_type &path, basic_ptree<Tr> &default_value);
-        const basic_ptree<Tr> &get_child(char_type separator, const key_type &path, const basic_ptree<Tr> &default_value) const;
-        optional<basic_ptree<Tr> &> get_child_optional(char_type separator, const key_type &path);
-        optional<const basic_ptree<Tr> &> get_child_optional(char_type separator, const key_type &path) const;
-
-        // Get child ptree with default separator
-        basic_ptree<Tr> &get_child(const key_type &path);
-        const basic_ptree<Tr> &get_child(const key_type &path) const;
-        basic_ptree<Tr> &get_child(const key_type &path, basic_ptree<Tr> &default_value);
-        const basic_ptree<Tr> &get_child(const key_type &path, const basic_ptree<Tr> &default_value) const;
-        optional<basic_ptree<Tr> &> get_child_optional(const key_type &path);
-        optional<const basic_ptree<Tr> &> get_child_optional(const key_type &path) const;
-
-        // Put child ptree with custom separator
-        basic_ptree<Tr> &put_child(char_type separator, const key_type &path, const basic_ptree<Tr> &value, bool do_not_replace = false);
-
-        // Put child ptree with default separator
-        basic_ptree<Tr> &put_child(const key_type &path, const basic_ptree<Tr> &value, bool do_not_replace = false);
-
-        // Get value from data of ptree
-        template<class Type> Type get_own(const std::locale &loc = std::locale()) const;
-        template<class Type> Type get_own(const Type &default_value, const std::locale &loc = std::locale()) const;
-        template<class CharType> std::basic_string<CharType> get_own(const CharType *default_value, const std::locale &loc = std::locale()) const;
-        template<class Type> optional<Type> get_own_optional(const std::locale &loc = std::locale()) const;
-
-        // Get value from data of child ptree (custom path separator)
-        template<class Type> Type get(char_type separator, const key_type &path, const std::locale &loc = std::locale()) const;
-        template<class Type> Type get(char_type separator, const key_type &path, const Type &default_value, const std::locale &loc = std::locale()) const;
-        template<class CharType> std::basic_string<CharType> get(char_type separator, const key_type &path, const CharType *default_value, const std::locale &loc = std::locale()) const;
-        template<class Type> optional<Type> get_optional(char_type separator, const key_type &path, const std::locale &loc = std::locale()) const;
-
-        // Get value from data of child ptree (default path separator)
-        template<class Type> Type get(const key_type &path, const std::locale &loc = std::locale()) const;
-        template<class Type> Type get(const key_type &path, const Type &default_value, const std::locale &loc = std::locale()) const;
-        template<class CharType> std::basic_string<CharType> get(const key_type &path, const CharType *default_value, const std::locale &loc = std::locale()) const;
-        template<class Type> optional<Type> get_optional(const key_type &path, const std::locale &loc = std::locale()) const;
-
-        // Put value in data of ptree
-        template<class Type> void put_own(const Type &value, const std::locale &loc = std::locale());
-
-        // Put value in data of child ptree (custom path separator)
-        template<class Type> basic_ptree<Tr> &put(char_type separator, const key_type &path, const Type &value, bool do_not_replace = false, const std::locale &loc = std::locale());
-
-        // Put value in data of child ptree (default path separator)
-        template<class Type> basic_ptree<Tr> &put(const key_type &path, const Type &value, bool do_not_replace = false, const std::locale &loc = std::locale());
-
-    private:
-
-        typedef std::multimap<key_type, iterator, Tr> index_type;
-        
-        struct impl;
-        impl *m_impl;
-
-        ////////////////////////////////////////////////////////////////////////////
-        // Debugging
-
-#ifdef BOOST_PROPERTY_TREE_DEBUG
-    private:
-        static boost::detail::lightweight_mutex debug_mutex;    // Mutex for syncing instances counter
-        static size_type debug_instances_count;                 // Total number of instances of this ptree class
-    public:
-        static size_type debug_get_instances_count();
-#endif
-
-    };
-
-} }
-
-#endif
diff --git a/boost/property_tree/detail/ptree_utils.hpp b/boost/property_tree/detail/ptree_utils.hpp
deleted file mode 100644
index e5e2bb6..0000000
--- a/boost/property_tree/detail/ptree_utils.hpp
+++ /dev/null
@@ -1,72 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_DETAIL_PTREE_UTILS_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_DETAIL_PTREE_UTILS_HPP_INCLUDED
-
-#include <boost/property_tree/ptree.hpp>
-#include <string>
-#include <locale>
-
-namespace boost { namespace property_tree { namespace detail
-{
-
-    // Naively convert narrow string to another character type
-    template<class Ch>
-    std::basic_string<Ch> widen(const char *text)
-    {
-        std::locale loc;
-        std::basic_string<Ch> result;
-        while (*text)
-        {
-            result += Ch(*text);
-            ++text;
-        }
-        return result;
-    }
-
-    // Naively convert string to narrow character type
-    template<class Ch>
-    std::string narrow(const Ch *text)
-    {
-        std::locale loc;
-        std::string result;
-        while (*text)
-        {
-            if (*text < 0 || *text > (std::numeric_limits<char>::max)())
-                result += '*';
-            else
-                result += char(*text);
-            ++text;
-        }
-        return result;
-    }
-
-    // Remove trailing and leading spaces
-    template<class Ch>
-    std::basic_string<Ch> trim(const std::basic_string<Ch> &s, 
-                               const std::locale &loc = std::locale())
-    {
-        typename std::basic_string<Ch>::const_iterator first = s.begin();
-        typename std::basic_string<Ch>::const_iterator end = s.end();
-        while (first != end && std::isspace(*first, loc)) 
-            ++first;
-        if (first == end)
-            return std::basic_string<Ch>();
-        typename std::basic_string<Ch>::const_iterator last = end;
-        do --last; while (std::isspace(*last, loc)); 
-        if (first != s.begin() || last + 1 != end)
-            return std::basic_string<Ch>(first, last + 1);
-        else
-            return s;
-    }
-
-} } }
-
-#endif
diff --git a/boost/property_tree/detail/xml_parser_error.hpp b/boost/property_tree/detail/xml_parser_error.hpp
deleted file mode 100644
index 4c7f498..0000000
--- a/boost/property_tree/detail/xml_parser_error.hpp
+++ /dev/null
@@ -1,33 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_DETAIL_XML_PARSER_ERROR_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_DETAIL_XML_PARSER_ERROR_HPP_INCLUDED
-
-#include <boost/property_tree/detail/file_parser_error.hpp>
-#include <string>
-
-namespace boost { namespace property_tree { namespace xml_parser
-{
-
-    //! Xml parser error
-    class xml_parser_error: public file_parser_error
-    {
-    public:
-        xml_parser_error(const std::string &message, 
-                         const std::string &filename, 
-                         unsigned long line): 
-            file_parser_error(message, filename, line)
-        { 
-        }
-    };
-
-} } }
-
-#endif
diff --git a/boost/property_tree/detail/xml_parser_flags.hpp b/boost/property_tree/detail/xml_parser_flags.hpp
deleted file mode 100644
index 75ef672..0000000
--- a/boost/property_tree/detail/xml_parser_flags.hpp
+++ /dev/null
@@ -1,26 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_DETAIL_XML_PARSER_FLAGS_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_DETAIL_XML_PARSER_FLAGS_HPP_INCLUDED
-
-namespace boost { namespace property_tree { namespace xml_parser
-{
-    
-    static const int no_concat_text = 1;     // Text elements should be put in separate keys, not concatenated in parent data
-    static const int no_comments = 2;        // Comments should be omitted
-
-    inline bool validate_flags(int flags)
-    {
-        return (flags & ~(no_concat_text | no_comments)) == 0;
-    }
-
-} } }
-
-#endif
diff --git a/boost/property_tree/detail/xml_parser_read_spirit.hpp b/boost/property_tree/detail/xml_parser_read_spirit.hpp
deleted file mode 100644
index 0fd593c..0000000
--- a/boost/property_tree/detail/xml_parser_read_spirit.hpp
+++ /dev/null
@@ -1,737 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Based on XML grammar by Daniel C. Nuffer 
-// http://spirit.sourceforge.net/repository/applications/xml.zip
-// 
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_DETAIL_XML_PARSER_READ_SPIRIT_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_DETAIL_XML_PARSER_READ_SPIRIT_HPP_INCLUDED
-
-//#define BOOST_SPIRIT_DEBUG
-#include <boost/version.hpp>
-#include <boost/property_tree/ptree.hpp>
-#include <boost/property_tree/detail/xml_parser_error.hpp>
-#include <boost/property_tree/detail/xml_parser_flags.hpp>
-#include <boost/property_tree/detail/xml_parser_utils.hpp>
-
-#if BOOST_VERSION < 103800
-#include <boost/spirit.hpp>
-#include <boost/spirit/iterator/position_iterator.hpp>
-#else
-#define BOOST_SPIRIT_USE_OLD_NAMESPACE
-#include <boost/spirit/include/classic.hpp>
-#include <boost/spirit/include/classic_position_iterator.hpp>
-#endif
-
-#include <string>
-#include <locale>
-#include <istream>
-#include <vector>
-
-namespace boost { namespace property_tree { namespace xml_parser
-{
-
-    // XML parser context
-    template<class Ptree>
-    struct context
-    {
-        
-        typedef typename Ptree::char_type Ch;
-        typedef std::basic_string<Ch> Str;
-        typedef boost::spirit::position_iterator<typename std::vector<Ch>::const_iterator> It;
-
-        int flags;
-        std::vector<Ptree *> stack;
-
-        ///////////////////////////////////////////////////////////////////////
-        // Actions
-        
-        struct a_key_s
-        {
-            context &c;
-            a_key_s(context &c): c(c) { }
-            void operator()(It b, It e) const
-            {
-                if (c.stack.empty())
-                    throw xml_parser_error("xml parse error", 
-                                           b.get_position().file, 
-                                           b.get_position().line);
-                Str name(b, e);
-                Ptree *child = &c.stack.back()->push_back(std::make_pair(name, Ptree()))->second;
-                c.stack.push_back(child);
-            }
-        };
-
-        struct a_key_e
-        {
-            context &c;
-            a_key_e(context &c): c(c) { }
-            void operator()(It b, It e) const
-            {
-                if (c.stack.size() <= 1)
-                    throw xml_parser_error("xml parse error", 
-                                           b.get_position().file, 
-                                           b.get_position().line);
-                c.stack.pop_back();
-            }
-        };
-
-        struct a_content
-        {
-            context &c;
-            a_content(context &c): c(c) { }
-            void operator()(It b, It e) const
-            {
-                Str s = decode_char_entities(detail::trim(condense(Str(b, e))));
-                if (!s.empty())
-                {
-                    if (c.flags & no_concat_text)
-                        c.stack.back()->push_back(std::make_pair(xmltext<Ch>(), Ptree(s)));
-                    else
-                        c.stack.back()->put_own(c.stack.back()->template get_own<std::basic_string<Ch> >() + s);
-                }
-            }
-        };
-
-        struct a_attr_key
-        {
-            context &c;
-            a_attr_key(context &c): c(c) { }
-            void operator()(It b, It e) const
-            {
-                c.stack.back()->put_child(Ch('/'), xmlattr<Ch>() + Ch('/') + Str(b, e), empty_ptree<Ptree>());
-            }
-        };
-
-        struct a_attr_data
-        {
-            context &c;
-            a_attr_data(context &c): c(c) { }
-            void operator()(It b, It e) const
-            {
-                Ptree &attr = c.stack.back()->get_child(xmlattr<Ch>());
-                attr.back().second.put_own(Str(b.base() + 1, e.base() - 1));
-            }
-        };
-
-        struct a_comment
-        {
-            context &c;
-            a_comment(context &c): c(c) { }
-            void operator()(It b, It e) const
-            {
-                c.stack.back()->push_back(std::make_pair(xmlcomment<Ch>(), Ptree(Str(b, e))));
-            }
-        };
-
-    };
-
-    ///////////////////////////////////////////////////////////////////////
-    // Grammar
-        
-    template<class Ptree>
-    struct xml_grammar: public boost::spirit::grammar<xml_grammar<Ptree> >
-    {
-        
-        typedef context<Ptree> context_t;
-        
-        mutable context_t c;
-        
-        template<class ScannerT>
-        struct definition
-        {
-            
-            typedef typename ScannerT::value_t char_t;
-            typedef boost::spirit::chset<char_t> chset_t;
-
-            boost::spirit::rule<ScannerT>
-                prolog, element, Misc, PEReference, Reference, PITarget, CData,
-                doctypedecl, XMLDecl, SDDecl, VersionInfo, EncodingDecl, VersionNum,
-                Eq, DeclSep, ExternalID, markupdecl, NotationDecl, EntityDecl,
-                AttlistDecl, elementdecl, TextDecl, extSubsetDecl, conditionalSect,
-                EmptyElemTag, STag, content, ETag, Attribute, contentspec, Mixed,
-                children, choice, seq, cp, AttDef, AttType, DefaultDecl, StringType,
-                TokenizedType, EnumeratedType, NotationType, Enumeration, EntityValue,
-                AttValue, SystemLiteral, PubidLiteral, CharDataChar, CharData, Comment,
-                PI, CDSect, extSubset, includeSect, ignoreSect, ignoreSectContents,
-                Ignore, CharRef, EntityRef, GEDecl, PEDecl, EntityDef, PEDef,
-                NDataDecl, extParsedEnt, EncName, PublicID, document, S, Name, Names,
-                Nmtoken, Nmtokens, STagB, STagE1, STagE2;
-
-            definition(const xml_grammar &self)
-            {
-                
-                using namespace boost::spirit;
-                
-                // XML Char sets
-                chset_t Char("\x9\xA\xD\x20-\x7F");
-                chset_t Sch("\x20\x9\xD\xA");
-                chset_t Letter("\x41-\x5A\x61-\x7A");
-                chset_t Digit("0-9");
-                chset_t XDigit("0-9A-Fa-f");
-                chset_t Extender("\xB7");
-                chset_t NameChar =
-                    Letter 
-                    | Digit 
-                    | (char_t)'.'
-                    | (char_t)'-'
-                    | (char_t)'_'
-                    | (char_t)':'
-                    | Extender;
-
-                document =
-                    prolog >> element >> *Misc
-                ;
-
-                S = 
-                    +(Sch)
-                ;
-
-                Name =
-                    (Letter | '_' | ':') 
-                    >> *(NameChar)
-                ;
-
-                Names =
-                    Name >> *(S >> Name)
-                ;
-
-                Nmtoken =
-                    +NameChar
-                ;
-
-                Nmtokens =
-                    Nmtoken >> *(S >> Nmtoken)
-                ;
-
-                EntityValue =
-                    '"'  >> *(  (anychar_p - (chset_t(detail::widen<char_t>("%&\"").c_str()))) 
-                                | PEReference
-                                | Reference) 
-                        >> '"'
-                    | '\'' >> *(  (anychar_p - (chset_t("%&'"))) 
-                                | PEReference
-                                | Reference) 
-                            >> '\''
-                ;
-
-                AttValue = 
-                    '"' >> *(  (anychar_p - (chset_t("<&\""))) 
-                                | Reference) 
-                        >> '"'
-                    | '\'' >> *(  (anychar_p - (chset_t("<&'"))) 
-                                | Reference) 
-                            >> '\''
-                ;
-
-                SystemLiteral= 
-                    ('"' >> *(anychar_p - '"') >> '"')
-                    | ('\'' >> *(anychar_p - '\'') >> '\'')
-                ;
-
-                chset_t PubidChar("\x20\xD\xA'a-zA-Z0-9()+,./:=?;!*#@$_%-");
-
-                PubidLiteral = 
-                    '"' >> *PubidChar >> '"' 
-                    | '\'' >> *(PubidChar - '\'') >> '\''
-                ;
-
-                CharDataChar = 
-                    //anychar_p - (chset_t("<&"))
-                    anychar_p - (chset_t("<"))
-                ;
-
-                CharData =
-                    *(CharDataChar - "]]>")
-                ;
-
-                Comment = 
-                    "<!--" >> 
-                    (
-                        *(
-                            (Char - '-')
-                            | ('-' >> (Char - '-'))
-                        )
-                    )[typename context_t::a_comment(self.c)] 
-                    >> "-->"
-                ;
-
-                PI = 
-                    "<?" >> PITarget >> !(S >> (*(Char - "?>"))) >> "?>"
-                ;
-
-                PITarget =
-                    Name - (as_lower_d["xml"])
-                ;
-
-                CDSect =
-                    "<![CDATA[" >> CData >> "]]>"
-                ;
-
-                CData =
-                    *(Char - "]]>")
-                ;
-
-                prolog =
-                    !XMLDecl >> *Misc >> !(doctypedecl >> *Misc)
-                ;
-
-                XMLDecl =
-                    "<?xml" >> VersionInfo >> !EncodingDecl >> !SDDecl 
-                    >> !S >> "?>"
-                ;
-
-                VersionInfo = 
-                    S >> "version" >> Eq >> 
-                    (
-                    '\'' >> VersionNum >> '\''
-                    | '"' >> VersionNum >> '"'
-                    )
-                ;
-
-                Eq =
-                    !S >> '=' >> !S
-                ;
-
-                chset_t VersionNumCh("a-zA-Z0-9_.:-");
-
-                VersionNum =
-                    +(VersionNumCh)
-                ;
-
-                Misc =
-                    Comment 
-                    | PI 
-                    | S
-                ;
-
-                doctypedecl =
-                    "<!DOCTYPE" >> S >> Name >> !(S >> ExternalID) >> !S >> 
-                    !(
-                    '[' >> *(markupdecl | DeclSep) >> ']' >> !S
-                    ) 
-                    >> '>'
-                ;
-
-                DeclSep =
-                    PEReference 
-                    | S
-                ;
-
-                markupdecl =
-                    elementdecl 
-                    | AttlistDecl 
-                    | EntityDecl 
-                    | NotationDecl 
-                    | PI 
-                    | Comment
-                ;
-
-                extSubset =
-                    !TextDecl >> extSubsetDecl
-                ;
-
-                extSubsetDecl =
-                    *(
-                        markupdecl 
-                    | conditionalSect 
-                    | DeclSep
-                    )
-                ;
-
-                SDDecl = 
-                    S >> "standalone" >> Eq >> 
-                    (
-                    ('\'' >> (str_p("yes") | "no") >> '\'')
-                    | ('"' >> (str_p("yes") | "no") >> '"')
-                    )
-                ;
-
-                /*
-                element =
-                    EmptyElemTag
-                    | STag >> content >> ETag
-                ;
-                */
-                element =
-                    STagB >> (STagE2 | (STagE1 >> content >> ETag))[typename context_t::a_key_e(self.c)]
-                ;
-
-                STag =
-                    '<' >> Name >> *(S >> Attribute) >> !S >> '>'
-                ;
-
-                STagB =
-                    '<'
-                    >> Name[typename context_t::a_key_s(self.c)]
-                    >> *(S >> Attribute)
-                    >> !S
-                ;
-
-                STagE1 = 
-                    ch_p(">")
-                ;
-
-                STagE2 = 
-                    str_p("/>")
-                ;
-
-                Attribute =
-                    Name[typename context_t::a_attr_key(self.c)]
-                    >> Eq
-                    >> AttValue[typename context_t::a_attr_data(self.c)]
-                ;
-
-                ETag =
-                    "</" >> Name >> !S >> '>'
-                ;
-
-                content =
-                   !(CharData[typename context_t::a_content(self.c)]) >> 
-                   *(
-                     (
-                          element 
-                        // | Reference
-                        | CDSect 
-                        | PI 
-                        | Comment
-                     ) >> 
-                     !(CharData[typename context_t::a_content(self.c)])
-                    )
-                ;
-
-                EmptyElemTag =
-                    '<' >> Name >> *(S >> Attribute) >> !S >> "/>"
-                ;
-
-                elementdecl = 
-                    "<!ELEMENT" >> S >> Name >> S >> contentspec >> !S >> '>'
-                ;
-
-                contentspec = 
-                    str_p("EMPTY") 
-                    | "ANY" 
-                    | Mixed 
-                    | children
-                ;
-
-                children =
-                    (choice | seq) >> !(ch_p('?') | '*' | '+')
-                ;
-
-                cp = 
-                    (Name | choice | seq) >> !(ch_p('?') | '*' | '+')
-                ;
-
-                choice = 
-                    '(' >> !S >> cp 
-                    >> +(!S >> '|' >> !S >> cp) 
-                    >> !S >> ')'
-                ;
-
-                seq =
-                    '(' >> !S >> cp >> 
-                    *(!S >> ',' >> !S >> cp) 
-                    >> !S >> ')'
-                ;
-
-                Mixed =
-                    '(' >> !S >> "#PCDATA" 
-                        >> *(!S >> '|' >> !S >> Name) 
-                        >> !S >> ")*"
-                    | '(' >> !S >> "#PCDATA" >> !S >> ')'
-                ;
-
-                AttlistDecl =
-                    "<!ATTLIST" >> S >> Name >> *AttDef >> !S >> '>'
-                ;
-
-                AttDef =
-                    S >> Name >> S >> AttType >> S >> DefaultDecl
-                ;
-
-                AttType =
-                    StringType 
-                    | TokenizedType 
-                    | EnumeratedType
-                ;
-
-                StringType =
-                    str_p("CDATA")
-                ;
-
-                TokenizedType =
-                    longest_d[ 
-                        str_p("ID") 
-                        | "IDREF" 
-                        | "IDREFS" 
-                        | "ENTITY" 
-                        | "ENTITIES" 
-                        | "NMTOKEN"
-                        | "NMTOKENS" 
-                    ]
-                ;
-
-                EnumeratedType =
-                    NotationType 
-                    | Enumeration
-                ;
-
-                NotationType =
-                    "NOTATION" >> S >> '(' >> !S >> Name 
-                    >> *(!S >> '|' >> !S >> Name) 
-                    >> !S >> ')'
-                ;
-
-                Enumeration = 
-                    '(' >> !S >> Nmtoken 
-                    >> *(!S >> '|' >> !S >> Nmtoken) 
-                    >> !S >> ')'
-                ;
-
-                DefaultDecl =
-                    str_p("#REQUIRED") 
-                    | "#IMPLIED" 
-                    | !("#FIXED" >> S) >> AttValue
-                ;
-
-                conditionalSect =
-                    includeSect 
-                    | ignoreSect
-                ;
-
-                includeSect =
-                    "<![" >> !S >> "INCLUDE" >> !S 
-                    >> '[' >> extSubsetDecl >> "]]>"
-                ;
-
-                ignoreSect = 
-                    "<![" >> !S >> "IGNORE"  >> !S 
-                    >> '[' >> *ignoreSectContents >> "]]>"
-                ;
-
-                ignoreSectContents = 
-                    Ignore >> *("<![" >> ignoreSectContents >> "]]>" >> Ignore)
-                ;
-
-                Ignore = 
-                    *(Char - (str_p("<![") | "]]>"))
-                ;
-
-                CharRef = 
-                    "&#"  >> +Digit  >> ';'
-                    | "&#x" >> +XDigit >> ';'
-                ;
-
-                Reference =
-                    EntityRef 
-                    | CharRef
-                ;
-
-                EntityRef =
-                    '&' >> Name >> ';'
-                ;
-
-                PEReference =
-                    '%' >> Name >> ';'
-                ;
-
-                EntityDecl =
-                    GEDecl 
-                    | PEDecl
-                ;
-
-                GEDecl =
-                    "<!ENTITY" >> S >> Name >> S >> EntityDef >> !S >> '>'
-                ;
-
-                PEDecl =
-                    "<!ENTITY" >> S >> '%' >> S >> Name >> S >> PEDef 
-                    >> !S >> '>'
-                ;
-
-                EntityDef =
-                    EntityValue
-                    | ExternalID >> !NDataDecl
-                ;
-
-                PEDef =
-                    EntityValue 
-                    | ExternalID
-                ;
-
-                ExternalID =
-                    "SYSTEM" >> S >> SystemLiteral
-                    | "PUBLIC" >> S >> PubidLiteral >> S >> SystemLiteral
-                ;
-
-                NDataDecl =
-                    S >> "NDATA" >> S >> Name
-                ;
-
-                TextDecl =
-                    "<?xml" >> !VersionInfo >> EncodingDecl >> !S >> "?>"
-                ;
-
-                extParsedEnt =
-                    !TextDecl >> content
-                ;
-
-                EncodingDecl =
-                    S >> "encoding" >> Eq 
-                    >> (  '"' >> EncName >> '"' 
-                        | '\'' >> EncName >> '\''
-                    )
-                ;
-
-                EncName =
-                    Letter >> *(Letter | Digit | '.' | '_' | '-')
-                ;
-
-                NotationDecl =
-                    "<!NOTATION" >> S >> Name >> S 
-                    >> (ExternalID | PublicID) >> !S >> '>'
-                ;
-
-                PublicID =
-                    "PUBLIC" >> S >> PubidLiteral
-                ;
-
-                BOOST_SPIRIT_DEBUG_RULE(document);
-                BOOST_SPIRIT_DEBUG_RULE(prolog);
-                BOOST_SPIRIT_DEBUG_RULE(element);
-                BOOST_SPIRIT_DEBUG_RULE(Misc);
-                BOOST_SPIRIT_DEBUG_RULE(PEReference);
-                BOOST_SPIRIT_DEBUG_RULE(Reference);
-                BOOST_SPIRIT_DEBUG_RULE(PITarget);
-                BOOST_SPIRIT_DEBUG_RULE(CData);
-                BOOST_SPIRIT_DEBUG_RULE(doctypedecl);
-                BOOST_SPIRIT_DEBUG_RULE(XMLDecl);
-                BOOST_SPIRIT_DEBUG_RULE(SDDecl);
-                BOOST_SPIRIT_DEBUG_RULE(VersionInfo);
-                BOOST_SPIRIT_DEBUG_RULE(EncodingDecl);
-                BOOST_SPIRIT_DEBUG_RULE(VersionNum);
-                BOOST_SPIRIT_DEBUG_RULE(Eq);
-                BOOST_SPIRIT_DEBUG_RULE(DeclSep);
-                BOOST_SPIRIT_DEBUG_RULE(ExternalID);
-                BOOST_SPIRIT_DEBUG_RULE(markupdecl);
-                BOOST_SPIRIT_DEBUG_RULE(NotationDecl);
-                BOOST_SPIRIT_DEBUG_RULE(EntityDecl);
-                BOOST_SPIRIT_DEBUG_RULE(AttlistDecl);
-                BOOST_SPIRIT_DEBUG_RULE(elementdecl);
-                BOOST_SPIRIT_DEBUG_RULE(TextDecl);
-                BOOST_SPIRIT_DEBUG_RULE(extSubsetDecl);
-                BOOST_SPIRIT_DEBUG_RULE(conditionalSect);
-                BOOST_SPIRIT_DEBUG_RULE(EmptyElemTag);
-                BOOST_SPIRIT_DEBUG_RULE(STag);
-                BOOST_SPIRIT_DEBUG_RULE(content);
-                BOOST_SPIRIT_DEBUG_RULE(ETag);
-                BOOST_SPIRIT_DEBUG_RULE(Attribute);
-                BOOST_SPIRIT_DEBUG_RULE(contentspec);
-                BOOST_SPIRIT_DEBUG_RULE(Mixed);
-                BOOST_SPIRIT_DEBUG_RULE(children);
-                BOOST_SPIRIT_DEBUG_RULE(choice);
-                BOOST_SPIRIT_DEBUG_RULE(seq);
-                BOOST_SPIRIT_DEBUG_RULE(cp);
-                BOOST_SPIRIT_DEBUG_RULE(AttDef);
-                BOOST_SPIRIT_DEBUG_RULE(AttType);
-                BOOST_SPIRIT_DEBUG_RULE(DefaultDecl);
-                BOOST_SPIRIT_DEBUG_RULE(StringType);
-                BOOST_SPIRIT_DEBUG_RULE(TokenizedType);
-                BOOST_SPIRIT_DEBUG_RULE(EnumeratedType);
-                BOOST_SPIRIT_DEBUG_RULE(NotationType);
-                BOOST_SPIRIT_DEBUG_RULE(Enumeration);
-                BOOST_SPIRIT_DEBUG_RULE(EntityValue);
-                BOOST_SPIRIT_DEBUG_RULE(AttValue);
-                BOOST_SPIRIT_DEBUG_RULE(SystemLiteral);
-                BOOST_SPIRIT_DEBUG_RULE(PubidLiteral);
-                BOOST_SPIRIT_DEBUG_RULE(CharDataChar);
-                BOOST_SPIRIT_DEBUG_RULE(CharData);
-                BOOST_SPIRIT_DEBUG_RULE(Comment);
-                BOOST_SPIRIT_DEBUG_RULE(PI);
-                BOOST_SPIRIT_DEBUG_RULE(CDSect);
-                BOOST_SPIRIT_DEBUG_RULE(extSubset);
-                BOOST_SPIRIT_DEBUG_RULE(includeSect);
-                BOOST_SPIRIT_DEBUG_RULE(ignoreSect);
-                BOOST_SPIRIT_DEBUG_RULE(ignoreSectContents);
-                BOOST_SPIRIT_DEBUG_RULE(Ignore);
-                BOOST_SPIRIT_DEBUG_RULE(CharRef);
-                BOOST_SPIRIT_DEBUG_RULE(EntityRef);
-                BOOST_SPIRIT_DEBUG_RULE(GEDecl);
-                BOOST_SPIRIT_DEBUG_RULE(PEDecl);
-                BOOST_SPIRIT_DEBUG_RULE(EntityDef);
-                BOOST_SPIRIT_DEBUG_RULE(PEDef);
-                BOOST_SPIRIT_DEBUG_RULE(NDataDecl);
-                BOOST_SPIRIT_DEBUG_RULE(extParsedEnt);
-                BOOST_SPIRIT_DEBUG_RULE(EncName);
-                BOOST_SPIRIT_DEBUG_RULE(PublicID);
-                BOOST_SPIRIT_DEBUG_RULE(document);
-                BOOST_SPIRIT_DEBUG_RULE(S);
-                BOOST_SPIRIT_DEBUG_RULE(Name);
-                BOOST_SPIRIT_DEBUG_RULE(Names);
-                BOOST_SPIRIT_DEBUG_RULE(Nmtoken);
-                BOOST_SPIRIT_DEBUG_RULE(Nmtokens);
-                BOOST_SPIRIT_DEBUG_RULE(STagB);
-                BOOST_SPIRIT_DEBUG_RULE(STagE1);
-                BOOST_SPIRIT_DEBUG_RULE(STagE2);
-
-            }
-
-            const boost::spirit::rule<ScannerT> &start() const
-            {
-                return document;
-            }
-
-        };
-
-    };
-
-    template<class Ptree>
-    void read_xml_internal(std::basic_istream<typename Ptree::char_type> &stream,
-                           Ptree &pt,
-                           int flags,
-                           const std::string &filename)
-    {
-
-        typedef typename Ptree::char_type Ch;
-        typedef boost::spirit::position_iterator<typename std::vector<Ch>::const_iterator> It;
-
-        BOOST_ASSERT(validate_flags(flags));
-
-        // Load data into vector
-        std::vector<Ch> v(std::istreambuf_iterator<Ch>(stream.rdbuf()),
-                          std::istreambuf_iterator<Ch>());
-        if (!stream.good())
-            throw xml_parser_error("read error", filename, 0);
-        
-        // Initialize iterators
-        It begin(v.begin(), v.end());
-        It end(v.end(), v.end());
-        begin.set_position(filename);
-        
-        // Prepare grammar
-        Ptree local;
-        xml_grammar<Ptree> g;
-        g.c.stack.push_back(&local);       // Push root ptree on context stack
-        g.c.flags = flags;
-
-        // Parse into local
-        boost::spirit::parse_info<It> result = boost::spirit::parse(begin, end, g);
-        if (!result.full || g.c.stack.size() != 1)
-            throw xml_parser_error("xml parse error", 
-                                   result.stop.get_position().file, 
-                                   result.stop.get_position().line);
-
-        // Swap local and pt
-        pt.swap(local);
-    }
-
-} } }
-
-#endif
diff --git a/boost/property_tree/detail/xml_parser_read_tinyxml.hpp b/boost/property_tree/detail/xml_parser_read_tinyxml.hpp
deleted file mode 100644
index 92a057c..0000000
--- a/boost/property_tree/detail/xml_parser_read_tinyxml.hpp
+++ /dev/null
@@ -1,82 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_DETAIL_XML_PARSER_READ_TINYXML_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_DETAIL_XML_PARSER_READ_TINYXML_HPP_INCLUDED
-
-#include <boost/property_tree/ptree.hpp>
-#include <boost/property_tree/detail/xml_parser_error.hpp>
-#include <boost/property_tree/detail/xml_parser_flags.hpp>
-#include <boost/property_tree/detail/xml_parser_utils.hpp>
-
-#ifndef TIXML_USE_STL
-#define TIXML_USE_STL
-#endif
-
-#include <tinyxml.h>
-
-namespace boost { namespace property_tree { namespace xml_parser
-{
-
-    template<class Ptree>
-    void read_xml_node(TiXmlNode *node, Ptree &pt, int flags)
-    {
-
-        typedef typename Ptree::char_type Ch;
-
-        if (TiXmlElement *elem = node->ToElement())
-        {
-            Ptree &tmp = pt.push_back(std::make_pair(elem->Value(), Ptree()))->second;
-            for (TiXmlAttribute *attr = elem->FirstAttribute(); attr; attr = attr->Next())
-                tmp.put(Ch('/'), xmlattr<Ch>() + "/" + attr->Name(), attr->Value());
-            for (TiXmlNode *child = node->FirstChild(); child; child = child->NextSibling())
-                read_xml_node(child, tmp, flags);
-        }
-        else if (TiXmlText *text = node->ToText())
-        {
-            if (flags & no_concat_text)
-                pt.push_back(std::make_pair(xmltext<Ch>(), Ptree(text->Value())));
-            else
-                pt.data() += text->Value();
-        }
-        else if (TiXmlComment *comment = node->ToComment())
-        {
-            if (!(flags & no_comments))
-                pt.push_back(std::make_pair(xmlcomment<Ch>(), Ptree(comment->Value())));
-        }
-    }
-
-    template<class Ptree>
-    void read_xml_internal(std::basic_istream<typename Ptree::char_type> &stream,
-                           Ptree &pt,
-                           int flags,
-                           const std::string &filename)
-    {
-
-        // Create and load document from stream
-        TiXmlDocument doc;
-        stream >> doc;
-        if (!stream.good())
-            throw xml_parser_error("read error", filename, 0);
-        if (doc.Error())
-            throw xml_parser_error(doc.ErrorDesc(), filename, doc.ErrorRow());
-
-        // Create ptree from nodes
-        Ptree local;
-        for (TiXmlNode *child = doc.FirstChild(); child; child = child->NextSibling())
-            read_xml_node(child, local, flags);
-
-        // Swap local and result ptrees
-        pt.swap(local);
-
-    }
-
-} } }
-
-#endif
diff --git a/boost/property_tree/detail/xml_parser_utils.hpp b/boost/property_tree/detail/xml_parser_utils.hpp
deleted file mode 100644
index f2df027..0000000
--- a/boost/property_tree/detail/xml_parser_utils.hpp
+++ /dev/null
@@ -1,119 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_DETAIL_XML_PARSER_UTILS_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_DETAIL_XML_PARSER_UTILS_HPP_INCLUDED
-
-#include <boost/property_tree/detail/ptree_utils.hpp>
-#include <boost/property_tree/detail/xml_parser_error.hpp>
-#include <string>
-#include <algorithm>
-#include <locale>
-
-namespace boost { namespace property_tree { namespace xml_parser
-{
-
-    template<class Ch>
-    std::basic_string<Ch> condense(const std::basic_string<Ch> &s)
-    {
-        std::basic_string<Ch> r;
-        std::locale loc;
-        bool space = false;
-        typename std::basic_string<Ch>::const_iterator end = s.end();
-        for (typename std::basic_string<Ch>::const_iterator it = s.begin();
-             it != end; ++it)
-        {
-            if (isspace(*it, loc) || *it == Ch('\n'))
-            {
-                if (!space)
-                    r += Ch(' '), space = true;
-            }
-            else
-                r += *it, space = false;
-        }
-        return r;
-    }
-
-    template<class Ch>
-    std::basic_string<Ch> encode_char_entities(const std::basic_string<Ch> &s)
-    {
-        typedef typename std::basic_string<Ch> Str;
-        Str r;
-        typename Str::const_iterator end = s.end();
-        for (typename Str::const_iterator it = s.begin(); it != end; ++it)
-        {
-            switch (*it)
-            {
-                case Ch('<'): r += detail::widen<Ch>("<"); break;
-                case Ch('>'): r += detail::widen<Ch>(">"); break;
-                case Ch('&'): r += detail::widen<Ch>("&"); break;
-                default: r += *it; break;
-            }
-        }
-        return r;
-    }
-    
-    template<class Ch>
-    std::basic_string<Ch> decode_char_entities(const std::basic_string<Ch> &s)
-    {
-        typedef typename std::basic_string<Ch> Str;
-        Str r;
-        typename Str::const_iterator end = s.end();
-        for (typename Str::const_iterator it = s.begin(); it != end; ++it)
-        {
-            if (*it == Ch('&'))
-            {
-                typename Str::const_iterator semicolon = std::find(it + 1, end, Ch(';'));
-                if (semicolon == end)
-                    throw xml_parser_error("invalid character entity", "", 0);
-                Str ent(it + 1, semicolon);
-                if (ent == detail::widen<Ch>("lt")) r += Ch('<');
-                else if (ent == detail::widen<Ch>("gt")) r += Ch('>');
-                else if (ent == detail::widen<Ch>("amp")) r += Ch('&');
-                else
-                    throw xml_parser_error("invalid character entity", "", 0);
-                it = semicolon;
-            }
-            else
-                r += *it;
-        }
-        return r;
-    }
-    
-    template<class Ch>
-    const std::basic_string<Ch> &xmldecl()
-    {
-        static std::basic_string<Ch> s = detail::widen<Ch>("<?xml>");
-        return s;
-    }
-
-    template<class Ch>
-    const std::basic_string<Ch> &xmlattr()
-    {
-        static std::basic_string<Ch> s = detail::widen<Ch>("<xmlattr>");
-        return s;
-    }
-
-    template<class Ch>
-    const std::basic_string<Ch> &xmlcomment()
-    {
-        static std::basic_string<Ch> s = detail::widen<Ch>("<xmlcomment>");
-        return s;
-    }
-
-    template<class Ch>
-    const std::basic_string<Ch> &xmltext()
-    {
-        static std::basic_string<Ch> s = detail::widen<Ch>("<xmltext>");
-        return s;
-    }
-
-} } }
-
-#endif
diff --git a/boost/property_tree/detail/xml_parser_write.hpp b/boost/property_tree/detail/xml_parser_write.hpp
deleted file mode 100644
index 0d56969..0000000
--- a/boost/property_tree/detail/xml_parser_write.hpp
+++ /dev/null
@@ -1,145 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_DETAIL_XML_PARSER_WRITE_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_DETAIL_XML_PARSER_WRITE_HPP_INCLUDED
-
-#include <boost/property_tree/ptree.hpp>
-#include <boost/property_tree/detail/xml_parser_utils.hpp>
-#include <string>
-#include <ostream>
-#include <iomanip>
-
-namespace boost { namespace property_tree { namespace xml_parser
-{
-
-    template<class Ch>
-    void write_xml_comment(std::basic_ostream<Ch> &stream,
-                           const std::basic_string<Ch> &s, 
-                           int indent)
-    {
-        typedef typename std::basic_string<Ch> Str;
-        stream << Str(4 * indent, Ch(' '));
-        stream << Ch('<') << Ch('!') << Ch('-') << Ch('-');
-        stream << s;
-        stream << Ch('-') << Ch('-') << Ch('>') << std::endl;
-    }
-    
-    template<class Ch>
-    void write_xml_text(std::basic_ostream<Ch> &stream,
-                        const std::basic_string<Ch> &s, 
-                        int indent, 
-                        bool separate_line)
-    {
-        typedef typename std::basic_string<Ch> Str;
-        if (separate_line)    
-            stream << Str(4 * indent, Ch(' '));
-        stream << encode_char_entities(s);
-        if (separate_line)    
-            stream << Ch('\n');
-    }
-
-    template<class Ptree>
-    void write_xml_element(std::basic_ostream<typename Ptree::char_type> &stream, 
-                           const std::basic_string<typename Ptree::char_type> &key,
-                           const Ptree &pt, 
-                           int indent)
-    {
-
-        typedef typename Ptree::char_type Ch;
-        typedef typename std::basic_string<Ch> Str;
-        typedef typename Ptree::const_iterator It;
-
-        // Find if elements present
-        bool has_elements = false;
-        for (It it = pt.begin(), end = pt.end(); it != end; ++it)
-            if (it->first != xmlattr<Ch>() &&
-                it->first != xmltext<Ch>())
-            {
-                has_elements = true;
-                break;
-            }
-        
-        // Write element
-        if (pt.data().empty() && pt.empty())    // Empty key
-        {
-            if (indent >= 0)
-                stream << Str(4 * indent, Ch(' ')) << Ch('<') << key << 
-                          Ch('/') << Ch('>') << std::endl;
-        }
-        else    // Nonempty key
-        {
-        
-            // Write opening tag, attributes and data
-            if (indent >= 0)
-            {
-            
-                // Write opening brace and key
-                stream << Str(4 * indent, Ch(' '));
-                stream << Ch('<') << key;
-
-                // Write attributes
-                if (optional<const Ptree &> attribs = pt.get_child_optional(xmlattr<Ch>()))
-                    for (It it = attribs.get().begin(); it != attribs.get().end(); ++it)
-                        stream << Ch(' ') << it->first << Ch('=') << 
-                                  Ch('"') << it->second.template get_own<std::basic_string<Ch> >() << Ch('"');
-
-                // Write closing brace
-                stream << Ch('>');
-
-                // Break line if needed
-                if (has_elements)
-                    stream << Ch('\n');
-
-            }
-            
-            // Write data text, if present
-            if (!pt.data().empty())
-                write_xml_text(stream, pt.template get_own<std::basic_string<Ch> >(), indent + 1, has_elements);
-            
-            // Write elements, comments and texts
-            for (It it = pt.begin(); it != pt.end(); ++it)
-            {
-                if (it->first == xmlattr<Ch>())
-                    continue;
-                else if (it->first == xmlcomment<Ch>())
-                    write_xml_comment(stream, it->second.template get_own<std::basic_string<Ch> >(), indent + 1);
-                else if (it->first == xmltext<Ch>())
-                    write_xml_text(stream, it->second.template get_own<std::basic_string<Ch> >(), indent + 1, has_elements);
-                else
-                    write_xml_element(stream, it->first, it->second, indent + 1);
-            }
-            
-            // Write closing tag
-            if (indent >= 0)
-            {
-                if (has_elements)
-                    stream << Str(4 * indent, Ch(' '));
-                stream << Ch('<') << Ch('/') << key << Ch('>') << std::endl;
-            }
-
-        }
-    }
-
-    template<class Ptree>
-    void write_xml_internal(std::basic_ostream<typename Ptree::char_type> &stream, 
-                            const Ptree &pt,
-                            const std::string &filename)
-    {
-        typedef typename Ptree::char_type Ch;
-        typedef typename std::basic_string<Ch> Str;
-        stream << detail::widen<Ch>("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
-        write_xml_element(stream, Str(), pt, -1);
-        if (!stream)
-            throw xml_parser_error("write error", filename, 0);
-    }
-
-} } }
-
-#endif
diff --git a/boost/property_tree/info_parser.hpp b/boost/property_tree/info_parser.hpp
deleted file mode 100644
index fe85727..0000000
--- a/boost/property_tree/info_parser.hpp
+++ /dev/null
@@ -1,77 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_INFO_PARSER_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_INFO_PARSER_HPP_INCLUDED
-
-#include <boost/property_tree/ptree.hpp>
-#include <boost/property_tree/detail/info_parser_error.hpp>
-#include <boost/property_tree/detail/info_parser_read.hpp>
-#include <boost/property_tree/detail/info_parser_write.hpp>
-#include <istream>
-
-namespace boost { namespace property_tree { namespace info_parser
-{
-
-    // Read info from stream
-    template<class Ptree>
-    void read_info(std::basic_istream<typename Ptree::char_type> &stream, 
-                   Ptree &pt)
-    {
-        Ptree local;
-        read_info_internal(stream, local, std::string(), 0);
-        pt.swap(local);
-    }
-
-    // Read info from file
-    template<class Ptree>
-    void read_info(const std::string &filename,
-                   Ptree &pt,
-                   const std::locale &loc = std::locale())
-    {
-        std::basic_ifstream<typename Ptree::char_type> stream(filename.c_str());
-        if (!stream)
-            throw info_parser_error("cannot open file for reading", filename, 0);
-        stream.imbue(loc);
-        Ptree local;
-        read_info_internal(stream, local, filename, 0);
-        pt.swap(local);
-    }
-
-    // Write info to stream
-    template<class Ptree>
-    void write_info(std::basic_ostream<typename Ptree::char_type> &stream, 
-                    const Ptree &pt)
-    {
-        write_info_internal(stream, pt, std::string());
-    }
-
-    // Write info to file
-    template<class Ptree>
-    void write_info(const std::string &filename,
-                    const Ptree &pt,
-                    const std::locale &loc = std::locale())
-    {
-        std::basic_ofstream<typename Ptree::char_type> stream(filename.c_str());
-        if (!stream)
-            throw info_parser_error("cannot open file for writing", filename, 0);
-        stream.imbue(loc);
-        write_info_internal(stream, pt, filename);
-    }
-
-} } }
-
-namespace boost { namespace property_tree
-{
-    using info_parser::info_parser_error;
-    using info_parser::read_info;
-    using info_parser::write_info;
-} }
-
-#endif
diff --git a/boost/property_tree/ini_parser.hpp b/boost/property_tree/ini_parser.hpp
deleted file mode 100644
index 2f65830..0000000
--- a/boost/property_tree/ini_parser.hpp
+++ /dev/null
@@ -1,196 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_INI_PARSER_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_INI_PARSER_HPP_INCLUDED
-
-#include <boost/property_tree/ptree.hpp>
-#include <boost/property_tree/detail/ptree_utils.hpp>
-#include <boost/property_tree/detail/file_parser_error.hpp>
-#include <istream>
-#include <string>
-#include <sstream>
-#include <stdexcept>
-#include <locale>
-
-namespace boost { namespace property_tree { namespace ini_parser
-{
-
-    static const int skip_ini_validity_check = 1;     // Skip check if ptree is a valid ini
-
-    inline bool validate_flags(int flags)
-    {
-        return (flags & ~skip_ini_validity_check) == 0;
-    }
-
-    //! Ini parser error
-    class ini_parser_error: public file_parser_error
-    {
-    public:
-        ini_parser_error(const std::string &message, 
-                         const std::string &filename, 
-                         unsigned long line): 
-            file_parser_error(message, filename, line)
-        { 
-        }
-    };
-
-    //! Read ini from stream
-    template<class Ptree>
-    void read_ini(std::basic_istream<typename Ptree::char_type> &stream, 
-                  Ptree &pt)
-    {
-
-        typedef typename Ptree::char_type Ch;
-        typedef std::basic_string<Ch> Str;
-
-        Ptree local;
-        unsigned long line_no = 0;
-        Ptree *section = 0;
-        Str line;
-
-        // For all lines
-        while (stream.good())
-        {
-
-            // Get line from stream
-            ++line_no;
-            std::getline(stream, line);
-            if (!stream.good() && !stream.eof())
-                throw ini_parser_error("read error", "", line_no);
-
-            // If line is non-empty
-            line = detail::trim(line, stream.getloc());
-            if (!line.empty())
-            {
-            
-                // Comment, section or key?
-                if (line[0] == Ch(';'))
-                {
-                    // Ignore comments
-                }
-                else if (line[0] == Ch('['))
-                {
-                    typename Str::size_type end = line.find(Ch(']'));
-                    if (end == Str::npos)
-                        throw ini_parser_error("unmatched '['", "", line_no);
-                    Str key = detail::trim(line.substr(1, end - 1), stream.getloc());
-                    if (local.find(key) != local.end())
-                        throw ini_parser_error("duplicate section name", "", line_no);
-                    section = &local.push_back(std::make_pair(key, Ptree()))->second;
-                }
-                else
-                {
-                    if (!section)
-                        throw ini_parser_error("section expected", "", line_no);
-                    typename Str::size_type eqpos = line.find(Ch('='));
-                    if (eqpos == Str::npos)
-                        throw ini_parser_error("'=' character not found in line", "", line_no);
-                    if (eqpos == 0)
-                        throw ini_parser_error("key expected", "", line_no);
-                    Str key = detail::trim(line.substr(0, eqpos), stream.getloc());
-                    Str data = detail::trim(line.substr(eqpos + 1, Str::npos), stream.getloc());
-                    if (section->find(key) != section->end())
-                        throw ini_parser_error("duplicate key name", "", line_no);
-                    section->push_back(std::make_pair(key, Ptree(data)));
-                }
-            }
-        }
-
-        // Swap local ptree with result ptree
-        pt.swap(local);
-
-    }
-
-    //! Read ini from file
-    template<class Ptree>
-    void read_ini(const std::string &filename, 
-                  Ptree &pt,
-                  const std::locale &loc = std::locale())
-    {
-        std::basic_ifstream<typename Ptree::char_type> stream(filename.c_str());
-        if (!stream)
-            throw ini_parser_error("cannot open file", filename, 0);
-        stream.imbue(loc);
-        try {
-            read_ini(stream, pt);
-        }
-        catch (ini_parser_error &e) {
-            throw ini_parser_error(e.message(), filename, e.line());
-        }
-    }
-
-    //! Write ini to stream
-    template<class Ptree>
-    void write_ini(std::basic_ostream<typename Ptree::char_type> &stream, 
-                   const Ptree &pt,
-                   int flags = 0)
-    {
-
-        typedef typename Ptree::char_type Ch;
-        typedef std::basic_string<Ch> Str;
-
-        BOOST_ASSERT(validate_flags(flags));
-        
-        // Verify if ptree is not too rich to be saved as ini
-        if (!(flags & skip_ini_validity_check))
-            for (typename Ptree::const_iterator it = pt.begin(), end = pt.end(); it != end; ++it)
-            {
-                if (!it->second.data().empty())
-                    throw ini_parser_error("ptree has data on root level keys", "", 0);
-                if (pt.count(it->first) > 1)
-                    throw ini_parser_error("duplicate section name", "", 0);
-                for (typename Ptree::const_iterator it2 = it->second.begin(), end2 = it->second.end(); it2 != end2; ++it2)
-                {
-                    if (!it2->second.empty())
-                        throw ini_parser_error("ptree is too deep", "", 0);
-                    if (it->second.count(it2->first) > 1)
-                        throw ini_parser_error("duplicate key name", "", 0);
-                }
-            }
-
-        // Write ini
-        for (typename Ptree::const_iterator it = pt.begin(), end = pt.end(); it != end; ++it)
-        {
-            stream << Ch('[') << it->first << Ch(']') << Ch('\n');
-            for (typename Ptree::const_iterator it2 = it->second.begin(), end2 = it->second.end(); it2 != end2; ++it2)
-                stream << it2->first << Ch('=') << it2->second.template get_own<std::basic_string<Ch> >() << Ch('\n');
-        }
-
-    }
-
-    // Write ini to file
-    template<class Ptree>
-    void write_ini(const std::string &filename,
-                   const Ptree &pt,
-                   int flags = 0,
-                   const std::locale &loc = std::locale())
-    {
-        std::basic_ofstream<typename Ptree::char_type> stream(filename.c_str());
-        if (!stream)
-            throw ini_parser_error("cannot open file", filename, 0);
-        stream.imbue(loc);
-        try {
-            write_ini(stream, pt, flags);
-        }
-        catch (ini_parser_error &e) {
-            throw ini_parser_error(e.message(), filename, e.line());
-        }
-    }
-
-} } }
-
-namespace boost { namespace property_tree
-{
-    using ini_parser::ini_parser_error;
-    using ini_parser::read_ini;
-    using ini_parser::write_ini;
-} }
-
-#endif
diff --git a/boost/property_tree/json_parser.hpp b/boost/property_tree/json_parser.hpp
deleted file mode 100644
index 4f3a7e5..0000000
--- a/boost/property_tree/json_parser.hpp
+++ /dev/null
@@ -1,76 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_JSON_PARSER_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_JSON_PARSER_HPP_INCLUDED
-
-#include <boost/property_tree/ptree.hpp>
-#include <boost/property_tree/detail/json_parser_read.hpp>
-#include <boost/property_tree/detail/json_parser_write.hpp>
-#include <boost/property_tree/detail/json_parser_error.hpp>
-
-#include <fstream>
-#include <string>
-#include <locale>
-
-namespace boost { namespace property_tree { namespace json_parser
-{
-
-    // Read json from stream
-    template<class Ptree>
-    void read_json(std::basic_istream<typename Ptree::char_type> &stream,
-                   Ptree &pt)
-    {
-        read_json_internal(stream, pt, std::string());
-    }
-
-    // Read json from file
-    template<class Ptree>
-    void read_json(const std::string &filename,
-                   Ptree &pt,
-                   const std::locale &loc = std::locale())
-    {
-        std::basic_ifstream<typename Ptree::char_type> stream(filename.c_str());
-        if (!stream)
-            throw json_parser_error("cannot open file", filename, 0);
-        stream.imbue(loc);
-        read_json_internal(stream, pt, filename);
-    }
-
-    // Write json to stream
-    template<class Ptree>
-    void write_json(std::basic_ostream<typename Ptree::char_type> &stream, 
-                    const Ptree &pt)
-    {
-        write_json_internal(stream, pt, std::string());
-    }
-
-    // Write json to file
-    template<class Ptree>
-    void write_json(const std::string &filename,
-                    const Ptree &pt,
-                    const std::locale &loc = std::locale())
-    {
-        std::basic_ofstream<typename Ptree::char_type> stream(filename.c_str());
-        if (!stream)
-            throw json_parser_error("cannot open file", filename, 0);
-        stream.imbue(loc);
-        write_json_internal(stream, pt, filename);
-    }
-
-} } }
-
-namespace boost { namespace property_tree
-{
-    using json_parser::read_json;
-    using json_parser::write_json;
-    using json_parser::json_parser_error;
-} }
-
-#endif
diff --git a/boost/property_tree/ptree.hpp b/boost/property_tree/ptree.hpp
deleted file mode 100644
index 2fe57b5..0000000
--- a/boost/property_tree/ptree.hpp
+++ /dev/null
@@ -1,16 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_PTREE_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_PTREE_HPP_INCLUDED
-
-#include <boost/property_tree/detail/ptree_interface.hpp>
-#include <boost/property_tree/detail/ptree_implementation.hpp>
-
-#endif                                                
diff --git a/boost/property_tree/ptree_fwd.hpp b/boost/property_tree/ptree_fwd.hpp
deleted file mode 100644
index 54e06bb..0000000
--- a/boost/property_tree/ptree_fwd.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_PTREE_FWD_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_PTREE_FWD_HPP_INCLUDED
-
-#include <boost/config.hpp>
-
-namespace boost { namespace property_tree
-{
-
-    ////////////////////////////////////////////////////////////////////////////
-    // Traits
-
-    template<class Ch> struct ptree_traits;
-    template<class Ch> struct iptree_traits;
-
-    ///////////////////////////////////////////////////////////////////////////
-    // Exceptions
-
-    class ptree_error;
-    class bad_ptree_data;
-    class bad_ptree_path;
-
-    ///////////////////////////////////////////////////////////////////////////
-    // basic_ptree class template
-
-    template<class Tr> class basic_ptree;
-
-    ////////////////////////////////////////////////////////////////////////////
-    // Typedefs
-
-    typedef basic_ptree<ptree_traits<char> > ptree;       // case sensitive, narrow char
-    typedef basic_ptree<iptree_traits<char> > iptree;     // case insensitive, narrow char
-#ifndef BOOST_NO_CWCHAR
-    typedef basic_ptree<ptree_traits<wchar_t> > wptree;    // case sensitive, wide char
-    typedef basic_ptree<iptree_traits<wchar_t> > wiptree;  // case insensitive, wide char
-#endif
-
-    ///////////////////////////////////////////////////////////////////////////
-    // Free functions
-
-    template<class Tr> void swap(basic_ptree<Tr> &pt1, basic_ptree<Tr> &pt2);
-    template<class Ptree> const Ptree &empty_ptree();
-
-} }
-
-#endif
diff --git a/boost/property_tree/registry_parser.hpp b/boost/property_tree/registry_parser.hpp
deleted file mode 100644
index c505a34..0000000
--- a/boost/property_tree/registry_parser.hpp
+++ /dev/null
@@ -1,520 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_REGISTRY_PARSER_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_REGISTRY_PARSER_HPP_INCLUDED
-
-// Include minimal version of windows.h if not included yet
-#ifndef _WINDOWS_
-#ifndef NOMINMAX
-    #define NOMINMAX
-#endif
-#define STRICT
-#define WIN32_LEAN_AND_MEAN
-#define VC_EXTRALEAN
-#define NOGDICAPMASKS
-#define NOVIRTUALKEYCODES
-#define NOWINMESSAGES
-#define NOWINSTYLES
-#define NOSYSMETRICS
-#define NOMENUS
-#define NOICONS
-#define NOKEYSTATES
-#define NOSYSCOMMANDS
-#define NORASTEROPS
-#define NOSHOWWINDOW
-#define OEMRESOURCE
-#define NOATOM
-#define NOCLIPBOARD
-#define NOCOLOR
-#define NOCTLMGR
-#define NODRAWTEXT
-#define NOGDI
-#define NOKERNEL
-#define NOUSER
-#define NONLS
-#define NOMB 
-#define NOMEMMGR
-#define NOMETAFILE
-#define NOMSG
-#define NOOPENFILE
-#define NOSCROLL
-#define NOSERVICE
-#define NOSOUND
-#define NOTEXTMETRIC
-#define NOWH
-#define NOWINOFFSETS
-#define NOCOMM
-#define NOKANJI
-#define NOHELP
-#define NOPROFILER
-#define NODEFERWINDOWPOS
-#define NOMCX
-#include <windows.h>
-#endif
-
-#include <boost/property_tree/ptree.hpp>
-#include <boost/property_tree/detail/ptree_utils.hpp>
-#include <boost/cstdint.hpp>                // for 64 bit int
-#include <sstream>
-#include <iomanip>
-#include <string>
-#include <vector>
-#include <stdexcept>
-
-namespace boost { namespace property_tree { namespace registry_parser
-{
-
-    //! Registry parser error
-    class registry_parser_error: public ptree_error
-    {
-    public:
-    
-        // Construct error 
-        registry_parser_error(const std::string &message, DWORD windows_error): 
-            ptree_error(format_what(message, windows_error)), 
-            m_windows_error(windows_error)
-        { 
-        }
-    
-        // Get windows error
-        DWORD windows_error()
-        {
-            return m_windows_error;
-        }
-    
-    private:
-
-        DWORD m_windows_error;
-
-        // Format error message to be returned by std::runtime_error::what()
-        std::string format_what(const std::string &message,
-                                DWORD windows_error)
-        {
-            std::stringstream stream;
-            if (windows_error)
-                stream << message << " (windows error 0x" << std::hex << windows_error << ")";
-            else
-                stream << message;
-            return stream.str();
-        }
-
-    };
-
-    // Translate from binary buffer to string
-    template<class Ch>
-    std::basic_string<Ch> translate(DWORD type, const std::vector<BYTE> &data)
-    {
-
-        typedef std::basic_string<Ch> Str;
-        typedef std::basic_stringstream<Ch> Stream;
-
-        Str value;
-        switch (type)
-        {
-        
-            // No data
-            case REG_NONE:
-                break;
-            
-            // Binary data
-            case REG_BINARY: 
-                if (!data.empty())
-                {
-                    Stream stream;
-                    stream << std::hex << std::setfill(Ch('0'));
-                    for (std::vector<BYTE>::const_iterator it = data.begin(), end = data.end(); 
-                         it != end; ++it)
-                        stream << std::setw(2) << static_cast<int>(*it) << Ch(' ');
-                    value = stream.str();
-                    value.resize(value.size() - 1); // remove final space
-                }
-                break;
-            
-            // DWORD value
-            case REG_DWORD: 
-                if (!data.empty())
-                {
-                    Stream stream;
-                    stream << *reinterpret_cast<const DWORD *>(&data.front());
-                    value = stream.str();
-                }
-                break;
-
-            // QWORD value
-            case REG_QWORD: 
-                if (!data.empty())
-                {
-                    Stream stream;
-                    stream << *reinterpret_cast<const boost::uint64_t *>(&data.front());
-                    value = stream.str();
-                }
-                break;
-            
-            // Zero terminated string
-            case REG_SZ: case REG_EXPAND_SZ: 
-                if (!data.empty())
-                    value.assign(reinterpret_cast<const Ch *>(&data.front()));
-                break;
-            
-            // Unknown data type
-            default:
-                throw registry_parser_error("unsupported data type", 0);
-
-        };
-        return value;
-    }
-
-    // Translate from string to binary buffer
-    template<class Ch>
-    std::vector<BYTE> translate(DWORD type, const std::basic_string<Ch> &s)
-    {
-
-        typedef std::basic_string<Ch> Str;
-        typedef std::basic_stringstream<Ch> Stream;
-
-        std::vector<BYTE> data;
-        switch (type)
-        {
-        
-            // No data
-            case REG_NONE:
-                break;
-            
-            // Binary data
-            case REG_BINARY:
-                {
-                    int v;
-                    Stream stream(s);
-                    stream >> std::hex;
-                    while (1)
-                    {
-                        stream >> v >> std::ws;
-                        if (stream.fail() || stream.bad())
-                            throw registry_parser_error("bad REG_BINARY value", 0);
-                        data.push_back(v);
-                        if (stream.eof())
-                            break;
-                    }
-                }
-                break;
-            
-            // DWORD value
-            case REG_DWORD: 
-                {
-                    DWORD v;
-                    Stream stream(s);
-                    stream >> v >> std::ws;
-                    if (!stream.eof() || stream.fail() || stream.bad())
-                        throw registry_parser_error("bad REG_DWORD value", 0);
-                    for (size_t i = 0; i < sizeof(v); ++i)
-                        data.push_back(*(reinterpret_cast<BYTE *>(&v) + i));
-                }
-                break;
-
-            // QWORD value
-            case REG_QWORD: 
-                {
-                    boost::uint64_t v;
-                    Stream stream(s);
-                    stream >> v;
-                    if (!stream.eof() || stream.fail() || stream.bad())
-                        throw registry_parser_error("bad REG_QWORD value", 0);
-                    for (size_t i = 0; i < sizeof(v); ++i)
-                        data.push_back(*(reinterpret_cast<BYTE *>(&v) + i));
-                }
-                break;
-            
-            // Zero terminated string
-            case REG_SZ: case REG_EXPAND_SZ:
-                {
-                    const Ch *sz = s.c_str();
-                    size_t len = (s.size() + 1) * sizeof(Ch);
-                    for (size_t i = 0; i < len; ++i)
-                        data.push_back(*(reinterpret_cast<const BYTE *>(sz) + i));
-                }
-                break;
-            
-            // Unknown data type
-            default:
-                throw registry_parser_error("unsupported data type", 0);
-
-        };
-        return data;
-    }
-
-    /////////////////////////////////////////////////////////////////////////////
-    // Registry functions wrappers
-    
-    template<class Ch> 
-    inline LONG reg_create_key_ex(HKEY hkey, const Ch *subkey, REGSAM sam, HKEY *result);
-
-    template<> 
-    inline LONG reg_create_key_ex<char>(HKEY hkey, const char *subkey, REGSAM sam, HKEY *result)
-    {
-        return RegCreateKeyExA(hkey, subkey, 0, NULL, REG_OPTION_NON_VOLATILE, sam, NULL, result, NULL);
-    }
-    
-    template<> 
-    inline LONG reg_create_key_ex<wchar_t>(HKEY hkey, const wchar_t *subkey, REGSAM sam, HKEY *result)
-    {
-        return RegCreateKeyExW(hkey, subkey, 0, NULL, REG_OPTION_NON_VOLATILE, sam, NULL, result, NULL);
-    }
-
-    template<class Ch> 
-    inline LONG reg_set_value_ex(HKEY hkey, const Ch *name, DWORD type, const BYTE *data, DWORD size);
-
-    template<> 
-    inline LONG reg_set_value_ex<char>(HKEY hkey, const char *name, DWORD type, const BYTE *data, DWORD size)
-    {
-        return RegSetValueExA(hkey, name, 0, type, data, size);
-    }
-
-    template<> 
-    inline LONG reg_set_value_ex<wchar_t>(HKEY hkey, const wchar_t *name, DWORD type, const BYTE *data, DWORD size)
-    {
-        return RegSetValueExW(hkey, name, 0, type, data, size);
-    }
-
-    template<class Ch> 
-    inline LONG reg_open_key_ex(HKEY hkey, const Ch *subkey, REGSAM sam, HKEY *result);
-
-    template<> 
-    inline LONG reg_open_key_ex<char>(HKEY hkey, const char *subkey, REGSAM sam, HKEY *result)
-    {
-        return RegOpenKeyExA(hkey, subkey, 0, sam, result);
-    }
-    
-    template<> 
-    inline LONG reg_open_key_ex<wchar_t>(HKEY hkey, const wchar_t *subkey, REGSAM sam, HKEY *result)
-    {
-        return RegOpenKeyExW(hkey, subkey, 0, sam, result);
-    }
-
-    template<class Ch> 
-    inline LONG reg_enum_key_ex(HKEY hkey, DWORD index, Ch *name, DWORD *size);
-
-    template<> 
-    inline LONG reg_enum_key_ex<char>(HKEY hkey, DWORD index, char *name, DWORD *size)
-    {
-        FILETIME ft;
-        return RegEnumKeyExA(hkey, index, name, size, 0, NULL, NULL, &ft);
-    }
-
-    template<> 
-    inline LONG reg_enum_key_ex<wchar_t>(HKEY hkey, DWORD index, wchar_t *name, DWORD *size)
-    {
-        FILETIME ft;
-        return RegEnumKeyExW(hkey, index, name, size, 0, NULL, NULL, &ft);
-    }
-
-    template<class Ch> 
-    inline LONG reg_enum_value(HKEY hkey, DWORD index, Ch *name, DWORD *name_size, DWORD *type, BYTE *data, DWORD *data_size);
-
-    template<> 
-    inline LONG reg_enum_value<char>(HKEY hkey, DWORD index, char *name, DWORD *name_size, DWORD *type, BYTE *data, DWORD *data_size)
-    {
-        return RegEnumValueA(hkey, index, name, name_size, NULL, type, data, data_size);
-    }
-
-    template<> 
-    inline LONG reg_enum_value<wchar_t>(HKEY hkey, DWORD index, wchar_t *name, DWORD *name_size, DWORD *type, BYTE *data, DWORD *data_size)
-    {
-        return RegEnumValueW(hkey, index, name, name_size, NULL, type, data, data_size);
-    }
-
-    template<class Ch> 
-    inline LONG reg_query_info_key(HKEY hkey, DWORD *max_subkey_len, DWORD *max_name_len, DWORD *max_value_len);
-
-    template<> 
-    inline LONG reg_query_info_key<char>(HKEY hkey, DWORD *max_subkey_len, DWORD *max_name_len, DWORD *max_value_len)
-    {
-        return RegQueryInfoKeyA(hkey, NULL, NULL, NULL, NULL, max_subkey_len, NULL, NULL, max_name_len, max_value_len, NULL, NULL);
-    }
-
-    template<> 
-    inline LONG reg_query_info_key<wchar_t>(HKEY hkey, DWORD *max_subkey_len, DWORD *max_name_len, DWORD *max_value_len)
-    {
-        return RegQueryInfoKeyW(hkey, NULL, NULL, NULL, NULL, max_subkey_len, NULL, NULL, max_name_len, max_value_len, NULL, NULL);
-    }
-
-    /////////////////////////////////////////////////////////////////////////////
-    // Registry key handle wrapper
-    
-    template<class Ch>
-    class reg_key
-    {
-    public:
-        typedef std::basic_string<Ch> Str;
-        reg_key(HKEY root, const std::basic_string<Ch> &key, bool create):
-            hkey(0)
-        {
-            if (create)
-            {
-                LONG result = reg_create_key_ex(root, key.c_str(), KEY_WRITE, &hkey);
-                if (result != ERROR_SUCCESS)
-                    throw registry_parser_error("RegCreateKeyEx failed", result);
-            }
-            else
-            {
-                LONG result = reg_open_key_ex(root, key.c_str(), KEY_READ, &hkey);
-                if (result != ERROR_SUCCESS)
-                    throw registry_parser_error("RegOpenKeyEx failed", result);
-            }
-            BOOST_ASSERT(hkey);
-        }
-        ~reg_key()
-        {
-            BOOST_ASSERT(hkey);
-            RegCloseKey(hkey);
-        }
-        HKEY handle()
-        {
-            BOOST_ASSERT(hkey);
-            return hkey;
-        }
-    private:
-        HKEY hkey;
-    };
-    
-    /////////////////////////////////////////////////////////////////////////////
-    // Registry parser
-    
-    //! Read registry
-    template<class Ptree>
-    void read_registry(HKEY root, 
-                       const std::basic_string<typename Ptree::char_type> &key, 
-                       Ptree &pt)
-    {
-
-        typedef typename Ptree::char_type Ch;
-        typedef std::basic_string<Ch> Str;
-        typedef std::basic_stringstream<Ch> Stream;
-        
-        Ptree local;
-        
-        // Open key
-        reg_key<Ch> rk(root, key, false);
-        
-        // Query key info
-        DWORD max_subkey_len, max_name_len, max_value_len;
-        LONG result = reg_query_info_key<Ch>(rk.handle(), &max_subkey_len, &max_name_len, &max_value_len);
-        if (result != ERROR_SUCCESS)
-            throw registry_parser_error("RegQueryInfoKey failed", result);
-
-        // For all subkeys
-        std::vector<Ch> subkey(max_subkey_len + 1);
-        for (DWORD index = 0; true; ++index)
-        {
-            
-            // Get subkey name
-            DWORD size = static_cast<DWORD>(subkey.size());
-            LONG result = reg_enum_key_ex(rk.handle(), index, &subkey.front(), &size);
-            if (result == ERROR_NO_MORE_ITEMS)
-                break;
-            if (result != ERROR_SUCCESS)
-                throw registry_parser_error("RegEnumKeyEx failed", result);
-            
-            // Parse recursively
-            Ptree &child = local.push_back(typename Ptree::value_type(&subkey.front(), Ptree()))->second;
-            read_registry<Ptree>(rk.handle(), &subkey.front(), child);
-
-        }
-
-        // For all values
-        for (DWORD index = 0; true; ++index)
-        {
-
-            // Resize data to max size
-            std::vector<Ch> name(max_name_len + 1);
-            std::vector<BYTE> data(max_value_len + 1);
-            
-            // Get name and value from registry
-            DWORD name_size = static_cast<DWORD>(name.size());
-            DWORD data_size = static_cast<DWORD>(data.size());
-            DWORD type;
-            result = reg_enum_value<Ch>(rk.handle(), index, &name.front(), &name_size, &type, &data.front(), &data_size);
-            if (result == ERROR_NO_MORE_ITEMS)
-                break;
-            if (result != ERROR_SUCCESS)
-                throw registry_parser_error("RegEnumValue failed", result);
-
-            // Truncate data to actual size
-            name.resize(name_size + 1);
-            data.resize(data_size);
-
-            // Translate and put value in tree
-            Str value = translate<Ch>(type, data);
-            if (name_size > 0)
-            {
-                local.put(Str(detail::widen<Ch>("\\values.") + &name.front()), value);
-                local.put(Str(detail::widen<Ch>("\\types.") + &name.front()), type);
-            }
-            else
-                local.data() = value;
-
-        }
-
-        // Swap pt and local
-        pt.swap(local);
-
-    }
-
-    //! Write registry
-    template<class Ptree>
-    void write_registry(HKEY root, 
-                        const std::basic_string<typename Ptree::char_type> &key, 
-                        const Ptree &pt)
-    {
-
-        typedef typename Ptree::char_type Ch;
-        typedef std::basic_string<Ch> Str;
-        typedef std::basic_stringstream<Ch> Stream;
-        
-        // Create key
-        reg_key<Ch> rk(root, key, true);
-
-        // Set default key value
-        if (!pt.data().empty())
-        {
-            std::vector<BYTE> data = translate<Ch>(REG_SZ, pt.data());
-            reg_set_value_ex<Ch>(rk.handle(), NULL, REG_SZ, 
-                                 data.empty() ? NULL : &data.front(), 
-                                 static_cast<DWORD>(data.size()));
-        }
-
-        // Create values
-        const Ptree &values = pt.get_child(detail::widen<Ch>("\\values"), empty_ptree<Ptree>());
-        const Ptree &types = pt.get_child(detail::widen<Ch>("\\types"), empty_ptree<Ptree>());
-        for (typename Ptree::const_iterator it = values.begin(), end = values.end(); it != end; ++it)
-        {
-            DWORD type = types.get(it->first, REG_SZ);
-            std::vector<BYTE> data = translate<Ch>(type, it->second.data());
-            reg_set_value_ex<Ch>(rk.handle(), it->first.c_str(), type, 
-                                 data.empty() ? NULL : &data.front(), 
-                                 static_cast<DWORD>(data.size()));
-        }
-
-        // Create subkeys
-        for (typename Ptree::const_iterator it = pt.begin(), end = pt.end(); it != end; ++it)
-            if (&it->second != &values && &it->second != &types)
-                write_registry(rk.handle(), it->first, it->second);
-
-    }
-
-} } }
-
-namespace boost { namespace property_tree
-{
-    using registry_parser::read_registry;
-    using registry_parser::write_registry;
-    using registry_parser::registry_parser_error;
-} }
-
-#endif
diff --git a/boost/property_tree/xml_parser.hpp b/boost/property_tree/xml_parser.hpp
deleted file mode 100644
index 6178aa2..0000000
--- a/boost/property_tree/xml_parser.hpp
+++ /dev/null
@@ -1,86 +0,0 @@
-// ----------------------------------------------------------------------------
-// Copyright (C) 2002-2005 Marcin Kalicinski
-//
-// Distributed under the Boost Software License, Version 1.0. 
-// (See accompanying file LICENSE_1_0.txt or copy at 
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see www.boost.org
-// ----------------------------------------------------------------------------
-#ifndef BOOST_PROPERTY_TREE_XML_PARSER_HPP_INCLUDED
-#define BOOST_PROPERTY_TREE_XML_PARSER_HPP_INCLUDED
-
-#include <boost/property_tree/ptree.hpp>
-#include <boost/property_tree/detail/xml_parser_write.hpp>
-#include <boost/property_tree/detail/xml_parser_error.hpp>
-#include <boost/property_tree/detail/xml_parser_flags.hpp>
-
-// Include proper parser
-#ifdef BOOST_PROPERTY_TREE_XML_PARSER_TINYXML
-#include <boost/property_tree/detail/xml_parser_read_tinyxml.hpp>
-#else
-#include <boost/property_tree/detail/xml_parser_read_spirit.hpp>
-#endif
-
-#include <fstream>
-#include <string>
-#include <locale>
-
-namespace boost { namespace property_tree { namespace xml_parser
-{
-
-    // Read XML from stream
-    template<class Ptree>
-    void read_xml(std::basic_istream<typename Ptree::char_type> &stream,
-                  Ptree &pt,
-                  int flags = 0)
-    {
-        read_xml_internal(stream, pt, flags, std::string());
-    }
-
-    // Read XML from file
-    template<class Ptree>
-    void read_xml(const std::string &filename,
-                  Ptree &pt,
-                  int flags = 0,
-                  const std::locale &loc = std::locale())
-    {
-        BOOST_ASSERT(validate_flags(flags));
-        std::basic_ifstream<typename Ptree::char_type> stream(filename.c_str());
-        if (!stream)
-            throw xml_parser_error("cannot open file", filename, 0);
-        stream.imbue(loc);
-        read_xml_internal(stream, pt, flags, filename);
-    }
-
-    // Write XML to stream
-    template<class Ptree>
-    void write_xml(std::basic_ostream<typename Ptree::char_type> &stream, 
-                   const Ptree &pt)
-    {
-        write_xml_internal(stream, pt, std::string());
-    }
-
-    // Write XML to file
-    template<class Ptree>
-    void write_xml(const std::string &filename,
-                   const Ptree &pt,
-                   const std::locale &loc = std::locale())
-    {
-        std::basic_ofstream<typename Ptree::char_type> stream(filename.c_str());
-        if (!stream)
-            throw xml_parser_error("cannot open file", filename, 0);
-        stream.imbue(loc);
-        write_xml_internal(stream, pt, filename);
-    }
-
-} } }
-
-namespace boost { namespace property_tree
-{
-    using xml_parser::read_xml;
-    using xml_parser::write_xml;
-    using xml_parser::xml_parser_error;
-} }
-
-#endif
diff --git a/configure b/configure
new file mode 100755
index 0000000..141f72c
--- /dev/null
+++ b/configure
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+python scons/scons.py configure $@
diff --git a/demo/c++/SConscript b/demo/c++/SConscript
deleted file mode 100644
index c5bf402..0000000
--- a/demo/c++/SConscript
+++ /dev/null
@@ -1,51 +0,0 @@
-#
-# This file is part of Mapnik (c++ mapping toolkit)
-#
-# Copyright (C) 2009 Artem Pavlenko, Dane Springmeyer
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-# $Id$
-
-Import ('env')
-
-prefix = env['PREFIX']
-install_prefix = env['DESTDIR'] + '/' + prefix
-
-source = Split(
-    """
-    rundemo.cpp
-    """
-    )
-
-headers = env['CPPPATH'] 
-
-boost_thread  = 'boost_thread%s' % env['BOOST_APPEND']
-
-libraries =  [boost_thread,'mapnik']
-
-if '-DHAVE_CAIRO' in env['CXXFLAGS']:
-    # add cairo and cairomm-1.0 to libs
-    libraries.append([lib for lib in env['LIBS'] if lib.startswith('cairo')])
-
-if env['PLATFORM'] == 'Darwin':
-    libraries.append(env['ICU_LIB_NAME'])
-   
-rundemo = env.Program('rundemo', source, CPPPATH=headers, LIBS=libraries)
-
-# we don't install this app because the datasource paths are relative
-# and we're not going to install the sample data.
-#env.Install(install_prefix + '/bin', rundemo)
-#env.Alias('install', install_prefix + '/bin')
\ No newline at end of file
diff --git a/demo/c++/build.py b/demo/c++/build.py
new file mode 100644
index 0000000..f08772e
--- /dev/null
+++ b/demo/c++/build.py
@@ -0,0 +1,53 @@
+#
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2009 Artem Pavlenko, Dane Springmeyer
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+import os
+from copy import copy
+
+Import ('env')
+
+source = Split(
+    """
+    rundemo.cpp
+    """
+    )
+
+demo_env = env.Clone()
+
+
+demo_env['CXXFLAGS'] = copy(env['LIBMAPNIK_CXXFLAGS'])
+
+if env['HAS_CAIRO']:
+    demo_env.PrependUnique(CPPPATH=env['CAIROMM_CPPPATHS'])
+    demo_env.Append(CXXFLAGS = '-DHAVE_CAIRO')
+
+libraries =  copy(env['LIBMAPNIK_LIBS'])
+boost_program_options = 'boost_program_options%s' % env['BOOST_APPEND']
+libraries.extend([boost_program_options,'mapnik2'])
+
+rundemo = demo_env.Program('rundemo', source, LIBS=libraries, LINKFLAGS=env["CUSTOM_LDFLAGS"])
+
+Depends(rundemo, env.subst('../../src/%s' % env['MAPNIK_LIB_NAME']))
+
+# we don't install this app because the datasource paths are relative
+# and we're not going to install the sample data.
+#env.Install(install_prefix + '/bin', rundemo)
+#env.Alias('install', install_prefix + '/bin')
\ No newline at end of file
diff --git a/demo/c++/rundemo.cpp b/demo/c++/rundemo.cpp
index 00cd0f1..4216dd6 100644
--- a/demo/c++/rundemo.cpp
+++ b/demo/c++/rundemo.cpp
@@ -43,7 +43,7 @@ int main ( int argc , char** argv)
 {    
     if (argc != 2)
     {
-        std::cout << "usage: ./rundemo <mapnik_install_dir>\nUsually /usr/local/lib/mapnik\n";
+        std::cout << "usage: ./rundemo <mapnik_install_dir>\nUsually /usr/local/lib/mapnik2\n";
         std::cout << "Warning: ./rundemo looks for data in ../data/,\nTherefore must be run from within the demo/c++ folder.\n";
         return EXIT_SUCCESS;
     }
@@ -65,13 +65,13 @@ int main ( int argc , char** argv)
         // Provinces (polygon)
         feature_type_style provpoly_style;
        
-        rule_type provpoly_rule_on;
-        provpoly_rule_on.set_filter(create_filter("[NAME_EN] = 'Ontario'"));
+        rule provpoly_rule_on;
+        provpoly_rule_on.set_filter(parse_expression("[NAME_EN] = 'Ontario'"));
         provpoly_rule_on.append(polygon_symbolizer(color(250, 190, 183)));
         provpoly_style.add_rule(provpoly_rule_on);
         
-        rule_type provpoly_rule_qc;
-        provpoly_rule_qc.set_filter(create_filter("[NOM_FR] = 'Qu\xe9""bec'"));
+        rule provpoly_rule_qc;
+        provpoly_rule_qc.set_filter(parse_expression("[NOM_FR] = 'Québec'"));
         provpoly_rule_qc.append(polygon_symbolizer(color(217, 235, 203)));
         provpoly_style.add_rule(provpoly_rule_qc);
         
@@ -85,7 +85,7 @@ int main ( int argc , char** argv)
         provlines_stk.add_dash(2, 2);
         provlines_stk.add_dash(2, 2);
         
-        rule_type provlines_rule;
+        rule provlines_rule;
         provlines_rule.append(line_symbolizer(provlines_stk));
         provlines_style.add_rule(provlines_rule);
         
@@ -94,8 +94,8 @@ int main ( int argc , char** argv)
         // Drainage 
         feature_type_style qcdrain_style;
         
-        rule_type qcdrain_rule;
-        qcdrain_rule.set_filter(create_filter("[HYC] = 8"));
+        rule qcdrain_rule;
+        qcdrain_rule.set_filter(parse_expression("[HYC] = 8"));
         qcdrain_rule.append(polygon_symbolizer(color(153, 204, 255)));
         qcdrain_style.add_rule(qcdrain_rule);
         
@@ -103,8 +103,8 @@ int main ( int argc , char** argv)
         
         // Roads 3 and 4 (The "grey" roads)
         feature_type_style roads34_style;    
-        rule_type roads34_rule;
-        roads34_rule.set_filter(create_filter("[CLASS] = 3 or [CLASS] = 4"));
+        rule roads34_rule;
+        roads34_rule.set_filter(parse_expression("[CLASS] = 3 or [CLASS] = 4"));
         stroke roads34_rule_stk(color(171,158,137),2.0);
         roads34_rule_stk.set_line_cap(ROUND_CAP);
         roads34_rule_stk.set_line_join(ROUND_JOIN);
@@ -116,8 +116,8 @@ int main ( int argc , char** argv)
 
         // Roads 2 (The thin yellow ones)
         feature_type_style roads2_style_1;
-        rule_type roads2_rule_1;
-        roads2_rule_1.set_filter(create_filter("[CLASS] = 2"));
+        rule roads2_rule_1;
+        roads2_rule_1.set_filter(parse_expression("[CLASS] = 2"));
         stroke roads2_rule_stk_1(color(171,158,137),4.0);
         roads2_rule_stk_1.set_line_cap(ROUND_CAP);
         roads2_rule_stk_1.set_line_join(ROUND_JOIN);
@@ -127,8 +127,8 @@ int main ( int argc , char** argv)
         m.insert_style("road-border", roads2_style_1);
         
         feature_type_style roads2_style_2;
-        rule_type roads2_rule_2;
-        roads2_rule_2.set_filter(create_filter("[CLASS] = 2"));
+        rule roads2_rule_2;
+        roads2_rule_2.set_filter(parse_expression("[CLASS] = 2"));
         stroke roads2_rule_stk_2(color(255,250,115),2.0);
         roads2_rule_stk_2.set_line_cap(ROUND_CAP);
         roads2_rule_stk_2.set_line_join(ROUND_JOIN);
@@ -139,8 +139,8 @@ int main ( int argc , char** argv)
         
         // Roads 1 (The big orange ones, the highways)
         feature_type_style roads1_style_1;
-        rule_type roads1_rule_1;
-        roads1_rule_1.set_filter(create_filter("[CLASS] = 1"));
+        rule roads1_rule_1;
+        roads1_rule_1.set_filter(parse_expression("[CLASS] = 1"));
         stroke roads1_rule_stk_1(color(188,149,28),7.0);
         roads1_rule_stk_1.set_line_cap(ROUND_CAP);
         roads1_rule_stk_1.set_line_join(ROUND_JOIN);
@@ -149,8 +149,8 @@ int main ( int argc , char** argv)
         m.insert_style("highway-border", roads1_style_1);
         
         feature_type_style roads1_style_2;
-        rule_type roads1_rule_2;
-        roads1_rule_2.set_filter(create_filter("[CLASS] = 1"));
+        rule roads1_rule_2;
+        roads1_rule_2.set_filter(parse_expression("[CLASS] = 1"));
         stroke roads1_rule_stk_2(color(242,191,36),5.0);
         roads1_rule_stk_2.set_line_cap(ROUND_CAP);
         roads1_rule_stk_2.set_line_join(ROUND_JOIN);
@@ -161,8 +161,8 @@ int main ( int argc , char** argv)
         // Populated Places
         
         feature_type_style popplaces_style;
-        rule_type popplaces_rule;
-        text_symbolizer popplaces_text_symbolizer("GEONAME","DejaVu Sans Book",10,color(0,0,0));
+        rule popplaces_rule;
+        text_symbolizer popplaces_text_symbolizer(parse_expression("[GEONAME]"),"DejaVu Sans Book",10,color(0,0,0));
         popplaces_text_symbolizer.set_halo_fill(color(255,255,200));
         popplaces_text_symbolizer.set_halo_radius(1);
         popplaces_rule.append(popplaces_text_symbolizer);
@@ -170,14 +170,14 @@ int main ( int argc , char** argv)
         
         m.insert_style("popplaces",popplaces_style );
         
-        // Layers
+        // layers
         // Provincial  polygons
         {
             parameters p;
             p["type"]="shape";
             p["file"]="../data/boundaries";
             
-            Layer lyr("Provinces"); 
+            layer lyr("Provinces"); 
             lyr.set_datasource(datasource_cache::instance()->create(p));
             lyr.add_style("provinces");    
             m.addLayer(lyr);
@@ -188,7 +188,7 @@ int main ( int argc , char** argv)
             parameters p;
             p["type"]="shape";
             p["file"]="../data/qcdrainage";
-            Layer lyr("Quebec Hydrography");
+            layer lyr("Quebec Hydrography");
             lyr.set_datasource(datasource_cache::instance()->create(p));
             lyr.add_style("drainage");    
             m.addLayer(lyr);
@@ -199,7 +199,7 @@ int main ( int argc , char** argv)
             p["type"]="shape";
             p["file"]="../data/ontdrainage";
             
-            Layer lyr("Ontario Hydrography"); 
+            layer lyr("Ontario Hydrography"); 
             lyr.set_datasource(datasource_cache::instance()->create(p));
             lyr.add_style("drainage");    
             m.addLayer(lyr);
@@ -210,7 +210,7 @@ int main ( int argc , char** argv)
             parameters p;
             p["type"]="shape";
             p["file"]="../data/boundaries_l";
-            Layer lyr("Provincial borders"); 
+            layer lyr("Provincial borders"); 
             lyr.set_datasource(datasource_cache::instance()->create(p));
             lyr.add_style("provlines");    
             m.addLayer(lyr);
@@ -221,7 +221,7 @@ int main ( int argc , char** argv)
             parameters p;
             p["type"]="shape";
             p["file"]="../data/roads";        
-            Layer lyr("Roads"); 
+            layer lyr("Roads"); 
             lyr.set_datasource(datasource_cache::instance()->create(p));
             lyr.add_style("smallroads");
             lyr.add_style("road-border");
@@ -237,22 +237,22 @@ int main ( int argc , char** argv)
             p["type"]="shape";
             p["file"]="../data/popplaces";
             p["encoding"] = "latin1";
-            Layer lyr("Populated Places");
+            layer lyr("Populated Places");
             lyr.set_datasource(datasource_cache::instance()->create(p));
             lyr.add_style("popplaces");    
             m.addLayer(lyr);
         }
         
-        m.zoomToBox(Envelope<double>(1405120.04127408,-247003.813399447,
+        m.zoom_to_box(box2d<double>(1405120.04127408,-247003.813399447,
                                      1706357.31328276,-25098.593149577));
         
-        Image32 buf(m.getWidth(),m.getHeight());
-        agg_renderer<Image32> ren(m,buf);
+        image_32 buf(m.width(),m.height());
+        agg_renderer<image_32> ren(m,buf);
         ren.apply();
         
-        save_to_file<ImageData32>(buf.data(),"demo.jpg","jpeg");
-        save_to_file<ImageData32>(buf.data(),"demo.png","png");
-        save_to_file<ImageData32>(buf.data(),"demo256.png","png256");
+        save_to_file<image_data_32>(buf.data(),"demo.jpg","jpeg");
+        save_to_file<image_data_32>(buf.data(),"demo.png","png");
+        save_to_file<image_data_32>(buf.data(),"demo256.png","png256");
         std::cout << "Three maps have been rendered using AGG in the current directory:\n"
            "- demo.jpg\n"
            "- demo.png\n"
@@ -262,20 +262,20 @@ int main ( int argc , char** argv)
         #if defined(HAVE_CAIRO)
         Cairo::RefPtr<Cairo::ImageSurface> image_surface;
 
-        image_surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, m.getWidth(),m.getHeight());
+        image_surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, m.width(),m.height());
         cairo_renderer<Cairo::Surface> png_render(m, image_surface);
         png_render.apply();
         image_surface->write_to_png("cairo-demo.png");
 
-        Image32 im(image_surface);
+        image_32 im(image_surface);
         save_to_file(im, "cairo-demo256.png","png256");
 
         Cairo::RefPtr<Cairo::Surface> surface;
-        surface = Cairo::PdfSurface::create("cairo-demo.pdf", m.getWidth(),m.getHeight());
+        surface = Cairo::PdfSurface::create("cairo-demo.pdf", m.width(),m.height());
         cairo_renderer<Cairo::Surface> pdf_render(m, surface);
         pdf_render.apply();
 
-        surface = Cairo::SvgSurface::create("cairo-demo.svg", m.getWidth(),m.getHeight());
+        surface = Cairo::SvgSurface::create("cairo-demo.svg", m.width(),m.height());
         cairo_renderer<Cairo::Surface> svg_render(m, surface);
         svg_render.apply();
 
diff --git a/demo/python/rundemo.py b/demo/python/rundemo.py
index 19a96b9..b4e8194 100644
--- a/demo/python/rundemo.py
+++ b/demo/python/rundemo.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 #
-# $Id: rundemo.py 1692 2010-03-12 18:28:20Z dane $
+# $Id: rundemo.py 2300 2010-11-03 13:18:56Z artem $
 #
 # This file is part of Mapnik (c++ mapping toolkit)
 # Copyright (C) 2005 Jean-Francois Doyon
@@ -26,7 +26,7 @@
 import sys
 
 try:
-    import mapnik
+    import mapnik2
 except:
     print '\n\nThe mapnik library and python bindings must have been compiled and \
 installed successfully before running this script.\n\n'
@@ -41,11 +41,11 @@ except ImportError:
 # Instanciate a map, giving it a width and height. Remember: the word "map" is
 # reserved in Python! :)
 
-m = mapnik.Map(800,600,"+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs")
+m = mapnik2.Map(800,600,"+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs")
 
 # Set its background colour. More on colours later ...
 
-m.background = mapnik.Color('white')
+m.background = mapnik2.Color('white')
 
 # Now we can start adding layers, in stacking order (i.e. bottom layer first)
 
@@ -66,9 +66,9 @@ m.background = mapnik.Color('white')
 #     password='mypassword'
 #     table= TODO
 
-provpoly_lyr = mapnik.Layer('Provinces')
+provpoly_lyr = mapnik2.Layer('Provinces')
 provpoly_lyr.srs = "+proj=lcc +ellps=GRS80 +lat_0=49 +lon_0=-95 +lat+1=49 +lat_2=77 +datum=NAD83 +units=m +no_defs"
-provpoly_lyr.datasource = mapnik.Shapefile(file='../data/boundaries', encoding='latin1')
+provpoly_lyr.datasource = mapnik2.Shapefile(file='../data/boundaries', encoding='latin1')
 
 # We then define a style for the layer.  A layer can have one or many styles.
 # Styles are named, so they can be shared across different layers.
@@ -78,18 +78,18 @@ provpoly_lyr.datasource = mapnik.Shapefile(file='../data/boundaries', encoding='
 # multiple styles in one layer is the same has having multiple layers.
 # The paradigm is useful mostly as a convenience.
 
-provpoly_style = mapnik.Style()
+provpoly_style = mapnik2.Style()
 
 # A Style needs one or more rules.  A rule will normally consist of a filter
 # for feature selection, and one or more symbolizers.
 
-provpoly_rule_on = mapnik.Rule()
+provpoly_rule_on = mapnik2.Rule()
 
-# A Filter() allows the selection of features to which the symbology will
+# A Expression() allows the selection of features to which the symbology will
 # be applied.  More on Mapnik expressions can be found in Tutorial #2.
 # A given feature can only match one filter per rule per style.
 
-provpoly_rule_on.filter = mapnik.Filter("[NAME_EN] = 'Ontario'")
+provpoly_rule_on.filter = mapnik2.Expression("[NAME_EN] = 'Ontario'")
 
 # Here a symbolizer is defined.  Available are:
 #     - LineSymbolizer(Color(),<width>)
@@ -103,12 +103,12 @@ provpoly_rule_on.filter = mapnik.Filter("[NAME_EN] = 'Ontario'")
 #     - Color(<string>) where <string> will be something like '#00FF00'
 #       or '#0f0' or 'green'
 
-provpoly_rule_on.symbols.append(mapnik.PolygonSymbolizer(mapnik.Color(250, 190, 183)))
+provpoly_rule_on.symbols.append(mapnik2.PolygonSymbolizer(mapnik2.Color(250, 190, 183)))
 provpoly_style.rules.append(provpoly_rule_on)
 
-provpoly_rule_qc = mapnik.Rule()
-provpoly_rule_qc.filter = mapnik.Filter("[NOM_FR] = 'Québec'")
-provpoly_rule_qc.symbols.append(mapnik.PolygonSymbolizer(mapnik.Color(217, 235, 203)))
+provpoly_rule_qc = mapnik2.Rule()
+provpoly_rule_qc.filter = mapnik2.Expression("[NOM_FR] = 'Québec'")
+provpoly_rule_qc.symbols.append(mapnik2.PolygonSymbolizer(mapnik2.Color(217, 235, 203)))
 provpoly_style.rules.append(provpoly_rule_qc)
 
 # Add the style to the map, giving it a name.  This is the name that will be
@@ -131,14 +131,14 @@ m.layers.append(provpoly_lyr)
 
 # A simple example ...
 
-qcdrain_lyr = mapnik.Layer('Quebec Hydrography')
+qcdrain_lyr = mapnik2.Layer('Quebec Hydrography')
 qcdrain_lyr.srs = "+proj=lcc +ellps=GRS80 +lat_0=49 +lon_0=-95 +lat+1=49 +lat_2=77 +datum=NAD83 +units=m +no_defs"
-qcdrain_lyr.datasource = mapnik.Shapefile(file='../data/qcdrainage')
+qcdrain_lyr.datasource = mapnik2.Shapefile(file='../data/qcdrainage')
 
-qcdrain_style = mapnik.Style()
-qcdrain_rule = mapnik.Rule()
-qcdrain_rule.filter = mapnik.Filter('[HYC] = 8')
-qcdrain_rule.symbols.append(mapnik.PolygonSymbolizer(mapnik.Color(153, 204, 255)))
+qcdrain_style = mapnik2.Style()
+qcdrain_rule = mapnik2.Rule()
+qcdrain_rule.filter = mapnik2.Expression('[HYC] = 8')
+qcdrain_rule.symbols.append(mapnik2.PolygonSymbolizer(mapnik2.Color(153, 204, 255)))
 qcdrain_style.rules.append(qcdrain_rule)
 
 m.append_style('drainage', qcdrain_style)
@@ -149,31 +149,31 @@ m.layers.append(qcdrain_lyr)
 # attributes, and same desired style), so we're going to
 # re-use the style defined in the above layer for the next one.
 
-ondrain_lyr = mapnik.Layer('Ontario Hydrography')
+ondrain_lyr = mapnik2.Layer('Ontario Hydrography')
 ondrain_lyr.srs = "+proj=lcc +ellps=GRS80 +lat_0=49 +lon_0=-95 +lat+1=49 +lat_2=77 +datum=NAD83 +units=m +no_defs"
-ondrain_lyr.datasource = mapnik.Shapefile(file='../data/ontdrainage')
+ondrain_lyr.datasource = mapnik2.Shapefile(file='../data/ontdrainage')
 
 ondrain_lyr.styles.append('drainage')
 m.layers.append(ondrain_lyr)
 
 # Provincial boundaries
 
-provlines_lyr = mapnik.Layer('Provincial borders')
+provlines_lyr = mapnik2.Layer('Provincial borders')
 provlines_lyr.srs = "+proj=lcc +ellps=GRS80 +lat_0=49 +lon_0=-95 +lat+1=49 +lat_2=77 +datum=NAD83 +units=m +no_defs"
-provlines_lyr.datasource = mapnik.Shapefile(file='../data/boundaries_l')
+provlines_lyr.datasource = mapnik2.Shapefile(file='../data/boundaries_l')
 
 # Here we define a "dash dot dot dash" pattern for the provincial boundaries.
 
-provlines_stk = mapnik.Stroke()
+provlines_stk = mapnik2.Stroke()
 provlines_stk.add_dash(8, 4)
 provlines_stk.add_dash(2, 2)
 provlines_stk.add_dash(2, 2)
-provlines_stk.color = mapnik.Color('black')
+provlines_stk.color = mapnik2.Color('black')
 provlines_stk.width = 1.0
 
-provlines_style = mapnik.Style()
-provlines_rule = mapnik.Rule()
-provlines_rule.symbols.append(mapnik.LineSymbolizer(provlines_stk))
+provlines_style = mapnik2.Style()
+provlines_rule = mapnik2.Rule()
+provlines_rule.symbols.append(mapnik2.LineSymbolizer(provlines_stk))
 provlines_style.rules.append(provlines_rule)
 
 m.append_style('provlines', provlines_style)
@@ -182,22 +182,22 @@ m.layers.append(provlines_lyr)
 
 # Roads 3 and 4 (The "grey" roads)
 
-roads34_lyr = mapnik.Layer('Roads')
+roads34_lyr = mapnik2.Layer('Roads')
 roads34_lyr.srs = "+proj=lcc +ellps=GRS80 +lat_0=49 +lon_0=-95 +lat+1=49 +lat_2=77 +datum=NAD83 +units=m +no_defs"
 # create roads datasource (we're going to re-use it later) 
 
-roads34_lyr.datasource = mapnik.Shapefile(file='../data/roads')
+roads34_lyr.datasource = mapnik2.Shapefile(file='../data/roads')
 
-roads34_style = mapnik.Style()
-roads34_rule = mapnik.Rule()
-roads34_rule.filter = mapnik.Filter('[CLASS] = 3 or [CLASS] = 4')
+roads34_style = mapnik2.Style()
+roads34_rule = mapnik2.Rule()
+roads34_rule.filter = mapnik2.Expression('([CLASS] = 3) or ([CLASS] = 4)')
 
 # With lines of a certain width, you can control how the ends
 # are closed off using line_cap as below.
 
-roads34_rule_stk = mapnik.Stroke()
-roads34_rule_stk.color = mapnik.Color(171,158,137)
-roads34_rule_stk.line_cap = mapnik.line_cap.ROUND_CAP
+roads34_rule_stk = mapnik2.Stroke()
+roads34_rule_stk.color = mapnik2.Color(171,158,137)
+roads34_rule_stk.line_cap = mapnik2.line_cap.ROUND_CAP
 
 # Available options are:
 # line_cap: BUTT_CAP, SQUARE_CAP, ROUND_CAP
@@ -207,7 +207,7 @@ roads34_rule_stk.line_cap = mapnik.line_cap.ROUND_CAP
 # can be set to a numerical value.
 
 roads34_rule_stk.width = 2.0
-roads34_rule.symbols.append(mapnik.LineSymbolizer(roads34_rule_stk))
+roads34_rule.symbols.append(mapnik2.LineSymbolizer(roads34_rule_stk))
 roads34_style.rules.append(roads34_rule)
 
 m.append_style('smallroads', roads34_style)
@@ -216,31 +216,31 @@ m.layers.append(roads34_lyr)
 
 # Roads 2 (The thin yellow ones)
 
-roads2_lyr = mapnik.Layer('Roads')
+roads2_lyr = mapnik2.Layer('Roads')
 roads2_lyr.srs = "+proj=lcc +ellps=GRS80 +lat_0=49 +lon_0=-95 +lat+1=49 +lat_2=77 +datum=NAD83 +units=m +no_defs"
 # Just get a copy from roads34_lyr
 roads2_lyr.datasource = roads34_lyr.datasource 
 
-roads2_style_1 = mapnik.Style()
-roads2_rule_1 = mapnik.Rule()
-roads2_rule_1.filter = mapnik.Filter('[CLASS] = 2')
-roads2_rule_stk_1 = mapnik.Stroke()
-roads2_rule_stk_1.color = mapnik.Color(171,158,137)
-roads2_rule_stk_1.line_cap = mapnik.line_cap.ROUND_CAP
+roads2_style_1 = mapnik2.Style()
+roads2_rule_1 = mapnik2.Rule()
+roads2_rule_1.filter = mapnik2.Expression('[CLASS] = 2')
+roads2_rule_stk_1 = mapnik2.Stroke()
+roads2_rule_stk_1.color = mapnik2.Color(171,158,137)
+roads2_rule_stk_1.line_cap = mapnik2.line_cap.ROUND_CAP
 roads2_rule_stk_1.width = 4.0
-roads2_rule_1.symbols.append(mapnik.LineSymbolizer(roads2_rule_stk_1))
+roads2_rule_1.symbols.append(mapnik2.LineSymbolizer(roads2_rule_stk_1))
 roads2_style_1.rules.append(roads2_rule_1)
 
 m.append_style('road-border', roads2_style_1)
 
-roads2_style_2 = mapnik.Style()
-roads2_rule_2 = mapnik.Rule()
-roads2_rule_2.filter = mapnik.Filter('[CLASS] = 2')
-roads2_rule_stk_2 = mapnik.Stroke()
-roads2_rule_stk_2.color = mapnik.Color(255,250,115)
-roads2_rule_stk_2.line_cap = mapnik.line_cap.ROUND_CAP
+roads2_style_2 = mapnik2.Style()
+roads2_rule_2 = mapnik2.Rule()
+roads2_rule_2.filter = mapnik2.Expression('[CLASS] = 2')
+roads2_rule_stk_2 = mapnik2.Stroke()
+roads2_rule_stk_2.color = mapnik2.Color(255,250,115)
+roads2_rule_stk_2.line_cap = mapnik2.line_cap.ROUND_CAP
 roads2_rule_stk_2.width = 2.0
-roads2_rule_2.symbols.append(mapnik.LineSymbolizer(roads2_rule_stk_2))
+roads2_rule_2.symbols.append(mapnik2.LineSymbolizer(roads2_rule_stk_2))
 roads2_style_2.rules.append(roads2_rule_2)
 
 m.append_style('road-fill', roads2_style_2)
@@ -252,29 +252,29 @@ m.layers.append(roads2_lyr)
 
 # Roads 1 (The big orange ones, the highways)
 
-roads1_lyr = mapnik.Layer('Roads')
+roads1_lyr = mapnik2.Layer('Roads')
 roads1_lyr.srs = "+proj=lcc +ellps=GRS80 +lat_0=49 +lon_0=-95 +lat+1=49 +lat_2=77 +datum=NAD83 +units=m +no_defs"
 roads1_lyr.datasource = roads34_lyr.datasource
 
-roads1_style_1 = mapnik.Style()
-roads1_rule_1 = mapnik.Rule()
-roads1_rule_1.filter = mapnik.Filter('[CLASS] = 1')
-roads1_rule_stk_1 = mapnik.Stroke()
-roads1_rule_stk_1.color = mapnik.Color(188,149,28)
-roads1_rule_stk_1.line_cap = mapnik.line_cap.ROUND_CAP
+roads1_style_1 = mapnik2.Style()
+roads1_rule_1 = mapnik2.Rule()
+roads1_rule_1.filter = mapnik2.Expression('[CLASS] = 1')
+roads1_rule_stk_1 = mapnik2.Stroke()
+roads1_rule_stk_1.color = mapnik2.Color(188,149,28)
+roads1_rule_stk_1.line_cap = mapnik2.line_cap.ROUND_CAP
 roads1_rule_stk_1.width = 7.0
-roads1_rule_1.symbols.append(mapnik.LineSymbolizer(roads1_rule_stk_1))
+roads1_rule_1.symbols.append(mapnik2.LineSymbolizer(roads1_rule_stk_1))
 roads1_style_1.rules.append(roads1_rule_1)
 m.append_style('highway-border', roads1_style_1)
 
-roads1_style_2 = mapnik.Style()
-roads1_rule_2 = mapnik.Rule()
-roads1_rule_2.filter = mapnik.Filter('[CLASS] = 1')
-roads1_rule_stk_2 = mapnik.Stroke()
-roads1_rule_stk_2.color = mapnik.Color(242,191,36)
-roads1_rule_stk_2.line_cap = mapnik.line_cap.ROUND_CAP
+roads1_style_2 = mapnik2.Style()
+roads1_rule_2 = mapnik2.Rule()
+roads1_rule_2.filter = mapnik2.Expression('[CLASS] = 1')
+roads1_rule_stk_2 = mapnik2.Stroke()
+roads1_rule_stk_2.color = mapnik2.Color(242,191,36)
+roads1_rule_stk_2.line_cap = mapnik2.line_cap.ROUND_CAP
 roads1_rule_stk_2.width = 5.0
-roads1_rule_2.symbols.append(mapnik.LineSymbolizer(roads1_rule_stk_2))
+roads1_rule_2.symbols.append(mapnik2.LineSymbolizer(roads1_rule_stk_2))
 roads1_style_2.rules.append(roads1_rule_2)
 
 m.append_style('highway-fill', roads1_style_2)
@@ -286,27 +286,29 @@ m.layers.append(roads1_lyr)
 
 # Populated Places
 
-popplaces_lyr = mapnik.Layer('Populated Places')
+popplaces_lyr = mapnik2.Layer('Populated Places')
 popplaces_lyr.srs = "+proj=lcc +ellps=GRS80 +lat_0=49 +lon_0=-95 +lat+1=49 +lat_2=77 +datum=NAD83 +units=m +no_defs"
-popplaces_lyr.datasource = mapnik.Shapefile(file='../data/popplaces',encoding='latin1')
+popplaces_lyr.datasource = mapnik2.Shapefile(file='../data/popplaces',encoding='latin1')
 
-popplaces_style = mapnik.Style()
-popplaces_rule = mapnik.Rule()
+popplaces_style = mapnik2.Style()
+popplaces_rule = mapnik2.Rule()
 
 # And here we have a TextSymbolizer, used for labeling.
 # The first parameter is the name of the attribute to use as the source of the
 # text to label with.  Then there is font size in points (I think?), and colour.
 
-popplaces_text_symbolizer = mapnik.TextSymbolizer('GEONAME',
+popplaces_text_symbolizer = mapnik2.TextSymbolizer(mapnik2.Expression("[GEONAME]"),
                                            'DejaVu Sans Book',
-                                           10, mapnik.Color('black'))
+                                           10, mapnik2.Color('black'))
 
 # We set a "halo" around the text, which looks like an outline if thin enough,
 # or an outright background if large enough.
-popplaces_text_symbolizer.label_placement= mapnik.label_placement.POINT_PLACEMENT
-popplaces_text_symbolizer.halo_fill = mapnik.Color('white')
+popplaces_text_symbolizer.label_placement= mapnik2.label_placement.POINT_PLACEMENT
+popplaces_text_symbolizer.halo_fill = mapnik2.Color('white')
 popplaces_text_symbolizer.halo_radius = 1
 popplaces_text_symbolizer.avoid_edges = True
+#popplaces_text_symbolizer.minimum_padding = 30
+
 popplaces_rule.symbols.append(popplaces_text_symbolizer)
 
 popplaces_style.rules.append(popplaces_rule)
@@ -318,11 +320,11 @@ m.layers.append(popplaces_lyr)
 # Draw map
 
 # Set the initial extent of the map in 'master' spherical Mercator projection
-m.zoom_to_box(mapnik.Envelope(-8024477.28459,5445190.38849,-7381388.20071,5662941.44855)) 
+m.zoom_to_box(mapnik2.Box2d(-8024477.28459,5445190.38849,-7381388.20071,5662941.44855)) 
 
 # Render two maps, two PNGs, one JPEG.
-im = mapnik.Image(m.width,m.height)
-mapnik.render(m, im)
+im = mapnik2.Image(m.width,m.height)
+mapnik2.render(m, im)
 
 # Save image to files
 images_ = []
@@ -346,37 +348,37 @@ im.save('demo_low.jpg', 'jpeg50')
 images_.append('demo_low.jpg')
 
 # Render cairo examples
-if HAS_PYCAIRO_MODULE and mapnik.has_pycairo():
+if HAS_PYCAIRO_MODULE and mapnik2.has_pycairo():
     
     svg_surface = cairo.SVGSurface('demo.svg', m.width,m.height)
-    mapnik.render(m, svg_surface)
+    mapnik2.render(m, svg_surface)
     svg_surface.finish()
     images_.append('demo.svg')
 
     pdf_surface = cairo.PDFSurface('demo.pdf', m.width,m.height)
-    mapnik.render(m, pdf_surface)
+    mapnik2.render(m, pdf_surface)
     images_.append('demo.pdf')
     pdf_surface.finish()
 
     postscript_surface = cairo.PSSurface('demo.ps', m.width,m.height)
-    mapnik.render(m, postscript_surface)
+    mapnik2.render(m, postscript_surface)
     images_.append('demo.ps')
     postscript_surface.finish()    
 
 else:
     print '\n\nPycairo not available...',
-    if  mapnik.has_cairo():
+    if  mapnik2.has_cairo():
         print ' will render Cairo formats using alternative method'
         
-        mapnik.render_to_file(m,'demo.pdf')
+        mapnik2.render_to_file(m,'demo.pdf')
         images_.append('demo.pdf')
-        mapnik.render_to_file(m,'demo.ps')
+        mapnik2.render_to_file(m,'demo.ps')
         images_.append('demo.ps')
-        mapnik.render_to_file(m,'demo.svg')
+        mapnik2.render_to_file(m,'demo.svg')
         images_.append('demo.svg')
-        mapnik.render_to_file(m,'demo_cairo_rgb.png','RGB24')
+        mapnik2.render_to_file(m,'demo_cairo_rgb.png','RGB24')
         images_.append('demo_cairo_rgb.png')
-        mapnik.render_to_file(m,'demo_cairo_argb.png','ARGB32')
+        mapnik2.render_to_file(m,'demo_cairo_argb.png','ARGB32')
         images_.append('demo_cairo_argb.png')
 
 print "\n\n", len(images_), "maps have been rendered in the current directory:"
@@ -386,4 +388,4 @@ for im_ in images_:
 
 print "\n\nHave a look!\n\n"
 
-mapnik.save_map(m,"map.xml")
+mapnik2.save_map(m,"map.xml")
diff --git a/demo/test/charplacement.py b/demo/test/charplacement.py
index 3a13765..6f89303 100644
--- a/demo/test/charplacement.py
+++ b/demo/test/charplacement.py
@@ -27,7 +27,7 @@ except:
 installed successfully before running this script.\n\n'
     raise
 
-m = Map(690,690,"+proj=latlong +ellps=WGS84")
+m = Map(690,690,"+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
 
 m.background = Color(255,100,100,255)
 
@@ -69,7 +69,7 @@ m.layers.append(road_layer)
 # Draw map
 
 # Set the initial extent of the map.
-m.zoom_to_box(Envelope(0,0,14,-14))
+m.zoom_to_box(Box2d(0,0,14,-14))
 
 
 # Render
diff --git a/demo/test/displacement.py b/demo/test/displacement.py
index e63712b..5e22826 100644
--- a/demo/test/displacement.py
+++ b/demo/test/displacement.py
@@ -27,7 +27,7 @@ except:
 installed successfully before running this script.\n\n'
     raise
 
-m = Map(690,690,"+proj=latlong +ellps=WGS84")
+m = Map(690,690,"+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
 
 m.background = Color(255,100,100,255)
 
@@ -70,7 +70,7 @@ m.layers.append(road_layer)
 # Draw map
 
 # Set the initial extent of the map.
-m.zoom_to_box(Envelope(0,0,14,-14))
+m.zoom_to_box(Box2d(0,0,14,-14))
 
 
 # Render
diff --git a/demo/test/overlap.py b/demo/test/overlap.py
index 46b8c38..a1d28a9 100644
--- a/demo/test/overlap.py
+++ b/demo/test/overlap.py
@@ -27,7 +27,7 @@ except:
 installed successfully before running this script.\n\n'
     raise
 
-m = Map(690,690,"+proj=latlong +ellps=WGS84")
+m = Map(690,690,"+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
 
 m.background = Color(255,100,100,255)
 
@@ -71,7 +71,7 @@ m.layers.append(road_layer)
 # Draw map
 
 # Set the initial extent of the map.
-m.zoom_to_box(Envelope(0,0,14,-14))
+m.zoom_to_box(Box2d(0,0,14,-14))
 
 
 # Render
diff --git a/demo/test/textspacing.py b/demo/test/textspacing.py
index 170c083..482ee40 100644
--- a/demo/test/textspacing.py
+++ b/demo/test/textspacing.py
@@ -27,7 +27,7 @@ except:
 installed successfully before running this script.\n\n'
     raise
 
-m = Map(690,690,"+proj=latlong +ellps=WGS84")
+m = Map(690,690,"+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
 
 m.background = Color(255,100,100,255)
 
@@ -69,7 +69,7 @@ m.layers.append(road_layer)
 # Draw map
 
 # Set the initial extent of the map.
-m.zoom_to_box(Envelope(0,0,14,-14))
+m.zoom_to_box(Box2d(0,0,14,-14))
 
 
 # Render
diff --git a/demo/viewer/build.py b/demo/viewer/build.py
new file mode 100644
index 0000000..ad30e7e
--- /dev/null
+++ b/demo/viewer/build.py
@@ -0,0 +1,47 @@
+#
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2010 Artem Pavlenko, Jean-Francois Doyon
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+Import ('env')
+import os
+import platform
+
+lib_dir = os.path.normpath(env['DESTDIR'] + '/' + env['PREFIX'] + '/' + env['LIBDIR_SCHEMA'] + '/mapnik2') 
+
+fonts = 1
+ini_template = '''
+[mapnik]
+plugins_dir=%(lib_dir)s/input
+fonts/1/dir=%(lib_dir)s/fonts
+'''
+
+if platform.uname()[0] == 'Darwin':
+    ini_template += 'fonts/2/dir=/Library/Fonts\n'
+    fonts += 1
+
+ini_template += 'fonts/size=%d\n' % fonts
+
+ini = ini_template % locals()
+
+open('viewer.ini','w').write(ini)
+
+try:
+    os.chmod('viewer.ini',0666)
+except: pass
diff --git a/demo/viewer/forms/layer_info.ui b/demo/viewer/forms/layer_info.ui
index ea9aaf7..eded771 100644
--- a/demo/viewer/forms/layer_info.ui
+++ b/demo/viewer/forms/layer_info.ui
@@ -1,60 +1,69 @@
-<ui version="4.0" >
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
  <author>Artem Pavlenko</author>
  <class>LayerInfoDialog</class>
- <widget class="QDialog" name="LayerInfoDialog" >
-  <property name="sizePolicy" >
-   <sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
+ <widget class="QDialog" name="LayerInfoDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>446</width>
+    <height>344</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
     <horstretch>0</horstretch>
     <verstretch>0</verstretch>
    </sizepolicy>
   </property>
-  <property name="windowTitle" >
+  <property name="windowTitle">
    <string>Layer Info</string>
   </property>
-  <property name="sizeGripEnabled" >
+  <property name="sizeGripEnabled">
    <bool>false</bool>
   </property>
-  <layout class="QGridLayout" >
-   <item row="0" column="0" >
-    <layout class="QGridLayout" >
-     <item row="0" column="0" >
-      <layout class="QHBoxLayout" >
+  <layout class="QGridLayout">
+   <item row="0" column="0">
+    <layout class="QGridLayout">
+     <item row="0" column="0">
+      <layout class="QHBoxLayout">
        <item>
-        <widget class="QLabel" name="nameLabel" >
-         <property name="text" >
+        <widget class="QLabel" name="nameLabel">
+         <property name="text">
           <string>Name:</string>
          </property>
         </widget>
        </item>
        <item>
-        <widget class="QLineEdit" name="layerNameEdit" />
+        <widget class="QLineEdit" name="layerNameEdit"/>
        </item>
       </layout>
      </item>
-     <item row="1" column="0" >
-      <layout class="QHBoxLayout" >
+     <item row="1" column="0">
+      <layout class="QHBoxLayout">
        <item>
-        <widget class="QLabel" name="stylesLabel" >
-         <property name="text" >
+        <widget class="QLabel" name="stylesLabel">
+         <property name="text">
           <string>Styles:</string>
          </property>
         </widget>
        </item>
        <item>
-        <widget class="QComboBox" name="comboBox" />
+        <widget class="QComboBox" name="comboBox"/>
        </item>
       </layout>
      </item>
-     <item row="2" column="0" >
-      <widget class="QTableWidget" name="tableWidget" />
+     <item row="2" column="0">
+      <widget class="QTableWidget" name="tableWidget"/>
      </item>
-     <item row="3" column="0" >
-      <widget class="QDialogButtonBox" name="buttonBox" >
-       <property name="orientation" >
+     <item row="3" column="0">
+      <widget class="QDialogButtonBox" name="buttonBox">
+       <property name="orientation">
         <enum>Qt::Horizontal</enum>
        </property>
-       <property name="standardButtons" >
-        <set>QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set>
+       <property name="standardButtons">
+        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
        </property>
       </widget>
      </item>
@@ -62,7 +71,6 @@
    </item>
   </layout>
  </widget>
- <includes/>
  <resources/>
  <connections>
   <connection>
@@ -71,11 +79,11 @@
    <receiver>LayerInfoDialog</receiver>
    <slot>accept()</slot>
    <hints>
-    <hint type="sourcelabel" >
+    <hint type="sourcelabel">
      <x>248</x>
      <y>254</y>
     </hint>
-    <hint type="destinationlabel" >
+    <hint type="destinationlabel">
      <x>157</x>
      <y>274</y>
     </hint>
@@ -87,11 +95,11 @@
    <receiver>LayerInfoDialog</receiver>
    <slot>reject()</slot>
    <hints>
-    <hint type="sourcelabel" >
+    <hint type="sourcelabel">
      <x>316</x>
      <y>260</y>
     </hint>
-    <hint type="destinationlabel" >
+    <hint type="destinationlabel">
      <x>286</x>
      <y>274</y>
     </hint>
diff --git a/demo/viewer/layer_info_dialog.cpp b/demo/viewer/layer_info_dialog.cpp
index 082bad2..ec23b1e 100644
--- a/demo/viewer/layer_info_dialog.cpp
+++ b/demo/viewer/layer_info_dialog.cpp
@@ -20,22 +20,48 @@
 
 #include "layer_info_dialog.hpp"
 
-layer_info_dialog::layer_info_dialog(QVector<QPair<QString,QString> > const& info, QWidget *parent)
+// mapnik
+#include <mapnik/layer.hpp>
+
+
+layer_info_dialog::layer_info_dialog(mapnik::layer& lay, QWidget *parent)
   : QDialog(parent)
 {
-   ui.setupUi(this);
-   //ui.tableWidget->setHorizontalHeaderItem(0,new QTableWidgetItem("Name"));
-   //ui.tableWidget->setHorizontalHeaderItem(1,new QTableWidgetItem("Value"));
-   
-   ui.tableWidget->setRowCount(info.size());
-   ui.tableWidget->setColumnCount(2);
-   for (int i=0;i<info.size();++i)
-   {
-      QTableWidgetItem *keyItem = new QTableWidgetItem(info[i].first);
-      QTableWidgetItem *valueItem = new QTableWidgetItem(info[i].second);
-      ui.tableWidget->setItem(i,0,keyItem);
-      ui.tableWidget->setItem(i,1,valueItem); 
-   }
+    ui.setupUi(this);
+    
+    ui.tableWidget->setHorizontalHeaderItem(0,new QTableWidgetItem("Name"));
+    ui.tableWidget->setHorizontalHeaderItem(1,new QTableWidgetItem("Value"));
+    
+    // Layer name
+    ui.layerNameEdit->setText(QString(lay.name().c_str()));
+
+    // Named Styles : TODO!!!
+    
+    // Datasource
+    mapnik::datasource_ptr ds = lay.datasource();
+    if (ds)
+    {
+        mapnik::parameters ps = ds->params();
+
+        ui.tableWidget->setRowCount(ps.size());
+        ui.tableWidget->setColumnCount(2);
+
+        mapnik::parameters::const_iterator pos;
+        int index=0;
+        for (pos = ps.begin();pos != ps.end();++pos)
+        {
+            boost::optional<std::string> result;
+            boost::apply_visitor(mapnik::value_extractor_visitor<std::string>(result),pos->second);
+            if (result)
+            {
+                QTableWidgetItem *keyItem = new QTableWidgetItem(QString(pos->first.c_str()));
+                QTableWidgetItem *valueItem = new QTableWidgetItem(QString((*result).c_str()));
+                ui.tableWidget->setItem(index,0,keyItem);
+                ui.tableWidget->setItem(index,1,valueItem); 
+                ++index;
+            }
+        }   
+    }
 }
 
 Ui::LayerInfoDialog& layer_info_dialog::getUI()
diff --git a/demo/viewer/layer_info_dialog.hpp b/demo/viewer/layer_info_dialog.hpp
index ab9175e..d9ecb8a 100644
--- a/demo/viewer/layer_info_dialog.hpp
+++ b/demo/viewer/layer_info_dialog.hpp
@@ -25,12 +25,17 @@
 #include "ui_layer_info.h"
 #include <QDialog>
 
+namespace mapnik
+{
+class layer;
+}
+
 class layer_info_dialog : public QDialog
 {
   Q_OBJECT
   public:
-      layer_info_dialog(QVector<QPair<QString,QString> > const& params,QWidget * parent = 0);
-      Ui::LayerInfoDialog& getUI();
+    layer_info_dialog(mapnik::layer& l, QWidget * parent = 0);
+    Ui::LayerInfoDialog& getUI();
    private:
       Ui::LayerInfoDialog ui;
 };
diff --git a/demo/viewer/layerdelegate.cpp b/demo/viewer/layerdelegate.cpp
index ab24af6..b06a129 100644
--- a/demo/viewer/layerdelegate.cpp
+++ b/demo/viewer/layerdelegate.cpp
@@ -27,7 +27,7 @@ LayerDelegate::LayerDelegate(QObject *parent)
 }
 
 void LayerDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
-                          const QModelIndex &/*index*/) const
+                          const QModelIndex &index) const
 {
     painter->setRenderHint(QPainter::Antialiasing);
     painter->setPen(QPen(QColor(255,0,0),1));
diff --git a/demo/viewer/layerdelegate.hpp b/demo/viewer/layerdelegate.hpp
index f6ccc39..d747ebe 100644
--- a/demo/viewer/layerdelegate.hpp
+++ b/demo/viewer/layerdelegate.hpp
@@ -36,7 +36,7 @@ class LayerDelegate : public QAbstractItemDelegate
 public:
     LayerDelegate(QObject *parent = 0);
     void paint(QPainter *painter, const QStyleOptionViewItem &option,
-	       const QModelIndex &index) const;    
+    const QModelIndex &index) const;    
     QSize sizeHint(const QStyleOptionViewItem &option,
                        const QModelIndex &index ) const;
 };
diff --git a/demo/viewer/layerlistmodel.cpp b/demo/viewer/layerlistmodel.cpp
index 53d1400..b8ae007 100644
--- a/demo/viewer/layerlistmodel.cpp
+++ b/demo/viewer/layerlistmodel.cpp
@@ -40,33 +40,33 @@ int LayerListModel::rowCount(QModelIndex const&) const
 QVariant LayerListModel::data(QModelIndex const& index,int role) const
 {
     if (!index.isValid() || !map_)
-	return QVariant();
+        return QVariant();
     if (index.row() < 0 || index.row() >= int(map_->layers().size()))
-	return QVariant();
+        return QVariant();
     if (role == Qt::DisplayRole)
-	return QString(map_->layers().at(index.row()).name().c_str());
+        return QString(map_->layers().at(index.row()).name().c_str());
     else if (role == Qt::DecorationRole)
     {
-	double scale = map_->scale();
-	if (map_->layers().at(index.row()).isVisible(scale))
-	{
-	    return QIcon(":/images/globe.png");
-	}
-	else
-	{
-	    return QIcon(":/images/globe_bw.png");
-	}
+        double scale = map_->scale();
+        if (map_->layers().at(index.row()).isVisible(scale))
+        {
+            return QIcon(":/images/globe.png");
+        }
+        else
+        {
+            return QIcon(":/images/globe_bw.png");
+        }
     }
     else if (role == Qt::CheckStateRole)
     {
-	if (map_->layers().at(index.row()).isActive())
+        if (map_->layers().at(index.row()).isActive())
            return QVariant(Qt::Checked);
-	else 
+        else 
            return QVariant(Qt::Unchecked);
     }
     else
     {
-	return QVariant();
+        return QVariant();
     }
 }
 
@@ -74,23 +74,23 @@ QVariant LayerListModel::headerData(int section, Qt::Orientation orientation,
                                          int role) const
 {
     if (role != Qt::DisplayRole)
-	return QVariant();
+        return QVariant();
     
     if (orientation == Qt::Horizontal)
-	return QString("TODO Column %1").arg(section);
+        return QString("TODO Column %1").arg(section);
     else
-	return QString("TODO Row %1").arg(section);
+        return QString("TODO Row %1").arg(section);
 }
 
 bool LayerListModel::setData(const QModelIndex &index,
-			     const QVariant &value, int role)
+                             const QVariant &value, int role)
 {
    if (!map_) return false;
    
    if (index.isValid() && role == Qt::CheckStateRole)
    {
       int status = value.toInt(); 
-      std::vector<mapnik::Layer> & layers = const_cast<std::vector<mapnik::Layer>& >(map_->layers());
+      std::vector<mapnik::layer> & layers = const_cast<std::vector<mapnik::layer>& >(map_->layers());
       layers.at(index.row()).setActive(status);
       emit dataChanged(index, index);
       return true;
@@ -107,15 +107,15 @@ Qt::ItemFlags LayerListModel::flags(QModelIndex const& index) const
     return flags;
 }
 
-boost::optional<mapnik::Layer&> LayerListModel::map_layer(int i)
+boost::optional<mapnik::layer&> LayerListModel::map_layer(int i)
 {
    if (map_)
    {
-      std::vector<mapnik::Layer> & layers = const_cast<std::vector<mapnik::Layer>& >(map_->layers());
+      std::vector<mapnik::layer> & layers = const_cast<std::vector<mapnik::layer>& >(map_->layers());
       if (i < int(layers.size()))
-	  return boost::optional<mapnik::Layer&>(layers[i]);
+          return boost::optional<mapnik::layer&>(layers[i]);
    }
-   return boost::optional<mapnik::Layer&>();
+   return boost::optional<mapnik::layer&>();
 }
 
 
diff --git a/demo/viewer/layerlistmodel.hpp b/demo/viewer/layerlistmodel.hpp
index 6a66448..30f126b 100644
--- a/demo/viewer/layerlistmodel.hpp
+++ b/demo/viewer/layerlistmodel.hpp
@@ -40,7 +40,7 @@ class LayerListModel : public QAbstractListModel
       bool setData(const QModelIndex &index, const QVariant &value,
                    int role = Qt::EditRole);
       Qt::ItemFlags flags(QModelIndex const& index) const; 
-      boost::optional<mapnik::Layer&> map_layer(int i);
+      boost::optional<mapnik::layer&> map_layer(int i);
 
    private:
       boost::shared_ptr<mapnik::Map> map_;
diff --git a/demo/viewer/layerwidget.cpp b/demo/viewer/layerwidget.cpp
index 6354fd9..c5402b5 100644
--- a/demo/viewer/layerwidget.cpp
+++ b/demo/viewer/layerwidget.cpp
@@ -77,46 +77,15 @@ void LayerTab::layerInfo2(QModelIndex const& index)
 {
    qDebug("LayerInfo id = %d",index.row());
    QVector<QPair<QString,QString> > params;
+   QVector<QString> style_names;
    unsigned i = index.row();
    LayerListModel * model = static_cast<LayerListModel*>(this->model());
-   boost::optional<mapnik::Layer&> layer = model->map_layer(i);
+   boost::optional<mapnik::layer&> layer = model->map_layer(i);
    
    if (layer)
    {
-      mapnik::datasource_ptr ds = (*layer).datasource();
-      if (ds)
-      {
-         mapnik::parameters ps = ds->params();
-
-         //mapnik::parameters::extract_iterator_type itr = ps.extract_begin();
-         //mapnik::parameters::extract_iterator_type end = ps.extract_end();
-         
-         //for (;itr != end;++itr)
-         //{
-            //if (itr->second)
-         //   {
-         ///     params.push_back(QPair<QString,QString>(itr->first.c_str(),itr->first.c_str()));
-         //   }
-         //}
-
-         
-         mapnik::parameters::const_iterator pos;
-         
-         for (pos = ps.begin();pos != ps.end();++pos)
-         {
-            boost::optional<std::string> result;
-            boost::apply_visitor(mapnik::value_extractor_visitor<std::string>(result),pos->second);
-            if (result)
-            {
-               params.push_back(QPair<QString,QString>(pos->first.c_str(),(*result).c_str()));
-            }
-         }   
-      }
-      layer_info_dialog dlg(params,this);
-      dlg.getUI().layerNameEdit->setText(QString((*layer).name().c_str()));
-
-      
-      dlg.exec();
+       layer_info_dialog dlg(*layer,this);
+       dlg.exec();
    }
 }
 
diff --git a/demo/viewer/main.cpp b/demo/viewer/main.cpp
index d06a494..d4b785f 100644
--- a/demo/viewer/main.cpp
+++ b/demo/viewer/main.cpp
@@ -21,6 +21,7 @@
 // qt
 #include <QApplication>
 #include <QStringList>
+#include <QSettings>
 #include <mapnik/datasource_cache.hpp>
 #include <mapnik/font_engine_freetype.hpp>
 #include "mainwindow.hpp"
@@ -28,53 +29,58 @@
 #include <boost/algorithm/string.hpp>
 #include <boost/filesystem/operations.hpp>
 
-bool is_font_file (std::string const& filename)
-{
-    return boost::algorithm::ends_with(filename,std::string(".ttf"));
-}
 
 int main( int argc, char **argv )
 {
-	using mapnik::datasource_cache;
-	using mapnik::freetype_engine;
-	
-	// modify this prefix based on your install location
-	std::string mapnik_dir = "/opt/mapnik";
-	
-	datasource_cache::instance()->register_datasources(mapnik_dir + "/lib/mapnik/input");
-	boost::filesystem::path path(mapnik_dir + "/lib/mapnik/fonts");
-	boost::filesystem::directory_iterator end_itr;	
+    using mapnik::datasource_cache;
+    using mapnik::freetype_engine;
+       
+    QCoreApplication::setOrganizationName("Mapnik");
+    QCoreApplication::setOrganizationDomain("mapnik.org");
+    QCoreApplication::setApplicationName("Viewer");
+    
+    QSettings settings("viewer.ini",QSettings::IniFormat);
     
+    // register input plug-ins
+    QString plugins_dir = settings.value("mapnik/plugins_dir",
+                                         QVariant("/usr/local/lib/mapnik2/input/")).toString();
+    datasource_cache::instance()->register_datasources(plugins_dir.toStdString());
+    // register fonts
+    int count = settings.beginReadArray("mapnik/fonts");
+    for (int index=0; index < count; ++index)
+    {
+        settings.setArrayIndex(index);
+        QString font_dir = settings.value("dir").toString();
+        freetype_engine::register_fonts(font_dir.toStdString());
+    }
+    settings.endArray();
     
-	if (boost::filesystem::exists(path) && boost::filesystem::is_directory(path))
-	{
-		for (boost::filesystem::directory_iterator itr(path);itr!=end_itr;++itr )
-		{
-			if (!boost::filesystem::is_directory(*itr) && is_font_file(itr->path().leaf())) 
-			{
-				std::cout << "register font " << itr->string() << "\n";
-				freetype_engine::register_font(itr->string());
-			}
-		}
+    QApplication app( argc, argv ); 
+    MainWindow window;
+    window.show();
+    if (argc > 1) window.open(argv[1]);
+    if (argc >= 3)
+    {
+        QStringList list = QString(argv[2]).split(",");
+        if (list.size()==4)
+        {
+            bool ok;
+            double x0 = list[0].toDouble(&ok);
+            double y0 = list[1].toDouble(&ok);
+            double x1 = list[2].toDouble(&ok);
+            double y1 = list[3].toDouble(&ok);
+            if (ok) window.set_default_extent(x0,y0,x1,y1);
+        }
+    }
+    else
+    {
+        window.zoom_all();
+    }
+    if (argc == 4)
+    {
+        bool ok;
+        double scaling_factor = QString(argv[3]).toDouble(&ok);
+        if (ok) window.set_scaling_factor(scaling_factor);
     }
-		
-	QApplication app( argc, argv ); 
-	MainWindow window;
-	window.show();
-	if (argc > 1) window.open(argv[1]);
-	if (argc == 3)
-	{
-		QStringList list = QString(argv[2]).split(",");
-		if (list.size()==4)
-		{
-			bool ok;
-			double x0 = list[0].toDouble(&ok);
-			double y0 = list[1].toDouble(&ok);
-			double x1 = list[2].toDouble(&ok);
-			double y1 = list[3].toDouble(&ok);
-			if (ok) window.set_default_extent(x0,y0,x1,y1);
-		}
-	}
-	
-	return app.exec(); 
+    return app.exec(); 
 }
diff --git a/demo/viewer/mainwindow.cpp b/demo/viewer/mainwindow.cpp
index cf926ff..a4da2a6 100644
--- a/demo/viewer/mainwindow.cpp
+++ b/demo/viewer/mainwindow.cpp
@@ -34,7 +34,9 @@
 // mapnik
 #include <mapnik/config_error.hpp>
 #include <mapnik/load_map.hpp>
+#include <mapnik/save_map.hpp>
 
+// qt
 #include "mainwindow.hpp"
 #include "layerlistmodel.hpp"
 #include "styles_model.hpp"
@@ -43,331 +45,332 @@
 #include "about_dialog.hpp"
 
 MainWindow::MainWindow()
-   : filename_(),
-     default_extent_(-20037508.3428,-20037508.3428,20037508.3428,20037508.3428)
+    : filename_(),
+      default_extent_(-20037508.3428,-20037508.3428,20037508.3428,20037508.3428)
 {        
-   mapWidget_ = new MapWidget(this);
-   QSplitter *splitter = new QSplitter(this); 
-   QTabWidget *tabWidget=new QTabWidget;
-   layerTab_ = new LayerTab;
-   layerTab_->setFocusPolicy(Qt::NoFocus);
-   layerTab_->setIconSize(QSize(16,16));
+    mapWidget_ = new MapWidget(this);
+    QSplitter *splitter = new QSplitter(this); 
+    QTabWidget *tabWidget=new QTabWidget;
+    layerTab_ = new LayerTab;
+    layerTab_->setFocusPolicy(Qt::NoFocus);
+    layerTab_->setIconSize(QSize(16,16));
       
-   //LayerDelegate *delegate = new LayerDelegate(this);   
-   //layerTab_->setItemDelegate(delegate);
-   //layerTab_->setItemDelegate(new QItemDelegate(this));
-   //layerTab_->setViewMode(QListView::IconMode);
+    //LayerDelegate *delegate = new LayerDelegate(this);   
+    //layerTab_->setItemDelegate(delegate);
+    //layerTab_->setItemDelegate(new QItemDelegate(this));
+    //layerTab_->setViewMode(QListView::IconMode);
    
-   layerTab_->setFlow(QListView::TopToBottom);
-   tabWidget->addTab(layerTab_,tr("Layers"));
-
-   // Styles tab
-   styleTab_ = new StyleTab;
-   tabWidget->addTab(styleTab_,tr("Styles"));   
-   splitter->addWidget(tabWidget);
-   splitter->addWidget(mapWidget_);
-   QList<int> list;
-   list.push_back(200);
-   list.push_back(600);
-   splitter->setSizes(list);
+    layerTab_->setFlow(QListView::TopToBottom);
+    tabWidget->addTab(layerTab_,tr("Layers"));
+
+    // Styles tab
+    styleTab_ = new StyleTab;
+    tabWidget->addTab(styleTab_,tr("Styles"));   
+    splitter->addWidget(tabWidget);
+    splitter->addWidget(mapWidget_);
+    QList<int> list;
+    list.push_back(200);
+    list.push_back(600);
+    splitter->setSizes(list);
     
-   mapWidget_->setFocusPolicy(Qt::StrongFocus);
-   mapWidget_->setFocus();
+    mapWidget_->setFocusPolicy(Qt::StrongFocus);
+    mapWidget_->setFocus();
    
-   //setCentralWidget(mapWidget_);
-   setCentralWidget(splitter);
-   createActions();
-   createMenus();
-   createToolBars();
-   createContextMenu();
+    //setCentralWidget(mapWidget_);
+    setCentralWidget(splitter);
+    createActions();
+    createMenus();
+    createToolBars();
+    createContextMenu();
     
-   setWindowTitle(tr("Mapnik Viewer"));
-   status=new QStatusBar(this);
-   status->showMessage(tr(""));
-   setStatusBar(status);
-   resize(800,600);
-
-   //connect mapview to layerlist
-   connect(mapWidget_, SIGNAL(mapViewChanged()),layerTab_, SLOT(update()));
-   // slider 
-   connect(slider_,SIGNAL(valueChanged(int)),mapWidget_,SLOT(zoomToLevel(int)));
-   // 
-   connect(layerTab_,SIGNAL(update_mapwidget()),mapWidget_,SLOT(updateMap()));
-   connect(layerTab_,SIGNAL(layerSelected(int)), 
-           mapWidget_,SLOT(layerSelected(int)));
+    setWindowTitle(tr("Mapnik Viewer"));
+    status=new QStatusBar(this);
+    status->showMessage(tr(""));
+    setStatusBar(status);
+    resize(800,600);
+
+    //connect mapview to layerlist
+    connect(mapWidget_, SIGNAL(mapViewChanged()),layerTab_, SLOT(update()));
+    // slider 
+    connect(slider_,SIGNAL(valueChanged(int)),mapWidget_,SLOT(zoomToLevel(int)));
+    // 
+    connect(layerTab_,SIGNAL(update_mapwidget()),mapWidget_,SLOT(updateMap()));
+    connect(layerTab_,SIGNAL(layerSelected(int)), 
+            mapWidget_,SLOT(layerSelected(int)));
 }
 
 
 MainWindow::~MainWindow()
 {
-   delete mapWidget_;
+    delete mapWidget_;
 }
 
 void MainWindow::closeEvent(QCloseEvent* event)
 {
-   event->accept();
+    event->accept();
 }
 
 void MainWindow::createContextMenu()
 {
-   layerTab_->setContextMenuPolicy(Qt::ActionsContextMenu);
-   layerTab_->addAction(openAct);
-   layerTab_->addAction(layerInfo);
+    layerTab_->setContextMenuPolicy(Qt::ActionsContextMenu);
+    layerTab_->addAction(openAct);
+    layerTab_->addAction(layerInfo);
 }
 
 void MainWindow::open(QString const& path)
 {
-   if (path.isNull())
-   {
-      filename_ = QFileDialog::getOpenFileName(this,tr("Open Mapnik file"),
-                                              currentPath,"*.xml");
-   }
-   else
-   {
-      filename_ = path;
-   }
+    if (path.isNull())
+    {
+        filename_ = QFileDialog::getOpenFileName(this,tr("Open Mapnik file"),
+                                                 currentPath,"*.xml");
+    }
+    else
+    {
+        filename_ = path;
+    }
     
-   if (!filename_.isEmpty())
-   {
-      load_map_file(filename_);
-      //zoom_all();
-      setWindowTitle(tr("%1 - Mapnik Viewer").arg(filename_));
-   }
+    if (!filename_.isEmpty())
+    {
+        
+        load_map_file(filename_);
+        setWindowTitle(tr("%1 - Mapnik Viewer").arg(filename_));
+    }
     
 }
 
-void MainWindow::reload() 
+void MainWindow::reload()
 {
-   if (!filename_.isEmpty())
-   {
-      mapnik::Envelope<double> bbox = mapWidget_->getMap()->getCurrentExtent();
-      load_map_file(filename_);
-      mapWidget_->zoomToBox(bbox);
-      setWindowTitle(tr("%1 - *Reloaded*").arg(filename_));
-   }
+    if (!filename_.isEmpty())
+    {
+        
+        mapnik::box2d<double> bbox = mapWidget_->getMap()->get_current_extent();
+        load_map_file(filename_);
+        mapWidget_->zoomToBox(bbox);
+        setWindowTitle(tr("%1 - *Reloaded*").arg(filename_));
+    }
 }
 
 void MainWindow::save()
 {
-   QString initialPath = QDir::currentPath() + "/untitled.xml";
-   QString filename = QFileDialog::getSaveFileName(this, tr("Save"),
-                                                   initialPath,
-                                                   tr("%1 Files (*.xml)")
-                                                   .arg(QString("Mapnik definition")));
-   if (!filename.isEmpty()) 
-   {
-      std::cout<<"saving "<< filename.toStdString() << std::endl;
-   }
+    QString initialPath = QDir::currentPath() + "/untitled.xml";
+    QString filename = QFileDialog::getSaveFileName(this, tr("Save"),
+                                                    initialPath,
+                                                    tr("%1 Files (*.xml)")
+                                                    .arg(QString("Mapnik definition")));
+    if (!filename.isEmpty()) 
+    {
+        std::cout<<"saving "<< filename.toStdString() << std::endl;
+        mapnik::save_map(*mapWidget_->getMap(),filename.toStdString());
+    }
 }
 
 void MainWindow::load_map_file(QString const& filename)
 {
-   std::cout<<"loading "<< filename.toStdString() << std::endl;    
-   try 
-   {  
-      unsigned width = mapWidget_->width();
-      unsigned height = mapWidget_->height();
-      boost::shared_ptr<mapnik::Map> map(new mapnik::Map(width,height)); 
-      mapnik::load_map(*map,filename.toStdString());
-      mapWidget_->setMap(map);
-      mapWidget_->zoomToBox(default_extent_);
-      layerTab_->setModel(new LayerListModel(map,this));
-      styleTab_->setModel(new StyleModel(map,this));
-   }
-   catch (mapnik::config_error & ex) 
-   {
-      std::cout << ex.what() << "\n";
-   }
-}
-
-void MainWindow::zoom_all()
-{
-   mapWidget_->defaultView();
+    std::cout<<"loading "<< filename.toStdString() << std::endl;    
+    unsigned width = mapWidget_->width();
+    unsigned height = mapWidget_->height();
+    boost::shared_ptr<mapnik::Map> map(new mapnik::Map(width,height)); 
+    mapWidget_->setMap(map);
+    try 
+    {  
+        mapnik::load_map(*map,filename.toStdString());
+    }
+    catch (mapnik::config_error & ex) 
+    {
+        std::cout << ex.what() << "\n";
+    }
+    catch (...)
+    {
+        std::cerr << "Exception caught in load_map\n";
+    }
+    layerTab_->setModel(new LayerListModel(map,this));
+    styleTab_->setModel(new StyleModel(map,this));
+    zoom_all();
 }
 
 void MainWindow::zoom_to_box()
 {
-   mapWidget_->setTool(MapWidget::ZoomToBox);
+    mapWidget_->setTool(MapWidget::ZoomToBox);
 }
 
 void MainWindow::pan()
 {
-   mapWidget_->setTool(MapWidget::Pan);   
+    mapWidget_->setTool(MapWidget::Pan);   
 }
 
 void MainWindow::info()
 {
-   mapWidget_->setTool(MapWidget::Info);
+    mapWidget_->setTool(MapWidget::Info);
 }
 
 void MainWindow::pan_left()
 {
-   mapWidget_->panLeft();
+    mapWidget_->panLeft();
 }
 
 void MainWindow::pan_right()
 {
-   mapWidget_->panRight();
+    mapWidget_->panRight();
 }
 
 void MainWindow::pan_up()
 {
-   mapWidget_->panUp();
+    mapWidget_->panUp();
 }
 
 void MainWindow::pan_down()
 {
-   mapWidget_->panDown();
+    mapWidget_->panDown();
 }
 
 void MainWindow::about()
 {
-   about_dialog dlg;
-   dlg.exec();
+    about_dialog dlg;
+    dlg.exec();
 }
 
 void MainWindow::export_as()
 {
-   QAction *action = qobject_cast<QAction *>(sender());
-   QByteArray fileFormat = action->data().toByteArray();
-   QString initialPath = QDir::currentPath() + "/map." + fileFormat;
-
-   QString fileName = QFileDialog::getSaveFileName(this, tr("Export As"),
-                                                   initialPath,
-                                                   tr("%1 Files (*.%2);;All Files (*)")
-                                                   .arg(QString(fileFormat.toUpper()))
-                                                   .arg(QString(fileFormat)));
-   if (!fileName.isEmpty()) 
-   {
-      QPixmap const& pix = mapWidget_->pixmap();
-      pix.save(fileName);
-   }
+    QAction *action = qobject_cast<QAction *>(sender());
+    QByteArray fileFormat = action->data().toByteArray();
+    QString initialPath = QDir::currentPath() + "/map." + fileFormat;
+
+    QString fileName = QFileDialog::getSaveFileName(this, tr("Export As"),
+                                                    initialPath,
+                                                    tr("%1 Files (*.%2);;All Files (*)")
+                                                    .arg(QString(fileFormat.toUpper()))
+                                                    .arg(QString(fileFormat)));
+    if (!fileName.isEmpty()) 
+    {
+        QPixmap const& pix = mapWidget_->pixmap();
+        pix.save(fileName);
+    }
 }
 
 void MainWindow::print()
 {    
    
-   //Q_ASSERT(mapWidget_->pixmap());
-   //QPrintDialog dialog(&printer, this);
-   //if (dialog.exec()) {
-   //	QPainter painter(&printer);
-   //	QRect rect = painter.viewport();
-   //	QSize size = mapWidget_->pixmap()->size();
-   //	size.scale(rect.size(), Qt::KeepAspectRatio);
-   //	painter.setViewport(rect.x(), rect.y(), size.width(), size.height());
-   //	painter.setWindow(mapWidget_->pixmap()->rect());
-   //	painter.drawPixmap(0, 0, *mapWidget_->pixmap());
-   //}
+    //Q_ASSERT(mapWidget_->pixmap());
+    //QPrintDialog dialog(&printer, this);
+    //if (dialog.exec()) {
+    //   QPainter painter(&printer);
+    //   QRect rect = painter.viewport();
+    //   QSize size = mapWidget_->pixmap()->size();
+    //   size.scale(rect.size(), Qt::KeepAspectRatio);
+    //   painter.setViewport(rect.x(), rect.y(), size.width(), size.height());
+    //   painter.setWindow(mapWidget_->pixmap()->rect());
+    //   painter.drawPixmap(0, 0, *mapWidget_->pixmap());
+    //}
 }
 
 void MainWindow::createActions()
 { 
-   //exportAct = new QAction(tr("&Export as ..."),this);
-   //exportAct->setShortcut(tr("Ctrl+E"));
-   //connect(exportAct, SIGNAL(triggered()), this, SLOT(export_as()));
-   zoomAllAct = new QAction(QIcon(":/images/home.png"),tr("Zoom All"),this);
-   connect(zoomAllAct, SIGNAL(triggered()), this, SLOT(zoom_all()));
+    //exportAct = new QAction(tr("&Export as ..."),this);
+    //exportAct->setShortcut(tr("Ctrl+E"));
+    //connect(exportAct, SIGNAL(triggered()), this, SLOT(export_as()));
+    zoomAllAct = new QAction(QIcon(":/images/home.png"),tr("Zoom All"),this);
+    connect(zoomAllAct, SIGNAL(triggered()), this, SLOT(zoom_all()));
     
-   zoomBoxAct = new QAction(QIcon(":/images/zoombox.png"),tr("Zoom To Box"),this);
-   zoomBoxAct->setCheckable(true);
-   connect(zoomBoxAct, SIGNAL(triggered()), this, SLOT(zoom_to_box()));
+    zoomBoxAct = new QAction(QIcon(":/images/zoombox.png"),tr("Zoom To Box"),this);
+    zoomBoxAct->setCheckable(true);
+    connect(zoomBoxAct, SIGNAL(triggered()), this, SLOT(zoom_to_box()));
     
-   panAct = new QAction(QIcon(":/images/pan.png"),tr("Pan"),this);
-   panAct->setCheckable(true);
-   connect(panAct, SIGNAL(triggered()), this, SLOT(pan()));
+    panAct = new QAction(QIcon(":/images/pan.png"),tr("Pan"),this);
+    panAct->setCheckable(true);
+    connect(panAct, SIGNAL(triggered()), this, SLOT(pan()));
     
-   infoAct = new QAction(QIcon(":/images/info.png"),tr("Info"),this);
-   infoAct->setCheckable(true);
-   connect(infoAct, SIGNAL(triggered()), this, SLOT(info()));
+    infoAct = new QAction(QIcon(":/images/info.png"),tr("Info"),this);
+    infoAct->setCheckable(true);
+    connect(infoAct, SIGNAL(triggered()), this, SLOT(info()));
    
-   toolsGroup=new QActionGroup(this);
-   toolsGroup->addAction(zoomBoxAct);
-   toolsGroup->addAction(panAct);
-   toolsGroup->addAction(infoAct);
-   zoomBoxAct->setChecked(true);
+    toolsGroup=new QActionGroup(this);
+    toolsGroup->addAction(zoomBoxAct);
+    toolsGroup->addAction(panAct);
+    toolsGroup->addAction(infoAct);
+    zoomBoxAct->setChecked(true);
        
-   openAct=new QAction(tr("Open Map definition"),this);
-   connect(openAct,SIGNAL(triggered()),this,SLOT(open()));
-   saveAct=new QAction(tr("Save Map definition"),this);
-   connect(saveAct,SIGNAL(triggered()),this,SLOT(save()));
-
-   panLeftAct = new QAction(QIcon(":/images/left.png"),tr("&Pan Left"),this);
-   connect(panLeftAct, SIGNAL(triggered()), this, SLOT(pan_left()));
-   panRightAct = new QAction(QIcon(":/images/right.png"),tr("&Pan Right"),this);
-   connect(panRightAct, SIGNAL(triggered()), this, SLOT(pan_right()));
-   panUpAct = new QAction(QIcon(":/images/up.png"),tr("&Pan Up"),this);
-   connect(panUpAct, SIGNAL(triggered()), this, SLOT(pan_up()));
-   panDownAct = new QAction(QIcon(":/images/down.png"),tr("&Pan Down"),this);
-   connect(panDownAct, SIGNAL(triggered()), this, SLOT(pan_down()));
+    openAct=new QAction(tr("Open Map definition"),this);
+    connect(openAct,SIGNAL(triggered()),this,SLOT(open()));
+    saveAct=new QAction(tr("Save Map definition"),this);
+    connect(saveAct,SIGNAL(triggered()),this,SLOT(save()));
+
+    panLeftAct = new QAction(QIcon(":/images/left.png"),tr("&Pan Left"),this);
+    connect(panLeftAct, SIGNAL(triggered()), this, SLOT(pan_left()));
+    panRightAct = new QAction(QIcon(":/images/right.png"),tr("&Pan Right"),this);
+    connect(panRightAct, SIGNAL(triggered()), this, SLOT(pan_right()));
+    panUpAct = new QAction(QIcon(":/images/up.png"),tr("&Pan Up"),this);
+    connect(panUpAct, SIGNAL(triggered()), this, SLOT(pan_up()));
+    panDownAct = new QAction(QIcon(":/images/down.png"),tr("&Pan Down"),this);
+    connect(panDownAct, SIGNAL(triggered()), this, SLOT(pan_down()));
    
-   reloadAct = new QAction(QIcon(":/images/reload.png"),tr("Reload"),this);
-   connect(reloadAct, SIGNAL(triggered()), this, SLOT(reload()));
+    reloadAct = new QAction(QIcon(":/images/reload.png"),tr("Reload"),this);
+    connect(reloadAct, SIGNAL(triggered()), this, SLOT(reload()));
    
-   layerInfo = new QAction(QIcon(":/images/info.png"),tr("&Layer info"),layerTab_);
-   connect(layerInfo, SIGNAL(triggered()), layerTab_,SLOT(layerInfo()));
-   connect(layerTab_, SIGNAL(doubleClicked(QModelIndex const&)), layerTab_,SLOT(layerInfo2(QModelIndex const&)));
-   foreach (QByteArray format, QImageWriter::supportedImageFormats()) 
-   {
-      QString text = tr("%1...").arg(QString(format).toUpper());
+    layerInfo = new QAction(QIcon(":/images/info.png"),tr("&Layer info"),layerTab_);
+    connect(layerInfo, SIGNAL(triggered()), layerTab_,SLOT(layerInfo()));
+    connect(layerTab_, SIGNAL(doubleClicked(QModelIndex const&)), layerTab_,SLOT(layerInfo2(QModelIndex const&)));
+    foreach (QByteArray format, QImageWriter::supportedImageFormats()) 
+    {
+        QString text = tr("%1...").arg(QString(format).toUpper());
       
-      QAction *action = new QAction(text, this);
-      action->setData(format);
-      connect(action, SIGNAL(triggered()), this, SLOT(export_as()));
-      exportAsActs.append(action);
-   }
+        QAction *action = new QAction(text, this);
+        action->setData(format);
+        connect(action, SIGNAL(triggered()), this, SLOT(export_as()));
+        exportAsActs.append(action);
+    }
    
-   printAct = new QAction(QIcon(":/images/print.png"),tr("&Print ..."),this);
-   printAct->setShortcut(tr("Ctrl+E"));
-   connect(printAct, SIGNAL(triggered()), this, SLOT(print()));
+    printAct = new QAction(QIcon(":/images/print.png"),tr("&Print ..."),this);
+    printAct->setShortcut(tr("Ctrl+E"));
+    connect(printAct, SIGNAL(triggered()), this, SLOT(print()));
     
-   exitAct = new QAction(tr("E&xit"), this);
-   exitAct->setShortcut(tr("Ctrl+Q"));
-   connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));
+    exitAct = new QAction(tr("E&xit"), this);
+    exitAct->setShortcut(tr("Ctrl+Q"));
+    connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));
 
-   aboutAct = new QAction(QIcon(":/images/about.png"),tr("&About"), this);
-   connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));
+    aboutAct = new QAction(QIcon(":/images/about.png"),tr("&About"), this);
+    connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));
 }
 
 void MainWindow::createMenus()
 {
-   exportMenu = new QMenu(tr("&Export As"), this);
-   foreach (QAction *action, exportAsActs)
-      exportMenu->addAction(action); 
+    exportMenu = new QMenu(tr("&Export As"), this);
+    foreach (QAction *action, exportAsActs)
+        exportMenu->addAction(action); 
         
-   fileMenu = new QMenu(tr("&File"),this);
-   fileMenu->addAction(openAct);
-   fileMenu->addAction(saveAct);
-   fileMenu->addMenu(exportMenu);
-   fileMenu->addAction(printAct);
-   fileMenu->addSeparator();
-   fileMenu->addAction(exitAct);
-   menuBar()->addMenu(fileMenu);
+    fileMenu = new QMenu(tr("&File"),this);
+    fileMenu->addAction(openAct);
+    fileMenu->addAction(saveAct);
+    fileMenu->addMenu(exportMenu);
+    fileMenu->addAction(printAct);
+    fileMenu->addSeparator();
+    fileMenu->addAction(exitAct);
+    menuBar()->addMenu(fileMenu);
     
-   helpMenu = new QMenu(tr("&Help"), this);
-   helpMenu->addAction(aboutAct);
-   menuBar()->addMenu(helpMenu);
+    helpMenu = new QMenu(tr("&Help"), this);
+    helpMenu->addAction(aboutAct);
+    menuBar()->addMenu(helpMenu);
 }
 
 void MainWindow::createToolBars()
 {
-   fileToolBar = addToolBar(tr("Actions"));
-   fileToolBar->addAction(zoomAllAct);
-   fileToolBar->addAction(zoomBoxAct);
-   fileToolBar->addAction(panAct);
-   fileToolBar->addAction(panLeftAct);
-   fileToolBar->addAction(panRightAct);
-   fileToolBar->addAction(panUpAct);
-   fileToolBar->addAction(panDownAct);
-   fileToolBar->addAction(infoAct);
-   fileToolBar->addAction(reloadAct);
-   fileToolBar->addAction(printAct);
-   slider_ = new QSlider(Qt::Horizontal,fileToolBar);
-   slider_->setRange(1,18);
-   slider_->setTickPosition(QSlider::TicksBelow);
-   slider_->setTickInterval(1);
-   slider_->setTracking(false);
-   fileToolBar->addWidget(slider_);
-   fileToolBar->addAction(aboutAct);
+    fileToolBar = addToolBar(tr("Actions"));
+    fileToolBar->addAction(zoomAllAct);
+    fileToolBar->addAction(zoomBoxAct);
+    fileToolBar->addAction(panAct);
+    fileToolBar->addAction(panLeftAct);
+    fileToolBar->addAction(panRightAct);
+    fileToolBar->addAction(panUpAct);
+    fileToolBar->addAction(panDownAct);
+    fileToolBar->addAction(infoAct);
+    fileToolBar->addAction(reloadAct);
+    fileToolBar->addAction(printAct);
+    slider_ = new QSlider(Qt::Horizontal,fileToolBar);
+    slider_->setRange(1,18);
+    slider_->setTickPosition(QSlider::TicksBelow);
+    slider_->setTickInterval(1);
+    slider_->setTracking(false);
+    fileToolBar->addWidget(slider_);
+    fileToolBar->addAction(aboutAct);
 }
 
 
@@ -376,18 +379,32 @@ void MainWindow::set_default_extent(double x0,double y0, double x1, double y1)
 {
     try 
     {
-       boost::shared_ptr<mapnik::Map> map_ptr = mapWidget_->getMap();
-       if (map_ptr) 
-       {
-          mapnik::projection prj(map_ptr->srs());
-          prj.forward(x0,y0);
-          prj.forward(x1,y1);
-          default_extent_=mapnik::Envelope<double>(x0,y0,x1,y1);
-          mapWidget_->zoomToBox(default_extent_);
-          std::cout << "SET DEFAULT EXT\n";
-       }
+        boost::shared_ptr<mapnik::Map> map_ptr = mapWidget_->getMap();
+        if (map_ptr) 
+        {
+            mapnik::projection prj(map_ptr->srs());
+            prj.forward(x0,y0);
+            prj.forward(x1,y1);
+            default_extent_=mapnik::box2d<double>(x0,y0,x1,y1);
+            mapWidget_->zoomToBox(default_extent_);
+            std::cout << "SET DEFAULT EXT\n";
+        }
     }
     catch (...) {}
-    
-    
+}
+
+void MainWindow::set_scaling_factor(double scaling_factor)
+{
+    mapWidget_->set_scaling_factor(scaling_factor);
+}
+
+void MainWindow::zoom_all()
+{
+    boost::shared_ptr<mapnik::Map> map_ptr = mapWidget_->getMap();
+    if (map_ptr) 
+    {
+        map_ptr->zoom_all();
+        mapnik::box2d<double> const& ext = map_ptr->get_current_extent();
+        mapWidget_->zoomToBox(ext);
+    }
 }
diff --git a/demo/viewer/mainwindow.hpp b/demo/viewer/mainwindow.hpp
index 9b8cef8..2d70210 100644
--- a/demo/viewer/mainwindow.hpp
+++ b/demo/viewer/mainwindow.hpp
@@ -38,74 +38,74 @@ class QSlider;
 
 class MainWindow : public QMainWindow
 {
-      Q_OBJECT
-   public:
-      MainWindow();
-      virtual ~MainWindow();
-      void set_default_extent(double x0,double y0,double x1, double y1);
-   protected:
-      void closeEvent(QCloseEvent* event);
+    Q_OBJECT
+    public:
+    MainWindow();
+    virtual ~MainWindow();
+    void set_default_extent(double x0,double y0,double x1, double y1);
+    void set_scaling_factor(double scaling_factor);
+protected:
+    void closeEvent(QCloseEvent* event);
 public slots:
-      void zoom_all();
-      void zoom_to_box();
-      void pan();
-      void info();
-      void export_as();
-      void open(QString const&  path = QString());
-      void reload();
-      void save();
-      void print();
-      void about();
-      void pan_left();
-      void pan_right();
-      void pan_up();
-      void pan_down();
-   private:
-      void createActions();
-      void createMenus();
-      void createToolBars();
-      void createContextMenu();
-      void load_map_file(QString const& filename);
+    void zoom_all();
+    void zoom_to_box();
+    void pan();
+    void info();
+    void export_as();
+    void open(QString const&  path = QString());
+    void reload();
+    void save();
+    void print();
+    void about();
+    void pan_left();
+    void pan_right();
+    void pan_up();
+    void pan_down();
+private:
+    void createActions();
+    void createMenus();
+    void createToolBars();
+    void createContextMenu();
+    void load_map_file(QString const& filename);
      
 
-      QString currentPath;
-      QString filename_;
-      QAbstractItemModel *model;
-      LayerTab  *layerTab_;
-      StyleTab * styleTab_;
-      MapWidget * mapWidget_;
-      QPrinter printer;
-      //actions
-      QList<QAction *> exportAsActs;
-      QActionGroup *toolsGroup;
+    QString currentPath;
+    QString filename_;
+    QAbstractItemModel *model;
+    LayerTab  *layerTab_;
+    StyleTab * styleTab_;
+    MapWidget * mapWidget_;
+    QPrinter printer;
+    //actions
+    QList<QAction *> exportAsActs;
+    QActionGroup *toolsGroup;
 
-      QAction *zoomAllAct;
-      QAction *zoomBoxAct;
-      QAction *panAct;
-      QAction *infoAct;
-      QAction *openAct;
-      QAction *saveAct;
-      QAction *printAct;
-      QAction *exitAct;
-      QAction *aboutAct;
-      QAction *panLeftAct;
-      QAction *panRightAct;
-      QAction *panUpAct;
-      QAction *panDownAct;
-      QAction *reloadAct;
-      QAction *layerInfo;
-      //toolbars
-      QToolBar *fileToolBar;
-      QToolBar *editToolBar;
-      //menus
-      QMenu *exportMenu;
-      QMenu *fileMenu;
-      QMenu *helpMenu;
-      //status bar
-      QStatusBar *status;
-      QSlider * slider_;
-
-      mapnik::Envelope<double> default_extent_;
+    QAction *zoomAllAct;
+    QAction *zoomBoxAct;
+    QAction *panAct;
+    QAction *infoAct;
+    QAction *openAct;
+    QAction *saveAct;
+    QAction *printAct;
+    QAction *exitAct;
+    QAction *aboutAct;
+    QAction *panLeftAct;
+    QAction *panRightAct;
+    QAction *panUpAct;
+    QAction *panDownAct;
+    QAction *reloadAct;
+    QAction *layerInfo;
+    //toolbars
+    QToolBar *fileToolBar;
+    QToolBar *editToolBar;
+    //menus
+    QMenu *exportMenu;
+    QMenu *fileMenu;
+    QMenu *helpMenu;
+    //status bar
+    QStatusBar *status;
+    QSlider * slider_;
+    mapnik::box2d<double> default_extent_;
 };
 
 
diff --git a/demo/viewer/mapwidget.cpp b/demo/viewer/mapwidget.cpp
index d920ccd..d9c72c0 100644
--- a/demo/viewer/mapwidget.cpp
+++ b/demo/viewer/mapwidget.cpp
@@ -25,20 +25,22 @@
 #include <mapnik/agg_renderer.hpp>
 #include <mapnik/layer.hpp>
 #include <mapnik/projection.hpp>
+#include <mapnik/scale_denominator.hpp>
 #include <mapnik/ctrans.hpp>
 #include <mapnik/memory_datasource.hpp>
 #include "mapwidget.hpp"
 #include "info_dialog.hpp"
 
-using mapnik::Image32;
+using mapnik::image_32;
 using mapnik::Map;
-using mapnik::Layer;
-using mapnik::Envelope;
+using mapnik::layer;
+using mapnik::box2d;
 using mapnik::coord2d;
 using mapnik::feature_ptr;
 using mapnik::geometry_ptr;
 using mapnik::CoordTransform;
 using mapnik::projection;
+using mapnik::scale_denominator;
 
 double scales [] = {279541132.014,
                     139770566.007,
@@ -74,7 +76,8 @@ MapWidget::MapWidget(QWidget *parent)
      drag_(false),
      first_(true),
      pen_(QColor(0,0,255,96)),
-     selectedLayer_(-1)
+     selectedLayer_(-1),
+     scaling_factor_(1.0)
 {
    pen_.setWidth(3);
    pen_.setCapStyle(Qt::RoundCap);
@@ -98,13 +101,14 @@ void MapWidget::paintEvent(QPaintEvent*)
          unsigned height = end_y_-start_y_;
          painter.drawPixmap(QPoint(0, 0),pix_);
          painter.setPen(pen_);
+         painter.setBrush(QColor(200,200,255,128));
          painter.drawRect(start_x_,start_y_,width,height);
       }
       else if (cur_tool_ == Pan)
       {
          int dx = end_x_-start_x_;
          int dy = end_y_-start_y_;
-         painter.setBrush(QColor(200,200,255,128));
+         painter.setBrush(QColor(200,200,200,128));
          painter.drawRect(0,0,width(),height());
          painter.drawPixmap(QPoint(dx,dy),pix_);
       }
@@ -143,13 +147,13 @@ void MapWidget::mousePressEvent(QMouseEvent* e)
             
             projection map_proj(map_->srs()); // map projection
             double scale_denom = scale_denominator(*map_,map_proj.is_geographic());
-            CoordTransform t(map_->getWidth(),map_->getHeight(),map_->getCurrentExtent());
+            CoordTransform t(map_->width(),map_->height(),map_->get_current_extent());
             
-            for (unsigned index = 0; index <  map_->layerCount();++index)
+            for (unsigned index = 0; index <  map_->layer_count();++index)
             {
                if (int(index) != selectedLayer_) continue;
                
-               Layer & layer = map_->layers()[index];
+               layer & layer = map_->layers()[index];
                if (!layer.isVisible(scale_denom)) continue;
                std::string name = layer.name();
                double x = e->x();
@@ -159,7 +163,7 @@ void MapWidget::mousePressEvent(QMouseEvent* e)
                mapnik::proj_transform prj_trans(map_proj,layer_proj);
                //std::auto_ptr<mapnik::memory_datasource> data(new mapnik::memory_datasource);
                mapnik::featureset_ptr fs = map_->query_map_point(index,x,y);
-	         	
+                        
                if (fs)
                {
                   feature_ptr feat  = fs->next();
@@ -175,11 +179,11 @@ void MapWidget::mousePressEvent(QMouseEvent* e)
                                                                  itr->second.to_string().c_str()));
                         }
                      }
-                     typedef mapnik::coord_transform2<mapnik::CoordTransform,mapnik::geometry2d> path_type;
+                     typedef mapnik::coord_transform2<mapnik::CoordTransform,mapnik::geometry_type> path_type;
                      
                      for  (unsigned i=0; i<feat->num_geometries();++i)
                      {
-                        mapnik::geometry2d & geom = feat->get_geometry(i);                       
+                        mapnik::geometry_type & geom = feat->get_geometry(i);                       
                         path_type path(t,geom,prj_trans);
                         if (geom.num_points() > 0)
                         {
@@ -187,7 +191,7 @@ void MapWidget::mousePressEvent(QMouseEvent* e)
                            double x,y;
                            path.vertex(&x,&y);
                            qpath.moveTo(x,y);
-                           for (unsigned j=1; j < geom.num_points(); ++j)
+                           for (unsigned j = 1; j < geom.num_points(); ++j)
                            {
                               path.vertex(&x,&y);
                               qpath.lineTo(x,y);
@@ -216,13 +220,13 @@ void MapWidget::mousePressEvent(QMouseEvent* e)
             // remove annotation layer
             map_->layers().erase(remove_if(map_->layers().begin(),
                                            map_->layers().end(),
-                                           bind(&Layer::name,_1) == "*annotations*")
+                                           bind(&layer::name,_1) == "*annotations*")
                                  , map_->layers().end());
          }
       } 
    }
    else if (e->button()==Qt::RightButton) 
-   {	
+   {    
       //updateMap();
    }
 }
@@ -248,9 +252,9 @@ void MapWidget::mouseReleaseEvent(QMouseEvent* e)
          drag_=false;
          if (map_)
          {
-            CoordTransform t(map_->getWidth(),map_->getHeight(),map_->getCurrentExtent());	
-            Envelope<double> box = t.backward(Envelope<double>(start_x_,start_y_,end_x_,end_y_));
-            map_->zoomToBox(box);
+            CoordTransform t(map_->width(),map_->height(),map_->get_current_extent());      
+            box2d<double> box = t.backward(box2d<double>(start_x_,start_y_,end_x_,end_y_));
+            map_->zoom_to_box(box);
             updateMap();
          }
       }
@@ -259,8 +263,8 @@ void MapWidget::mouseReleaseEvent(QMouseEvent* e)
          drag_=false;
          if (map_)
          {
-            int cx = int(0.5 * map_->getWidth());
-            int cy = int(0.5 * map_->getHeight());
+            int cx = int(0.5 * map_->width());
+            int cy = int(0.5 * map_->height());
             int dx = end_x_ - start_x_;
             int dy = end_y_ - start_y_;
             map_->pan(cx - dx ,cy - dy); 
@@ -273,7 +277,7 @@ void MapWidget::mouseReleaseEvent(QMouseEvent* e)
 
 void MapWidget::keyPressEvent(QKeyEvent *e) 
 {
-   std::cout << "key pressed:"<<e->key()<<"\n";
+   std::cout << "key pressed:"<< e->key()<<"\n";
    switch (e->key()) { 
       case Qt::Key_Minus:
          zoomOut();
@@ -324,15 +328,18 @@ void MapWidget::keyPressEvent(QKeyEvent *e)
       case 57:
          zoomToLevel(18);
          break;   
+   default:
+       QWidget::keyPressEvent(e);
    }
-   QWidget::keyPressEvent(e);
+   
+   
 }
 
-void MapWidget::zoomToBox(mapnik::Envelope<double> const& bbox)
+void MapWidget::zoomToBox(mapnik::box2d<double> const& bbox)
 {
    if (map_)
    {
-      map_->zoomToBox(bbox);
+      map_->zoom_to_box(bbox);
       updateMap();
    }
 }
@@ -369,8 +376,8 @@ void MapWidget::panUp()
 {
    if (map_)
    {
-      double cx = 0.5*map_->getWidth();
-      double cy = 0.5*map_->getHeight();
+      double cx = 0.5*map_->width();
+      double cy = 0.5*map_->height();
       map_->pan(int(cx),int(cy - cy*0.25));
       updateMap();
    }
@@ -380,8 +387,8 @@ void MapWidget::panDown()
 {
    if (map_)
    {
-      double cx = 0.5*map_->getWidth();
-      double cy = 0.5*map_->getHeight();
+      double cx = 0.5*map_->width();
+      double cy = 0.5*map_->height();
       map_->pan(int(cx),int(cy + cy*0.25));
       updateMap();
    }
@@ -391,8 +398,8 @@ void MapWidget::panLeft()
 {
    if (map_)
    {
-      double cx = 0.5*map_->getWidth();
-      double cy = 0.5*map_->getHeight();
+      double cx = 0.5*map_->width();
+      double cy = 0.5*map_->height();
       map_->pan(int(cx - cx * 0.25),int(cy));
       updateMap();
    }
@@ -402,8 +409,8 @@ void MapWidget::panRight()
 { 
    if (map_)
    {
-      double cx = 0.5*map_->getWidth();
-      double cy = 0.5*map_->getHeight();
+      double cx = 0.5*map_->width();
+      double cy = 0.5*map_->height();
       map_->pan(int(cx + cx * 0.25),int(cy)); 
       updateMap();
    }
@@ -416,59 +423,72 @@ void MapWidget::zoomToLevel(int level)
    {
       double scale_denom  = scales[level];
       std::cerr << "scale denominator = " << scale_denom << "\n";
-      mapnik::Envelope<double> ext = map_->getCurrentExtent();
-      double width = static_cast<double>(map_->getWidth());
-      double height= static_cast<double>(map_->getHeight()); 
+      mapnik::box2d<double> ext = map_->get_current_extent();
+      double width = static_cast<double>(map_->width());
+      double height= static_cast<double>(map_->height()); 
       mapnik::coord2d pt = ext.center();
 
       double res = scale_denom * 0.00028;
       
-      mapnik::Envelope<double> box(pt.x - 0.5 * width * res,
+      mapnik::box2d<double> box(pt.x - 0.5 * width * res,
                                    pt.y - 0.5 * height*res,
                                    pt.x + 0.5 * width * res,
                                    pt.y + 0.5 * height*res);
-      map_->zoomToBox(box);
+      map_->zoom_to_box(box);
       updateMap();
    }
 }
 
 void MapWidget::export_to_file(unsigned ,unsigned ,std::string const&,std::string const&) 
 {
-   //Image32 image(width,height);
+   //image_32 image(width,height);
    //agg_renderer renderer(map,image);
    //renderer.apply();
    //image.saveToFile(filename,type);
 }
        
+void MapWidget::set_scaling_factor(double scaling_factor)
+{
+    scaling_factor_ = scaling_factor;
+}
 
 void MapWidget::updateMap() 
 {   
    if (map_)
    {
-      unsigned width=map_->getWidth();
-      unsigned height=map_->getHeight();
+      unsigned width=map_->width();
+      unsigned height=map_->height();
       
-      Image32 buf(width,height);
+      image_32 buf(width,height);
 
       try 
       {
-	  mapnik::agg_renderer<Image32> ren(*map_,buf);
-	  ren.apply();
-	  
-	  QImage image((uchar*)buf.raw_data(),width,height,QImage::Format_ARGB32);
-	  pix_=QPixmap::fromImage(image.rgbSwapped());
-	  update();
-	  // emit signal to interested widgets
-	  emit mapViewChanged();
-	  std::cout << map_->getCurrentExtent() << "\n";
+          mapnik::agg_renderer<image_32> ren(*map_,buf,scaling_factor_);
+          ren.apply();
+          
+          QImage image((uchar*)buf.raw_data(),width,height,QImage::Format_ARGB32);
+          pix_=QPixmap::fromImage(image.rgbSwapped());
+          projection prj(map_->srs()); // map projection
+          
+          box2d<double> ext = map_->get_current_extent();
+          double x0 = ext.minx();
+          double y0 = ext.miny();
+          double x1 = ext.maxx();
+          double y1 = ext.maxy();
+          prj.inverse(x0,y0);
+          prj.inverse(x1,y1);
+          std::cout << "BBOX (WGS84): " << x0 << "," << y0 << "," << x1 << "," << y1 << "\n";
+          update();
+          // emit signal to interested widgets
+          emit mapViewChanged();
       }
       catch (mapnik::config_error & ex)
       {
-	  std::cerr << ex.what() << std::endl;
+          std::cerr << ex.what() << std::endl;
       }
       catch (...)
       {
-	  std::cerr << "Unknown exception caught!\n";
+          std::cerr << "Unknown exception caught!\n";
       }
    }
 }
diff --git a/demo/viewer/mapwidget.hpp b/demo/viewer/mapwidget.hpp
index a0153d4..e2d3c13 100644
--- a/demo/viewer/mapwidget.hpp
+++ b/demo/viewer/mapwidget.hpp
@@ -34,61 +34,63 @@
 
 class MapWidget : public QWidget 
 {
-      Q_OBJECT
+    Q_OBJECT
       
-   public:   
-      enum eTool 
-      {
-         ZoomToBox = 1,
-         Pan,
-         Info,
-      };
+    public:   
+    enum eTool 
+    {
+        ZoomToBox = 1,
+        Pan,
+        Info,
+    };
       
-   private: 
-      boost::shared_ptr<mapnik::Map> map_;
-      int selected_;
-      QPixmap pix_;
-      mapnik::Envelope<double> extent_;
-      eTool cur_tool_;
-      int start_x_;
-      int start_y_;
-      int end_x_;
-      int end_y_;
-      bool drag_;
-      bool first_;
-      QPen pen_;
-      int selectedLayer_;
-   public:
-      MapWidget(QWidget *parent=0);
-      void setTool(eTool tool);
-      boost::shared_ptr<mapnik::Map> getMap();
-      inline QPixmap const& pixmap() const { return pix_;}
-      void setMap(boost::shared_ptr<mapnik::Map> map);    
-      void defaultView();
-      void zoomToBox(mapnik::Envelope<double> const& box);
-      void zoomIn();
-      void zoomOut();
-      void panLeft();
-      void panRight();
-      void panUp();
-      void panDown();
- public slots:
-      void zoomToLevel(int level);
-      void updateMap();
-      void layerSelected(int);
-   signals:
-      void mapViewChanged();
-   protected:    
-      void paintEvent(QPaintEvent* ev);
-      void resizeEvent(QResizeEvent* ev);
-      void mousePressEvent(QMouseEvent* e);
-      void mouseMoveEvent(QMouseEvent* e);
-      void mouseReleaseEvent(QMouseEvent* e);
-      void keyPressEvent(QKeyEvent *e);
-      void export_to_file(unsigned width,
-                          unsigned height,
-                          std::string const& filename, 
-                          std::string const& type);    
+private: 
+    boost::shared_ptr<mapnik::Map> map_;
+    int selected_;
+    QPixmap pix_;
+    mapnik::box2d<double> extent_;
+    eTool cur_tool_;
+    int start_x_;
+    int start_y_;
+    int end_x_;
+    int end_y_;
+    bool drag_;
+    bool first_;
+    QPen pen_;
+    int selectedLayer_;
+    double scaling_factor_;
+public:
+    MapWidget(QWidget *parent=0);
+    void setTool(eTool tool);
+    boost::shared_ptr<mapnik::Map> getMap();
+    inline QPixmap const& pixmap() const { return pix_;}
+    void setMap(boost::shared_ptr<mapnik::Map> map);    
+    void defaultView();
+    void zoomToBox(mapnik::box2d<double> const& box);
+    void zoomIn();
+    void zoomOut();
+    void panLeft();
+    void panRight();
+    void panUp();
+    void panDown();
+    void set_scaling_factor(double);
+public slots:
+    void zoomToLevel(int level);
+    void updateMap();
+    void layerSelected(int);
+signals:
+    void mapViewChanged();
+protected:    
+    void paintEvent(QPaintEvent* ev);
+    void resizeEvent(QResizeEvent* ev);
+    void mousePressEvent(QMouseEvent* e);
+    void mouseMoveEvent(QMouseEvent* e);
+    void mouseReleaseEvent(QMouseEvent* e);
+    void keyPressEvent(QKeyEvent *e);
+    void export_to_file(unsigned width,
+                        unsigned height,
+                        std::string const& filename, 
+                        std::string const& type);    
 };
 
 #endif // MAP_WIDGET_HPP
diff --git a/demo/viewer/styles_model.cpp b/demo/viewer/styles_model.cpp
index cc01149..aae9aa9 100644
--- a/demo/viewer/styles_model.cpp
+++ b/demo/viewer/styles_model.cpp
@@ -19,7 +19,7 @@
 //$Id$
 
 #include "styles_model.hpp"
-
+#include <mapnik/expression_string.hpp>
 // boost
 #include <boost/concept_check.hpp>
 #include <boost/scoped_ptr.hpp>
@@ -32,300 +32,304 @@
 
 class node : private boost::noncopyable
 {
-      struct node_base
-      {
-            virtual QString name() const=0;
-            virtual QIcon   icon() const=0;
-            virtual ~node_base() {}
-      };
+    struct node_base
+    {
+        virtual QString name() const=0;
+        virtual QIcon   icon() const=0;
+        virtual ~node_base() {}
+    };
       
-      template <typename T>
-      struct wrap : public node_base
-      {
-            wrap(T const& obj)
-               : obj_(obj) {}
+    template <typename T>
+    struct wrap : public node_base
+    {
+    wrap(T const& obj)
+        : obj_(obj) {}
             
-            ~wrap() {}
+    ~wrap() {}
             
-            QString name () const
-            {
-               return obj_.name();
-            }
+    QString name () const
+    {
+        return obj_.name();
+    }
             
-            QIcon icon() const
-            {
-               return obj_.icon();
-            }
+    QIcon icon() const
+    {
+        return obj_.icon();
+    }
             
-            T obj_;
-      };
+    T obj_;
+    };
       
-   public:
-      template <typename T> 
-      node ( T const& obj, node * parent=0)
-         : impl_(new wrap<T>(obj)),
-           parent_(parent)
-      {}
+public:
+    template <typename T> 
+    node ( T const& obj, node * parent=0)
+    : impl_(new wrap<T>(obj)),
+      parent_(parent)
+    {}
       
-      QString name() const
-      {
-         return impl_->name();
-      }
+    QString name() const
+    {
+        return impl_->name();
+    }
       
-      QIcon icon() const
-      {
-         return impl_->icon();
-      }
+    QIcon icon() const
+    {
+        return impl_->icon();
+    }
       
-      unsigned num_children() const
-      {
-         return children_.count();
-      }
+    unsigned num_children() const
+    {
+        return children_.count();
+    }
       
-      node * child(unsigned row) const
-      {
-         return children_.value(row);
-      }
+    node * child(unsigned row) const
+    {
+        return children_.value(row);
+    }
       
-      node * parent() const
-      {
-         return parent_;
-      }
+    node * parent() const
+    {
+        return parent_;
+    }
       
-      node * add_child(node * child)
-      {
-         children_.push_back(child);
-         return child;
-      }
-      int row () const
-      {
-         if (parent_)
+    node * add_child(node * child)
+    {
+        children_.push_back(child);
+        return child;
+    }
+    int row () const
+    {
+        if (parent_)
             return parent_->children_.indexOf(const_cast<node*>(this));
-         else
+        else
             return 0;
-      }
+    }
       
-      ~node() 
-      {
-         qDeleteAll(children_);
-      }
+    ~node() 
+    {
+        qDeleteAll(children_);
+    }
       
-   private:
-      boost::scoped_ptr<node_base> impl_;
-      QList<node*> children_;
-      node * parent_;
+private:
+    boost::scoped_ptr<node_base> impl_;
+    QList<node*> children_;
+    node * parent_;
 };
 
 
 struct symbolizer_info : public boost::static_visitor<QString>
 {
-      QString operator() (mapnik::point_symbolizer const& sym) const
-      {
-         boost::ignore_unused_variable_warning(sym);
-         return QString("PointSymbolizer");
-      }
+    QString operator() (mapnik::point_symbolizer const& sym) const
+    {
+        boost::ignore_unused_variable_warning(sym);
+        return QString("PointSymbolizer");
+    }
       
-      QString operator() (mapnik::line_symbolizer const& sym) const
-      {
-         boost::ignore_unused_variable_warning(sym);
-         return QString("LineSymbolizer");
-      }
+    QString operator() (mapnik::line_symbolizer const& sym) const
+    {
+        boost::ignore_unused_variable_warning(sym);
+        return QString("LineSymbolizer");
+    }
 
-      QString operator() (mapnik::line_pattern_symbolizer const& sym) const
-      {
-         boost::ignore_unused_variable_warning(sym);
-         return QString("LinePatternSymbolizer");
-      }
+    QString operator() (mapnik::line_pattern_symbolizer const& sym) const
+    {
+        boost::ignore_unused_variable_warning(sym);
+        return QString("LinePatternSymbolizer");
+    }
 
-      QString operator() (mapnik::polygon_symbolizer const& sym) const
-      {
-         boost::ignore_unused_variable_warning(sym);
-         return QString("PolygonSymbolizer");
-      }
+    QString operator() (mapnik::polygon_symbolizer const& sym) const
+    {
+        boost::ignore_unused_variable_warning(sym);
+        return QString("PolygonSymbolizer");
+    }
 
-      QString operator() (mapnik::polygon_pattern_symbolizer const& sym) const
-      {
-         boost::ignore_unused_variable_warning(sym);
-         return QString("PolygonSymbolizer");
-      }
+    QString operator() (mapnik::polygon_pattern_symbolizer const& sym) const
+    {
+        boost::ignore_unused_variable_warning(sym);
+        return QString("PolygonSymbolizer");
+    }
             
-      QString operator() (mapnik::text_symbolizer const& sym) const
-      {
-         boost::ignore_unused_variable_warning(sym);
-         return QString("TextSymbolizer");
-      }
+    QString operator() (mapnik::text_symbolizer const& sym) const
+    {
+        boost::ignore_unused_variable_warning(sym);
+        return QString("TextSymbolizer");
+    }
       
-      QString operator() (mapnik::shield_symbolizer const& sym) const
-      {
-         boost::ignore_unused_variable_warning(sym);
-         return QString("ShieldSymbolizer");
-      }
+    QString operator() (mapnik::shield_symbolizer const& sym) const
+    {
+        boost::ignore_unused_variable_warning(sym);
+        return QString("ShieldSymbolizer");
+    }
       
-      template <typename T>
-      QString operator() (T const& ) const
-      {
-         return QString ("FIXME");
-      }
+    template <typename T>
+    QString operator() (T const& ) const
+    {
+        return QString ("FIXME");
+    }
 };
 
 struct symbolizer_icon : public boost::static_visitor<QIcon>
 {
-      QIcon operator() (mapnik::polygon_symbolizer const& sym) const
-      {
-         QPixmap pix(16,16);
-         QPainter painter(&pix);
-         mapnik::color const& fill = sym.get_fill();
-         QBrush brush(QColor(fill.red(),fill.green(),fill.blue(),fill.alpha()));
-         painter.fillRect(0, 0, 16, 16, brush);
-         return QIcon(pix);
-      }
+    QIcon operator() (mapnik::polygon_symbolizer const& sym) const
+    {
+        QPixmap pix(16,16);
+        QPainter painter(&pix);
+        mapnik::color const& fill = sym.get_fill();
+        QBrush brush(QColor(fill.red(),fill.green(),fill.blue(),fill.alpha()));
+        painter.fillRect(0, 0, 16, 16, brush);
+        return QIcon(pix);
+    }
 
-      QIcon operator() (mapnik::point_symbolizer const& sym) const
-      {
-         boost::shared_ptr<mapnik::ImageData32> symbol = sym.get_image();
-         if (symbol)
-         {
-            QImage image(symbol->getBytes(),symbol->width(),symbol->height(),QImage::Format_ARGB32);
-            QPixmap pix = QPixmap::fromImage(image.rgbSwapped());
-            return QIcon(pix);
-         }
-         return QIcon();
-      }
-      QIcon operator() (mapnik::line_symbolizer const& sym) const
-      {
-         QPixmap pix(48,16);
-         pix.fill();
-         QPainter painter(&pix);
-         mapnik::stroke const&  strk = sym.get_stroke();	
-         mapnik::color const& col = strk.get_color();
-         QPen pen(QColor(col.red(),col.green(),col.blue(),col.alpha()));
-         pen.setWidth(strk.get_width());
-         painter.setPen(pen);
-         painter.drawLine(0,7,47,7);
-         //painter.drawLine(7,15,12,0);
-         //painter.drawLine(12,0,8,15);      
-         return QIcon(pix);
-      }
+    QIcon operator() (mapnik::point_symbolizer const& sym) const
+    {
+        // FIXME!
+        /*
+          boost::shared_ptr<mapnik::image_data_32> symbol = sym.get_image();
+          if (symbol)
+          {
+          QImage image(symbol->getBytes(),
+          symbol->width(),symbol->height(),QImage::Format_ARGB32);
+          QPixmap pix = QPixmap::fromImage(image.rgbSwapped());
+          return QIcon(pix);
+          }
+        */
+        return QIcon();
+    }
+    QIcon operator() (mapnik::line_symbolizer const& sym) const
+    {
+        QPixmap pix(48,16);
+        pix.fill();
+        QPainter painter(&pix);
+        mapnik::stroke const&  strk = sym.get_stroke();    
+        mapnik::color const& col = strk.get_color();
+        QPen pen(QColor(col.red(),col.green(),col.blue(),col.alpha()));
+        pen.setWidth(strk.get_width());
+        painter.setPen(pen);
+        painter.drawLine(0,7,47,7);
+        //painter.drawLine(7,15,12,0);
+        //painter.drawLine(12,0,8,15);      
+        return QIcon(pix);
+    }
 
-      template <typename T>
-      QIcon operator() (T const& ) const
-      {
-         return QIcon (":/images/filter.png");
-      }
+    template <typename T>
+    QIcon operator() (T const& ) const
+    {
+        return QIcon (":/images/filter.png");
+    }
 };
 
 class symbolizer_node
 {
-   public:
-      symbolizer_node(mapnik::symbolizer const & sym)
-         : sym_(sym) {}
-      ~symbolizer_node(){}
+public:
+    symbolizer_node(mapnik::symbolizer const & sym)
+    : sym_(sym) {}
+    ~symbolizer_node(){}
       
-      QString name() const 
-      {
-         //return QString("Symbolizer:fixme");
-         return boost::apply_visitor(symbolizer_info(),sym_);
-      }
+    QString name() const 
+    {
+        //return QString("Symbolizer:fixme");
+        return boost::apply_visitor(symbolizer_info(),sym_);
+    }
       
-      QIcon icon() const
-      {
-         return boost::apply_visitor(symbolizer_icon(),sym_);//QIcon(":/images/filter.png");
-      }
-      mapnik::symbolizer const& sym_;
+    QIcon icon() const
+    {
+        return boost::apply_visitor(symbolizer_icon(),sym_);//QIcon(":/images/filter.png");
+    }
+    mapnik::symbolizer const& sym_;
 };
 
 class rule_node
 {
-   public:
-      rule_node(QString name,mapnik::rule_type const & r)
-         : name_(name),
-           rule_(r) {}
-      ~rule_node() {}
-      QString name() const
-      {
-         mapnik::filter_ptr filter = rule_.get_filter();
-         
-         return QString(filter->to_string().c_str());
-      } 
+public:
+    rule_node(QString name,mapnik::rule const & r)
+    : name_(name),
+      rule_(r) {}
+    ~rule_node() {}
+    QString name() const
+    {
+        mapnik::expression_ptr filter = rule_.get_filter();
+             
+        return QString(mapnik::to_expression_string(*filter).c_str());
+    } 
       
-      QIcon icon() const
-      {
-         return QIcon(":/images/filter.png");
-      }
+    QIcon icon() const
+    {
+        return QIcon(":/images/filter.png");
+    }
       
-   private:
-      QString name_;
-      mapnik::rule_type const& rule_;
+private:
+    QString name_;
+    mapnik::rule const& rule_;
 };
 
 class style_node
 {
-   public:
-      style_node(QString name, mapnik::feature_type_style const& style)
-         : name_(name),
-           style_(style) {}
+public:
+    style_node(QString name, mapnik::feature_type_style const& style)
+    : name_(name),
+      style_(style) {}
       
-      ~style_node() {}
+    ~style_node() {}
       
-      QString name() const
-      {
-         return name_;
-      }
+    QString name() const
+    {
+        return name_;
+    }
       
-      QIcon icon() const
-      {
-         return QIcon(":/images/style.png");
-      }
+    QIcon icon() const
+    {
+        return QIcon(":/images/style.png");
+    }
       
-   private:
-      QString name_;
-      mapnik::feature_type_style const& style_;
+private:
+    QString name_;
+    mapnik::feature_type_style const& style_;
 };
 
 class map_node
 {
-   public:
-      explicit map_node(boost::shared_ptr<mapnik::Map> map)
-         : map_(map)  {}
-      ~map_node() {}
+public:
+    explicit map_node(boost::shared_ptr<mapnik::Map> map)
+    : map_(map)  {}
+    ~map_node() {}
       
-      QString name() const
-      {
-         return QString("Map");
-      }
+    QString name() const
+    {
+        return QString("Map");
+    }
       
-      QIcon icon() const
-      {
-         return QIcon(":/images/map.png");
-      }
+    QIcon icon() const
+    {
+        return QIcon(":/images/map.png");
+    }
       
-   private:
-      boost::shared_ptr<mapnik::Map> map_;
+private:
+    boost::shared_ptr<mapnik::Map> map_;
 };
 
 StyleModel::StyleModel(boost::shared_ptr<mapnik::Map> map, QObject * parent)
-   : QAbstractItemModel(parent),
-     root_(new node(map_node(map))) 
+    : QAbstractItemModel(parent),
+      root_(new node(map_node(map))) 
 {
-   typedef std::map<std::string,mapnik::feature_type_style> style_type; 
-   style_type const & styles = map->styles();
-   style_type::const_iterator itr = styles.begin();
-   style_type::const_iterator end = styles.end();
-   for (; itr != end; ++itr)
-   {
-      node * style_n = root_->add_child(new node(style_node(QString(itr->first.c_str()),itr->second),root_.get()));
-      mapnik::rules const& rules = itr->second.get_rules();
-      mapnik::rules::const_iterator itr2 = rules.begin();
-      for ( ; itr2 != rules.end();++itr2)
-      {
-         node* rule_n = style_n->add_child(new node(rule_node(QString("Rule"),*itr2),style_n));
-         mapnik::symbolizers::const_iterator itr3 = (*itr2).begin();
-         for ( ; itr3 !=itr2->end();++itr3)
-         {
+    typedef std::map<std::string,mapnik::feature_type_style> style_type; 
+    style_type const & styles = map->styles();
+    style_type::const_iterator itr = styles.begin();
+    style_type::const_iterator end = styles.end();
+    for (; itr != end; ++itr)
+    {
+        node * style_n = root_->add_child(new node(style_node(QString(itr->first.c_str()),itr->second),root_.get()));
+        mapnik::rules const& rules = itr->second.get_rules();
+        mapnik::rules::const_iterator itr2 = rules.begin();
+        for ( ; itr2 != rules.end();++itr2)
+        {
+            node* rule_n = style_n->add_child(new node(rule_node(QString("Rule"),*itr2),style_n));
+            mapnik::rule::symbolizers::const_iterator itr3 = (*itr2).begin();
+            for ( ; itr3 !=itr2->end();++itr3)
+            {
             rule_n->add_child(new node(symbolizer_node(*itr3),rule_n));
-         }
-      }
-   }   
+            }
+        }
+    }   
 }
 
 StyleModel::~StyleModel() {}
@@ -334,64 +338,64 @@ StyleModel::~StyleModel() {}
 QModelIndex StyleModel::index (int row, int col, QModelIndex const& parent) const
 {
 //   qDebug("index() row=%d col=%d parent::internalId() = %lld", row,col,parent.internalId());
-   node * parent_node;
+    node * parent_node;
    
-   if (!parent.isValid())
-      parent_node = root_.get();
-   else
-      parent_node = static_cast<node*>(parent.internalPointer());
+    if (!parent.isValid())
+        parent_node = root_.get();
+    else
+        parent_node = static_cast<node*>(parent.internalPointer());
    
-   node * child_node = parent_node->child(row);
-   if (child_node)
-      return createIndex(row,col,child_node);
-   else
-      return QModelIndex();
+    node * child_node = parent_node->child(row);
+    if (child_node)
+        return createIndex(row,col,child_node);
+    else
+        return QModelIndex();
 }
 
 QModelIndex StyleModel::parent (QModelIndex const& index) const
 {
-   node * child_node = static_cast<node*>(index.internalPointer());
-   node * parent_node = child_node->parent();
-   if (parent_node == root_.get())
-      return QModelIndex();
+    node * child_node = static_cast<node*>(index.internalPointer());
+    node * parent_node = child_node->parent();
+    if (parent_node == root_.get())
+        return QModelIndex();
   
-   return createIndex(parent_node->row(),0,parent_node);
+    return createIndex(parent_node->row(),0,parent_node);
 }
 
 int StyleModel::rowCount(QModelIndex const& parent) const
 {
-   //qDebug("rowCount");
-   node * parent_node;
-   if (parent.column() > 0) return 0;
-   if (!parent.isValid())
-      parent_node = root_.get();
-   else
-      parent_node = static_cast<node*>(parent.internalPointer());
-   return parent_node->num_children();
+    //qDebug("rowCount");
+    node * parent_node;
+    if (parent.column() > 0) return 0;
+    if (!parent.isValid())
+        parent_node = root_.get();
+    else
+        parent_node = static_cast<node*>(parent.internalPointer());
+    return parent_node->num_children();
 }
 
 int StyleModel::columnCount( QModelIndex const&) const
 {
-   return 1;
+    return 1;
 }
 
 QVariant StyleModel::data(const QModelIndex & index, int role) const
 {
-   //qDebug("data index::internalId() = %lld", index.internalId());
-   if (!index.isValid())
-      return QVariant();
-   node * cur_node = static_cast<node*>(index.internalPointer());
-   if (cur_node)
-   {
-      if (role == Qt::DisplayRole)
-      {
-         
-         return QVariant(cur_node->name());
-      }
-      else if ( role == Qt::DecorationRole)
-      {
-         return cur_node->icon();
-      }
-   }
-   return QVariant();
+    //qDebug("data index::internalId() = %lld", index.internalId());
+    if (!index.isValid())
+        return QVariant();
+    node * cur_node = static_cast<node*>(index.internalPointer());
+    if (cur_node)
+    {
+        if (role == Qt::DisplayRole)
+        {
+             
+            return QVariant(cur_node->name());
+        }
+        else if ( role == Qt::DecorationRole)
+        {
+            return cur_node->icon();
+        }
+    }
+    return QVariant();
 }
diff --git a/demo/viewer/viewer.pro b/demo/viewer/viewer.pro
index 12e9c7a..681620e 100644
--- a/demo/viewer/viewer.pro
+++ b/demo/viewer/viewer.pro
@@ -4,15 +4,15 @@
 CC = g++
 TEMPLATE = app
 
-INCLUDEPATH += /opt/mapnik/include
-INCLUDEPATH += /opt/boost/include/boost-1_39
+INCLUDEPATH += /usr/local/include/
+INCLUDEPATH += /usr/boost/include/
 INCLUDEPATH += /usr/X11/include/
 INCLUDEPATH += /usr/X11/include/freetype2
 INCLUDEPATH += .
 
-QMAKE_CXXFLAGS +=' -DDARWIN -Wno-missing-field-initializers'
-unix:LIBS =  -L/opt/mapnik/lib -L/usr/X11/lib -lmapnik -lfreetype -L/usr/local/lib -licuuc
-unix:LIBS += -lboost_system -lboost_filesystem -lboost_regex -L/opt/boost/lib
+QMAKE_CXXFLAGS +=' -DDARWIN -Wno-missing-field-initializers -ansi'
+unix:LIBS =  -L/usr/local/lib -L/usr/X11/lib -lmapnik2 -lfreetype
+unix:LIBS += -lboost_system -licuuc -lboost_filesystem -lboost_regex
 
 # Input
 
diff --git a/docs/epydoc_config/build_epydoc.sh b/docs/epydoc_config/build_epydoc.sh
index bd69724..3644c8a 100755
--- a/docs/epydoc_config/build_epydoc.sh
+++ b/docs/epydoc_config/build_epydoc.sh
@@ -5,15 +5,15 @@ API_DOCS_DIR="../api_docs/python"
 if [ ! -d $API_DOCS_DIR ]
     then 
         echo "creating $API_DOCS_DIR"
-	mkdir -p $API_DOCS_DIR
+    mkdir -p $API_DOCS_DIR
 fi
 
 epydoc --no-private \
     --no-frames \
     --no-sourcecode \
-    --name mapnik \
+    --name mapnik2 \
     --url http://mapnik.org \
-    --css mapnik_epydoc.css mapnik \
+    --css mapnik_epydoc.css mapnik2 \
     -o $API_DOCS_DIR
 
 exit $?
diff --git a/docs/epydoc_config/test_build_epydoc.sh b/docs/epydoc_config/test_build_epydoc.sh
index 73cddbc..dd03d87 100755
--- a/docs/epydoc_config/test_build_epydoc.sh
+++ b/docs/epydoc_config/test_build_epydoc.sh
@@ -1,2 +1,2 @@
 rm -rf test_api
-epydoc --no-private --no-frames --no-sourcecode --name mapnik --url http://mapnik.org --css mapnik_epydoc.css mapnik -o test_api
+epydoc --no-private --no-frames --no-sourcecode --name mapnik2 --url http://mapnik.org --css mapnik_epydoc.css mapnik2 -o test_api
diff --git a/docs/ogcserver/readme.txt b/docs/ogcserver/readme.txt
index 25a7b6e..bd89ffb 100644
--- a/docs/ogcserver/readme.txt
+++ b/docs/ogcserver/readme.txt
@@ -1,4 +1,4 @@
-# $Id: readme.txt 1186 2009-06-29 00:11:14Z dane $
+# $Id: readme.txt 2324 2010-11-08 21:37:16Z dane $
 
 Mapnik OGC Server
 -----------------
@@ -12,7 +12,7 @@ through the open and standard WMS interface published by the Open Geospatial
 Consortium (OGC).  It is in implemented in Python, around the core Mapnik C++
 library.
 
-This is the very first implementation of a WMS for Mapnik.  Although inital
+This is the very first implementation of a WMS for Mapnik.  Although initial
 testing seems to suggest it works well, there may be bugs, and it lacks some
 useful features.  Comments, contributions, and requests for help should all be
 directed to the Mapnik mailing list.
diff --git a/fonts/SConscript b/fonts/SConscript
deleted file mode 100644
index 023d587..0000000
--- a/fonts/SConscript
+++ /dev/null
@@ -1,36 +0,0 @@
-#  This file is part of Mapnik (c++ mapping toolkit)
-#  Copyright (C) 2005 Artem Pavlenko, Jean-Francois Doyon
-#
-#  Mapnik is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU General Public License
-#  as published by the Free Software Foundation; either version 2
-#  of the License, or any later version.
-# 
-#  This program is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#  GNU General Public License for more details.
-# 
-#  You should have received a copy of the GNU General Public License
-#  along with this program; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-# 
-# $Id$
-
-import glob
-
-Import('env')
-
-prefix = env['PREFIX']
-install_prefix = env['DESTDIR'] + '/' + prefix
-
-# grab all the deja vu fonts
-includes = glob.glob('*/*/*.ttf')
-
-# grab single unifont ttf (available at http://unifoundry.com/unifont.html)
-includes.extend(glob.glob('unifont*.ttf'))
-
-fontscollectionpath = install_prefix + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME'] + '/fonts'
-
-if not env['SYSTEM_FONTS']:
-    env.Alias(target='install', source=env.Install(fontscollectionpath, includes))
\ No newline at end of file
diff --git a/fonts/build.py b/fonts/build.py
new file mode 100644
index 0000000..99acaaa
--- /dev/null
+++ b/fonts/build.py
@@ -0,0 +1,32 @@
+#  This file is part of Mapnik (c++ mapping toolkit)
+#  Copyright (C) 2005 Artem Pavlenko, Jean-Francois Doyon
+#
+#  Mapnik is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or any later version.
+# 
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+# 
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+# 
+# $Id$
+
+import os
+import glob
+
+Import('env')
+
+# grab all the deja vu fonts
+includes = glob.glob('*/*/*.ttf')
+
+# grab single unifont ttf (available at http://unifoundry.com/unifont.html)
+includes.extend(glob.glob('unifont*.ttf'))
+
+if 'uninstall' not in COMMAND_LINE_TARGETS and not env['SYSTEM_FONTS']:
+    env.Alias(target='install', source=env.Install(env['MAPNIK_FONTS_DEST'], includes))
diff --git a/fonts/dejavu-fonts-ttf-2.30/AUTHORS b/fonts/dejavu-fonts-ttf-2.30/AUTHORS
deleted file mode 100644
index 94d37c2..0000000
--- a/fonts/dejavu-fonts-ttf-2.30/AUTHORS
+++ /dev/null
@@ -1,46 +0,0 @@
-abysta at yandex.ru
-Adrian Schroeter
-Andrey Valentinovich Panov
-Ben Laenen
-Besarion Gugushvili
-Bhikkhu Pesala
-Clayborne Arevalo
-Dafydd Harries
-Danilo Segan
-Davide Viti
-David Jez
-David Lawrence Ramsey
-Denis Jacquerye
-Dwayne Bailey
-Eugeniy Meshcheryakov
-Gee Fung Sit
-Heikki Lindroos
-James Cloos
-James Crippen
-John Karp
-Keenan Pepper
-Lars Naesbye Christensen
-Mashrab Kuvatov
-Max Berger
-Mederic Boquien
-Michael Everson
-Misu Moldovan
-Nguyen Thai Ngoc Duy
-Nicolas Mailhot
-Ognyan Kulev
-Ondrej Koala Vacha
-Peter Cernak
-Remy Oudompheng
-Roozbeh Pournader
-Sahak Petrosyan
-Sander Vesik
-Stepan Roh
-Stephen Hartke
-Steve Tinney
-Tavmjong Bah
-Tim May
-Valentin Stoykov
-Vasek Stodulka
-Wesley Transue
-
-$Id: AUTHORS 2344 2009-03-08 13:02:37Z moyogo $
diff --git a/fonts/dejavu-fonts-ttf-2.30/NEWS b/fonts/dejavu-fonts-ttf-2.30/NEWS
deleted file mode 100644
index a05a30c..0000000
--- a/fonts/dejavu-fonts-ttf-2.30/NEWS
+++ /dev/null
@@ -1,1215 +0,0 @@
-Changes from 2.29 to 2.30
-
-* added U+0462-U+0463 to Mono (by Denis Jacquerye) 
-* corrected U+1E53 in Serif (by Gee Fung Sit) 
-* added U+1E4C-U+1E4D to Mono and Serif (by Gee Fung Sit) 
-* added U+1E78-U+1E79 to Mono (by Gee Fung Sit) 
-* fixed missing diacritics in Latin Extended Additional in Sans ExtraLight
-  (moved stacked diacritics out of PUA in the process) (by Gee Fung Sit) 
-* fixed anchors on U+1E78 in Serif (by Gee Fung Sit) 
-* added U+1DC4-U+1DC9 to Serif (by Denis Jacquerye) 
-* renamed above-mark to above-mark in Serif-Italic (by Denis Jacquerye) 
-* added U+1DC4-U+1DC9 to context class for dotless substitution (by Denis
-  Jacquerye) 
-* changed Doubleacute to Doublegrave in Sans ExtraLight (by Gee Fung Sit) 
-* removed redundant reference in U+01FB in Sans Oblique (by Gee Fung Sit) 
-* added U+A726-U+A727 to Mono (Denis Jacquerye) 
-* changed U+04BE and U+04BF according to recommedations of Sasha Ankwab in Sans
-  (by Andrey V. Panov) 
-* remove "Symbol Charset" from set of codepages in Sans (by Eugeniy
-  Meshcheryakov)
-
-Changes from 2.28 to 2.29
-
-* modified U+10FB in Sans to be a mirror image of U+2056, since U+10FB is not
-  Georgian-specific (by Roozbeh Pournader)
-* added U+2B1F, U+2B24, U+2B53, U+2B54 in Sans (by Roozbeh Pournader)
-* fixed TUR opentype language tag to TRK in Serif (bug 19825) (by Ben Laenen)
-* early implementation of Abkhaz letter U+0524-U+0525 in Sans
-  (by Michael Everson and abysta)
-* flipped U+1D538 in Sans (by Gee Fung Sit)
-* added U+26B3-U+26B8, U+1D7D8-U+1D7E1 in Sans (by Gee Fung Sit)
-* corrected U+1D7A9 in Sans Bold Oblique (by Gee Fung Sit)
-* Fixed U+0649 to be dual-joining in Sans Mono (by Roozbeh Pournader)
-* Remove unnecessary 'isol' feature from Sans Mono (by Roozbeh Pournader)
-* Remove 'cmap' mappings for U+066E, U+066F, U+067C, U+067D, U+0681, U+0682,
-  U+0685, U+0692, U+06A1, U+06B5, U+06BA, U+06C6, U+06CE, and U+06D5
-  in Sans Mono (bug 20323) (by Roozbeh Pournader)
-* add half brackets (U+2E22 - U+2E25, by Steve Tinney) 
-
-Changes from 2.27 to 2.28
-
-* added U+A789, U+A78A in Sans and Sans Mono (by Denis Jacquerye)
-* modified U+02D6, U+02D7, U+02EE in Sans and Sans Mono (by Denis Jacquerye)
-* added U+1E9E (German capital ß) to Sans and Serif (by Denis Jacquerye)
-* adjusted width of U+01B7-U+01B9 in Serif Italic (by Denis Jacquerye)
-* modified U+021C, U+021D in Sans (by Denis Jacquerye)
-* added U+021C, U+021D in Mono (by Denis Jacquerye)
-* added U+F428 (Georgian Nuskhuri "f") in private use area (by Besarion
-  Gugushvili)
-* updated Georgian mkhedruli (U+10D0-U+10FA) with new version (by Besarion
-  Gugushvili)
-* updated Georgian asomtavruli (U+10A0-U+10C5) with new version (by Besarion
-  Gugushvili)
-* added Georgian nuskhuri (U+2D00-U+2D25) (by Besarion Gugushvili)
-* added Georgian mtavruli in private use area (U+F400-U+F426) (by Besarion
-  Gugushvili)
-* added mark anchors above to Cyrillic U+0430-U+0438, U+043A-U+044F,
-  U+0454-U+0455 in Mono (by Ben Laenen)
-* modified/moved up U+0318-U+0319, U+031C-U+031F, U+0329-U+032A, U+032C-U+032D,
-  U+0339-U+033B, U+0348 and U+0353 in Sans to prevent cut-off (by Gee Fung Sit)
-* added U+035A to Sans (by Gee Fung Sit)
-* updated fontconfig files (by Nicolas Mailhot)
-* added U+2032-2037 to Mono (by Denis Jacquerye)
-* added Ogham to Sans ExtraLight (by Gee Fung Sit)
-* added U+2C6F, U+2C79, U+2C7C-2C7D to Mono (by Gee Fung Sit)
-* added U+210F to Serif and Sans ExtraLight (by Gee Fung Sit)
-* changed U+210F to a more common glyph in Sans and Mono (by Gee Fung Sit)
-
-Changes from 2.26 to 2.27
-
-* added some of Michael Everson's new Cyrillic glyphs to Sans (by Wesley
-  Transue)
-* removed blank glyph at U+05EF from Sans Bold Oblique (by Gee Fung Sit)
-* small adjustments to existing tone bars in Sans and Mono (by Gee Fung Sit)
-* added U+0372-U+0373, U+0376-U+0377, U+03CF, U+A668-U+A66E, U+A708-U+A711,
-  U+A71B-U+A71F to Sans (by Gee Fung Sit)
-* copied U+02E5-U+02E9 over from Sans to fix inconsistencies in Serif (by Gee
-  Fung Sit)
-* added U+021C-U+021D, U+0370-U+0371, U+037B-U+037D, U+0470-U+0471,
-  U+0510-U+0515, U+051A-U+051D, U+1E9F, U+2C64, U+2C6E-U+2C6F, U+2C79,
-  U+2C7C-U+2C7D, U+A644-U+A647, U+A650-U+A651, U+A654-U+A657, U+A708-U+A716,
-  U+A71B-U+A71F to Serif (by Gee Fung Sit)
-* added U+A708-U+A716, U+A71B-U+A71F to Mono (by Gee Fung Sit)
-* added anchors to U+017F (ſ) and fixed U+1E9B (ẛ) in Serif (by Gee Fung Sit)
-* made U+0325 smaller in Sans Bold and Serif to match Sans Book (by Gee Fung
-  Sit)
-* fixes to U+02F3 (moved up), U+228F-U+2294 (more square-like) and
-  U+22CE-U+22CF (stroke width) in Sans (by Gee Fung Sit)
-* replaced U+2202 ∂ (Sans and Mono) and U+221D ∝, U+221E ∞ (Sans) with glyphs
-  from Arev (with small changes) (by Gee Fung Sit)
-* added U+22B0-U+22B1, U+22C7, U+22D0-U+22D5 from Arev to Sans to complete the
-  block (by Gee Fung Sit)
-* added U+0514-U+0515 to Sans ExtraLight (by Gee Fung Sit)
-* skewed U+A78C in all Oblique/Italic fonts (by Gee Fung Sit)
-* moved U+2215 to U+2044 in Sans and Serif and replaced U+2215 with reference
-  to U+002F in all fonts (by Gee Fung Sit)
-* added U+2C6E to Mono (by Denis Jacquerye)
-* added U+A782 and U+A783 in Sans (by Wesley Transue)
-* added U+0244, U+024C-024D, U+2C64 in Sans Mono (by Denis Jacquerye)
-* modified U+01AE in Sans Mono (by Denis Jacquerye)
-* added U+2C7A to all fonts (by Gee Fung Sit)
-* italicized/small changes to U+2C76 in Serif (Bold) Italic (by Gee Fung Sit)
-* improved outlines of U+2C68, U+2C6A, U+2C6C in Serif (Bold) Italic (by Gee
-  Fung Sit)
-* rounded U+2C77 at the bottom in Serif (by Gee Fung Sit)
-* added joining behavior for tone letters (U+02E5-U+02E9) in Sans (bug #15669)
-  (by Gee Fung Sit)
-* fixed outline of y.alt in Sans Regular (by Denis Jacquerye) 
-* changed references of U+1D5A8, U+1D5C5, U+1D5DC, U+1D5F9, U+1D610, U+1D62D,
-  U+1D644 and U+1D661 to stylistic alternates to have a better distinction (by
-  Gee Fung Sit)
-* hinted I.alt in Sans Regular (by Gee Fung Sit)
-* added U+0487, completing Cyrillic block (by Gee Fung Sit)
-* extended the bar of U+0463 to the right and moved the anchor (by Gee Fung
-  Sit)
-* added anchors to glyphs in Cyrillic block (by Gee Fung Sit)
-* added (preliminary) hints to tone letter forms (U+02E5.5, U+02E9.1, stem) in
-  Sans Book (by Gee Fung Sit)
-
-Changes from 2.25 to 2.26
-
-- added glyphs for Cyrillic-B to Sans (by Wesley Transue) 
-- added U+0370-U+0371 to Sans (by Wesley Transue) 
-- added U+019C, U+01A2-U+01A3, U+01A6, U+01E4-U+01E5, U+024C-U+024D, U+0285,
-  U+0290, U+02A0, U+0370-U+0371, U+03F1, U+03FC to Sans ExtraLight (by Wesley
-  Transue) 
-- added U+20A0-U+20A5, U+20A7-U+20B3, U+2105, U+210D, U+210F, U+2115, U+2117,
-  U+2119-U+211A, U+211D, U+2124, U+212E, U+2200-U+2204 to Mono (by Heikki
-  Lindroos) 
-- added U+01BA and U+01BF to Mono (by Heikki Lindroos) 
-- merged OpenType "aalt" feature in Latin in Sans (by Denis Jacquerye) 
-- added alternative shape for y in Sans (by Denis Jacquerye) 
-- added saltillo (U+A78B-U+A78C) to all faces (by James Cloos) 
-- changed U+047C-U+047D to references instead of outlines in Sans (by Wesley
-  Transue) 
-- added Latin letter tresillo U+A72A-U+A72B to Sans (by Wesley Transue) 
-- added U+A734-U+A737 to Sans (by Wesley Transue) 
-- added U+2053 to Serif and fixed it bug:9425 in Sans (by Gee Fung Sit) 
-- removed problematic hints for U+0423 bug:10025 (by Gee Fung Sit) 
-- added U+27C5-U+27C6 bug:10255 to all faces (by Gee Fung Sit) 
-- fixed width of U+2016 in Sans Oblique (by Gee Fung Sit) 
-- added U+2016, U+2032-U+2038, U+2042, U+2045-U+2046, U+204B-U+204F,
-  U+2051-U+2052, U+2057 to Serif (by Gee Fung Sit) 
-- made U+2140 bigger to match other n-ary operators (by Gee Fung Sit) 
-- added U+0606-U+0607, U+0609-U+060A to Sans (by Gee Fung Sit) 
-- added U+221B-U+221C to Mono (by Gee Fung Sit) 
-- small adjustments to U+221B-U+221C in Sans and Serif (by Gee Fung Sit) 
-- update U+04B4-U+04B5 in Serif (by Andrey V. Panov) 
-- increased max-storage value from maxp table to 153 (by Andrey V. Panov) 
-- added U+0472-U+0473, U+0510-U+0511, U+051A-U+051D, U+0606-U+0607,
-  U+0609-U+060A, U+1E26-U+1E27, U+1E54-U+1E55, U+1E7C-U+1E7D, U+1E8C-U+1E8D,
-  U+1E90-U+1E91, U+1E97-U+1E99, U+1E9F, U+1EAC-U+1EAD, U+1EB6-U+1EB7,
-  U+1EC6-U+1EC7, U+1ED8-U+1EDD, U+1EE0-U+1EE3, U+1EE8-U+1EEB, U+1EEE-U+1EF1 to
-  Mono (by Gee Fung Sit) 
-- added locl rules for S/T cedilla for Romanian and Moldavian so they get
-  rendered as S/T with comma accent (see Redhat bug #455981) (by Ben Laenen) 
-- removed ligature rule from Armenian U+0587 bug:16113 (by Gee Fung Sit)
-
-Changes from 2.24 to 2.25
-
-- moved/added U+2E18 (by Gee Fung Sit)
-- added empty glyph for U+2064 in Sans and Serif (by Gee Fung Sit)
-- added U+22CE-U+22CF to Sans (by Gee Fung Sit)
-- Sans Oblique and Bold Oblique, Serif: reverted digits hinting instructions back to before revision 1590, which fixed mistaken debian bug #471024. This fixes Debian bug #411308. The original bug was in freetype not in the fonts (by Denis Jacquerye)
-- added U+A726-U+A729, U+A730-U+A733, U+A738-U+A73F, U+A746-U+A74B, U+A74E-U+A74F, U+A780-U+A781, U+A7FB-U+A7FF to Sans (by Gee Fung Sit)
-- added Macedonian italic glyph shape for U+0453 in Serif (by Ben Laenen)
-- changed descenders in U+0446, U+0449, U+0497, U+04A3, U+04AD (by Andrey V. Panov)
-- updated main SFD files to SplineFontDB 3.0 (Denis Jacquerye and Gee Fung Sit)
-- moved U+0561 2 up since it wasn't aligned with the baseline well (by Ben Laenen)
-- added U+2E2E to Sans (by Gee Fung Sit)
-- replaced U+2699 with simpler version in Sans (by Gee Fung Sit)
-- added a lot of hinting instructions to Latin Extended B, Greek and Coptic glyphs Sans Book (by Wesley Transue)
-- differentiated U+2219 from U+22C5 and adjusted affected references in Sans and Mono (by Gee Fung Sit)
-- made Hebrew narrower in Sans Bold and Sans Bold Oblique (by Denis Jacquerye)
-- added Kurdish and Chuvash letters from Unicode 5.1 Cyrillic Extended block (by Wesley Transue)
-- added U+1E9F, U+A644-U+A647, U+A64C-U+A64D, U+A650-U+A651, U+A654-U+A655, U+A712U+A716 to Sans (by Gee Fung Sit)
-- added several glyphs to Sans ExtraLight (by Gee Fung Sit)
-- added hinting instructions to U+046A-U+046B, U+0508-U+0509, U+050B, U+0512-U+0513 in Sans Book (by Wesley Transue)
-- corrected width of U+027E in Sans Book (by Gee Fung Sit)
-- added U+2C79, U+2C7B-U+2C7D to Sans (by Gee Fung Sit)
-- added a bunch of glyphs+small corrections to Sans Light (by Gee Fung Sit)
-- added U+0496, U+0497, U+04B0, U+04B1 (by Andrey V. Panov)
-- updated U+0493, U+049B, U+04B3, U+04B7, U+04F7 (by Andrey V. Panov)
-- further improvements in extended Cyrillic (by Andrey V. Panov) 
-
-Changes from 2.23 to 2.24
-
-- instructions for U+05C0 ׀, U+05C3 ׃, U+05F3 ׳, and U+05F4 ״ in DejaVu 
-   Sans. (by Wesley Transue)
-- instructions for U+2116 in Sans (by Andrey V. Panov)
-- Unicode 5.1 update: moved U+F208 to U+2C6D, U+F25F to U+2C71, added 
-  U+2C6E-U+2C6F, U+2C72-U+2C73, updated outline of U+2C71 in Sans. (by 
-  Denis Jacquerye)
-- updated and instructed U+0401 in Sans (by Andrey V. Panov)
-- fixed the bug in Sans faces where U+02EC ˬ faced the wrong direction. 
-  Also, added a few more glyph instructions. (by Wesley Transue)
-- removed OS2Sub and OS2Strike that weren't intentional in Sans 
-  ExtraLight. (by Denis Jacquerye)
-- updated instructions for U+401, U+44F in Serif Book. (by Andrey V. 
-  Panov)
-- instructions for U+02C4 ˄, U+02C5 ˅, U+03D8 Ϙ, U+03D9 ϙ, U+0494 Ҕ, and 
-  U+0495 ҕ in Sans Book. (by Wesley Transue)
-- instructions for U+01A6 Ʀ, U+0238 ȸ, U+0239 ȹ, U+02EC ˬ, and U+05C6 ׆ 
-  in Sans Book. (by Wesley Transue)
-- DejaVuSans.sfd DejaVuSerif.sfd: updated instructions for U+447 and 
-  U+451 using code generated with xgridfit (by Andrey V. Panov)
-- instructions for a few glyphs in the Latin Extended-B Block, Greek 
-  Block, Cyrillic Block, and N'Ko block. (by Wesley Transue)
-- updated sfdnormalize.pl, and SFD files to new SFD format with empty 
-  lines. (by Denis Jacquerye) 
-
-Changes from 2.22 to 2.23
-
-- fixed bug which made Condensed fonts appear instead of normal width ones
-- added U+20DB, U+20DC, and U+20E1 to Sans (by Roozbeh Pournader)
-- added hinting instructions to U+01A7, U+01AA-U+01AC, U+01AE-U+01AF,
-  U+01BC-U+01BD, U+01BF, U+01F7, U+0277, U+027F, U+0285-U+0286, U+0297, U+02AF,
-  U+02B4-U+02B5, U+02BD, U+030D, U+0311, U+0329, U+04A0-U+04A1 in Sans Book (by
-  Wesley Transue)
-- modified hinting instructions of U+04A2 in Sans Book (by Wesley Transue)
-- added hinting instructions to U+237D, U+2423 in Mono Book and Mono Bold (by
-  Wesley Transue)
-- added mathematical alphanumeric symbols to all styles (by Max Berger)
-- added Unicode 5.1 U+2E18 as U+2E18.u51 (not yet usable) to Sans (by Roozbeh
-  Pournader) 
-- dereferenced all glyphs with mixed references and outlines (by Denis
-  Jacquerye)
-- removed non-zero width from U+0344 in Sans (by Denis Jacquerye)
-
-Changes from 2.21 to 2.22
-
-- directory structure has changed, we now use the Makefile
-- modified Armenian U+0565 in Sans (by Սահակ Պետրոսյան)
-- added double struck letters and numbers U+2102, U+210D, U+2115,
-  U+2119-U+211A, U+211D, U+2124, U+213C-U+2140, U+2145-U+2149, U+1D538-U+1D539,
-  U+1D53B-U+1D53E, U+1D540-U+1D544, U+1D546, U+1D54A-U+1D550, U+1D552-U+1D56B,
-  U+1D7D8-U+1D7E1 to Serif (by Stephen Hartke)
-- added letterlike symbols U+2103, U+2109, U+2127, U+214B, U+2141-U+2144 to
-  Serif (by Ben Laenen)
-- fixed outline direction of U+2143 in Sans Bold/Bold Oblique (by Ben Laenen)
-- added arrow set in Serif: arrows: U+2194-U+21FF; dingbats: U+27A1;
-  supplemental arrows A: U+27F0-U+27FF; supplemental arrows B: U+2900-U+2975,
-  U+297A; miscellaneous symbols and arrows: U+2B00-U+2B11 (by Ben Laenen)
-- added U+0180, U+01DE, U+01E0-01E1, U+022A, U+022C, U+0230, U+1E08-U+1E09,
-  U+1E10-U+1E11, U+1EB0-U+1EB1 to Mono (by Denis Jacquerye)
-- adjusted U+01D5, U+01D7, U+01D9, U+1DB in Mono (by Denis Jacquerye)
-- added Ogham in Sans (by Wesley Transue)
-- added Yijing Hexagram Symbols in Sans (by Wesley Transue)
-- hinting instructions added to Cyrillic U+0460, U+04A6-U+04A7, U+04AC-U+04AD,
-  U+04C7-U+04C8, U+04F6-U+04F7, U+04FA-U+04FB, U+050C-U+050D in Sans Book (by
-  Wesley Transue)
-- adjusted Cyrillic letters U+042A, U+044A, U+044C, U+0459-U+045B, U+0462,
-  U+048C-U+048D in Serif (by Andrey V. Panov)
-- hinting instructions added to Lao U+0EB7 in Sans (by Wesley Transue)
-- added Roman numerals and Claudian letter U+2160-U+2184 in Serif (by Ben
-  Laenen)
-- added U+FFF9-U+FFFD to Sans, Serif and Mono (by Lars Næsbye Christensen)
-- added mathematical symbols to Serif: U+2200, U+2203-U+2204, U+2213-U+2214,
-  U+2217-U+2218, U+2223-U+2226, U+2250-U+2255, U+2295-U+22AF, U+22C5 (by Ben
-  Laenen)
-- modified bullet symbol U+2219 in Serif (by Ben Laenen)
-
-Changes from 2.20 to 2.21
-
-- added U+FE20-U+FE23 (half diacritics) to Sans (by Denis Jacquerye)
-- added anchor "half" to position right half of double marks, U+FE21 or U+FE23
-  to Sans (by Denis Jacquerye)
-- shifted U+0360 up to avoid collision with some outlines in Sans (by Denis
-  Jacquerye)
-- added anchor above-mark anchor to U+035D, U+035E, U+0360, U+0361 in Sans (by
-  Denis Jacquerye)
-- added instructions for ff, ffi, ffl ligatures in Serif Bold (by Eugeniy
-  Meshcheryakov)
-- added instructions to some N'Ko glyphs (by Wesley Transue)
-- added instructions to some Lao glyphs (by Wesley Transue)
-- cleaning up 'liga' Standard Ligature in Latin, in Sans and Sans Mono (by
-  Denis Jacquerye)
-- added U+046A, U+046B (big yus) in Serif (by Andrey V. Panov)
-- added box drawing symbols to Sans and Serif (by Lars Næsbye Christensen)
-- added Makefile to improve font and packages generating (by Nicolas Mailhot)
-
-Changes from 2.19 to 2.20
-
-- removed TeX and TeXData tags from all sfd files (by Eugeniy  Meshcheryakov)
-- removed all 'frac' lookups (by Eugeniy  Meshcheryakov)
-- fixed duplicate glyph names (by Eugeniy  Meshcheryakov)
-- removed standard ligatures with U+00B7 in Mono (by Eugeniy  Meshcheryakov)
-- use reference to U+002D in U+00AD in Sans Oblique, and adjust instructions
-  (by Eugeniy  Meshcheryakov)
-- updated Cyrillic in Sans Extra Light (by Andrey V. Panov)
-- added instructions to N'Ko U+07C1-U+07C6, U+07CA, U+07CE-U+07CF, U+07D1,
-  U+07D3-U+07D4, U+07D8, U+07DB and U+07EB in Sans (by Wesley Transue)
-- added instructions to Lao U+0E8A, U+0E95, U+0E97, U+EA5, U+0EB4 and U+0EB5
-  (by Wesley Transue)
-- adjusted instructions for Hebrew glyphs (by Denis Jacquerye)
-- added instructions for U+0265 in Sans Bold (by Denis Jacquerye)
-- fix U+1D68 in Sans: it had the shape of delta, where it should be a rho (by
-  Ben Laenen)
-- remove U+1D5C glyph in Sans Oblique (it was empty) (by Ben Laenen)
-- fix instructions of U+01AD in Sans Bold  (by Ben Laenen)
-- fix instructions of U+042D in Serif (by Ben Laenen)
-- remove buggy instructions of U+2328 in Serif (by Ben Laenen)
-- corrected width of U+2C75-U+2C76 in Sans Bold and Serif Bold (by Gee Fung Sit)
-- added U+2C75-U+2C77 to Mono (by Gee Fung Sit)
-
-Changes from 2.18 to 2.19
-
-- fixed misplaced symbols (U+2325,2326) in Sans Oblique (by John Karp) 
-- added Mark to Base anchors: 'cedilla' for combining cedilla and
-  'above-legacy' for stacking above precomposed glyphs (just a,e,i,o,u with
-  macron for now) in Sans (by Denis Jacquerye).
-- added contextual substitution for Case and Dotless forms in all Sans variants
-  (by Denis Jacquerye).
-- renamed 'ccmp' lookups for RTL and Basic (LGC, etc.) (by Denis Jacquerye)
-- added anchor 'cedilla' for vowels in Sans. (by Denis Jacquerye)
-- extended contextual dotless and case substitutions to handle both below and
-  above diacritics (by Denis Jacquerye)
-- renamed Dotless and Case Form GSUB lookups in Sans with meaningful names (by
-  Denis Jacquerye)
-
-Changes from 2.17 to 2.18
-
-- Re-encoded the source files for Full Unicode (by Ben Laenen)
-- Re-enabled the "ff", "fl", "fi", "ffl", "ffi" ligatures by default in Serif
-  (by Ben Laenen)
-- Disabled the "fi", "ffi" ligatures for languages with dotless i in Serif (by
-  Ben Laenen)
-- added Tifinagh to Sans Book and Bold, U+2D30-U+2D65, U+2D6F, partially hinted
-  in Sans Book. (by Denis Jacquerye)
-- added Tai Xuan Jing Symbols (U+1D300-1D356) to Sans (by Remy Oudompheng)
-- added double-struck letters (U+1D538-U+1D56B minus reserved code points) to
-  Sans (by Gee Fung Sit)
-- added U+22EE-U+22F1 to Sans (by Gee Fung Sit)
-- added U+2C67-U+2C6C, U+2C75-U+2C77 to Serif (by Gee Fung Sit)
-- italicized various glyphs in Latin Extended-B, IPA Extensions, Spacing
-  Modifier Letters, Phonetic Extension (Supplement) and Super- and Subscripts
-  in Serif Oblique fonts (by Gee Fung Sit)
-- modified outlines, bearings of Hebrew U+05D6, U+05D8, U+05DB, U+05DE, U+05E0,
-  U+05E1, U+05E2, U+05EA in Sans Book and Oblique, adjusted hinting in Book
-  based on Yotam Benshalom's comments. (by Denis Jacquerye)
-- added Braille Patterns (U+2800-U+28FF) to Serif fonts (by Gee Fung Sit)
-- added N'Ko to Sans Book and Bold: U+07C0-U+07E7, U+07EB-U+07F5, U+07F8-U+07FA
-  (by Eugeniy  Meshcheryakov)
-- added U+0ED8 (Lao digit 8) to Sans (by Remy Oudompheng)
-- added Lao diacritics U+0EB0-0EB9, U+0EBB-0EBC, U+0EC8-0ECD to Mono (by Remy
-  Oudompheng)
-- renamed Serif [Bold] Oblique, make it Italic (by Eugeniy  Meshcheryakov)
-- added U+29FA-U+29FB to Sans and Sans Mono (by Gee Fung Sit)
-- swapped glyphs for Eng U+014A from Sami Eng to African Eng, the latter being
-  more common (by Denis Jacquerye)
-- swapped ae U+00E6 and ae.alt in Serif Italics fonts, thus fixing #8213 (by
-  Denis Jacquerye)
-- minor improvements to Misc. Symbols in Sans (by Gee Fung Sit)
-- minor improvements and additions to Sans ExtraLight (by Gee Fung Sit)
-- improved instructions for various Cyrillic letters (by Eugeniy  Meshcheryakov)
-- fixed hinting of theta and chi in Sans Book (by Ben Laenen)
-- added Georgian Mkhedruli to Sans, Serif and Mono, ASumtavruli to Sans and
-  Serif (by Besarion Gugushvili)
-
-Changes from 2.16 to 2.17
-
-- Sans fonts: fix position for certain combinations of Arabic fatha, kasra,
-  shadda, damma, kasratan, dammatan, fathatan and hamza (by Ben Laenen)
-- added 'ae.alt' to Serif Oblique fonts, with design matching shape of italic
-  'a' instead of slanted 'a', see bug #8213 (by Denis Jacquerye)
-- added super- and subscripts to Serif and Mono: U+1D2C-U+1D2E, U+1D30-U+1D3C,
-  U+1D3E-U+1D42, U+1D62-U+1D65, U+1D78, U+2071, U+207A-U+207E, U+208A-U+208E,
-  U+2090-U+2094 (by Gee Fung Sit)
-
-Changes from 2.15 to 2.16
-
-- fixed hinting instructions for digits in DejaVu Sans Oblique, Bold Oblique,
-  and Serif Book to not change glyph width (by Eugeniy  Meshcheryakov)
-- added instructions for U+0404, U+0411, U+0413, U+0414, U+0417-U+041B, U+041F,
-  U+0423, U+0424, U+0426-U+0429, U+042C, U+042E, U+042F, U+0490 in Serif Bold
-  (by Eugeniy  Meshcheryakov)
-- added U+0220 and Eng.alt to Serif fonts (by Denis Jacquerye)
-- added U+232C, U+2394, U+23E3 to Sans fonts (by John Karp)
-- added U+230C-U+230F, U+231C-U+231F to Sans fonts, fixing bug:9547
-  (by John Karp)
-- adjusted dot below, dot above, dieresis above, dieresis below in Sans fonts
-  (by Denis Jacquerye)
-- added U+2300, U+2301, U+2303, U+2304, U+2305, U+2307, U+2326, U+2327, U+232B,
-  arrow.base to Sans fonts (by John Karp)
-- adjusted dot and dieresis below and above in Serif fonts (by Denis Jacquerye)
-- added U+1E1C-U+1E1D to Serif fonts (by Denis Jacquerye)
-- added U+22BE, U+22BF (by Wesley Transue)
-- added U+2324; modified U+2325: more standard proportions, and matches U+2324 
-  and U+2387; added U+2387 : flipped U+2325 with standard arrowhead 
-  (by John Karp)
-- added Lao digits U+0ED0-0ED7, U+0ED9 (by Remy Oudompheng)
-- added to Mono in Arabic block : U+060C, U+0615, U+061B, U+061F, 
-  U+0621-U+063A, U+0640-0655, U+065A, U+0660-066F, U+0674, U+0679-0687, U+0691, 
-  U+0692, U+0698, U+06A1, U+06A4, U+06A9, U+06AF, U+06B5, U+06BA, U+06BE, 
-  U+06C6, U+06CC, U+06CE, U+06D5, U+06F0-06F9 (by Remy Oudompheng)
-- added to Mono in Arabic Presentations Forms-A : U+FB52-FB81, U+FB8A-FB95, 
-  U+FB9E, U+FB9F, U+FBAA-FBAD, U+FBE8, U+FBE9, U+FBFC-FBFF (by Remy Oudompheng)
-- added to Mono in Arabic Presentations Forms-B : U+FE70-FE74, U+FE76-FEFC, 
-  U+FEFF (by Remy Oudompheng)
-- added U+05BA, U+05BE, U+05F3, U+05F4, U+FB1E, U+FB21-U+FB28, U+FB4F to Sans 
-  (by Eugeniy  Meshcheryakov)
-- added U+2102 to Mono (by Eugeniy  Meshcheryakov)
-- added U+2983-U+2984 to Sans (by Gee Fung Sit)
-- added U+2A2F to Sans, Serif and Mono (by Gee Fung Sit)
-- added U+2373-2375, U+237A to Sans (by John Karp)
-- converted kern pairs to kern classes with Tavmjong Bah's scripts 
-  (by Denis Jacquerye)
-- set ScriptLang of kerning classes to just latn because of Pango bug
-  (by Denis Jacquerye)
-- added DNK to ScriptLang latn otherwise it is excluded, and SRB and MDK to
-  cyrl (by Denis Jacquerye)
-- removed flag 0x80 in generate.pe, otherwise it generates kerning tables some
-  systems don't like; thus loosing Apple tables (by Denis Jacquerye)
-- removed ligature for precomposed legacy characters of Sans Oblique fonts
-  (by Denis Jacquerye)
-- added bearings to en dash U+2013, em dash U+2014 and figure dash U+2012
-  by making dashes shorter, preserving character width (by Denis Jacquerye)
-- reduced U+031C, U+0325 (ring below), U+0339 to be entirely visible; 
-  added instructions in Sans Book; changed U+1e00-U+1e01 to use new ring below
-  (by Denis Jacquerye)
-- adjusted circumflex below on U+1E12-U+1E13, U+1E18-U+1E19, U+1E3C-U+1E3D,
-  U+1E4A-U+1E4B, U+1E70-U+1E71, U+1E76-U+1E77 in Sans fonts (by Denis Jacquerye)
-- Added U+0ED4, U+0ED5 to DejaVu Sans (by Remy Oudompheng)
-- Lao-specific anchors (by Remy Oudompheng)
-- added alternate I to match the small capital in Sans (by Gee Fung Sit)
-
-Changes from 2.14 to 2.15
-
-- improved hinting in Sans Oblique to deal with some spacing and inconsistency
-  issues (by Ben Laenen)
-- added anchors to Mono Book, and added GPOS rules for combining diacritics to
-  show up as zero width glyphs (by Ben Laenen)
-- removed U+F21C (PUA), it was copy of U+2C64 from Latin Extended C (by Eugeniy
-  Meshcheryakov)
-- added U+27E6-U+27E7 to Sans (by Gee Fung Sit)
-- added U+1407, U+1409, U+140C-U+141B, U+141D-U+1425, U+1427-U+142E,
-  U+1435-U+1438, U+143A-U+1449, U+1452, U+1454, U+1457-U+1465, U+1467-U+146A,
-  U+1471, U+1474-U+1482, U+1484-U+1488, U+148F, U+1492, U+14A0, U+14A2, U+14A9,
-  U+14AC-U+14BA, U+14BC, U+14BD, U+14C6, U+14C9-U+14CF, U+14D1, U+14D2, U+14D9,
-  U+14DC-U+14E9, U+14EC, U+14F3, U+14F6-U+1504, U+1506, U+1507, U+1510-U+1525,
-  U+152C, U+152F-U+153D, U+1540, U+1541, U+154E, U+154F, U+1552, U+155B, U+155C,
-  U+1568, U+1569, U+1574-U+157B, U+157D, U+15A7-U+15AE, U+1646, U+1647 (by
-  Eugeniy Meshcheryakov)
-- fixed several contours to not intersect, use horizontal or vertical tangents,
-  use integer coordinates, etc in Sans Book (by Denis Jacquerye)
-- added U+0496-U+0497 in Serif (by Andrey V. Panov)
-
-Changes from 2.13 to 2.14
-
-- added Philippine peso glyph U+20B1 (by Clayborne Arevalo)
-- made U+2012 have the same width as digits, according to Unicode 5.0, 
-  page 206 (by Roozbeh Pournader)
-- made all of the "above" combining characters remove the dot of "i", 
-  "j", etc (Soft_Dotted characters), according to Unicode 5.0, 
-  page 228 (by Roozbeh Pournader)
-- made U+012F, U+03F3, U+0456, U+0458, U+1E2D, and U+1ECB (all fonts 
-  except Mono), U+0249, U+2148, and U+2149 (Sans and Sans Condensed), 
-  U+0268 (Sans ExtraLight, Serif and Serif Condensed), and U+029D (Serif 
-  and Serif Condensed) respect the Soft_Dotted property (by Roozbeh 
-  Pournader)
-- added U+223E, U+223F, U+2240, U+22C2, U+22C3 to Sans (by Remy Oudompheng)
-- added U+203D to Serif (by Gee Fung Sit)
-- added zero-width glyphs for U+2061-U+2063 to Sans and Serif (by Gee 
-  Fung Sit)
-- changed isolated forms of Arabic waw (U+0648, U+0624 and U+06C6) (bug #9432) 
-  (by Ben Laenen)
-- added Lao consonants U+0E81, U+0E82, U+0E84, U+0E87, U+0E88, U+0E8A, 
-  U+0E8D, U+0E94-0E97, U+0E99-0E9F, U+0EA1-0EA3, U+0EA5, U+0EA7, U+0EAA, 
-  U+0EAB, U+0EAD-0EAF to Sans Mono (by Remy Oudompheng)
-- added U+0200-U+0217, U+0226-U+0229, U+02F3, U+1E00-U+1E07, 
-  U+1E0A-U+1E0B, U+1E18-U+1E1F, U+1E22-U+1E23, U+1E28-U+1E2D, 
-  U+1E3A-U+1E3B, U+1E40, U+1E48-U+1E49, U+1E56, U+1E58-U+1E59, 
-  U+1E5E-U+1E5F, U+1E60, U+1E68-U+1E6B, U+1E6E-U+1E6F, U+1E72-U+1E77, 
-  U+1E86-U+1E8B, U+1E92-U+1E96, U+1EA0-U+1EA1, U+1EF4-U+1EF5 to Mono 
-  (by Ben Laenen)
-- renamed uppercase variants of diacritics (macron, breve, double grave, 
-  double acute, inverted breve, dot above) to "uni03XX.case" in Mono 
-  (by Ben Laenen)
-- moved uppercase variants of diacritics up in Mono so they properly 
-  vertically align on capitals (by Ben Laenen)
-- precomposed glyphs with macron, breve, double grave, double acute, 
-  inverted breve, dot above, macron below, breve below, inverted breve 
-  below, dot below, cedilla, caron below, circumflex below, diaeresis 
-  below, tilde below now reference to combining diacritics instead of 
-  space modifiers in Mono (by Ben Laenen)
-- made ring below (U+0325), and half rings below (U+031C and U+0339) 
-  smaller in Mono (by Ben Laenen)
-- added U+205F to all fonts (by Roozbeh Pournader)
-- added U+035E-U+035F to Sans (by Roozbeh Pournader)
-- added empty glyphs for U+034F, U+202A-U+202E, U+2060, U+206A-206F, 
-  U+FE00-U+FE0F to non-Mono fonts (by Roozbeh Pournader)
-- added U+2101, U+2107-U+2108, U+210B, U+210C, U+2110, U+2112, U+211B, 
-  U+211F, U+2123, U+2125, U+2128-U+2129, U+212C-U+212D, U+212F, 
-  U+2130-U+2131, U+2133, U+2136-U+213A, U+2141-U+2144, U+2B00-U+2B11, 
-  U+2B20-U+2B23 to Sans (by John Karp)
-- reshaped omega (U+03C9) in Mono (by Ben Laenen)
-- added U+2205, U+22C6, U+2300-U+2301, U+2303-U+2306, U+230C-U+230F, 
-  U+2312-U+2315, U+231C-U+231F, U+2335, U+2337-U+233E, U+2341-U+2344, 
-  U+2347-U+2348, U+234B-U+234D, U+2349-U+2350, U+2352-U+2354, 
-  U+2357-U+2359, U+235A-U+235C, U+235E-U+2360, U+2363-U+2365, 
-  U+2368-U+2369, U+236B-U+2370, U+2373-U+237A, U+2380-U+2383, 
-  U+2388-U+238B, U+2395 in Mono (by Ben Laenen)
-
-Changes from 2.12 to 2.13
-
-- adjusted U+0198B, U+01B3-U+01B4 in Sans, hinted U+01B4 in Sans Book 
-  (by Denis Jacquerye)
-- added U+27F0-U+27FF, U+2906-U+2907, U+290A-U+290B, U+2940-U+2941 to Sans 
-  (by Denis Jacquerye)
-- added U+01E6-U+01E9, U+01EE-U+01EF, U+01F4-U+01F5, U+01FC-U+01FF, 
-  U+021E-U+021F, U+0245, U+02BD, U+02C9, U+1E9B, U+2045-U+2046, U+2213, U+22C5,
-  U+22EF to Sans Mono (by Roozbeh Pournader)
-- added U+04FA-U+04FD to Sans (by Michael Everson)
-- removed U+2329 and U+232A because of their CJK properties, added U+27E8 
-  and U+27E9 in their stead, fixing part of bug #9038 (by Roozbeh Pournader)
-- corrected and improvised U+0466-U+0469, U+046E-U+0471, U+047C-U+047D, U+0482, 
-  U+0484-U+0486, U+0492-U+0493, U+04B0-U+04B1, U+050C-U+050D, and U+204A 
-  in Sans (by Michael Everson)
-- added instructions for U+0402, U+0409, U+040A, U+040B, U+044D, U+040F, 
-  U+0452, U+0459-U+045B, U+045F to Sans Book (by Eugeniy Meshcheryakov)
-- made italic shape for U+431, U+432, U+437, U+43B, U+43C, U+43D, U+444, U+447, 
-  U+44D, U+44F, U+459, U+45A in SerifOblique and SerifBoldOblique 
-  (by Andrey V. Panov)
-- modified U+024C to match glyph in Unicode chart, fixing bug #9039 
-  (by Denis Jacquerye)
-- made some canonically equivalent characters share the same glyph: 
-  U+02B9 = U+0374, U+0343 = U+0313, and U+0387 = U+00B7 also adjusting U+02BA 
-  to look like double U+02B9, fixing parts of bug #9038 (by Roozbeh Pournader)
-- changed shapes for U+0478 and U+0479 in Sans to those in the Unicode charts, 
-  based on a recent decision by Unicode Technical Committee to only use 
-  the digraph form (by Michael Everson)
-- adjusted width of NBSP U+00A0 and NNBSP U+202F, fixing bug #8401 
-  (by Denis Jacquerye)
-- fixed several contours to not intersect, use horizontal or vertical tangents, 
-  use integer coordinates, etc (by Roozbeh Pournader and Denis Jacquerye)
-- added U+1402, U+1430, U+144D, U+146C, U+148A, U+14A4, U+14C1, U+14D4, U+14EE, 
-  U+1527, U+1545, U+157E, U+158E, U+15AF to Sans (by Eugeniy Meshcheryakov)
-- enlarged width of U+459 and U+45A in Serif (by Andrey V. Panov)
-- made traditional shape for U+452, U+45B (by Andrey V. Panov)
-- added euro sign U+20AC to Sans ExtraLight, making fontconfig recognize 
-  the font as supporting English (by Denis Jacquerye)
-
-Changes from 2.11 to 2.12
-
-- added U+0180 to Serif (by Denis Jacquerye)
-- improved and/or hinted Armenian letters U+0542, U+0546, U+0562,
-  U+0563, U+0564, U+0577, U+0582 in Sans (by Ben Laenen)
-- added U+4FE-U+4FF, U+512-U+513, U+2114, U+214E, U+26B2 to Sans
-  (by Gee Fung Sit)
-- adjusted U+0496-U+0497, U+049A-U+04A1 in Sans to match U+0416,
-  U+041A, U+0436 and U+043A (by Gee Fung Sit)
-- Mathematical Operators in Sans: changed U+22C0-U+22C1 to match
-  other n-ary operators, adjusted U+2203-U+2204, changed U+2220 in
-  Sans to match the style of U+2221 (by Gee Fung Sit)
-- added U+1401, U+1403-U+1406, U+140A, U+140B, U+1426, U+142F,
-  U+1431-U+1434, U+1438, U+1439, U+1449, U+144A, U+144C,
-  U+144E-U+1451, U+1455, U+1456, U+1466, U+146B, U+146D-U+1470,
-  U+1472, U+1473, U+1483, U+1489, U+148B-U+148E, U+1490, U+1491,
-  U+14A1, U+14A3, U+14A5-U+14A8, U+14AA, U+14AB, U+14BB, U+14C0,
-  U+14C2-U+14C5, U+14C7, U+14C8, U+14D0, U+14D3, U+14D5-U+14D8,
-  U+14DA, U+14DB, U+14EA, U+14ED, U+14EF-U+14F2, U+14F4, U+14F5,
-  U+1405, U+1526, U+1528-U+152B, U+152D, U+152E, U+153E,
-  U+1542-U+1544, U+1546-U+154D, U+1550, U+1553, U+1555-U+155A,
-  U+1567, U+156A, U+157C, U+157F-U+1585, U+158A-U+158D,
-  U+158F-U+1596, U+15A0-U+15A6, U+15DE, U+15E1, U+166E-U+1676 to
-  Sans (by Eugeniy Meshcheryakov)
-- re-enabled Latin ligatures fi, ffi, fl, ffl and ff in Sans
-  (by Ben Laenen)
-- made italic shape for U+436, U+44A, U+44B, U+44C, U+44E, U+45F,
-  U+463 in SerifOblique and SerifBoldOblique (by Andrey V. Panov)
-- fixed sub- and superscript metrics in Condensed Sans (bug #8848)
-  (by Ben Laenen)
-- added U+474, U+475 in Serif (by Andrey V. Panov)
-- hinted Greek glyphs U+03B7, U+30B8, U+03B9, U+03C1, U+03C3,
-  U+03C6 in Mono Book (by Ben Laenen)
-
-Changes from 2.10 to 2.11
-
-- added instructions for Hebrew glyphs (Sans Book, by Eugeniy
-  Meshcheryakov)
-- changed U+01A6 (Latin Yr) after bug #8212, in Sans, Serif and
-  Sans Mono fonts (by Denis Jacquerye).
-- removed instruction for U+2600-U+26A1 (by Mederic Boquien)
-- added U+202F and set width of U+00A0 (nobreakingspace) to the
-  same as U+0020, space (by Denis Jacquerye).
-- added and improved instructions for various Cyrillic letters
-  (by Eugeniy Meshcheryakov)
-- Changed U+416, U+42F, U+427 (non-Bold), U+436, U+447 (non-Bold),
-  U+44F, U+437 (Bold), corrected U+40F, U+414, U+424, U+426, U+429,
-  U+434, U+438 (Bold), U+446, U+449, U+44D (non-Bold), U+45F in
-  Sans Mono (by Andrey V. Panov)
-- made small corrections to Cyrillic, most appreciable to U+409,
-  U+413, U+41B, U+427 and U+433, U+434, U+43B, U+447, U+459
-  (upright fonts) to Serif (by Andrey V. Panov)
-- adjusted bearings of U+410, U+416, U+41A, U+42F, U+436, U+43A,
-  U+443, U+44F in Serif (by Andrey V. Panov)
-- enlarged width of U+44A, U+44B, U+44C, U+463 in Serif
-  (by Andrey V. Panov)
-- added ligature "iacute" as "afii10103" (U+456) "acutecomb" in
-  Serif (by Andrey V. Panov)
-- made italic shape to U+446, U+448, U+449 in Serif (by Andrey V.
-  Panov)
-- added "afii10831" (U+F6C7), "afii10832" (U+F6C8) in Serif (by
-  Andrey V. Panov)
-- new minimum version of fontforge is 20061014 (by Ben Laenen)
-
-Changes from 2.9 to 2.10:
-
-- added U+0242, U+024A-U+024B, U+024E-U+024F, U+037C-U+037D, U+0E3F, 
-  U+1D2C-U+1D2E, U+1D30-U+1D42, U+1D5D-U+1D6A, U+1D78, U+1DB8, 
-  U+2090-U+2094, U+20D0-U+20D1, U+2C60-U+2C66, U+2C6B-U+2C6C, U+2C74 and 
-  U+FB29 to Sans (by Gee Fung Sit)
-- added Lao glyphs : U+0E81-0E82, U+E084, U+0E87-0E88, U+0E8A, U+0E8D, 
-  U+0E94-0E97, U+0E99-0E9F, U+0EA1-0EA3, U+0EA5, U+0EA7, U+0EAA-0EAB, 
-  U+0EAD-0EB9, U+0EBB-0EBD, U+0EC0-0EC4, U+0EC6, U+0EC8-0ECD, U+0EDC-0EDD 
-  (by Remy Oudompheng)
-- fixed U+0193 not showing in Windows (bug #7897) (by Ben Laenen)
-- changes to U+222B-222D in Sans Mono (by Remy Oudompheng)
-- ported the three remaining currency symbols from Arev (U+20B0, 
-  U+20B2-U+20B3), and replaced one (U+20AF) in Sans (by Lars Naesbye 
-  Christensen)
-- corrected U+20A5 in Sans (by Gee Fung Sit)
-- merged Double-Struck Letters from Arev: U+2102, U+210D, U+2115, 
-  U+2119-U+211A, U+2124, U+213C-U+2140 (by Gee Fung Sit)
-- added U+2308-U+230B and U+2329-U+232A to Sans Mono and Serif faces, 
-  fixed incorrect direction of U+2329 in Sans faces, and improved 
-  U+2308-U+230B in Sans faces per Ben Laenen's suggestions (by David 
-  Lawrence Ramsey)
-- added U+06D5 and final form of it (needed for Kurdish) (by Ben Laenen)
-- added two special glyphs U+F000 and U+F001 in Sans Book that show the 
-  current ppem size (horizontal and vertical) (by Ben Laenen)
-- added U+2318 and U+2325 to Sans Mono faces, based on the Sans versions 
-  (by David Lawrence Ramsey)
-- added U+2B14-U+2B1A to all faces except Sans ExtraLight (by David 
-  Lawrence Ramsey)
-- respaced all Geometric Shapes characters in Serif faces to match those 
-  in Sans faces again, respaced U+23CF in Sans, Sans ExtraLight, and 
-  Serif faces to match U+25A0 (or Sans in Sans ExtraLight's case) again, 
-  and respaced U+2B12-U+2B13 in Sans and Serif faces to match U+25A1 
-  again (by David Lawrence Ramsey)
-- corrected width of Modifier Small Letters U+1D43-1D5B in Sans Oblique 
-  and U+1D9B-U+1DBF in Sans Oblique and Sans Bold Oblique (by Gee Fung Sit)
-- added a bunch of glyphs to Sans ExtraLight (see SVN for details) (by 
-  Gee Fung Sit)
-- adjusted Cyrillic descenders in Sans ExtraLight to sync with Sans (by 
-  Gee Fung Sit)
-- added U+0242, U+0245 to Serif (by Gee Fung Sit)
-- replaced the SHPIX routines which gave them bad spacing at certain 
-  sizes in FreeType for A, V, Z, v and z in Sans Bold (by Ben Laenen) 
-
-Changes from 2.8 to 2.9:
-
-- DejaVuSansExtraLight.sfd: changed family name from "DejaVu Sans" to
-  "DejaVu Sans Light" (in case we add a Light weight variant), so legacy
-  apps that understand only 4 styles are happy. (by Denis Jacquerye)
-- added Name ID 16, aka preferred family name, and Name ID 17, aka
-  preferred style name, so contemporary apps that understand more that 4
-  styles can use big fonts families "DejaVu Sans" and "DejaVu Serif". For
-  those, Extralight and Condensed are just styles not different families.
-  (by Denis Jacquerye)
-- added U+22B6-22BD, U+22C0-22C1, U+22D6-22D7 to Sans. (by Remy Oudompheng)
-- added U+037B, U+2184, U+2C67-U+2C6A and U+2C75-U+2C77 to Sans (by Gee
-  Fung Sit)
-- adjusted asteriskmath (U+2217) for consistency with other mathematical
-  operators in Sans (by Ben Laenen)
-- hinted some Armenian capitals in Sans Book (by Ben Laenen)
-- added U+0246 - U+0249 (by Ben Laenen)
-- BUGFIX : swapped U+224E and U+224F, in Sans, Sans Condensed and Sans Mono
-  (by Remy Oudompheng)
-- adjusted U+20B5 (by Mederic Boquien)
-- swapped U+21DA and U+21DB which were in wrong order (by Heikki Lindroos)
-- added U+222E-2233, U+239B-23AD, U+2A00-2A02, U+2A0F-2A1C to Sans (by Remy
-  Oudompheng)
-- added U+239B-23AD to Mono (by Remy Oudompheng)
-- added U+2024-2025 to Serif (by Mederic Boquien)
-- added U+222C-222D, U+2A0C-2A0E to Serif (by Remy Oudompheng)
-- added U+2190-21FF to Mono (by Heikki Lindroos)
-- added Hebrew glyphs - U+05B0-U+05BD, U+05BF-U+05C3, U+05C6, U+05C7,
-  U+05D0-U+05EA, U+05F0-U+05F2, U+FB1F, U+FB20, U+FB2A-U+FB36,
-  U+FB38-U+FB3C, U+FB3E, U+FB40, U+FB41, U+FB43, U+FB44, U+FB46-U+FB4E (by
-  Gee Fung Sit and Eugeniy Meshcheryakov)
-- adjustments for Cyrillic in Sans (by Andrey V. Panov)
-- made italic shape for U+0434, U+0456, U+0457 in SerifOblique and Serif
-  Bold Oblique (by Andrey V. Panov)
-
-Changes from 2.7 to 2.8:
-
-- fixed instructions for U+0423, U+0427, U+0447, U+0448 in Serif, so they
-  look good at large sizes too (by Eugeniy Meshcheryakov)
-- added U+FB00 and U+FB03 to U+FB06 to Serif typefaces (by Heikki Lindroos)
-- added U+26B0-U+26B1, U+2701-U+2704, U+2706-U+2709, U+270C-U+2727, U+2729
-  to U+274B, U+274D, U+274F to U+2752, U+2756, U+2758-U+275E, U+2761 to
-  U+2775 (by Heikki Lindroos)
-- added and improved instructions for Cyrillic letters in Mono and Serif
-  (Book, by Eugeniy Meshcheryakov)
-- rotated U+26B0 (was too small in mono) (by Gee Fung Sit)
-- adjusted U+1EDA-U+1EDD, U+1EE8-U+1EEB, capitals using capital specific
-  accent and moved diacritics to match position on U+00F2 (ograve), etc.
-  (by Denis Jacquerye)
-- added U+20D6, U+20D7 to Sans (by Gee Fung Sit)
-- made Armenian ligatures discretionary since the Firefox ligature problem
-  still isn't fixed (by Ben Laenen)
-- moved Armenian hyphen U+058A to a higher position (bug #7436) (by Ben
-  Laenen)
-- hinted Greek glyphs in Sans Bold (by Ben Laenen)
-- enabled Arabic lam-alif ligatures when diacritics are used (by Ben Laenen)
-
-Changes from 2.6 to 2.7:
-
-- added glyphs needed for Kurdish: U+0695, U+06B5, U+06C6, U+06CE and their
-  init/medi/fina forms in Sans (by Ben Laenen)
-- added U+02CD, U+01F8 - U+01F9, U+1E3E - U+1E3F, U+1E30 - U+1E35, U+1EBC -
-  U+1EBD, U+1EF8 - U+1EF9 (includes glyphs needed for Yoruba, Maori, Guarani
-  and Twi) (by Ben Laenen)
-- added U+22C8-22CC, U+29CE-29D5, U+2A7D-2AA0, U+2AAE-2ABA, U+2AF9-2AFA to
-  Sans (by Remy Oudompheng)
-- adjusted diacritics on Vietnamese, Pinyin and other characters:
-  U+01A0-U+01A1, U+01AF-U+01B0, U+01D5-U+01DC, U+01DE-01E1, U+01FA-U+01FB
-  U+022A-U+022D, U+0230-U+0231, U+1E14-U+1E17, U+1E4C-U+1E53, U+1E78-U+1E7B,
-  U+1EA4-U+1EF1 in Sans (Book, Bold and Oblique) (by Denis Jacquerye)
-- added basic arrows U+2190-U+2193 in Serif, which completes MES-1 compliance
-  for Serif (by Ben Laenen)
-- added U+01E4, U+01E5, U+01FA, U+01FB, U+02BD, U+02C9 and U+02EE to Serif
-  (by Ben Laenen)
-- fixed U+0209 in Serif Bold Oblique (by Ben Laenen)
-- adjusted Box Drawing block characters U+2500-257F in Mono to fit character
-  cell, shifting them up by 416 (Denis Jacquerye)
-- redid U+0194 in Sans (by Ben Laenen)
-- added U+2217-2218, U+2295-22A1 to Mono (by Remy Oudompheng)
-- added U+0462 to Serif (by Andrey V. Panov)
-- added U+226C, U+228C-228E, U+2293-2294, U+22F2-22FF to Sans (by Remy
-  Oudompheng)
-- adjusted U+2208-220D in Sans (by Remy Oudompheng)
-- improved some Cyrillic glyphs in Mono (by Andrey V. Panov), rewritten
-  instructions for changed glyphs (by Eugeniy Meshcheryakov)
-- added U+1E0E-1E0F, U+1E8E-1E8F to Mono fonts (by Denis Jacquerye). (bug
-  #7166)
-- renamed 'Dotabove' to 'Dotaccent' in Mono Sans Oblique to match other fonts
-  (by Denis Jacquerye).
-- added U+200B-U+200F in Sans faces and Serif faces, U+200B and U+200C were
-  in Sans already (by Lars Naesbye Christensen)
-- added U+2601-U+262F, U+263D, U+263E, U+2648-U+265F, U+2668, U+2670-U+268B,
-  U+2690-U+269C, U+26A0, U+26A1, U+2794, U+2798-U+27AF, U+27B1-U+27BE to Mono
-  (by Heikki Lindroos)
-- replaced the references with unshifted ones for both κ U+03BA and к U+043A
-  in Mono Book (by Denis Jacquerye)
-- fixing glyph for U+04ED in Mono Book, consisted only of dieresis (by Andrey
-  V. Panov).
-
-Changes from 2.5 to 2.6:
-
-- redid U+2032 - U+2037, U+2057 based on Arev in Sans (by Gee Fung Sit)
-- added U+0195, corrected U+039E, U+204B in Sans ExtraLight (by Gee Fung Sit)
-- added instructions for some Cyrillic letters in Sans Bold (by Eugeniy
-  Meshcheryakov)
-- added vulgar fractions U+2153-U+215F for Serif, made with references (by
-  Lars Naesbye Christensen)
-- added U+228F-2292, U+2299-22AF, U+22B2-22B5, U+22CD, U+22D8-22ED to Sans
-  (by Remy Oudompheng)
-- added U+2208-220D, U+2238-223D, U+2278-2281, U+228A-228B, U+228F-2292,
-  U+22CD, U+22DA-22E9 to Mono (by Remy Oudompheng)
-- fixed misplaced dot in U+2250 in Mono (by Remy Oudompheng)
-- added instructions for some Cyrillic letters in Mono Book and Bold(by
-  Eugeniy Meshcheryakov)
-- minor changes to U+2241, U+2261-2263, U+22A4, U+22A5 in Sans (by Remy
-  Oudompheng)
-- added hinting instructions to lowercase Armenian glyphs in Sans Book (by
-  Ben Laenen)
-- changed U+2208, U+220B to match U+2209 and U+220C in Sans Bold (by Remy
-  Oudompheng)
-- added Braille patterns U+2800-U+28FF to Sans (by Mederic Boquien)
-- added instructions for some Cyrillic letters in Serif Book (by Eugeniy
-  Meshcheryakov)
-- renamed BoldOblique fonts to Bold Oblique in TTF Name as originally in
-  Bitstream Vera fonts (by Denis Jacquerye)
-- added hinting instructions to some Latin-B Extended and IPA characters in
-  Sans Book (by Denis Jacquerye and Ben Laenen)
-- adjusted bearings, replaced diacritics, hinted hook and horn for
-  Vietnamese in Sans Book (by Denis Jacquerye)
-- made FAX, TM, TEL, etc. discritionary ligatures in Sans and Serif fonts
-  (by Denis Jacquerye)
-- removed ligatures of precomposed characters in Sans and Serif fonts (by
-  Denis Jacquerye)
-- added U+F208, U+F20A, U+F215-F217, U+F21A-F21B, U+F25F in PUA (from SIL's
-  PUA, probably in Unicode 5.0): U+0243, U+0244, U+0245, U+024C, U+024D,
-  U+2C64, (U+2C6D), (U+2C71)
-- modified some glyphs in Serif Oblique to make them more italic (by Denis
-  Jacquerye)
-
-Changes from 2.4 to 2.5:
-
-- fixed excessive kerning bug that occurs with Pango (by Denis Jacquerye)
-- added U+20AF to Sans and Serif (by Lars Naesbye Christensen)
-- regenerated Condensed faces (by Ben Laenen)
-- added U+035C-U+035D to Sans, fixed U+0361 (by Denis Jacquerye)
-- integrated 255 characters from Arev fonts: Latin Extended-B, Spacing
-  Modifiers, Combining Diacritical Marks, Cyrillic, Cyrillic supplement,
-  General Punctuation, Letterlike Symbols, Arrows, Mathematical Operators,
-  Miscellaneous Technical, Dingbats, Alphabetic Presentation Forms (by Denis
-  Jacquerye)
-- added basic Cyrillic and basic Greek to Sans ExtraLight (by Denis Jacquerye)
-- added U+0498, U+049A, U+04AA, U+04AB, U+04AF to Serif (by Eugeniy
-  Meshcheryakov)
-- added U+0494, U+0495, U+0498, U+0499, U+04AA, U+04AB, U+04C3, U+04C4,
-  U+04C7, U+04C8 to Mono (by Eugeniy Meshcheryakov)
-- adjusted weight of U+0256, U+0257, U+0260, U+0272, U+0273, U+0277, U+029B,
-  U+02A0 and modifed  U+028B and U+027A in Mono (by Denis Jacquerye)
-- added U+2000-200A to Mono (by Denis Jacquerye)
-- added vulgar fractions U+2153 - U+215F to Mono (by Gee Fung Sit)
-- adapted metrics of Arabic glyphs so they stay above cut-off height in Sans
-  (by Ben Laenen)
-- fixed mkmk anchors for Arabic diacritics so they stack properly in Sans (by
-  Ben Laenen)
-- fixed weight of lowercase upsilon in Sans Bold, make small adjustment to
-  lowercase omega in Sans (by Ben Laenen)
-- added U+210E (by Mederic Boquien)
-- unslanted U+2201, U+221B and U+221C in Sans Oblique (by Mederic Boquien)
-- added several mathematical relation symbols to Sans and Mono (U+2241-224C,
-  U+2250-2255, U+2260-2269, U+226E-2277, U+2282-2287) modified U+223C to match
-  other tildes, and U+2282-2284 to have the same shape. (by Remy Oudompheng)
-- made U+2234-U+2237 refer to U+2219 instead of U+00B7 in Sans (by Mederic
-  Boquien)
-- added U+2238-223B, U+226A-226B, U+2278-2281, U+2288-228B to Sans (by Remy
-  Oudompheng)
-- unslanted and changed reference of U+22C5 from U+00B7 to U+2219 in Sans (by
-  Mederic Boquien)
-- added U+224D-225F, U+226D, U+22C6 to Sans and unslanted U+2219 in Sans
-  Oblique. (by Remy Oudompheng)
-- added U+224D-225F, U+226D to Mono, shifted U+2266-2269 higher upwards and
-  unslanted U+2219 in Oblique. (by Remy Oudompheng)
-- merged Coptic glyphs from Arev 0.2 (by Lars Naesbye Christensen)
-- fixed and adjusted various Cyrillic glyphs in Serif (by Andrey V. Panov)
-- made fi, fl... ligatures discretionary ligatures (by Ben Laenen)
-
-Changes from 2.3 to 2.4:
-
-- added U+04A2, U+04A3, U+04AC - U+04AF, U+04BA, U+04BB, U+04C0 -
-  U+04C2, U+04CB, U+04CD, U+04D8 - U+04DF, U+04E2 - U+04E5, U+04E8 - U+04F5,
-  U+04F6 - U+04F9 to Mono (by Eugeniy Meshcheryakov)
-- added U+048C, U+048D, U+0494, U+0495, U+049E - U+04A7, U+04AC -
-  U+04AE, U+04B4- U+04B7, U+04BA, U+04BB, U+04C0 - U+04C4, U+04C7, U+04C8,
-  U+04CB, U+04CC, U+04D8 - U+04DF, U+04E2 - U+04E5, U+04EC - U+04F9 to Serif
-  (by Eugeniy Meshcheryakov)
-- added U+2134 to Sans (by Gee Fung Sit)
-- added U+2080 - U+2089 to all faces (by Gee Fung Sit)
-- several minor corrections to Sans (by Gee Fung Sit)
-- major corrections to Sans Condensed (by Gee Fung Sit)
-- corrected Superscripts and Subscripts in Sans (by Gee Fung Sit)
-- corrected anchors of U+0316-U+0319 (by Denis Jacquerye)
-- Verajja integrated (by Stepan Roh)
-- copied U+2328, U+2600, U+2639-U+263C, U+263F-U+2647, U+2660-U+2667,
-  and U+2669-U+266F from Sans to Serif, and copied scaled-down versions of
-  them to Sans Mono (by David Lawrence Ramsey)
-- added U+20B4 to all faces (by Eugeniy Meshcheryakov)
-- added more minor positional adjustments to U+2638 in all faces to
-  match the other miscellaneous symbols in Verajja, and rescale it in Sans
-  Mono so that it looks better (by David Lawrence Ramsey)
-- added U+2242, U+2243 and U+22A4 (by Mederic Boquien)
-- corrected U+2245 in Sans (by Mederic Boquien)
-- added U+0221, U+0234-0236 (by Denis Jacquerye)
-- added in Arabic block to Sans: U+060C, U+0615, U+061B, U+061F, U+0621
-- U+063A, U+0640 - U+0655, U+0660 - U+066F, U+0679 - U+0687, U+0698, U+06A1,
-  U+06A9, U+06AF, U+06BA, U+06BF, U+06CC, U+06F0 - U+06F9 (by Ben Laenen)
-- added in Arabic Presentation Forms A to Sans: U+FB52 - U+FB81, U+FB8A
-- U+FB95, U+FB9E - U+FB9F, U+FBE8 - U+FBE9, U+FBFC - U+FBFF (by Ben Laenen)
-- added complete Arabic Presentation Forms B to Sans: U+FE70 - U+FE74,
-  U+FE76 - U+FEFC, U+FEFF (by Ben Laenen)
-- added complete Greek Extended block to Mono (by Ben Laenen)
-- modified Greek capitals with tonos in Mono (by Ben Laenen)
-- added U+01C4-01CC, U+01D5, U+01DE, U+01E0-U+01E1, U+01E6-U+01E9,
-  U+01EE-U+01F5, U+01F8-U+0217, U+021E-U+021F, U+0226-U+022A, U+022C to Serif
-  (by Denis Jacquerye)
-- adjusted U+043B and U+044F in Serif (by Denis Jacquerye)
-- added U+2000-U+200A (by Denis Jacquerye)
-- added U+1E00-U+1E0B, U+1E0E-U+1E11, U+1E14-U+1E1C, U+1E1E-U+1E23,
-  U+1E26-U+1E2D, U+1E30-U+1E35, U+1E3A-U+1E3B, U+1E3E-U+1E40, U+1E48-U+1E49,
-  U+1E50-U+1E56, U+1E58-U+1E59, U+1E5E-U+1E60, U+1E68-U+1E6B, U+1E6E-U+1E6F,
-  U+1E72-U+1E7D, U+1E86-U+1E9B, U+1EA0-U+1EA3, U+1EAC-U+1EB7, U+1EBA-U+1EBD,
-  U+1EC6-U+1ECF, U+1ED8-U+1ED9, U+1EE6-U+1EE7, U+1EF4-U+1EF9 to Serif (by
-  Denis Jacquerye)
-- added U+048E, U+048F, U+049C-U+049F, U+04B8, U+04B9, U+04BC-U+04BF,
-  U+04C3, U+04C4 to Sans (by Eugeniy Meshcheryakov)
-- added DejaVu Sans Extra Light (by Denis Jacquerye)
-- Adjusted underline position for (hopefully) improved legibility in
-  Sans, Serif, Mono (Tim May)
-- added auto-generated DejaVu LGC (by Stepan Roh) 
-
-Changes from 2.2 to 2.3:
-
-- fixed bug U+042B and U+044B behave badly in Sans Bold or Oblique (by
-  Keenan Pepper)
-- added and improved TrueType instructions and related settings (by
-  Keenan Pepper)
-- added U+04D0-U+04D7, U+04E6, U+04E7 to Mono (by Eugeniy Meshcheryakov)
-- added U+048A - U+048D, U+0498, U+0499, U+04AA, U+04AB, U+04B0, U+04B1,
-  U+04C0, U+04C9, U+04CA, U+04CE, U+04CD, U+04DA, U+04DB, U+04DE, U+04DF,
-  U+04E2 - U+04E5, U+04EC - U+04F8, U+04F9 to Sans (by Eugeniy Meshcheryakov)
-- added U+04E0, U+04E1 to all faces (by Eugeniy Meshcheryakov)
-- added Greek Extended to Sans and Serif: U+1F00-U+1F15, U+1F18-U+1F1D,
-  U+1F20-U+1F45, U+1F48-U+1F4D, U+1F50-U+1F57, U+1F59, U+1F5B, U+1F5D,
-  U+1F5F-U+1F7D, U+1F80-U+1FB4, U+1FB6-U+1FC4, U+1FC6-U+1FD3, U+1FD6-U+1FDB,
-  U+1FDD-U+1FEF, U+1FF2-U+1FF4, U+1FF6-U+1FFE (by Ben Laenen)
-- added Greek variant letterforms, archaic letters and symbols to Mono:
-  U+03D0-U+03E1, U+03F0-U+03FF (by Ben Laenen)
-- added Armenian block and Armenian ligatures to Sans (U+0531 - U+0556,
-  U+0559 - U+055F, U+0561 - U+0587, U+0589 - U+058A, U+FB13 - U+FB17) (by Ben
-  Laenen)
-- redid some Greek characters in Sans and Mono to make them look better
-  and to correct some errors (by Ben Laenen)
-- added U+27E0 to all faces (by David Lawrence Ramsey)
-- added underscore (U+005F) consistency fixes: extended the Sans Mono
-  and Sans Mono Oblique underscores to touch both horizontal edges, and
-  reduced the height of the Sans Bold Oblique underscore to match the Sans
-  Bold underscore (by David Lawrence Ramsey)
-- added underscore (U+005F) derivatives and consistency fixes for them:
-  made U+0332 a reference to underscore at Denis Jacquerye's suggestion; made
-  U+0333 two references to underscore; made U+033F two references to U+203E;
-  added U+2017 as two references to underscore, and made U+0333 a reference to
-  it; and added U+203E as a reference to underscore, and made U+0305 a
-  reference to it (by David Lawrence Ramsey)
-- added U+201B, U+2220, U+2320-U+2321, U+23AE, U+23CF, all remaining
-  Geometric Shapes glyphs (U+25A0-U+25C9, U+25CB-U+25D7, U+25D9-U+25E5,
-  U+25E7-U+25FF), and U+2B12-U+2B13 to all faces (by David Lawrence Ramsey)
-- added minor positional adjustments to U+2638 in all faces (by David
-  Lawrence Ramsey)
-- added U+201F to Sans Mono and Serif faces (by David Lawrence Ramsey)
-- added U+01B7, U+01F6, U+0464 - U+0465, U+2160 - U+2180, U+2183,
-  U+220A, U+220D, U+2329, U+232A, U+2422, U+27E8 - U+27EB, U+2680 - U+2685 to
-  Sans (by Gee Fung Sit ???)
-- added U+2116 to Sans and Serif (by Gee Fung Sit)
-- changed florin sign U+0192 in Sans (by Gee Fung Sit)
-- added anchor points to some glyphs (by Denis Jacquerye)
-- adjusted height of IPA superscripts U+02B0-02B8, U+02C0-02C1,
-  U+02E0-02E4, U+207F to match with height of U+00B2 (by Denis Jacquerye)
-- added U+0184-U+0185, U+019C, U+019F, U+01A0-U+01A3, U+01A6, U+01AA,
-  U+01AF-U+01B0, U+01B2-U+01B4, U+01B7-U+01B8, U+01BC-U+01BC, U+0224-U+0225,
-  U+023A-U+0240, U+1D16-U+1D17, U+1D1D-U+1D1E, U+1D43-U+1D5B, U+1D7B,
-  U+1D85,U+1D9B-1DB7, U+1DB9-U+1DBF, U+20A6 to all fonts (by Denis Jacquerye)
-- added added U+0182, U+018B, U+018E, U+01A0-U+01A1, U+01B1, U+01B9,
-  U+01C0-U+01C3, U+0238-U+0239, U+1D02, U+1D08-U+1D09, U+1D14, U+1D1F, U+1D77
-  to Serif and Mono (by Denis Jacquerye)
-- added U+0181, U+0183, U+0187-U+0188, U+018A-U+018F, U+0191, U+0193,
-  U+0195-U+019B, U+019D-U+019E, U+01A4-U+01A5, U+01AC-U+01AE, U+01B5-U+01B6,
-  U+01B9, U+01BB, U+01F6 to Serif (by Denis Jacquerye)
-- added U+0181, U+0187-U+0188, U+018A, U+018D, U+018F, U+0191, U+0193,
-  U+0195-U+019F, U+01A4-01A5, U+01AC-01AD, U+01B5-U+01B6, U+1BB, U+01F6,
-  U+01D7-U+01DC, U+0238-U+0239, U+0241 to Mono (by Denis Jacquerye)
-- added to Mono and Serif (by Denis Jacquerye) 
-
-Changes from 2.1 to 2.2:
-
-- reworked the vertical orientation of the Blocks Elements characters
-  in all faces to remove their overly large descenders, in order to fix
-  problems with e.g. terminal emulators (by David Lawrence Ramsey)
-- copied bullet in Sans faces to Serif faces for consistency (by David
-  Lawrence Ramsey)
-- added U+2023, U+25D8, U+25E6, and U+29EB to all faces (by David
-  Lawrence Ramsey)
-- added U+1EB8, U+1EB9, U+1ECA - U+1ECD, U+1EE4, U+1EE5 (by Tim May)
-- added U+01DD, U+02BE, U+02BF, U+02D3 to all, changed U+02D2 in
-  non-Condensed and U+1EE5 in Serif (by Tim May)
-- fixed U+01CE, replacing wrong circumflex by caron (by Denis Jacquerye)
-- added anchor points to some glyphs (by Denis Jacquerye)
-- added U+20B5 (by Denis Jacquerye)
-- added U+0181 - U+0183, U+0187, U+0188, U+018A - U+018D, U+0191,
-  U+0193, U+0195 - U+019B, U+019D, U+019E, U+01A4, U+01A7 - U+01A9, U+01AB -
-  U+01AE, U+01B1, U+01B5, U+01B6, U+01BB, U+01C0 - U+01C3, U+01F1 - U+01F3,
-  U+0238, U+0239, U+1D02, U+1D08, U+1D09, U+1D14, U+1D1F, U+1D77, U+2103,
-  U+2126, U+2127, U+212A, U+212B, U+2132, U+214B, U+2210, U+2217, U+2218,
-  U+2A0C - U+2A0E, U+FB00, U+FB03 and U+FB04 to Sans (by Gee Fung Sit)
-- added U+01A9, U+01C3 and U+2126 to Mono and Serif (by Gee Fung Sit)
-- adjusted bearings of U+028B in Sans (by Gee Fung Sit)
-- added U+018F, U+0494-U+0497, U+04A0-U+04A7, U+04AC-U+04AF,
-  U+04B4-U+04B7, U+04BA-U+04BB, U+04C1-U+04C2, U+04C5-U+04C8, U+04CB-U+04CC,
-  U+04D0-U+04D9, U+04DC-U+04DD, U+04E6-U+04EB to Sans (by Eugeniy
-  Meshcheryakov)
-- replaced with references U+0391-U+0393, U+0395-U+0397, U+0399, U+039A,
-  U+039C, U+039D, U+039F-U+03A1, U+03A4, U+03A5, U+03A7, U+03BF, U+03DC,
-  U+0405, U+0406, U+0408, U+0410, U+0412, U+0415, U+0417, U+041A,
-  U+041C-U+041E, U+0420-U+0422, U+0425, U+0430, U+0435, U+043E, U+0440,
-  U+0441, U+0443, U+0445, U+0455-U+0458 in Serif and Mono (by Eugeniy
-  Meshcheryakov)
-- added U+04D0-U+04D7, U+04E6-U+04EB to Serif (by Eugeniy Meshcheryakov)
-- added U+212A and U+212B to the rest of the faces (by Lars Naesbye
-  Christensen)
-- added U+2318 and U+2325 to Sans and Serif (by Lars Naesbye Christensen)
-- added and improved TrueType instructions and related settings (by
-  Keenan Pepper)
-- completed basic Greek alphabet: added U+0374-U+0375, U+037A, U+037E,
-  U+0384-U+038A, U+038C, U+038E-U+0390, U+03AC-U+03BF, U+03C1-U+03CE (by Ben
-  Laenen)
-- added U+2070 and U+2074-U+2079 (by Mederic Boquien) 
-
-Changes from 2.0 to 2.1:
-
-*** Be aware that names of some TTF files changed since version 2.0. ***
-
-- added U+0323, U+1E0C, U+1E0D, U+1E24, U+1E25, U+1E36 - U+1E39, U+1E42,
-  U+1E43, U+1E46, U+1E47, U+1E5A - U+1E5D, U+1E62, U+1E63, U+1E6C, U+1E6D,
-  U+1E7E, U+1E7F (by Tim May)
-- fixed bug where GNOME applications used Mono Bold Oblique instead of
-  Mono Oblique (by Keenan Pepper)
-- added and improved TrueType instructions and related settings (by
-  Keenan Pepper)
-- added U+1E41, U+1E57, U+1E61 (by Sander Vesik)
-- added U+0189, U+0309, U+0313, U+0314, U+031A, U+031B, U+0327, U+0328,
-  U+032B, U+0333, U+033C (by Denis Jacquerye)
-- adjusted and fixed U+0186, U+0254, U+0291, U+0316 - U+0319, U+031C -
-  U+0320, U+0323 - U+0326, U+0329 - U+032A, U+032C - U+0332, U+0339 - U+033B,
-  U+033E, U+033F (by Denis Jacquerye)
-- fixed U+1E12, U+1E3C, U+1E4A, U+1E70 to have normal below diacritics
-  (by Denis Jacquerye)
-- fixed U+1E82, U+1E84 and U+1EF2 to have uppercase above diacritics (by
-  Denis Jacquerye)
-- added anchor points to some glyphs (by Denis Jacquerye)
-- dropped "-Roman" from font names - affects both internal TTF names and
-  names of generated files (by Stepan Roh)
-- attempt to fix bug Vertical spacing too big for Mono by exchanging
-  LineGap and OS2TypoLinegap values (proofed by Stefan Rank)
-- added Greek capitals U+0391 - U+03A1, U+03A3 - U+03A9, U+03AA, U+03AB
-  in Mono (by Ben Laenen)
-- added the per ten thousand sign U+2031 (by Mederic Boquien)
-- added U+2207, U+221D, U+221F, U+2227 - U+222A, and U+2261 (by David
-  Lawrence Ramsey)
-- new logo (by Gee Fung Sit)
-- added U+0180, U+018E, U+201F, U+2024, U+2025, U+203D, U+2200, U+2203,
-  U+2213, U+222C, U+222D, U+2263 to Sans (by Gee Fung Sit) 
-
-Changes from 1.15 to 2.0:
-
-- "Italized" basic glyphs in all Serif Oblique and their Condensed faces
-  (by David Jez)
-- added and improved TrueType instructions and related settings (by Keenan
-  Pepper)
-- added anchor points to some glyphs (by Denis Jacquerye)
-- many new spacing and combining accents (by Denis Jacquerye)
-- smart substitutions for transforming i and j to dottless form and for
-  using uppercase diacritics (by Denis Jacquerye)
-- fixed remaining erroneously slanted characters in Serif Oblique faces (by
-  David Lawrence Ramsey)
-- copied bullet in Sans faces to Sans Oblique faces for consistency (by
-  David Lawrence Ramsey)
-- added U+203C and U+2047-U+2049 (by David Lawrence Ramsey)
-- added Greek glyphs to Serif (by Ben Laenen, Condensed merge by David Jez)
-- fixed bug LTR glyphs behaving like RTL (by Ben Laenen)
-- fixed wrong glyph directions (by David Jez)
-- fixed repositioned accents in Condensed faces (by David Jez)
-
-Changes from 1.14 to 1.15:
-
-- added and improved TrueType instructions and related settings (by Keenan
-  Pepper)
-- fixed U+2302, U+2319 (by David Lawrence Ramsey)
-- fixed yet another monospace bug (by Stepan Roh)
-- fixed potential "too big ascender/descender" bug (by Stepan Roh)
-- fixed U+026E and U+028E (by Denis Jacquerye)
-- added U+0186, U+0190, U+0300 - U+0304, U+0306 - U+0308, U+030A - U+030C,
-  U+0321, U+0322 (by Denis Jacquerye)
-- added rest of Block Elements: U+2591 - U+2593 (by David Lawrence Ramsey)
-- added U+2311, U+237D and U+2638 (by David Lawrence Ramsey)
-- added U+01CD - U+01D4 (by Denis Jacquerye)
-- fixed accents of U+00F2 - U+00F6 by replacing them with references in Mono
-  Bold (by David Jez)
-- added U+0490, U+0491 (by Eugeniy Meshcheryakov)
-- added hints to U+0404 and U+0454 in Sans (by Eugeniy Meshcheryakov)
-- completed Greek glyphs from U+0370 to U+03CF in Serif (by Ben Laenen)
-- fixed shape of U+0255 in Sans Bold and Sans Bold Oblique (by Denis
-  Jacquerye)
-
-Changes from 1.13 to 1.14:
-
-- fixed bug where Mono faces were not recognized as fixed pitch in Windows
-  by correcting Venda glyphs (by David Jez)
-- added and improved TrueType instructions (by Keenan Pepper)
-- added 6 Uzbekian glyphs (by Mashrab Kuvatov)
-- added Greek glyphs to Sans and Serif, changed pi and omega to fit in (by
-  Ben Laenen)
-- added IPA and related superscript glyphs (by Denis Jacquerye)
-- fixed buggy Venda glyphs (by David Lawrence Ramsey and Stepan Roh)
-- added U+2302, U+2310, U+2319 (by David Lawrence Ramsey)
-- fixed slanted U+00AC in Serif Oblique faces (by David Lawrence Ramsey)
-- added 29 glyphs from Block Elements (by David Lawrence Ramsey)
-
-Changes from 1.12 to 1.13:
-
-- removed all stems (PS hints) (requested by David Jez)
-- added U+01D6, U+01DF, U+022B, U+022D and U+0231 (by Sander Vesik)
-- added 10 Venda glyphs (by Dwayne Bailey)
-- fixed bug when fonts had no name on Microsoft Windows (by Stepan Roh)
-- updated 'missing' glyph U+FFFD (by David Jez)
-- set TTF flag fsType to 'Installable Embedding' (= unrestricted usage)
-  (idea by C. Tiffany)
-
-Changes from 1.11 to 1.12:
-
-- added long s (by James Cloos)
-- prettier comma accent in gcommaaccent (by David Jez)
-- added Hbar, hbar, kgreenlandic, napostrophe, Eng, eng, Tbar, tbar,
-  afii57929 (by David Jez)
-- changed Iogonek, iogonek, IJ, ij to look better (by David Jez)
-- glyph uni0237 renamed to dotlessj (requested by David Jez)
-- fixed accents for dcaron, lcaron, tcaron, Uogonek, uogonek in Serif (by
-  David Jez)
-- added U+2500 - U+257F box drawing glyphs to Sans Mono (by David Jez)
-- fixed accents in Wcircumflex, Ycircumflex and Zdotaccent (by David Jez)
-- extra kerning for F (by Sander Vesik)
-- added 'missing' glyph U+FFFD (by David Jez)
-
-Changes from 1.10 to 1.11:
-
-- kerning updates (by Sander Vesik)
-- added Iogonek, iogonek, IJ, ij, Uogonek, uogonek (from SuSE standard fonts
-  by Adrian Schroeter, SuSE AG)
-- added Gcommaaccent, gcommaaccent, Kcommaaccent, kcommaaccent,
-  Lcommaaccent, lcommaaccent, Ncommaaccent, ncommaaccent, Rcommaaccent,
-  rcommaaccent (by Stepan Roh)
-
-Changes from 1.9 to 1.10:
-
-- added U+022E, U+022F (by Sander Vesik)
-- kerning updates for DejaVu Sans (by Sander Vesik)
-- fixed too wide cyrillic glyphs in DejaVu Sans Mono (by Valentin Stoykov)
-- fixed ligatures bug in Mono (by Stepan Roh)
-
-Changes from 1.8 to 1.9:
-
-- integrated Arev Cyrillics (by Danilo Segan)
-- added U+01EA, U+01EB, U+01EC, U+01ED (by Sander Vesik)
-
-Changes from 1.7 to 1.8:
-
-- fixed accents in Serif Oblique and Serif Bold Oblique (by Stepan Roh)
-
-Changes from 1.6 to 1.7:
-
-- added automatically generated Condensed typefaces (by Stepan Roh)
-
-Changes from 1.5 to 1.6:
-
-- monospace bug fixed (by Stepan Roh)
-- incorrect Bitstream foundry assigned by fontconfig and KDE Font Installer
-fixed (by Stepan Roh)
-- added automatically generated Oblique version of Serif typefaces (by
-Stepan Roh)
-- corrected cyrillic D and d (by Danilo Segan and David Jez)
-- fixed accents position in Oblique version of Serif typefaces (by Danilo
-Segan and Sander Vesik)
-- fixed incorrect computation of OS2Win* fields (by Stepan Roh)
-- added visiblespace U+2423 (by David Jez)
-- fixed 'line height' bug by fixing ascender and descender values (by David
-Jez and Stepan Roh)
-- fixed part of 'worse than Vera' bug (by Peter Cernak)
-- smaller comma accent U+0326 (by David Jez)
-
-Changes from 1.4 to 1.5:
-
-- added Cyrillics (96 characters) and Dcroat to the rest of typefaces (by
-Danilo Segan)
-- fixed bugs in some Cyrillic characters, some of them reported by Sander
-Vesik (by Danilo Segan)
-- added U+0100, U+0101, U+0112, U+0113, U+012A, U+012B, U+014C, U+014D,
-U+016A, U+016B, U+01E2, U+01E3, U+0232 and U+0233 (by Sander Vesik)
-- added Romanian characters (by Misu Moldovan)
-- added U+0108, U+0109, U+010A, U+010B, U+0114, U+0115, U+0116, U+0117,
-U+011C, U+011D, U+0120, U+0121, U+0124, U+0125, U+0128, U+0129, U+012C,
-U+012D, U+0134, U+0135, U+014E, U+014F, U+0150, U+0151, U+015C, U+015D,
-U+0168, U+0169, U+016C, U+016D, U+0170, U+0171 and U+0237 (by James
-Crippen)
-- added U+02BB, U+2010, U+2011, U+2012 and U+2015 (by Stepan Roh)
-
-Changes from 1.3 to 1.4:
-
-- added Polish characters (Aogonek, aogonek, Eogonek, eogonek, Nacute,
-nacute, Sacute, sacute, Zacute, zacute, Zdotaccent, zdotaccent) (by Stepan
-Roh)
-
-Changes from 1.2 to 1.3:
-
-- added Cyrillics (96 characters) and Dcroat to Sans typefaces (by Danilo
-Segan from his BePa fonts)
-
-Changes from 1.1 to 1.2:
-
-- added Ldot, ldot, Wcircumflex, wcircumflex, Ycircumflex, ycircumflex,
-  Wgrave, wgrave, Wacute, wacute, Wdieresis, wdieresis, Ygrave and ygrave
-  (from The Olwen Font Family 0.2 by Dafydd Harries)
-
-Changes from 1.0 to 1.1:
-
-- added Lacute, lacute, Lcaron, lcaron, Racute and racute (by Peter Cernak)
-
-Changes from 0.9.4 to 1.0:
-
-- none, just changed version and updated README
-
-Changes from 0.9.3 to 0.9.4:
-
-- fixed TTF generation (kerning tables were missing)
-
-Changes from 0.9.2 to 0.9.3:
-
-- kerning of added characters
-- proper caron shape for dcaron in Mono (by Ondrej Koala Vacha)
-- minor visual changes
-
-Changes from 0.9.1 to 0.9.2:
-
-- internal bugged version
-
-Changes from 0.9 to 0.9.1:
-
-- proper caron shape for dcaron and tcaron
-- minor visual changes
-
-$Id: NEWS 2359 2009-08-27 14:13:16Z ben_laenen $
diff --git a/fonts/dejavu-fonts-ttf-2.30/README b/fonts/dejavu-fonts-ttf-2.30/README
deleted file mode 100644
index 0bcc3aa..0000000
--- a/fonts/dejavu-fonts-ttf-2.30/README
+++ /dev/null
@@ -1,59 +0,0 @@
-DejaVu fonts 2.30 (c)2004-2009 DejaVu fonts team
-------------------------------------------------
-
-The DejaVu fonts are a font family based on the Bitstream Vera Fonts
-(http://gnome.org/fonts/). Its purpose is to provide a wider range of
-characters (see status.txt for more information) while maintaining the
-original look and feel.
-
-DejaVu fonts are based on Bitstream Vera fonts version 1.10.
-
-Available fonts (Sans = sans serif, Mono = monospaced):
-
-DejaVu Sans Mono
-DejaVu Sans Mono Bold
-DejaVu Sans Mono Bold Oblique
-DejaVu Sans Mono Oblique
-DejaVu Sans
-DejaVu Sans Bold
-DejaVu Sans Bold Oblique
-DejaVu Sans Oblique
-DejaVu Sans ExtraLight (experimental)
-DejaVu Serif
-DejaVu Serif Bold
-DejaVu Serif Bold Italic (experimental)
-DejaVu Serif Italic (experimental)
-DejaVu Sans Condensed (experimental)
-DejaVu Sans Condensed Bold (experimental)
-DejaVu Sans Condensed Bold Oblique (experimental)
-DejaVu Sans Condensed Oblique (experimental)
-DejaVu Serif Condensed (experimental)
-DejaVu Serif Condensed Bold (experimental)
-DejaVu Serif Condensed Bold Italic (experimental)
-DejaVu Serif Condensed Italic (experimental)
-
-All fonts are also available as derivative called DejaVu LGC with support
-only for Latin, Greek and Cyrillic scripts.
-
-For license information see LICENSE. What's new is described in NEWS. Known
-bugs are in BUGS. All authors are mentioned in AUTHORS.
-
-Fonts are published in source form as SFD files (Spline Font Database from
-FontForge - http://fontforge.sf.net/) and in compiled form as TTF files
-(TrueType fonts).
-
-For more information go to http://dejavu.sourceforge.net/.
-
-Characters from Arev fonts, Copyright (c) 2006 by Tavmjong Bah:
----------------------------
-U+01BA, U+01BF, U+01F7, U+021C-U+021D, U+0220, U+0222-U+0223,
-U+02B9, U+02BA, U+02BD, U+02C2-U+02C5, U+02d4-U+02D5,
-U+02D7, U+02EC-U+02EE, U+0346-U+034E, U+0360, U+0362,
-U+03E2-03EF, U+0460-0463, U+0466-U+0486, U+0488-U+0489, U+04A8-U+04A9,
-U+0500-U+050F, U+2055-205E, U+20B0, U+20B2-U+20B3, U+2102, U+210D, U+210F,
-U+2111, U+2113, U+2115, U+2118-U+211A, U+211C-U+211D, U+2124, U+2135,
-U+213C-U+2140, U+2295-U+2298, U+2308-U+230B, U+26A2-U+26B1, U+2701-U+2704,
-U+2706-U+2709, U+270C-U+274B, U+2758-U+275A, U+2761-U+2775, U+2780-U+2794,
-U+2798-U+27AF, U+27B1-U+27BE, U+FB05-U+FB06
-
-$Id: README 2359 2009-08-27 14:13:16Z ben_laenen $
diff --git a/fonts/dejavu-fonts-ttf-2.30/langcover.txt b/fonts/dejavu-fonts-ttf-2.30/langcover.txt
deleted file mode 100644
index 8289ef4..0000000
--- a/fonts/dejavu-fonts-ttf-2.30/langcover.txt
+++ /dev/null
@@ -1,242 +0,0 @@
-This is the language coverage file for DejaVu fonts
-($Id$)
-
-                                                Sans               Serif              Sans Mono          
-aa     Afar                                     100% (62/62)       100% (62/62)       100% (62/62)      
-ab     Abkhazia                                 100% (90/90)        93% (84/90)        84% (76/90)      
-af     Afrikaans                                100% (69/69)       100% (69/69)       100% (69/69)      
-ak     Akan                                     100% (73/73)       100% (73/73)       100% (73/73)      
-am     Amharic                                       (0/264)            (0/264)            (0/264)      
-an     Aragonese                                100% (66/66)       100% (66/66)       100% (66/66)      
-ar     Arabic                                   100% (125/125)          (0/125)       100% (125/125)    
-as     Assamese                                      (0/64)             (0/64)             (0/64)       
-ast    Asturian/Bable/Leonese/Asturleonese      100% (66/66)       100% (66/66)       100% (66/66)      
-av     Avaric                                   100% (67/67)       100% (67/67)       100% (67/67)      
-ay     Aymara                                   100% (60/60)       100% (60/60)       100% (60/60)      
-az-az  Azerbaijani in Azerbaijan                100% (66/66)       100% (66/66)       100% (66/66)      
-az-ir  Azerbaijani in Iran                      100% (130/130)          (0/130)       100% (130/130)    
-ba     Bashkir                                  100% (82/82)       100% (82/82)        97% (80/82)      
-be     Byelorussian                             100% (68/68)       100% (68/68)       100% (68/68)      
-ber-dz Berber in Algeria                        100% (70/70)       100% (70/70)       100% (70/70)      
-ber-ma Berber in Morocco                        100% (32/32)            (0/32)             (0/32)       
-bg     Bulgarian                                100% (60/60)       100% (60/60)       100% (60/60)      
-bh     Bihari (Devanagari script)                    (0/68)             (0/68)             (0/68)       
-bho    Bhojpuri (Devanagari script)                  (0/68)             (0/68)             (0/68)       
-bi     Bislama                                  100% (58/58)       100% (58/58)       100% (58/58)      
-bin    Edo or Bini                              100% (78/78)       100% (78/78)       100% (78/78)      
-bm     Bambara                                  100% (60/60)       100% (60/60)       100% (60/60)      
-bn     Bengali                                       (0/63)             (0/63)             (0/63)       
-bo     Tibetan                                       (0/95)             (0/95)             (0/95)       
-br     Breton                                   100% (64/64)       100% (64/64)       100% (64/64)      
-bs     Bosnian                                  100% (62/62)       100% (62/62)       100% (62/62)      
-bua    Buriat (Buryat)                          100% (70/70)       100% (70/70)       100% (70/70)      
-byn    Blin/Bilin                                    (0/255)            (0/255)            (0/255)      
-ca     Catalan                                  100% (74/74)       100% (74/74)       100% (74/74)      
-ce     Chechen                                  100% (67/67)       100% (67/67)       100% (67/67)      
-ch     Chamorro                                 100% (58/58)       100% (58/58)       100% (58/58)      
-chm    Mari (Lower Cheremis / Upper Cheremis)   100% (76/76)       100% (76/76)        97% (74/76)      
-chr    Cherokee                                      (0/85)             (0/85)             (0/85)       
-co     Corsican                                 100% (84/84)       100% (84/84)       100% (84/84)      
-crh    Crimean Tatar/Crimean Turkish            100% (68/68)       100% (68/68)       100% (68/68)      
-cs     Czech                                    100% (82/82)       100% (82/82)       100% (82/82)      
-csb    Kashubian                                100% (74/74)       100% (74/74)       100% (74/74)      
-cu     Old Church Slavonic                      100% (103/103)      86% (89/103)       78% (81/103)     
-cv     Chuvash                                  100% (74/74)       100% (74/74)       100% (74/74)      
-cy     Welsh                                    100% (78/78)       100% (78/78)       100% (78/78)      
-da     Danish                                   100% (70/70)       100% (70/70)       100% (70/70)      
-de     German                                   100% (59/59)       100% (59/59)       100% (59/59)      
-dv     Divehi/Dhivehi/Maldivian                      (0/49)             (0/49)             (0/49)       
-dz     Dzongkha                                      (0/95)             (0/95)             (0/95)       
-ee     Ewe                                      100% (99/99)       100% (99/99)       100% (99/99)      
-el     Greek                                    100% (69/69)       100% (69/69)       100% (69/69)      
-en     English                                  100% (72/72)       100% (72/72)       100% (72/72)      
-eo     Esperanto                                100% (64/64)       100% (64/64)       100% (64/64)      
-es     Spanish                                  100% (66/66)       100% (66/66)       100% (66/66)      
-et     Estonian                                 100% (64/64)       100% (64/64)       100% (64/64)      
-eu     Basque                                   100% (56/56)       100% (56/56)       100% (56/56)      
-fa     Persian                                  100% (129/129)          (0/129)       100% (129/129)    
-fat    Fanti                                    100% (73/73)       100% (73/73)       100% (73/73)      
-ff     Fulah (Fula)                             100% (62/62)       100% (62/62)       100% (62/62)      
-fi     Finnish                                  100% (62/62)       100% (62/62)       100% (62/62)      
-fil    Filipino                                 100% (84/84)       100% (84/84)       100% (84/84)      
-fj     Fijian                                   100% (52/52)       100% (52/52)       100% (52/52)      
-fo     Faroese                                  100% (68/68)       100% (68/68)       100% (68/68)      
-fr     French                                   100% (84/84)       100% (84/84)       100% (84/84)      
-fur    Friulian                                 100% (66/66)       100% (66/66)       100% (66/66)      
-fy     Frisian                                  100% (75/75)       100% (75/75)       100% (75/75)      
-ga     Irish                                    100% (80/80)       100% (80/80)       100% (80/80)      
-gd     Scots Gaelic                             100% (70/70)       100% (70/70)       100% (70/70)      
-gez    Ethiopic (Geez)                               (0/218)            (0/218)            (0/218)      
-gl     Galician                                 100% (66/66)       100% (66/66)       100% (66/66)      
-gn     Guarani                                  100% (70/70)       100% (70/70)       100% (70/70)      
-gu     Gujarati                                      (0/68)             (0/68)             (0/68)       
-gv     Manx Gaelic                              100% (54/54)       100% (54/54)       100% (54/54)      
-ha     Hausa                                    100% (60/60)       100% (60/60)       100% (60/60)      
-haw    Hawaiian                                 100% (63/63)       100% (63/63)       100% (63/63)      
-he     Hebrew                                   100% (27/27)            (0/27)             (0/27)       
-hi     Hindi (Devanagari script)                     (0/68)             (0/68)             (0/68)       
-hne    Chhattisgarhi                                 (0/68)             (0/68)             (0/68)       
-ho     Hiri Motu                                100% (52/52)       100% (52/52)       100% (52/52)      
-hr     Croatian                                 100% (62/62)       100% (62/62)       100% (62/62)      
-hsb    Upper Sorbian                            100% (72/72)       100% (72/72)       100% (72/72)      
-ht     Haitian/Haitian Creole                   100% (56/56)       100% (56/56)       100% (56/56)      
-hu     Hungarian                                100% (70/70)       100% (70/70)       100% (70/70)      
-hy     Armenian                                 100% (77/77)            (0/77)             (0/77)       
-hz     Herero                                   100% (57/57)       100% (57/57)       100% (57/57)      
-ia     Interlingua                              100% (52/52)       100% (52/52)       100% (52/52)      
-id     Indonesian                               100% (54/54)       100% (54/54)       100% (54/54)      
-ie     Interlingue                              100% (52/52)       100% (52/52)       100% (52/52)      
-ig     Igbo                                     100% (58/58)       100% (58/58)       100% (58/58)      
-ii     Sichuan Yi/Nuosu                              (0/1165)           (0/1165)           (0/1165)     
-ik     Inupiaq (Inupiak, Eskimo)                100% (68/68)       100% (68/68)       100% (68/68)      
-io     Ido                                      100% (52/52)       100% (52/52)       100% (52/52)      
-is     Icelandic                                100% (70/70)       100% (70/70)       100% (70/70)      
-it     Italian                                  100% (72/72)       100% (72/72)       100% (72/72)      
-iu     Inuktitut                                100% (161/161)          (0/161)            (0/161)      
-ja     Japanese                                      (0/6537)           (0/6537)           (0/6537)     
-jv     Javanese                                 100% (56/56)       100% (56/56)       100% (56/56)      
-ka     Georgian                                 100% (33/33)       100% (33/33)       100% (33/33)      
-kaa    Kara-Kalpak (Karakalpak)                 100% (78/78)       100% (78/78)       100% (78/78)      
-kab    Kabyle                                   100% (70/70)       100% (70/70)       100% (70/70)      
-ki     Kikuyu                                   100% (56/56)       100% (56/56)       100% (56/56)      
-kj     Kuanyama/Kwanyama                        100% (52/52)       100% (52/52)       100% (52/52)      
-kk     Kazakh                                   100% (77/77)       100% (77/77)       100% (77/77)      
-kl     Greenlandic                              100% (81/81)       100% (81/81)       100% (81/81)      
-km     Central Khmer                                 (0/63)             (0/63)             (0/63)       
-kn     Kannada                                       (0/70)             (0/70)             (0/70)       
-ko     Korean                                        (0/2443)           (0/2443)           (0/2443)     
-kok    Kokani (Devanagari script)                    (0/68)             (0/68)             (0/68)       
-kr     Kanuri                                   100% (56/56)        96% (54/56)       100% (56/56)      
-ks     Kashmiri                                  94% (137/145)          (0/145)        97% (141/145)    
-ku-am  Kurdish in Armenia                       100% (64/64)       100% (64/64)       100% (64/64)      
-ku-iq  Kurdish in Iraq                          100% (32/32)            (0/32)         87% (28/32)      
-ku-ir  Kurdish in Iran                          100% (32/32)            (0/32)         87% (28/32)      
-ku-tr  Kurdish in Turkey                        100% (62/62)       100% (62/62)       100% (62/62)      
-kum    Kumyk                                    100% (66/66)       100% (66/66)       100% (66/66)      
-kv     Komi (Komi-Permyak/Komi-Siryan)          100% (70/70)       100% (70/70)       100% (70/70)      
-kw     Cornish                                  100% (64/64)       100% (64/64)       100% (64/64)      
-kwm    Kwambi                                   100% (52/52)       100% (52/52)       100% (52/52)      
-ky     Kirgiz                                   100% (70/70)       100% (70/70)       100% (70/70)      
-la     Latin                                    100% (68/68)       100% (68/68)       100% (68/68)      
-lah    Lahnda                                    94% (137/145)          (0/145)        97% (141/145)    
-lb     Luxembourgish (Letzeburgesch)            100% (75/75)       100% (75/75)       100% (75/75)      
-lez    Lezghian (Lezgian)                       100% (67/67)       100% (67/67)       100% (67/67)      
-lg     Ganda                                    100% (54/54)       100% (54/54)       100% (54/54)      
-li     Limburgan/Limburger/Limburgish           100% (62/62)       100% (62/62)       100% (62/62)      
-ln     Lingala                                  100% (81/81)       100% (81/81)       100% (81/81)      
-lo     Lao                                      100% (55/55)            (0/55)         83% (46/55)      
-lt     Lithuanian                               100% (70/70)       100% (70/70)       100% (70/70)      
-lv     Latvian                                  100% (78/78)       100% (78/78)       100% (78/78)      
-mai    Maithili (Devanagari script)                  (0/68)             (0/68)             (0/68)       
-mg     Malagasy                                 100% (56/56)       100% (56/56)       100% (56/56)      
-mh     Marshallese                              100% (62/62)       100% (62/62)       100% (62/62)      
-mi     Maori                                    100% (64/64)       100% (64/64)       100% (64/64)      
-mk     Macedonian                               100% (42/42)       100% (42/42)       100% (42/42)      
-ml     Malayalam                                     (0/68)             (0/68)             (0/68)       
-mn-cn  Mongolian in China                            (0/130)            (0/130)            (0/130)      
-mn-mn  Mongolian in Mongolia                    100% (70/70)       100% (70/70)       100% (70/70)      
-mo     Moldavian                                100% (128/128)     100% (128/128)     100% (128/128)    
-mr     Marathi (Devanagari script)                   (0/68)             (0/68)             (0/68)       
-ms     Malay                                    100% (52/52)       100% (52/52)       100% (52/52)      
-mt     Maltese                                  100% (72/72)       100% (72/72)       100% (72/72)      
-my     Burmese (Myanmar)                             (0/48)             (0/48)             (0/48)       
-na     Nauru                                    100% (60/60)       100% (60/60)       100% (60/60)      
-nb     Norwegian Bokmal                         100% (70/70)       100% (70/70)       100% (70/70)      
-nds    Low Saxon                                100% (59/59)       100% (59/59)       100% (59/59)      
-ne     Nepali (Devanagari script)                    (0/68)             (0/68)             (0/68)       
-ng     Ndonga                                   100% (52/52)       100% (52/52)       100% (52/52)      
-nl     Dutch                                    100% (82/82)       100% (82/82)       100% (82/82)      
-nn     Norwegian Nynorsk                        100% (76/76)       100% (76/76)       100% (76/76)      
-no     Norwegian (Bokmal)                       100% (70/70)       100% (70/70)       100% (70/70)      
-nr     Ndebele, South                           100% (52/52)       100% (52/52)       100% (52/52)      
-nso    Northern Sotho                           100% (58/58)       100% (58/58)       100% (58/58)      
-nv     Navajo/Navaho                            100% (72/72)       100% (72/72)       100% (72/72)      
-ny     Chichewa                                 100% (54/54)       100% (54/54)       100% (54/54)      
-oc     Occitan                                  100% (70/70)       100% (70/70)       100% (70/70)      
-om     Oromo or Galla                           100% (52/52)       100% (52/52)       100% (52/52)      
-or     Oriya                                         (0/68)             (0/68)             (0/68)       
-os     Ossetic                                  100% (66/66)       100% (66/66)       100% (66/66)      
-ota    Ottoman Turkish                           97% (36/37)            (0/37)         97% (36/37)      
-pa     Panjabi/Punjabi                               (0/63)             (0/63)             (0/63)       
-pa-pk  Panjabi/Punjabi in Pakistan               94% (137/145)          (0/145)        97% (141/145)    
-pap-an Papiamento in Netherlands Antilles       100% (72/72)       100% (72/72)       100% (72/72)      
-pap-aw Papiamento in Aruba                      100% (54/54)       100% (54/54)       100% (54/54)      
-pl     Polish                                   100% (70/70)       100% (70/70)       100% (70/70)      
-ps-af  Pashto in Afghanistan                     83% (41/49)            (0/49)         77% (38/49)      
-ps-pk  Pashto in Pakistan                        81% (40/49)            (0/49)         75% (37/49)      
-pt     Portuguese                               100% (82/82)       100% (82/82)       100% (82/82)      
-qu     Quechua                                  100% (55/55)       100% (55/55)       100% (55/55)      
-rm     Rhaeto-Romance (Romansch)                100% (66/66)       100% (66/66)       100% (66/66)      
-rn     Rundi                                    100% (52/52)       100% (52/52)       100% (52/52)      
-ro     Romanian                                 100% (62/62)       100% (62/62)       100% (62/62)      
-ru     Russian                                  100% (66/66)       100% (66/66)       100% (66/66)      
-rw     Kinyarwanda                              100% (52/52)       100% (52/52)       100% (52/52)      
-sa     Sanskrit (Devanagari script)                  (0/68)             (0/68)             (0/68)       
-sah    Yakut                                    100% (76/76)       100% (76/76)        97% (74/76)      
-sc     Sardinian                                100% (62/62)       100% (62/62)       100% (62/62)      
-sco    Scots                                    100% (56/56)       100% (56/56)       100% (56/56)      
-sd     Sindhi                                    81% (44/54)            (0/54)         79% (43/54)      
-se     North Sami                               100% (66/66)       100% (66/66)       100% (66/66)      
-sel    Selkup (Ostyak-Samoyed)                  100% (66/66)       100% (66/66)       100% (66/66)      
-sg     Sango                                    100% (72/72)       100% (72/72)       100% (72/72)      
-sh     Serbo-Croatian                           100% (156/156)     100% (156/156)      98% (154/156)    
-shs    Secwepemctsin                            100% (48/48)       100% (48/48)       100% (48/48)      
-si     Sinhala/Sinhalese                             (0/73)             (0/73)             (0/73)       
-sid    Sidamo                                        (0/281)            (0/281)            (0/281)      
-sk     Slovak                                   100% (86/86)       100% (86/86)       100% (86/86)      
-sl     Slovenian                                100% (62/62)       100% (62/62)       100% (62/62)      
-sm     Samoan                                   100% (53/53)       100% (53/53)       100% (53/53)      
-sma    South Sami                               100% (60/60)       100% (60/60)       100% (60/60)      
-smj    Lule Sami                                100% (60/60)       100% (60/60)       100% (60/60)      
-smn    Inari Sami                               100% (68/68)       100% (68/68)       100% (68/68)      
-sms    Skolt Sami                               100% (80/80)       100% (80/80)        97% (78/80)      
-sn     Shona                                    100% (52/52)       100% (52/52)       100% (52/52)      
-so     Somali                                   100% (52/52)       100% (52/52)       100% (52/52)      
-sq     Albanian                                 100% (56/56)       100% (56/56)       100% (56/56)      
-sr     Serbian                                  100% (60/60)       100% (60/60)       100% (60/60)      
-ss     Swati                                    100% (52/52)       100% (52/52)       100% (52/52)      
-st     Sotho, Southern                          100% (52/52)       100% (52/52)       100% (52/52)      
-su     Sundanese                                100% (54/54)       100% (54/54)       100% (54/54)      
-sv     Swedish                                  100% (68/68)       100% (68/68)       100% (68/68)      
-sw     Swahili                                  100% (52/52)       100% (52/52)       100% (52/52)      
-syr    Syriac                                        (0/45)             (0/45)             (0/45)       
-ta     Tamil                                         (0/48)             (0/48)             (0/48)       
-te     Telugu                                        (0/70)             (0/70)             (0/70)       
-tg     Tajik                                    100% (78/78)       100% (78/78)        97% (76/78)      
-th     Thai                                       1% (1/74)             (0/74)             (0/74)       
-ti-er  Eritrean Tigrinya                             (0/255)            (0/255)            (0/255)      
-ti-et  Ethiopian Tigrinya                            (0/281)            (0/281)            (0/281)      
-tig    Tigre                                         (0/221)            (0/221)            (0/221)      
-tk     Turkmen                                  100% (68/68)       100% (68/68)       100% (68/68)      
-tl     Tagalog                                  100% (84/84)       100% (84/84)       100% (84/84)      
-tn     Tswana                                   100% (58/58)       100% (58/58)       100% (58/58)      
-to     Tonga                                    100% (53/53)       100% (53/53)       100% (53/53)      
-tr     Turkish                                  100% (70/70)       100% (70/70)       100% (70/70)      
-ts     Tsonga                                   100% (52/52)       100% (52/52)       100% (52/52)      
-tt     Tatar                                    100% (76/76)       100% (76/76)       100% (76/76)      
-tw     Twi                                      100% (73/73)       100% (73/73)       100% (73/73)      
-ty     Tahitian                                 100% (65/65)       100% (65/65)       100% (65/65)      
-tyv    Tuvinian                                 100% (70/70)       100% (70/70)       100% (70/70)      
-ug     Uighur                                   100% (125/125)          (0/125)       100% (125/125)    
-uk     Ukrainian                                100% (72/72)       100% (72/72)       100% (72/72)      
-ur     Urdu                                      94% (137/145)          (0/145)        97% (141/145)    
-uz     Uzbek                                    100% (52/52)       100% (52/52)       100% (52/52)      
-ve     Venda                                    100% (62/62)       100% (62/62)       100% (62/62)      
-vi     Vietnamese                               100% (194/194)      77% (150/194)      76% (148/194)    
-vo     Volapuk                                  100% (54/54)       100% (54/54)       100% (54/54)      
-vot    Votic                                    100% (62/62)       100% (62/62)       100% (62/62)      
-wa     Walloon                                  100% (70/70)       100% (70/70)       100% (70/70)      
-wal    Wolaitta/Wolaytta                             (0/281)            (0/281)            (0/281)      
-wen    Sorbian languages (lower and upper)      100% (76/76)       100% (76/76)       100% (76/76)      
-wo     Wolof                                    100% (66/66)       100% (66/66)       100% (66/66)      
-xh     Xhosa                                    100% (52/52)       100% (52/52)       100% (52/52)      
-yap    Yapese                                   100% (58/58)       100% (58/58)       100% (58/58)      
-yi     Yiddish                                  100% (27/27)            (0/27)             (0/27)       
-yo     Yoruba                                   100% (119/119)     100% (119/119)     100% (119/119)    
-za     Zhuang/Chuang                            100% (52/52)       100% (52/52)       100% (52/52)      
-zh-cn  Chinese (simplified)                       0% (2/6765)        0% (2/6765)        0% (2/6765)     
-zh-hk  Chinese Hong Kong Supplementary Character Set      (0/2213)           (0/2213)           (0/2213)     
-zh-mo  Chinese in Macau                              (0/2213)           (0/2213)           (0/2213)     
-zh-sg  Chinese in Singapore                       0% (2/6765)        0% (2/6765)        0% (2/6765)     
-zh-tw  Chinese (traditional)                         (0/13063)          (0/13063)          (0/13063)    
-zu     Zulu                                     100% (52/52)       100% (52/52)       100% (52/52)      
diff --git a/fonts/dejavu-fonts-ttf-2.30/status.txt b/fonts/dejavu-fonts-ttf-2.30/status.txt
deleted file mode 100644
index ecc3055..0000000
--- a/fonts/dejavu-fonts-ttf-2.30/status.txt
+++ /dev/null
@@ -1,6237 +0,0 @@
-This is the status file for DejaVu fonts
-($Id: status.txt 2362 2009-08-27 14:43:39Z ben_laenen $)
-
-original = present in original Bitstream Vera 1.10
-<version> = added in DejaVu fonts <version>
-
-U+0020 space                original
-U+0021 exclam               original
-U+0022 quotedbl             original
-U+0023 numbersign           original
-U+0024 dollar               original
-U+0025 percent              original
-U+0026 ampersand            original
-U+0027 quotesingle          original
-U+0028 parenleft            original
-U+0029 parenright           original
-U+002a asterisk             original
-U+002b plus                 original
-U+002c comma                original
-U+002d hyphen               original
-U+002e period               original
-U+002f slash                original
-U+0030 zero                 original
-U+0031 one                  original
-U+0032 two                  original
-U+0033 three                original
-U+0034 four                 original
-U+0035 five                 original
-U+0036 six                  original
-U+0037 seven                original
-U+0038 eight                original
-U+0039 nine                 original
-U+003a colon                original
-U+003b semicolon            original
-U+003c less                 original
-U+003d equal                original
-U+003e greater              original
-U+003f question             original
-U+0040 at                   original
-U+0041 A                    original
-U+0042 B                    original
-U+0043 C                    original
-U+0044 D                    original
-U+0045 E                    original
-U+0046 F                    original
-U+0047 G                    original
-U+0048 H                    original
-U+0049 I                    original
-U+004a J                    original
-U+004b K                    original
-U+004c L                    original
-U+004d M                    original
-U+004e N                    original
-U+004f O                    original
-U+0050 P                    original
-U+0051 Q                    original
-U+0052 R                    original
-U+0053 S                    original
-U+0054 T                    original
-U+0055 U                    original
-U+0056 V                    original
-U+0057 W                    original
-U+0058 X                    original
-U+0059 Y                    original
-U+005a Z                    original
-U+005b bracketleft          original
-U+005c backslash            original
-U+005d bracketright         original
-U+005e asciicircum          original
-U+005f underscore           original
-U+0060 grave                original
-U+0061 a                    original
-U+0062 b                    original
-U+0063 c                    original
-U+0064 d                    original
-U+0065 e                    original
-U+0066 f                    original
-U+0067 g                    original
-U+0068 h                    original
-U+0069 i                    original
-U+006a j                    original
-U+006b k                    original
-U+006c l                    original
-U+006d m                    original
-U+006e n                    original
-U+006f o                    original
-U+0070 p                    original
-U+0071 q                    original
-U+0072 r                    original
-U+0073 s                    original
-U+0074 t                    original
-U+0075 u                    original
-U+0076 v                    original
-U+0077 w                    original
-U+0078 x                    original
-U+0079 y                    original
-U+007a z                    original
-U+007b braceleft            original
-U+007c bar                  original
-U+007d braceright           original
-U+007e asciitilde           original
-U+00a0 nonbreakingspace     original
-U+00a1 exclamdown           original
-U+00a2 cent                 original
-U+00a3 sterling             original
-U+00a4 currency             original
-U+00a5 yen                  original
-U+00a6 brokenbar            original
-U+00a7 section              original
-U+00a8 dieresis             original
-U+00a9 copyright            original
-U+00aa ordfeminine          original
-U+00ab guillemotleft        original
-U+00ac logicalnot           original
-U+00ad sfthyphen            original
-U+00ae registered           original
-U+00af macron               original
-U+00b0 degree               original
-U+00b1 plusminus            original
-U+00b2 twosuperior          original
-U+00b3 threesuperior        original
-U+00b4 acute                original
-U+00b5 mu                   original
-U+00b6 paragraph            original
-U+00b7 periodcentered       original
-U+00b8 cedilla              original
-U+00b9 onesuperior          original
-U+00ba ordmasculine         original
-U+00bb guillemotright       original
-U+00bc onequarter           original
-U+00bd onehalf              original
-U+00be threequarters        original
-U+00bf questiondown         original
-U+00c0 Agrave               original
-U+00c1 Aacute               original
-U+00c2 Acircumflex          original
-U+00c3 Atilde               original
-U+00c4 Adieresis            original
-U+00c5 Aring                original
-U+00c6 AE                   original
-U+00c7 Ccedilla             original
-U+00c8 Egrave               original
-U+00c9 Eacute               original
-U+00ca Ecircumflex          original
-U+00cb Edieresis            original
-U+00cc Igrave               original
-U+00cd Iacute               original
-U+00ce Icircumflex          original
-U+00cf Idieresis            original
-U+00d0 Eth                  original
-U+00d1 Ntilde               original
-U+00d2 Ograve               original
-U+00d3 Oacute               original
-U+00d4 Ocircumflex          original
-U+00d5 Otilde               original
-U+00d6 Odieresis            original
-U+00d7 multiply             original
-U+00d8 Oslash               original
-U+00d9 Ugrave               original
-U+00da Uacute               original
-U+00db Ucircumflex          original
-U+00dc Udieresis            original
-U+00dd Yacute               original
-U+00de Thorn                original
-U+00df germandbls           original
-U+00e0 agrave               original
-U+00e1 aacute               original
-U+00e2 acircumflex          original
-U+00e3 atilde               original
-U+00e4 adieresis            original
-U+00e5 aring                original
-U+00e6 ae                   original
-U+00e7 ccedilla             original
-U+00e8 egrave               original
-U+00e9 eacute               original
-U+00ea ecircumflex          original
-U+00eb edieresis            original
-U+00ec igrave               original
-U+00ed iacute               original
-U+00ee icircumflex          original
-U+00ef idieresis            original
-U+00f0 eth                  original
-U+00f1 ntilde               original
-U+00f2 ograve               original
-U+00f3 oacute               original
-U+00f4 ocircumflex          original
-U+00f5 otilde               original
-U+00f6 odieresis            original
-U+00f7 divide               original
-U+00f8 oslash               original
-U+00f9 ugrave               original
-U+00fa uacute               original
-U+00fb ucircumflex          original
-U+00fc udieresis            original
-U+00fd yacute               original
-U+00fe thorn                original
-U+00ff ydieresis            original
-U+0100 Amacron              1.5
-U+0101 amacron              1.5
-U+0102 Abreve               1.5
-U+0103 abreve               1.5
-U+0104 Aogonek              1.4
-U+0105 aogonek              1.4
-U+0106 Cacute               original
-U+0107 cacute               original
-U+0108 Ccircumflex          1.5
-U+0109 ccircumflex          1.5
-U+010a Cdotaccent           1.5
-U+010b cdotaccent           1.5
-U+010c Ccaron               original
-U+010d ccaron               original
-U+010e Dcaron               1.0
-U+010f dcaron               1.0
-U+0110 Dcroat               1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0111 dcroat               original
-U+0112 Emacron              1.5
-U+0113 emacron              1.5
-U+0114 Ebreve               1.5
-U+0115 ebreve               1.5
-U+0116 Edotaccent           1.5
-U+0117 edotaccent           1.5
-U+0118 Eogonek              1.4
-U+0119 eogonek              1.4
-U+011a Ecaron               1.0
-U+011b ecaron               1.0
-U+011c Gcircumflex          1.5
-U+011d gcircumflex          1.5
-U+011e Gbreve               original
-U+011f gbreve               original
-U+0120 Gdotaccent           1.5
-U+0121 gdotaccent           1.5
-U+0122 Gcommaaccent         1.11
-U+0123 gcommaaccent         1.11
-U+0124 Hcircumflex          1.5
-U+0125 hcircumflex          1.5
-U+0126 Hbar                 1.12
-U+0127 hbar                 1.12
-U+0128 Itilde               1.5
-U+0129 itilde               1.5
-U+012a Imacron              1.5
-U+012b imacron              1.5
-U+012c Ibreve               1.5
-U+012d ibreve               1.5
-U+012e Iogonek              1.11
-U+012f iogonek              1.11
-U+0130 Idotaccent           original
-U+0131 dotlessi             original
-U+0132 IJ                   1.11
-U+0133 ij                   1.11
-U+0134 Jcircumflex          1.5
-U+0135 jcircumflex          1.5
-U+0136 Kcommaaccent         1.11
-U+0137 kcommaaccent         1.11
-U+0138 kgreenlandic         1.12
-U+0139 Lacute               1.1
-U+013a lacute               1.1
-U+013b Lcommaaccent         1.11
-U+013c lcommaaccent         1.11
-U+013d Lcaron               1.1
-U+013e lcaron               1.1
-U+013f Ldot                 1.2
-U+0140 ldot                 1.2
-U+0141 Lslash               original
-U+0142 lslash               original
-U+0143 Nacute               1.4
-U+0144 nacute               1.4
-U+0145 Ncommaaccent         1.11
-U+0146 ncommaaccent         1.11
-U+0147 Ncaron               1.0
-U+0148 ncaron               1.0
-U+0149 napostrophe          1.12
-U+014a Eng                  1.12
-U+014b eng                  1.12
-U+014c Omacron              1.5
-U+014d omacron              1.5
-U+014e Obreve               1.5
-U+014f obreve               1.5
-U+0150 Ohungarumlaut        1.5
-U+0151 ohungarumlaut        1.5
-U+0152 OE                   original
-U+0153 oe                   original
-U+0154 Racute               1.1
-U+0155 racute               1.1
-U+0156 Rcommaaccent         1.11
-U+0157 rcommaaccent         1.11
-U+0158 Rcaron               1.0
-U+0159 rcaron               1.0
-U+015a Sacute               1.4
-U+015b sacute               1.4
-U+015c Scircumflex          1.5
-U+015d scircumflex          1.5
-U+015e Scedilla             original
-U+015f scedilla             original
-U+0160 Scaron               original
-U+0161 scaron               original
-U+0162 Tcommaaccent         1.5
-U+0163 tcommaaccent         1.5
-U+0164 Tcaron               1.0
-U+0165 tcaron               1.0
-U+0166 Tbar                 1.12
-U+0167 tbar                 1.12
-U+0168 Utilde               1.5
-U+0169 utilde               1.5
-U+016a Umacron              1.5
-U+016b umacron              1.5
-U+016c Ubreve               1.5
-U+016d ubreve               1.5
-U+016e Uring                1.0
-U+016f uring                1.0
-U+0170 Uhungarumlaut        1.5
-U+0171 uhungarumlaut        1.5
-U+0172 Uogonek              1.11
-U+0173 uogonek              1.11
-U+0174 Wcircumflex          1.2
-U+0175 wcircumflex          1.2
-U+0176 Ycircumflex          1.2
-U+0177 ycircumflex          1.2
-U+0178 Ydieresis            original
-U+0179 Zacute               1.4
-U+017a zacute               1.4
-U+017b Zdotaccent           1.4
-U+017c zdotaccent           1.4
-U+017d Zcaron               original
-U+017e zcaron               original
-U+017f longs                1.12
-U+0180 uni0180              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0181 uni0181              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0182 uni0182              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0183 uni0183              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0184 uni0184              2.3
-U+0185 uni0185              2.3
-U+0186 uni0186              1.15
-U+0187 uni0187              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0188 uni0188              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0189 uni0189              2.1
-U+018a uni018A              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+018b uni018B              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+018c uni018C              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+018d uni018D              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+018e uni018E              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+018f uni018F              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0190 uni0190              1.15
-U+0191 uni0191              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0192 florin               original
-U+0193 uni0193              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0194 uni0194              1.14
-U+0195 uni0195              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.6 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0196 uni0196              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0197 uni0197              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0198 uni0198              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0199 uni0199              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+019a uni019A              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+019b uni019B              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+019c uni019C              2.3
-U+019d uni019D              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+019e uni019E              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+019f uni019F              2.3
-U+01a0 Ohorn                2.3
-U+01a1 ohorn                2.3
-U+01a2 uni01A2              2.3
-U+01a3 uni01A3              2.3
-U+01a4 uni01A4              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+01a5 uni01A5              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+01a6 uni01A6              2.3
-U+01a7 uni01A7              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+01a8 uni01A8              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+01a9 uni01A9              2.2
-U+01aa uni01AA              2.3
-U+01ab uni01AB              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+01ac uni01AC              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+01ad uni01AD              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+01ae uni01AE              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+01af Uhorn                2.3
-U+01b0 uhorn                2.3
-U+01b1 uni01B1              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+01b2 uni01B2              2.3
-U+01b3 uni01B3              2.3
-U+01b4 uni01B4              2.3
-U+01b5 uni01B5              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+01b6 uni01B6              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+01b7 uni01B7              2.3
-U+01b8 uni01B8              2.3
-U+01b9 uni01B9              2.3
-U+01ba uni01BA              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+01bb uni01BB              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+01bc uni01BC              2.3
-U+01bd uni01BD              2.3
-U+01be uni01BE              2.3
-U+01bf uni01BF              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+01c0 uni01C0              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+01c1 uni01C1              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+01c2 uni01C2              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+01c3 uni01C3              2.2
-U+01c4 uni01C4              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+01c5 uni01C5              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+01c6 uni01C6              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+01c7 uni01C7              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+01c8 uni01C8              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+01c9 uni01C9              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+01ca uni01CA              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+01cb uni01CB              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+01cc uni01CC              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+01cd uni01CD              1.15
-U+01ce uni01CE              1.15
-U+01cf uni01CF              1.15
-U+01d0 uni01D0              1.15
-U+01d1 uni01D1              1.15
-U+01d2 uni01D2              1.15
-U+01d3 uni01D3              1.15
-U+01d4 uni01D4              1.15
-U+01d5 uni01D5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+01d6 uni01D6              1.13
-U+01d7 uni01D7              2.3
-U+01d8 uni01D8              2.3
-U+01d9 uni01D9              2.3
-U+01da uni01DA              2.3
-U+01db uni01DB              2.3
-U+01dc uni01DC              2.3
-U+01dd uni01DD              2.2
-U+01de uni01DE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique) 2.23 (Serif Italic Condensed)
-U+01df uni01DF              1.13
-U+01e0 uni01E0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+01e1 uni01E1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+01e2 uni01E2              1.5
-U+01e3 uni01E3              1.5
-U+01e4 uni01E4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
-U+01e5 uni01E5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
-U+01e6 Gcaron               2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+01e7 gcaron               2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+01e8 uni01E8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+01e9 uni01E9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+01ea uni01EA              1.9
-U+01eb uni01EB              1.9
-U+01ec uni01EC              1.9
-U+01ed uni01ED              1.9
-U+01ee uni01EE              2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+01ef uni01EF              2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+01f0 uni01F0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono) 2.22 (Sans Mono Bold) 2.23 (Serif Italic Condensed)
-U+01f1 uni01F1              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+01f2 uni01F2              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+01f3 uni01F3              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+01f4 uni01F4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+01f5 uni01F5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+01f6 uni01F6              2.3
-U+01f7 uni01F7              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+01f8 uni01F8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+01f9 uni01F9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+01fa Aringacute           2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+01fb aringacute           2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+01fc AEacute              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+01fd aeacute              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+01fe Oslashacute          2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+01ff oslashacute          2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0200 uni0200              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0201 uni0201              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0202 uni0202              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0203 uni0203              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0204 uni0204              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0205 uni0205              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0206 uni0206              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0207 uni0207              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0208 uni0208              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0209 uni0209              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+020a uni020A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+020b uni020B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+020c uni020C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+020d uni020D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+020e uni020E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+020f uni020F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0210 uni0210              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0211 uni0211              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0212 uni0212              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0213 uni0213              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0214 uni0214              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0215 uni0215              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0216 uni0216              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0217 uni0217              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0218 Scommaaccent         1.5
-U+0219 scommaaccent         1.5
-U+021a uni021A              1.5
-U+021b uni021B              1.5
-U+021c uni021C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+021d uni021D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+021e uni021E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+021f uni021F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0220 uni0220              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.18 (Sans Mono, Sans Mono Bold) 2.23 (Serif Italic Condensed)
-U+0221 uni0221              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+0222 uni0222              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0223 uni0223              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0224 uni0224              2.3
-U+0225 uni0225              2.3
-U+0226 uni0226              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0227 uni0227              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0228 uni0228              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0229 uni0229              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+022a uni022A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+022b uni022B              1.13
-U+022c uni022C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+022d uni022D              1.13
-U+022e uni022E              1.10
-U+022f uni022F              1.10
-U+0230 uni0230              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0231 uni0231              1.13
-U+0232 uni0232              1.5
-U+0233 uni0233              1.5
-U+0234 uni0234              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+0235 uni0235              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+0236 uni0236              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+0237 dotlessj             1.5
-U+0238 uni0238              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0239 uni0239              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+023a uni023A              2.3
-U+023b uni023B              2.3
-U+023c uni023C              2.3
-U+023d uni023D              2.3
-U+023e uni023E              2.3
-U+023f uni023F              2.3
-U+0240 uni0240              2.3
-U+0241 uni0241              2.3
-U+0242 uni0242              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+0243 uni0243              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0244 uni0244              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0245 uni0245              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0246 uni0246              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0247 uni0247              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0248 uni0248              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+0249 uni0249              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+024a uni024A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+024b uni024B              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans ExtraLight)
-U+024c uni024C              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+024d uni024D              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+024e uni024E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+024f uni024F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0250 uni0250              1.14
-U+0251 uni0251              1.14
-U+0252 uni0252              1.14
-U+0253 uni0253              1.14
-U+0254 uni0254              1.14
-U+0255 uni0255              1.14
-U+0256 uni0256              1.14
-U+0257 uni0257              1.14
-U+0258 uni0258              1.14
-U+0259 uni0259              1.14
-U+025a uni025A              1.14
-U+025b uni025B              1.14
-U+025c uni025C              1.14
-U+025d uni025D              1.14
-U+025e uni025E              1.14
-U+025f uni025F              1.14
-U+0260 uni0260              1.14
-U+0261 uni0261              1.14
-U+0262 uni0262              1.14
-U+0263 uni0263              1.14
-U+0264 uni0264              1.14
-U+0265 uni0265              1.14
-U+0266 uni0266              1.14
-U+0267 uni0267              1.14
-U+0268 uni0268              1.14
-U+0269 uni0269              1.14
-U+026a uni026A              1.14
-U+026b uni026B              1.14
-U+026c uni026C              1.14
-U+026d uni026D              1.14
-U+026e uni026E              1.14
-U+026f uni026F              1.14
-U+0270 uni0270              1.14
-U+0271 uni0271              1.14
-U+0272 uni0272              1.14
-U+0273 uni0273              1.14
-U+0274 uni0274              1.14
-U+0275 uni0275              1.14
-U+0276 uni0276              1.14
-U+0277 uni0277              1.14
-U+0278 uni0278              1.14
-U+0279 uni0279              1.14
-U+027a uni027A              1.14
-U+027b uni027B              1.14
-U+027c uni027C              1.14
-U+027d uni027D              1.14
-U+027e uni027E              1.14
-U+027f uni027F              1.14
-U+0280 uni0280              1.14
-U+0281 uni0281              1.14
-U+0282 uni0282              1.14
-U+0283 uni0283              1.14
-U+0284 uni0284              1.14
-U+0285 uni0285              1.14
-U+0286 uni0286              1.14
-U+0287 uni0287              1.14
-U+0288 uni0288              1.14
-U+0289 uni0289              1.14
-U+028a uni028A              1.14
-U+028b uni028B              1.14
-U+028c uni028C              1.14
-U+028d uni028D              1.14
-U+028e uni028E              1.14
-U+028f uni028F              1.14
-U+0290 uni0290              1.14
-U+0291 uni0291              1.14
-U+0292 uni0292              1.14
-U+0293 uni0293              1.14
-U+0294 uni0294              1.14
-U+0295 uni0295              1.14
-U+0296 uni0296              1.14
-U+0297 uni0297              1.14
-U+0298 uni0298              1.14
-U+0299 uni0299              1.14
-U+029a uni029A              1.14
-U+029b uni029B              1.14
-U+029c uni029C              1.14
-U+029d uni029D              1.14
-U+029e uni029E              1.14
-U+029f uni029F              1.14
-U+02a0 uni02A0              1.14
-U+02a1 uni02A1              1.14
-U+02a2 uni02A2              1.14
-U+02a3 uni02A3              1.14
-U+02a4 uni02A4              1.14
-U+02a5 uni02A5              1.14
-U+02a6 uni02A6              1.14
-U+02a7 uni02A7              1.14
-U+02a8 uni02A8              1.14
-U+02a9 uni02A9              1.14
-U+02aa uni02AA              1.14
-U+02ab uni02AB              1.14
-U+02ac uni02AC              1.14
-U+02ad uni02AD              1.14
-U+02ae uni02AE              1.14
-U+02af uni02AF              1.14
-U+02b0 uni02B0              1.14
-U+02b1 uni02B1              1.14
-U+02b2 uni02B2              1.14
-U+02b3 uni02B3              1.14
-U+02b4 uni02B4              1.14
-U+02b5 uni02B5              1.14
-U+02b6 uni02B6              1.14
-U+02b7 uni02B7              1.14
-U+02b8 uni02B8              1.14
-U+02b9 uni02B9              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+02ba uni02BA              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+02bb uni02BB              1.5
-U+02bc uni02BC              1.12
-U+02bd uni02BD              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+02be uni02BE              2.2
-U+02bf uni02BF              2.2
-U+02c0 uni02C0              1.14
-U+02c1 uni02C1              1.14
-U+02c2 uni02C2              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+02c3 uni02C3              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+02c4 uni02C4              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+02c5 uni02C5              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+02c6 circumflex           original
-U+02c7 caron                original
-U+02c8 uni02C8              2.0
-U+02c9 uni02C9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+02ca uni02CA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+02cb uni02CB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+02cc uni02CC              2.0
-U+02cd uni02CD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+02ce uni02CE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+02cf uni02CF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+02d0 uni02D0              1.14
-U+02d1 uni02D1              1.14
-U+02d2 uni02D2              2.0
-U+02d3 uni02D3              2.2
-U+02d4 uni02D4              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+02d5 uni02D5              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+02d6 uni02D6              2.0
-U+02d7 uni02D7              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+02d8 breve                original
-U+02d9 dotaccent            original
-U+02da ring                 original
-U+02db ogonek               original
-U+02dc tilde                original
-U+02dd hungarumlaut         original
-U+02de uni02DE              2.0
-U+02df uni02DF              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+02e0 uni02E0              1.14
-U+02e1 uni02E1              1.14
-U+02e2 uni02E2              1.14
-U+02e3 uni02E3              1.14
-U+02e4 uni02E4              1.14
-U+02e5 uni02E5              2.0
-U+02e6 uni02E6              2.0
-U+02e7 uni02E7              2.0
-U+02e8 uni02E8              2.0
-U+02e9 uni02E9              2.0
-U+02ec uni02EC              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+02ed uni02ED              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+02ee uni02EE              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+02f3 uni02F3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+02f7 uni02F7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+0300 gravecomb            1.15
-U+0301 acutecomb            1.15
-U+0302 uni0302              1.15
-U+0303 tildecomb            1.15
-U+0304 uni0304              1.15
-U+0305 uni0305              2.0
-U+0306 uni0306              1.15
-U+0307 uni0307              1.15
-U+0308 uni0308              1.15
-U+0309 hookabovecomb        2.1
-U+030a uni030A              1.15
-U+030b uni030B              1.15
-U+030c uni030C              1.15
-U+030d uni030D              2.0
-U+030e uni030E              2.0
-U+030f uni030F              2.0
-U+0310 uni0310              2.0
-U+0311 uni0311              2.0
-U+0312 uni0312              1.11
-U+0313 uni0313              2.1
-U+0314 uni0314              2.1
-U+0315 uni0315              2.0
-U+0316 uni0316              2.0
-U+0317 uni0317              2.0
-U+0318 uni0318              2.0
-U+0319 uni0319              2.0
-U+031a uni031A              2.1
-U+031b uni031B              2.1
-U+031c uni031C              2.0
-U+031d uni031D              2.0
-U+031e uni031E              2.0
-U+031f uni031F              2.0
-U+0320 uni0320              2.0
-U+0321 uni0321              1.15
-U+0322 uni0322              1.15
-U+0323 dotbelowcomb         2.1
-U+0324 uni0324              2.0
-U+0325 uni0325              2.0
-U+0326 uni0326              1.5
-U+0327 uni0327              2.1
-U+0328 uni0328              2.1
-U+0329 uni0329              2.0
-U+032a uni032A              2.0
-U+032b uni032B              2.1
-U+032c uni032C              2.0
-U+032d uni032D              2.0
-U+032e uni032E              2.0
-U+032f uni032F              2.0
-U+0330 uni0330              2.0
-U+0331 uni0331              2.0
-U+0332 uni0332              2.0
-U+0333 uni0333              2.1
-U+0334 uni0334              2.3
-U+0335 uni0335              2.3
-U+0336 uni0336              2.3
-U+0337 uni0337              2.3
-U+0338 uni0338              2.3
-U+0339 uni0339              2.0
-U+033a uni033A              2.0
-U+033b uni033B              2.0
-U+033c uni033C              2.1
-U+033d uni033D              2.0
-U+033e uni033E              2.1
-U+033f uni033F              2.1
-U+0340 uni0340              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0341 uni0341              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0342 uni0342              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0343 uni0343              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+0344 uni0344              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0345 uni0345              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0346 uni0346              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0347 uni0347              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0348 uni0348              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0349 uni0349              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+034a uni034A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+034b uni034B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+034c uni034C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+034d uni034D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+034e uni034E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+034f uni034F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+0351 uni0351              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0352 uni0352              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) 2.28 (Sans Condensed Oblique, Sans Oblique)
-U+0353 uni0353              2.5 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0357 uni0357              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0358 uni0358              2.3
-U+035a uni035A              2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+035c uni035C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+035d uni035D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+035e uni035E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+035f uni035F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0360 uni0360              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0361 uni0361              2.0
-U+0362 uni0362              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0370 uni0370              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+0371 uni0371              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+0372 uni0372              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+0373 uni0373              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+0374 uni0374              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0375 uni0375              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0376 uni0376              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+0377 uni0377              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+037a uni037A              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+037b uni037B              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+037c uni037C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+037d uni037D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+037e uni037E              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0384 tonos                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0385 dieresistonos        1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0386 Alphatonos           1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0387 anoteleia            1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0388 Epsilontonos         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0389 Etatonos             1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+038a Iotatonos            1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+038c Omicrontonos         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+038e Upsilontonos         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+038f Omegatonos           1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0390 iotadieresistonos    1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0391 Alpha                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0392 Beta                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0393 Gamma                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0394 uni0394              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0395 Epsilon              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0396 Zeta                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0397 Eta                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0398 Theta                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0399 Iota                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+039a Kappa                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+039b Lambda               1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+039c Mu                   1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+039d Nu                   1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+039e Xi                   1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+039f Omicron              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03a0 Pi                   1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03a1 Rho                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03a3 Sigma                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03a4 Tau                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03a5 Upsilon              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03a6 Phi                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03a7 Chi                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03a8 Psi                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03a9 Omega                original
-U+03aa Iotadieresis         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03ab Upsilondieresis      1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03ac alphatonos           1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03ad epsilontonos         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03ae etatonos             1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03af iotatonos            1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03b0 upsilondieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03b1 alpha                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03b2 beta                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03b3 gamma                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03b4 delta                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03b5 epsilon              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03b6 zeta                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03b7 eta                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03b8 theta                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03b9 iota                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03ba kappa                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03bb lambda               1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03bc uni03BC              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03bd nu                   1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03be xi                   1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03bf omicron              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03c0 pi                   original
-U+03c1 rho                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03c2 sigma1               1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03c3 sigma                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03c4 tau                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03c5 upsilon              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03c6 phi                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03c7 chi                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03c8 psi                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03c9 omega                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03ca iotadieresis         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03cb upsilondieresis      1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03cc omicrontonos         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03cd upsilontonos         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03ce omegatonos           1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03cf uni03CF              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+03d0 uni03D0              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+03d1 theta1               1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+03d2 Upsilon1             1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+03d3 uni03D3              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+03d4 uni03D4              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+03d5 phi1                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.18 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03d6 omega1               1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
-U+03d7 uni03D7              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+03d8 uni03D8              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
-U+03d9 uni03D9              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
-U+03da uni03DA              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+03db uni03DB              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+03dc uni03DC              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03dd uni03DD              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+03de uni03DE              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+03df uni03DF              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+03e0 uni03E0              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+03e1 uni03E1              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+03e2 uni03E2              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+03e3 uni03E3              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+03e4 uni03E4              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+03e5 uni03E5              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+03e6 uni03E6              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+03e7 uni03E7              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+03e8 uni03E8              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+03e9 uni03E9              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+03ea uni03EA              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+03eb uni03EB              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+03ec uni03EC              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+03ed uni03ED              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+03ee uni03EE              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+03ef uni03EF              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+03f0 uni03F0              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+03f1 uni03F1              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
-U+03f2 uni03F2              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03f3 uni03F3              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03f4 uni03F4              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03f5 uni03F5              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03f6 uni03F6              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03f7 uni03F7              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03f8 uni03F8              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03f9 uni03F9              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03fa uni03FA              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+03fb uni03FB              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+03fc uni03FC              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
-U+03fd uni03FD              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03fe uni03FE              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+03ff uni03FF              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0400 uni0400              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0401 uni0401              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0402 uni0402              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0403 uni0403              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0404 uni0404              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0405 uni0405              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0406 uni0406              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0407 uni0407              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0408 uni0408              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0409 uni0409              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+040a uni040A              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+040b uni040B              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+040c uni040C              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+040d uni040D              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+040e uni040E              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+040f uni040F              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0410 uni0410              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0411 uni0411              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0412 uni0412              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0413 uni0413              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0414 uni0414              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0415 uni0415              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0416 uni0416              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0417 uni0417              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0418 uni0418              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0419 uni0419              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+041a uni041A              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+041b uni041B              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+041c uni041C              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+041d uni041D              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+041e uni041E              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+041f uni041F              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0420 uni0420              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0421 uni0421              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0422 uni0422              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0423 uni0423              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0424 uni0424              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0425 uni0425              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0426 uni0426              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0427 uni0427              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0428 uni0428              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0429 uni0429              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+042a uni042A              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+042b uni042B              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+042c uni042C              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+042d uni042D              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+042e uni042E              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+042f uni042F              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0430 uni0430              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0431 uni0431              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0432 uni0432              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0433 uni0433              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0434 uni0434              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0435 uni0435              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0436 uni0436              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0437 uni0437              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0438 uni0438              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0439 uni0439              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+043a uni043A              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+043b uni043B              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+043c uni043C              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+043d uni043D              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+043e uni043E              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+043f uni043F              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0440 uni0440              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0441 uni0441              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0442 uni0442              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0443 uni0443              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0444 uni0444              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0445 uni0445              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0446 uni0446              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0447 uni0447              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0448 uni0448              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0449 uni0449              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+044a uni044A              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+044b uni044B              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+044c uni044C              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+044d uni044D              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+044e uni044E              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+044f uni044F              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0450 uni0450              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0451 uni0451              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0452 uni0452              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0453 uni0453              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0454 uni0454              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0455 uni0455              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0456 uni0456              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0457 uni0457              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0458 uni0458              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0459 uni0459              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+045a uni045A              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+045b uni045B              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+045c uni045C              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+045d uni045D              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+045e uni045E              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+045f uni045F              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+0460 uni0460              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0461 uni0461              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+0462 uni0462              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0463 uni0463              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0464 uni0464              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+0465 uni0465              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+0466 uni0466              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0467 uni0467              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0468 uni0468              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0469 uni0469              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+046a uni046A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.21 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+046b uni046B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.21 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+046c uni046C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+046d uni046D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+046e uni046E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+046f uni046F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0470 uni0470              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+0471 uni0471              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+0472 uni0472              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0473 uni0473              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0474 uni0474              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+0475 uni0475              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+0476 uni0476              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0477 uni0477              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0478 uni0478              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0479 uni0479              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+047a uni047A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+047b uni047B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+047c uni047C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+047d uni047D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+047e uni047E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+047f uni047F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0480 uni0480              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0481 uni0481              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0482 uni0482              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0483 uni0483              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0484 uni0484              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0485 uni0485              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0486 uni0486              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0487 uni0487              2.9 (Sans, Sans Condensed) 2.27 (Sans Bold, Sans Bold Oblique, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0488 uni0488              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0489 uni0489              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+048a uni048A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+048b uni048B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+048c uni048C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+048d uni048D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+048e uni048E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+048f uni048F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0490 uni0490              1.15
-U+0491 uni0491              1.15
-U+0492 uni0492              1.14
-U+0493 uni0493              1.14
-U+0494 uni0494              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0495 uni0495              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+0496 uni0496              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0497 uni0497              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0498 uni0498              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+0499 uni0499              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+049a uni049A              1.14
-U+049b uni049B              1.14
-U+049c uni049C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+049d uni049D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+049e uni049E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+049f uni049F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04a0 uni04A0              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
-U+04a1 uni04A1              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
-U+04a2 uni04A2              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04a3 uni04A3              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04a4 uni04A4              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04a5 uni04A5              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04a6 uni04A6              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04a7 uni04A7              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04a8 uni04A8              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+04a9 uni04A9              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+04aa uni04AA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04ab uni04AB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04ac uni04AC              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04ad uni04AD              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04ae uni04AE              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04af uni04AF              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04b0 uni04B0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+04b1 uni04B1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+04b2 uni04B2              1.14
-U+04b3 uni04B3              1.14
-U+04b4 uni04B4              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04b5 uni04B5              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04b6 uni04B6              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04b7 uni04B7              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04b8 uni04B8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+04b9 uni04B9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+04ba uni04BA              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04bb uni04BB              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04bc uni04BC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+04bd uni04BD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+04be uni04BE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+04bf uni04BF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+04c0 uni04C0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04c1 uni04C1              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04c2 uni04C2              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04c3 uni04C3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+04c4 uni04C4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+04c5 uni04C5              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+04c6 uni04C6              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+04c7 uni04C7              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
-U+04c8 uni04C8              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
-U+04c9 uni04C9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+04ca uni04CA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+04cb uni04CB              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04cc uni04CC              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04cd uni04CD              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+04ce uni04CE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+04cf uni04CF              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04d0 uni04D0              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04d1 uni04D1              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04d2 uni04D2              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04d3 uni04D3              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04d4 uni04D4              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04d5 uni04D5              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04d6 uni04D6              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04d7 uni04D7              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04d8 uni04D8              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04d9 uni04D9              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04da uni04DA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04db uni04DB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04dc uni04DC              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04dd uni04DD              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04de uni04DE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04df uni04DF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04e0 uni04E0              2.3
-U+04e1 uni04E1              2.3
-U+04e2 uni04E2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04e3 uni04E3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04e4 uni04E4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04e5 uni04E5              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04e6 uni04E6              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04e7 uni04E7              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04e8 uni04E8              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+04e9 uni04E9              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+04ea uni04EA              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+04eb uni04EB              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+04ec uni04EC              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04ed uni04ED              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04ee uni04EE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04ef uni04EF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04f0 uni04F0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04f1 uni04F1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04f2 uni04F2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04f3 uni04F3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04f4 uni04F4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04f5 uni04F5              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04f6 uni04F6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04f7 uni04F7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04f8 uni04F8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+04f9 uni04F9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+04fa uni04FA              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+04fb uni04FB              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+04fc uni04FC              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+04fd uni04FD              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+04fe uni04FE              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+04ff uni04FF              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+0500 uni0500              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+0501 uni0501              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+0502 uni0502              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0503 uni0503              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0504 uni0504              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0505 uni0505              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0506 uni0506              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0507 uni0507              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0508 uni0508              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0509 uni0509              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+050a uni050A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+050b uni050B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+050c uni050C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+050d uni050D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+050e uni050E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+050f uni050F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0510 uni0510              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+0511 uni0511              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+0512 uni0512              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+0513 uni0513              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+0514 uni0514              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+0515 uni0515              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+0516 uni0516              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0517 uni0517              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0518 uni0518              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0519 uni0519              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+051a uni051A              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+051b uni051B              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+051c uni051C              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+051d uni051D              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+0520 uni0520              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0521 uni0521              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0522 uni0522              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0523 uni0523              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0524 uni0524              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0525 uni0525              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0531 uni0531              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0532 uni0532              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0533 uni0533              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0534 uni0534              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0535 uni0535              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0536 uni0536              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0537 uni0537              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0538 uni0538              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0539 uni0539              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+053a uni053A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+053b uni053B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+053c uni053C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+053d uni053D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+053e uni053E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+053f uni053F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0540 uni0540              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0541 uni0541              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0542 uni0542              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0543 uni0543              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0544 uni0544              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0545 uni0545              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0546 uni0546              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0547 uni0547              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0548 uni0548              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+0549 uni0549              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+054a uni054A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+054b uni054B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+054c uni054C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+054d uni054D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight)
-U+054e uni054E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+054f uni054F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight)
-U+0550 uni0550              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+0551 uni0551              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0552 uni0552              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0553 uni0553              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+0554 uni0554              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0555 uni0555              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight)
-U+0556 uni0556              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0559 uni0559              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+055a uni055A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight)
-U+055b uni055B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+055c uni055C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+055d uni055D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight)
-U+055e uni055E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+055f uni055F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0561 uni0561              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+0562 uni0562              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+0563 uni0563              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+0564 uni0564              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+0565 uni0565              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+0566 uni0566              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+0567 uni0567              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0568 uni0568              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+0569 uni0569              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+056a uni056A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+056b uni056B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+056c uni056C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+056d uni056D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+056e uni056E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+056f uni056F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+0570 uni0570              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight)
-U+0571 uni0571              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0572 uni0572              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+0573 uni0573              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0574 uni0574              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0575 uni0575              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight)
-U+0576 uni0576              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0577 uni0577              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0578 uni0578              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight)
-U+0579 uni0579              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+057a uni057A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+057b uni057B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+057c uni057C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+057d uni057D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight)
-U+057e uni057E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+057f uni057F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+0580 uni0580              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight)
-U+0581 uni0581              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight)
-U+0582 uni0582              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+0583 uni0583              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+0584 uni0584              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0585 uni0585              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight)
-U+0586 uni0586              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0587 uni0587              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+0589 uni0589              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight)
-U+058a uni058A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05b0 uni05B0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05b1 uni05B1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05b2 uni05B2              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05b3 uni05B3              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05b4 uni05B4              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05b5 uni05B5              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05b6 uni05B6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05b7 uni05B7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05b8 uni05B8              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05b9 uni05B9              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05ba uni05BA              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+05bb uni05BB              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05bc uni05BC              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05bd uni05BD              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05be uni05BE              2.9 (Sans Condensed Oblique, Sans Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique)
-U+05bf uni05BF              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05c0 uni05C0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05c1 uni05C1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05c2 uni05C2              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05c3 uni05C3              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05c6 uni05C6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05c7 uni05C7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05d0 uni05D0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05d1 uni05D1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05d2 uni05D2              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05d3 uni05D3              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05d4 uni05D4              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05d5 uni05D5              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05d6 uni05D6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05d7 uni05D7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05d8 uni05D8              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05d9 uni05D9              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05da uni05DA              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05db uni05DB              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05dc uni05DC              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05dd uni05DD              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05de uni05DE              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05df uni05DF              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05e0 uni05E0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05e1 uni05E1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05e2 uni05E2              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05e3 uni05E3              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05e4 uni05E4              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05e5 uni05E5              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05e6 uni05E6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05e7 uni05E7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05e8 uni05E8              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05e9 uni05E9              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05ea uni05EA              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05f0 uni05F0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05f1 uni05F1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05f2 uni05F2              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+05f3 uni05F3              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+05f4 uni05F4              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0606 uni0606              2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold)
-U+0607 uni0607              2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold)
-U+0609 uni0609              2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold)
-U+060a uni060A              2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold)
-U+060c uni060C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0615 uni0615              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+061b uni061B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+061f uni061F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0621 uni0621              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0622 uni0622              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0623 uni0623              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0624 uni0624              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0625 uni0625              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0626 uni0626              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0627 uni0627              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0628 uni0628              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0629 uni0629              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+062a uni062A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+062b uni062B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+062c uni062C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+062d uni062D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+062e uni062E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+062f uni062F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0630 uni0630              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0631 uni0631              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0632 uni0632              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0633 uni0633              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0634 uni0634              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0635 uni0635              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0636 uni0636              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0637 uni0637              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0638 uni0638              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0639 uni0639              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+063a uni063A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0640 uni0640              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0641 uni0641              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0642 uni0642              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0643 uni0643              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0644 uni0644              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0645 uni0645              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0646 uni0646              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0647 uni0647              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0648 uni0648              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0649 uni0649              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+064a uni064A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+064b uni064B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+064c uni064C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+064d uni064D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+064e uni064E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+064f uni064F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0650 uni0650              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0651 uni0651              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0652 uni0652              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0653 uni0653              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0654 uni0654              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0655 uni0655              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+065a uni065A              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0660 uni0660              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0661 uni0661              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0662 uni0662              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0663 uni0663              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0664 uni0664              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0665 uni0665              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0666 uni0666              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0667 uni0667              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0668 uni0668              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0669 uni0669              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+066a uni066A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+066b uni066B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+066c uni066C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+066d uni066D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+066e uni066E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+066f uni066F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0674 uni0674              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans ExtraLight) 2.16 (Sans Mono, Sans Mono Bold)
-U+0679 uni0679              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+067a uni067A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+067b uni067B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+067c uni067C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+067d uni067D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+067e uni067E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+067f uni067F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0680 uni0680              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0681 uni0681              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0682 uni0682              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0683 uni0683              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0684 uni0684              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0685 uni0685              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0686 uni0686              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0687 uni0687              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0691 uni0691              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0692 uni0692              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+0695 uni0695              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+0698 uni0698              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+06a1 uni06A1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+06a4 uni06A4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+06a6 uni06A6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+06a9 uni06A9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+06af uni06AF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+06b5 uni06B5              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+06ba uni06BA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+06be uni06BE              2.16 (Sans Mono, Sans Mono Bold)
-U+06bf uni06BF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+06c6 uni06C6              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+06cc uni06CC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+06ce uni06CE              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+06d5 uni06D5              2.10 (Sans, Sans Bold) 2.11 (Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+06f0 uni06F0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+06f1 uni06F1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+06f2 uni06F2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+06f3 uni06F3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+06f4 uni06F4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+06f5 uni06F5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+06f6 uni06F6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+06f7 uni06F7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+06f8 uni06F8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+06f9 uni06F9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+07c0 uni07C0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07c1 uni07C1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07c2 uni07C2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07c3 uni07C3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07c4 uni07C4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07c5 uni07C5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07c6 uni07C6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07c7 uni07C7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07c8 uni07C8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07c9 uni07C9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07ca uni07CA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07cb uni07CB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07cc uni07CC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07cd uni07CD              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07ce uni07CE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07cf uni07CF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07d0 uni07D0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07d1 uni07D1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07d2 uni07D2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07d3 uni07D3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07d4 uni07D4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07d5 uni07D5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07d6 uni07D6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07d7 uni07D7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07d8 uni07D8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07d9 uni07D9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07da uni07DA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07db uni07DB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07dc uni07DC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07dd uni07DD              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07de uni07DE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07df uni07DF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07e0 uni07E0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07e1 uni07E1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07e2 uni07E2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07e3 uni07E3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07e4 uni07E4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07e5 uni07E5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07e6 uni07E6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07e7 uni07E7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07eb uni07EB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07ec uni07EC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07ed uni07ED              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07ee uni07EE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07ef uni07EF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07f0 uni07F0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07f1 uni07F1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07f2 uni07F2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07f3 uni07F3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07f4 uni07F4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07f5 uni07F5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07f8 uni07F8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07f9 uni07F9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+07fa uni07FA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+0e3f uni0E3F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0e81 uni0E81              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e82 uni0E82              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e84 uni0E84              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e87 uni0E87              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e88 uni0E88              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e8a uni0E8A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e8d uni0E8D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e94 uni0E94              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e95 uni0E95              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e96 uni0E96              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e97 uni0E97              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e99 uni0E99              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e9a uni0E9A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e9b uni0E9B              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e9c uni0E9C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e9d uni0E9D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e9e uni0E9E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0e9f uni0E9F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0ea1 uni0EA1              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0ea2 uni0EA2              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0ea3 uni0EA3              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0ea5 uni0EA5              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0ea7 uni0EA7              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0eaa uni0EAA              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0eab uni0EAB              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0ead uni0EAD              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0eae uni0EAE              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0eaf uni0EAF              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0eb0 uni0EB0              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0eb1 uni0EB1              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0eb2 uni0EB2              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0eb3 uni0EB3              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0eb4 uni0EB4              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0eb5 uni0EB5              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0eb6 uni0EB6              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0eb7 uni0EB7              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0eb8 uni0EB8              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0eb9 uni0EB9              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0ebb uni0EBB              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0ebc uni0EBC              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0ebd uni0EBD              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0ec0 uni0EC0              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0ec1 uni0EC1              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0ec2 uni0EC2              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0ec3 uni0EC3              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0ec4 uni0EC4              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0ec6 uni0EC6              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0ec8 uni0EC8              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0ec9 uni0EC9              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0eca uni0ECA              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0ecb uni0ECB              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0ecc uni0ECC              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0ecd uni0ECD              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+0ed0 uni0ED0              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0ed1 uni0ED1              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0ed2 uni0ED2              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0ed3 uni0ED3              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0ed4 uni0ED4              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0ed5 uni0ED5              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0ed6 uni0ED6              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0ed7 uni0ED7              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0ed8 uni0ED8              2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+0ed9 uni0ED9              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0edc uni0EDC              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+0edd uni0EDD              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+10a0 uni10A0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10a1 uni10A1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10a2 uni10A2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10a3 uni10A3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10a4 uni10A4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10a5 uni10A5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10a6 uni10A6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10a7 uni10A7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10a8 uni10A8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10a9 uni10A9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10aa uni10AA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10ab uni10AB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10ac uni10AC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10ad uni10AD              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10ae uni10AE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10af uni10AF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10b0 uni10B0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10b1 uni10B1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10b2 uni10B2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10b3 uni10B3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10b4 uni10B4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10b5 uni10B5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10b6 uni10B6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10b7 uni10B7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10b8 uni10B8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10b9 uni10B9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10ba uni10BA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10bb uni10BB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10bc uni10BC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10bd uni10BD              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10be uni10BE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10bf uni10BF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10c0 uni10C0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10c1 uni10C1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10c2 uni10C2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10c3 uni10C3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10c4 uni10C4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10c5 uni10C5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10d0 uni10D0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10d1 uni10D1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10d2 uni10D2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10d3 uni10D3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10d4 uni10D4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10d5 uni10D5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10d6 uni10D6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10d7 uni10D7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10d8 uni10D8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10d9 uni10D9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10da uni10DA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10db uni10DB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10dc uni10DC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10dd uni10DD              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10de uni10DE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10df uni10DF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10e0 uni10E0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10e1 uni10E1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10e2 uni10E2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10e3 uni10E3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10e4 uni10E4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10e5 uni10E5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10e6 uni10E6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10e7 uni10E7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10e8 uni10E8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10e9 uni10E9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10ea uni10EA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10eb uni10EB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10ec uni10EC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10ed uni10ED              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10ee uni10EE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10ef uni10EF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10f0 uni10F0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10f1 uni10F1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10f2 uni10F2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10f3 uni10F3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10f4 uni10F4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10f5 uni10F5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10f6 uni10F6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10f7 uni10F7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10f8 uni10F8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10f9 uni10F9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10fa uni10FA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10fb uni10FB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+10fc uni10FC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+1401 uni1401              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1402 uni1402              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1403 uni1403              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1404 uni1404              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1405 uni1405              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1406 uni1406              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1407 uni1407              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1409 uni1409              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+140a uni140A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+140b uni140B              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+140c uni140C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+140d uni140D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+140e uni140E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+140f uni140F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1410 uni1410              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1411 uni1411              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1412 uni1412              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1413 uni1413              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1414 uni1414              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1415 uni1415              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1416 uni1416              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1417 uni1417              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1418 uni1418              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1419 uni1419              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+141a uni141A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+141b uni141B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+141d uni141D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+141e uni141E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+141f uni141F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1420 uni1420              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1421 uni1421              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1422 uni1422              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1423 uni1423              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1424 uni1424              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1425 uni1425              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1426 uni1426              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1427 uni1427              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1428 uni1428              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1429 uni1429              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+142a uni142A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+142b uni142B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+142c uni142C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+142d uni142D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+142e uni142E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+142f uni142F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1430 uni1430              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1431 uni1431              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1432 uni1432              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1433 uni1433              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1434 uni1434              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1435 uni1435              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1437 uni1437              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1438 uni1438              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1439 uni1439              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+143a uni143A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+143b uni143B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+143c uni143C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+143d uni143D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+143e uni143E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+143f uni143F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1440 uni1440              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1441 uni1441              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1442 uni1442              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1443 uni1443              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1444 uni1444              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1445 uni1445              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1446 uni1446              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1447 uni1447              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1448 uni1448              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1449 uni1449              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+144a uni144A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+144c uni144C              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+144d uni144D              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+144e uni144E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+144f uni144F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1450 uni1450              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1451 uni1451              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1452 uni1452              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1454 uni1454              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1455 uni1455              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1456 uni1456              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1457 uni1457              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1458 uni1458              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1459 uni1459              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+145a uni145A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+145b uni145B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+145c uni145C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+145d uni145D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+145e uni145E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+145f uni145F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1460 uni1460              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1461 uni1461              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1462 uni1462              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1463 uni1463              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1464 uni1464              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1465 uni1465              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1466 uni1466              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1467 uni1467              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1468 uni1468              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1469 uni1469              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+146a uni146A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+146b uni146B              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+146c uni146C              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+146d uni146D              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+146e uni146E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+146f uni146F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1470 uni1470              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1471 uni1471              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1472 uni1472              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1473 uni1473              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1474 uni1474              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1475 uni1475              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1476 uni1476              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1477 uni1477              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1478 uni1478              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1479 uni1479              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+147a uni147A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+147b uni147B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+147c uni147C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+147d uni147D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+147e uni147E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+147f uni147F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1480 uni1480              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1481 uni1481              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1482 uni1482              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1483 uni1483              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1484 uni1484              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1485 uni1485              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1486 uni1486              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1487 uni1487              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1488 uni1488              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1489 uni1489              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+148a uni148A              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+148b uni148B              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+148c uni148C              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+148d uni148D              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+148e uni148E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+148f uni148F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1490 uni1490              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1491 uni1491              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1492 uni1492              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1493 uni1493              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1494 uni1494              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1495 uni1495              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1496 uni1496              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1497 uni1497              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1498 uni1498              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1499 uni1499              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+149a uni149A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+149b uni149B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+149c uni149C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+149d uni149D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+149e uni149E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+149f uni149F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14a0 uni14A0              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14a1 uni14A1              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14a2 uni14A2              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14a3 uni14A3              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14a4 uni14A4              2.13 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.15 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+14a5 uni14A5              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14a6 uni14A6              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14a7 uni14A7              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14a8 uni14A8              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14a9 uni14A9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14aa uni14AA              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14ab uni14AB              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14ac uni14AC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14ad uni14AD              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14ae uni14AE              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14af uni14AF              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14b0 uni14B0              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14b1 uni14B1              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14b2 uni14B2              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14b3 uni14B3              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14b4 uni14B4              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14b5 uni14B5              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14b6 uni14B6              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14b7 uni14B7              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14b8 uni14B8              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14b9 uni14B9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14ba uni14BA              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14bb uni14BB              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14bc uni14BC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14bd uni14BD              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14c0 uni14C0              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14c1 uni14C1              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14c2 uni14C2              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14c3 uni14C3              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14c4 uni14C4              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14c5 uni14C5              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14c6 uni14C6              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14c7 uni14C7              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14c8 uni14C8              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14c9 uni14C9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14ca uni14CA              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14cb uni14CB              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14cc uni14CC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14cd uni14CD              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14ce uni14CE              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14cf uni14CF              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14d0 uni14D0              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14d1 uni14D1              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14d2 uni14D2              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14d3 uni14D3              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14d4 uni14D4              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14d5 uni14D5              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14d6 uni14D6              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14d7 uni14D7              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14d8 uni14D8              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14d9 uni14D9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14da uni14DA              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14db uni14DB              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14dc uni14DC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14dd uni14DD              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14de uni14DE              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14df uni14DF              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14e0 uni14E0              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14e1 uni14E1              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14e2 uni14E2              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14e3 uni14E3              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14e4 uni14E4              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14e5 uni14E5              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14e6 uni14E6              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14e7 uni14E7              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14e8 uni14E8              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14e9 uni14E9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14ea uni14EA              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14ec uni14EC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14ed uni14ED              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14ee uni14EE              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14ef uni14EF              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14f0 uni14F0              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14f1 uni14F1              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14f2 uni14F2              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14f3 uni14F3              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14f4 uni14F4              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14f5 uni14F5              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14f6 uni14F6              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14f7 uni14F7              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14f8 uni14F8              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14f9 uni14F9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14fa uni14FA              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14fb uni14FB              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14fc uni14FC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14fd uni14FD              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14fe uni14FE              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+14ff uni14FF              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1500 uni1500              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1501 uni1501              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1502 uni1502              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1503 uni1503              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1504 uni1504              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1505 uni1505              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1506 uni1506              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1507 uni1507              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1510 uni1510              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1511 uni1511              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1512 uni1512              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1513 uni1513              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1514 uni1514              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1515 uni1515              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1516 uni1516              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1517 uni1517              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1518 uni1518              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1519 uni1519              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+151a uni151A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+151b uni151B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+151c uni151C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+151d uni151D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+151e uni151E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+151f uni151F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1520 uni1520              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1521 uni1521              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1522 uni1522              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1523 uni1523              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1524 uni1524              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1525 uni1525              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1526 uni1526              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1527 uni1527              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1528 uni1528              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1529 uni1529              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+152a uni152A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+152b uni152B              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+152c uni152C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+152d uni152D              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+152e uni152E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+152f uni152F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1530 uni1530              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1531 uni1531              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1532 uni1532              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1533 uni1533              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1534 uni1534              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1535 uni1535              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1536 uni1536              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1537 uni1537              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1538 uni1538              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1539 uni1539              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+153a uni153A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+153b uni153B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+153c uni153C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+153d uni153D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+153e uni153E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1540 uni1540              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1541 uni1541              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1542 uni1542              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1543 uni1543              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1544 uni1544              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1545 uni1545              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1546 uni1546              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1547 uni1547              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1548 uni1548              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1549 uni1549              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+154a uni154A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+154b uni154B              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+154c uni154C              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+154d uni154D              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+154e uni154E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+154f uni154F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1550 uni1550              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1552 uni1552              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1553 uni1553              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1554 uni1554              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1555 uni1555              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1556 uni1556              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1557 uni1557              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1558 uni1558              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1559 uni1559              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+155a uni155A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+155b uni155B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+155c uni155C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+155d uni155D              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+155e uni155E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+155f uni155F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1560 uni1560              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1561 uni1561              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1562 uni1562              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1563 uni1563              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1564 uni1564              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1565 uni1565              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1566 uni1566              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1567 uni1567              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1568 uni1568              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1569 uni1569              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+156a uni156A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1574 uni1574              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1575 uni1575              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1576 uni1576              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1577 uni1577              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1578 uni1578              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1579 uni1579              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+157a uni157A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+157b uni157B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+157c uni157C              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+157d uni157D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+157e uni157E              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+157f uni157F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1580 uni1580              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1581 uni1581              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1582 uni1582              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1583 uni1583              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1584 uni1584              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1585 uni1585              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+158a uni158A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+158b uni158B              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+158c uni158C              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+158d uni158D              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+158e uni158E              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+158f uni158F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1590 uni1590              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1591 uni1591              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1592 uni1592              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1593 uni1593              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1594 uni1594              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1595 uni1595              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1596 uni1596              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+15a0 uni15A0              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+15a1 uni15A1              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+15a2 uni15A2              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+15a3 uni15A3              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+15a4 uni15A4              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+15a5 uni15A5              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+15a6 uni15A6              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+15a7 uni15A7              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+15a8 uni15A8              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+15a9 uni15A9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+15aa uni15AA              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+15ab uni15AB              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+15ac uni15AC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+15ad uni15AD              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+15ae uni15AE              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+15af uni15AF              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+15de uni15DE              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+15e1 uni15E1              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1646 uni1646              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1647 uni1647              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+166e uni166E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+166f uni166F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1670 uni1670              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1671 uni1671              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1672 uni1672              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1673 uni1673              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1674 uni1674              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1675 uni1675              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1676 uni1676              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1680 uni1680              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+1681 uni1681              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+1682 uni1682              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+1683 uni1683              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+1684 uni1684              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+1685 uni1685              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+1686 uni1686              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+1687 uni1687              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+1688 uni1688              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+1689 uni1689              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+168a uni168A              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+168b uni168B              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+168c uni168C              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+168d uni168D              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+168e uni168E              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+168f uni168F              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+1690 uni1690              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+1691 uni1691              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+1692 uni1692              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+1693 uni1693              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+1694 uni1694              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+1695 uni1695              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+1696 uni1696              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+1697 uni1697              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+1698 uni1698              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+1699 uni1699              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+169a uni169A              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+169b uni169B              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+169c uni169C              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
-U+1d00 uni1D00              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d01 uni1D01              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d02 uni1D02              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1d03 uni1D03              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d04 uni1D04              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+1d05 uni1D05              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d06 uni1D06              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d07 uni1D07              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d08 uni1D08              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+1d09 uni1D09              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1d0a uni1D0A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d0b uni1D0B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+1d0c uni1D0C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d0d uni1D0D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+1d0e uni1D0E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+1d0f uni1D0F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+1d10 uni1D10              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+1d11 uni1D11              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+1d12 uni1D12              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+1d13 uni1D13              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+1d14 uni1D14              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1d16 uni1D16              2.3
-U+1d17 uni1D17              2.3
-U+1d18 uni1D18              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d19 uni1D19              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+1d1a uni1D1A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+1d1b uni1D1B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d1c uni1D1C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d1d uni1D1D              2.3
-U+1d1e uni1D1E              2.3
-U+1d1f uni1D1F              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+1d20 uni1D20              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+1d21 uni1D21              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+1d22 uni1D22              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+1d23 uni1D23              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d26 uni1D26              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+1d27 uni1D27              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+1d28 uni1D28              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+1d29 uni1D29              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d2a uni1D2A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d2b uni1D2B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
-U+1d2c uni1D2C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d2d uni1D2D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d2e uni1D2E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d30 uni1D30              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d31 uni1D31              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d32 uni1D32              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d33 uni1D33              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d34 uni1D34              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d35 uni1D35              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d36 uni1D36              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d37 uni1D37              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d38 uni1D38              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d39 uni1D39              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d3a uni1D3A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d3b uni1D3B              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d3c uni1D3C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d3d uni1D3D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono Oblique)
-U+1d3e uni1D3E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d3f uni1D3F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d40 uni1D40              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d41 uni1D41              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d42 uni1D42              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d43 uni1D43              2.3
-U+1d44 uni1D44              2.3
-U+1d45 uni1D45              2.3
-U+1d46 uni1D46              2.3
-U+1d47 uni1D47              2.3
-U+1d48 uni1D48              2.3
-U+1d49 uni1D49              2.3
-U+1d4a uni1D4A              2.3
-U+1d4b uni1D4B              2.3
-U+1d4c uni1D4C              2.3
-U+1d4d uni1D4D              2.3
-U+1d4e uni1D4E              2.3
-U+1d4f uni1D4F              2.3
-U+1d50 uni1D50              2.3
-U+1d51 uni1D51              2.3
-U+1d52 uni1D52              2.3
-U+1d53 uni1D53              2.3
-U+1d54 uni1D54              2.3
-U+1d55 uni1D55              2.3
-U+1d56 uni1D56              2.3
-U+1d57 uni1D57              2.3
-U+1d58 uni1D58              2.3
-U+1d59 uni1D59              2.3
-U+1d5a uni1D5A              2.3
-U+1d5b uni1D5B              2.3
-U+1d5d uni1D5D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+1d5e uni1D5E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+1d5f uni1D5F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+1d60 uni1D60              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+1d61 uni1D61              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+1d62 uni1D62              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d63 uni1D63              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d64 uni1D64              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d65 uni1D65              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d66 uni1D66              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+1d67 uni1D67              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+1d68 uni1D68              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+1d69 uni1D69              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+1d6a uni1D6A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+1d77 uni1D77              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1d78 uni1D78              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1d7b uni1D7B              2.3
-U+1d85 uni1D85              2.3
-U+1d9b uni1D9B              2.3
-U+1d9c uni1D9C              2.3
-U+1d9d uni1D9D              2.3
-U+1d9e uni1D9E              2.3
-U+1d9f uni1D9F              2.3
-U+1da0 uni1DA0              2.3
-U+1da1 uni1DA1              2.3
-U+1da2 uni1DA2              2.3
-U+1da3 uni1DA3              2.3
-U+1da4 uni1DA4              2.3
-U+1da5 uni1DA5              2.3
-U+1da6 uni1DA6              2.3
-U+1da7 uni1DA7              2.3
-U+1da8 uni1DA8              2.3
-U+1da9 uni1DA9              2.3
-U+1daa uni1DAA              2.3
-U+1dab uni1DAB              2.3
-U+1dac uni1DAC              2.3
-U+1dad uni1DAD              2.3
-U+1dae uni1DAE              2.3
-U+1daf uni1DAF              2.3
-U+1db0 uni1DB0              2.3
-U+1db1 uni1DB1              2.3
-U+1db2 uni1DB2              2.3
-U+1db3 uni1DB3              2.3
-U+1db4 uni1DB4              2.3
-U+1db5 uni1DB5              2.3
-U+1db6 uni1DB6              2.3
-U+1db7 uni1DB7              2.3
-U+1db8 uni1DB8              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+1db9 uni1DB9              2.3
-U+1dba uni1DBA              2.3
-U+1dbb uni1DBB              2.3
-U+1dbc uni1DBC              2.3
-U+1dbd uni1DBD              2.3
-U+1dbe uni1DBE              2.3
-U+1dbf uni1DBF              2.3
-U+1dc4 uni1DC4              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+1dc5 uni1DC5              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+1dc6 uni1DC6              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+1dc7 uni1DC7              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+1dc8 uni1DC8              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+1dc9 uni1DC9              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+1e00 uni1E00              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e01 uni1E01              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e02 uni1E02              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e03 uni1E03              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e04 uni1E04              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e05 uni1E05              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e06 uni1E06              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e07 uni1E07              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e08 uni1E08              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e09 uni1E09              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e0a uni1E0A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e0b uni1E0B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e0c uni1E0C              2.1
-U+1e0d uni1E0D              2.1
-U+1e0e uni1E0E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e0f uni1E0F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e10 uni1E10              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e11 uni1E11              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e12 uni1E12              1.13
-U+1e13 uni1E13              1.13
-U+1e14 uni1E14              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1e15 uni1E15              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1e16 uni1E16              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1e17 uni1E17              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1e18 uni1E18              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e19 uni1E19              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e1a uni1E1A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e1b uni1E1B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e1c uni1E1C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1e1d uni1E1D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+1e1e uni1E1E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e1f uni1E1F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e20 uni1E20              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e21 uni1E21              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e22 uni1E22              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e23 uni1E23              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e24 uni1E24              2.1
-U+1e25 uni1E25              2.1
-U+1e26 uni1E26              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e27 uni1E27              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e28 uni1E28              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e29 uni1E29              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e2a uni1E2A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e2b uni1E2B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e2c uni1E2C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e2d uni1E2D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e2e uni1E2E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1e2f uni1E2F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1e30 uni1E30              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e31 uni1E31              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e32 uni1E32              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e33 uni1E33              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e34 uni1E34              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e35 uni1E35              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e36 uni1E36              2.1
-U+1e37 uni1E37              2.1
-U+1e38 uni1E38              2.1
-U+1e39 uni1E39              2.1
-U+1e3a uni1E3A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e3b uni1E3B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e3c uni1E3C              1.13
-U+1e3d uni1E3D              1.13
-U+1e3e uni1E3E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e3f uni1E3F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e40 uni1E40              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e41 uni1E41              2.1
-U+1e42 uni1E42              2.1
-U+1e43 uni1E43              2.1
-U+1e44 uni1E44              1.13
-U+1e45 uni1E45              1.13
-U+1e46 uni1E46              2.1
-U+1e47 uni1E47              2.1
-U+1e48 uni1E48              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e49 uni1E49              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e4a uni1E4A              1.13
-U+1e4b uni1E4B              1.13
-U+1e4c uni1E4C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+1e4d uni1E4D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+1e4e uni1E4E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1e4f uni1E4F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1e50 uni1E50              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1e51 uni1E51              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1e52 uni1E52              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1e53 uni1E53              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1e54 uni1E54              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e55 uni1E55              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e56 uni1E56              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e57 uni1E57              2.1
-U+1e58 uni1E58              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e59 uni1E59              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e5a uni1E5A              2.1
-U+1e5b uni1E5B              2.1
-U+1e5c uni1E5C              2.1
-U+1e5d uni1E5D              2.1
-U+1e5e uni1E5E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e5f uni1E5F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e60 uni1E60              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e61 uni1E61              2.1
-U+1e62 uni1E62              2.1
-U+1e63 uni1E63              2.1
-U+1e64 uni1E64              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+1e65 uni1E65              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+1e66 uni1E66              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1e67 uni1E67              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1e68 uni1E68              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e69 uni1E69              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e6a uni1E6A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e6b uni1E6B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e6c uni1E6C              2.1
-U+1e6d uni1E6D              2.1
-U+1e6e uni1E6E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e6f uni1E6F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e70 uni1E70              1.13
-U+1e71 uni1E71              1.13
-U+1e72 uni1E72              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e73 uni1E73              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e74 uni1E74              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e75 uni1E75              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e76 uni1E76              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e77 uni1E77              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e78 uni1E78              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e79 uni1E79              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e7a uni1E7A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1e7b uni1E7B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1e7c uni1E7C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e7d uni1E7D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e7e uni1E7E              2.1
-U+1e7f uni1E7F              2.1
-U+1e80 Wgrave               1.2
-U+1e81 wgrave               1.2
-U+1e82 Wacute               1.2
-U+1e83 wacute               1.2
-U+1e84 Wdieresis            1.2
-U+1e85 wdieresis            1.2
-U+1e86 uni1E86              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e87 uni1E87              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e88 uni1E88              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e89 uni1E89              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e8a uni1E8A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e8b uni1E8B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e8c uni1E8C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e8d uni1E8D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e8e uni1E8E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e8f uni1E8F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e90 uni1E90              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e91 uni1E91              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e92 uni1E92              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e93 uni1E93              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e94 uni1E94              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e95 uni1E95              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e96 uni1E96              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e97 uni1E97              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e98 uni1E98              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e99 uni1E99              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1e9a uni1E9A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1e9b uni1E9B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1e9e uni1E9E              2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+1e9f uni1E9F              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+1ea0 uni1EA0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1ea1 uni1EA1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1ea2 uni1EA2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1ea3 uni1EA3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1ea4 uni1EA4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ea5 uni1EA5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ea6 uni1EA6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ea7 uni1EA7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ea8 uni1EA8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ea9 uni1EA9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1eaa uni1EAA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1eab uni1EAB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1eac uni1EAC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1ead uni1EAD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1eae uni1EAE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1eaf uni1EAF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1eb0 uni1EB0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1eb1 uni1EB1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1eb2 uni1EB2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1eb3 uni1EB3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1eb4 uni1EB4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1eb5 uni1EB5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1eb6 uni1EB6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1eb7 uni1EB7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1eb8 uni1EB8              2.2
-U+1eb9 uni1EB9              2.2
-U+1eba uni1EBA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1ebb uni1EBB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1ebc uni1EBC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1ebd uni1EBD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1ebe uni1EBE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ebf uni1EBF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ec0 uni1EC0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ec1 uni1EC1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ec2 uni1EC2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ec3 uni1EC3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ec4 uni1EC4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ec5 uni1EC5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ec6 uni1EC6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1ec7 uni1EC7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1ec8 uni1EC8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1ec9 uni1EC9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1eca uni1ECA              2.2
-U+1ecb uni1ECB              2.2
-U+1ecc uni1ECC              2.2
-U+1ecd uni1ECD              2.2
-U+1ece uni1ECE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1ecf uni1ECF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1ed0 uni1ED0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ed1 uni1ED1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ed2 uni1ED2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ed3 uni1ED3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ed4 uni1ED4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ed5 uni1ED5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ed6 uni1ED6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ed7 uni1ED7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ed8 uni1ED8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1ed9 uni1ED9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1eda uni1EDA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1edb uni1EDB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1edc uni1EDC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1edd uni1EDD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1ede uni1EDE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1edf uni1EDF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1ee0 uni1EE0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1ee1 uni1EE1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1ee2 uni1EE2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1ee3 uni1EE3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1ee4 uni1EE4              2.2
-U+1ee5 uni1EE5              2.2
-U+1ee6 uni1EE6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1ee7 uni1EE7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1ee8 uni1EE8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1ee9 uni1EE9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1eea uni1EEA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1eeb uni1EEB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1eec uni1EEC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1eed uni1EED              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+1eee uni1EEE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1eef uni1EEF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1ef0 uni1EF0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1ef1 uni1EF1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+1ef2 Ygrave               1.2
-U+1ef3 ygrave               1.2
-U+1ef4 uni1EF4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1ef5 uni1EF5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1ef6 uni1EF6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1ef7 uni1EF7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1ef8 uni1EF8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1ef9 uni1EF9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1f00 uni1F00              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f01 uni1F01              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f02 uni1F02              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f03 uni1F03              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f04 uni1F04              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f05 uni1F05              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f06 uni1F06              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f07 uni1F07              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f08 uni1F08              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f09 uni1F09              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f0a uni1F0A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f0b uni1F0B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f0c uni1F0C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f0d uni1F0D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f0e uni1F0E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f0f uni1F0F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f10 uni1F10              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f11 uni1F11              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f12 uni1F12              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f13 uni1F13              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f14 uni1F14              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f15 uni1F15              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f18 uni1F18              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f19 uni1F19              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f1a uni1F1A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f1b uni1F1B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f1c uni1F1C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f1d uni1F1D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f20 uni1F20              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f21 uni1F21              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f22 uni1F22              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f23 uni1F23              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f24 uni1F24              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f25 uni1F25              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f26 uni1F26              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f27 uni1F27              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f28 uni1F28              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f29 uni1F29              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f2a uni1F2A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f2b uni1F2B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f2c uni1F2C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f2d uni1F2D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f2e uni1F2E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f2f uni1F2F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f30 uni1F30              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f31 uni1F31              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f32 uni1F32              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f33 uni1F33              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f34 uni1F34              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f35 uni1F35              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f36 uni1F36              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f37 uni1F37              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f38 uni1F38              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f39 uni1F39              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f3a uni1F3A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f3b uni1F3B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f3c uni1F3C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f3d uni1F3D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f3e uni1F3E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f3f uni1F3F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f40 uni1F40              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f41 uni1F41              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f42 uni1F42              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f43 uni1F43              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f44 uni1F44              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f45 uni1F45              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f48 uni1F48              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f49 uni1F49              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f4a uni1F4A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f4b uni1F4B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f4c uni1F4C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f4d uni1F4D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f50 uni1F50              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f51 uni1F51              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f52 uni1F52              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f53 uni1F53              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f54 uni1F54              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f55 uni1F55              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f56 uni1F56              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f57 uni1F57              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f59 uni1F59              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f5b uni1F5B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f5d uni1F5D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f5f uni1F5F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f60 uni1F60              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f61 uni1F61              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f62 uni1F62              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f63 uni1F63              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f64 uni1F64              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f65 uni1F65              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f66 uni1F66              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f67 uni1F67              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f68 uni1F68              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f69 uni1F69              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f6a uni1F6A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f6b uni1F6B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f6c uni1F6C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f6d uni1F6D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f6e uni1F6E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f6f uni1F6F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f70 uni1F70              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1f71 uni1F71              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1f72 uni1F72              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1f73 uni1F73              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1f74 uni1F74              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1f75 uni1F75              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1f76 uni1F76              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f77 uni1F77              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f78 uni1F78              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1f79 uni1F79              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1f7a uni1F7A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f7b uni1F7B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f7c uni1F7C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f7d uni1F7D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f80 uni1F80              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f81 uni1F81              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f82 uni1F82              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f83 uni1F83              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f84 uni1F84              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f85 uni1F85              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f86 uni1F86              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f87 uni1F87              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f88 uni1F88              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f89 uni1F89              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f8a uni1F8A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f8b uni1F8B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f8c uni1F8C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f8d uni1F8D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f8e uni1F8E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f8f uni1F8F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f90 uni1F90              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f91 uni1F91              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f92 uni1F92              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f93 uni1F93              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f94 uni1F94              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f95 uni1F95              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f96 uni1F96              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f97 uni1F97              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f98 uni1F98              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f99 uni1F99              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f9a uni1F9A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f9b uni1F9B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f9c uni1F9C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f9d uni1F9D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f9e uni1F9E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1f9f uni1F9F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fa0 uni1FA0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fa1 uni1FA1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fa2 uni1FA2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fa3 uni1FA3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fa4 uni1FA4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fa5 uni1FA5              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fa6 uni1FA6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fa7 uni1FA7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fa8 uni1FA8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fa9 uni1FA9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1faa uni1FAA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fab uni1FAB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fac uni1FAC              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fad uni1FAD              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fae uni1FAE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1faf uni1FAF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fb0 uni1FB0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fb1 uni1FB1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fb2 uni1FB2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fb3 uni1FB3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fb4 uni1FB4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fb6 uni1FB6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fb7 uni1FB7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fb8 uni1FB8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fb9 uni1FB9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fba uni1FBA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fbb uni1FBB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fbc uni1FBC              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fbd uni1FBD              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fbe uni1FBE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fbf uni1FBF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fc0 uni1FC0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fc1 uni1FC1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fc2 uni1FC2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fc3 uni1FC3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fc4 uni1FC4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fc6 uni1FC6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fc7 uni1FC7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fc8 uni1FC8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fc9 uni1FC9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fca uni1FCA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fcb uni1FCB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fcc uni1FCC              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fcd uni1FCD              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fce uni1FCE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fcf uni1FCF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fd0 uni1FD0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fd1 uni1FD1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fd2 uni1FD2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fd3 uni1FD3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fd6 uni1FD6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fd7 uni1FD7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fd8 uni1FD8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fd9 uni1FD9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fda uni1FDA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fdb uni1FDB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fdd uni1FDD              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fde uni1FDE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fdf uni1FDF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fe0 uni1FE0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fe1 uni1FE1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fe2 uni1FE2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fe3 uni1FE3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fe4 uni1FE4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fe5 uni1FE5              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fe6 uni1FE6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fe7 uni1FE7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fe8 uni1FE8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fe9 uni1FE9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fea uni1FEA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1feb uni1FEB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fec uni1FEC              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1fed uni1FED              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fee uni1FEE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1fef uni1FEF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1ff2 uni1FF2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1ff3 uni1FF3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1ff4 uni1FF4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1ff6 uni1FF6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1ff7 uni1FF7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1ff8 uni1FF8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1ff9 uni1FF9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1ffa uni1FFA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1ffb uni1FFB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1ffc uni1FFC              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+1ffd uni1FFD              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+1ffe uni1FFE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+2000 uni2000              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+2001 uni2001              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+2002 uni2002              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+2003 uni2003              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+2004 uni2004              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+2005 uni2005              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+2006 uni2006              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+2007 uni2007              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+2008 uni2008              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+2009 uni2009              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+200a uni200A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+200b uni200B              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+200c uni200C              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+200d uni200D              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+200e uni200E              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+200f uni200F              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+2010 uni2010              1.5
-U+2011 uni2011              1.5
-U+2012 figuredash           1.5
-U+2013 endash               original
-U+2014 emdash               original
-U+2015 uni2015              1.5
-U+2016 uni2016              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2017 underscoredbl        2.3
-U+2018 quoteleft            original
-U+2019 quoteright           original
-U+201a quotesinglbase       original
-U+201b quotereversed        2.3
-U+201c quotedblleft         original
-U+201d quotedblright        original
-U+201e quotedblbase         original
-U+201f uni201F              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+2020 dagger               original
-U+2021 daggerdbl            original
-U+2022 bullet               original
-U+2023 uni2023              2.2
-U+2024 onedotenleader       2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2025 twodotenleader       2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2026 ellipsis             original
-U+2027 uni2027              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+202a uni202A              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+202b uni202B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+202c uni202C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+202d uni202D              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+202e uni202E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+202f uni202F              2.11 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.23 (Serif Italic Condensed)
-U+2030 perthousand          original
-U+2031 uni2031              2.1
-U+2032 minute               2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2033 second               2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2034 uni2034              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2035 uni2035              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2036 uni2036              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2037 uni2037              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2038 uni2038              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2039 guilsinglleft        original
-U+203a guilsinglright       original
-U+203b uni203B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+203c exclamdbl            2.0
-U+203d uni203D              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.11 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.14 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+203e uni203E              2.3
-U+203f uni203F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+2040 uni2040              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+2041 uni2041              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2042 uni2042              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2043 uni2043              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+2044 fraction             2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2045 uni2045              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2046 uni2046              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2047 uni2047              2.0
-U+2048 uni2048              2.0
-U+2049 uni2049              2.0
-U+204a uni204A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+204b uni204B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+204c uni204C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+204d uni204D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+204e uni204E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+204f uni204F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2050 uni2050              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+2051 uni2051              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2052 uni2052              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2053 uni2053              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2054 uni2054              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+2055 uni2055              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2056 uni2056              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2057 uni2057              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2058 uni2058              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2059 uni2059              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+205a uni205A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+205b uni205B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+205c uni205C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+205d uni205D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+205e uni205E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+205f uni205F              2.14
-U+2060 uni2060              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2061 uni2061              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2062 uni2062              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2063 uni2063              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2064 uni2064              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+206a uni206A              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+206b uni206B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+206c uni206C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+206d uni206D              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+206e uni206E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+206f uni206F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2070 uni2070              2.2
-U+2071 uni2071              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+2074 uni2074              2.2
-U+2075 uni2075              2.2
-U+2076 uni2076              2.2
-U+2077 uni2077              2.2
-U+2078 uni2078              2.2
-U+2079 uni2079              2.2
-U+207a uni207A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+207b uni207B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+207c uni207C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+207d uni207D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+207e uni207E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+207f uni207F              1.14
-U+2080 uni2080              2.4
-U+2081 uni2081              2.4
-U+2082 uni2082              2.4
-U+2083 uni2083              2.4
-U+2084 uni2084              2.4
-U+2085 uni2085              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2086 uni2086              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2087 uni2087              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2088 uni2088              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2089 uni2089              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+208a uni208A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+208b uni208B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+208c uni208C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+208d uni208D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+208e uni208E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+2090 uni2090              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+2091 uni2091              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+2092 uni2092              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+2093 uni2093              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+2094 uni2094              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+20a0 uni20A0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+20a1 colonmonetary        2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+20a2 uni20A2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+20a3 franc                2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+20a4 lira                 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+20a5 uni20A5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+20a6 uni20A6              2.3
-U+20a7 peseta               2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+20a8 uni20A8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+20a9 uni20A9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+20aa uni20AA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+20ab dong                 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+20ac Euro                 original
-U+20ad uni20AD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+20ae uni20AE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+20af uni20AF              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+20b0 uni20B0              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+20b1 uni20B1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+20b2 uni20B2              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+20b3 uni20B3              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+20b4 uni20B4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+20b5 uni20B5              2.2
-U+20d0 uni20D0              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+20d1 uni20D1              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+20d6 uni20D6              2.8 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+20d7 uni20D7              2.8 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+20db uni20DB              2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+20dc uni20DC              2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+20e1 uni20E1              2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2100 uni2100              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2101 uni2101              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2102 uni2102              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.16 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Condensed)
-U+2103 uni2103              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2104 uni2104              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2105 uni2105              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2106 uni2106              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2107 uni2107              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2108 uni2108              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2109 uni2109              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+210b uni210B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+210c uni210C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+210d uni210D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+210e uni210E              2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
-U+210f uni210F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.28 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2110 uni2110              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2111 Ifraktur             2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2112 uni2112              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2113 uni2113              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2114 uni2114              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2115 uni2115              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2116 uni2116              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+2117 uni2117              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2118 weierstrass          2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2119 uni2119              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+211a uni211A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+211b uni211B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+211c Rfraktur             2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+211d uni211D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+211e prescription         2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+211f uni211F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2120 uni2120              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2121 uni2121              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2122 trademark            original
-U+2123 uni2123              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2124 uni2124              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2125 uni2125              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2126 uni2126              2.2
-U+2127 uni2127              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2128 uni2128              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2129 uni2129              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+212a uni212A              2.2
-U+212b uni212B              2.2
-U+212c uni212C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+212d uni212D              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+212e estimated            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+212f uni212F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2130 uni2130              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2131 uni2131              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2132 uni2132              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
-U+2133 uni2133              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2134 uni2134              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+2135 aleph                2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2136 uni2136              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2137 uni2137              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2138 uni2138              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2139 uni2139              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+213a uni213A              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+213b uni213B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+213c uni213C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
-U+213d uni213D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
-U+213e uni213E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
-U+213f uni213F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
-U+2140 uni2140              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
-U+2141 uni2141              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2142 uni2142              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2143 uni2143              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2144 uni2144              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2145 uni2145              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
-U+2146 uni2146              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
-U+2147 uni2147              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
-U+2148 uni2148              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
-U+2149 uni2149              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
-U+214b uni214B              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+214e uni214E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2153 onethird             2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2154 twothirds            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2155 uni2155              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2156 uni2156              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2157 uni2157              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2158 uni2158              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2159 uni2159              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+215a uni215A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+215b oneeighth            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+215c threeeighths         2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+215d fiveeighths          2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+215e seveneighths         2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+215f uni215F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2160 uni2160              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2161 uni2161              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2162 uni2162              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2163 uni2163              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2164 uni2164              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2165 uni2165              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2166 uni2166              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2167 uni2167              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2168 uni2168              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2169 uni2169              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+216a uni216A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+216b uni216B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+216c uni216C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+216d uni216D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+216e uni216E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+216f uni216F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2170 uni2170              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2171 uni2171              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2172 uni2172              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2173 uni2173              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2174 uni2174              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2175 uni2175              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2176 uni2176              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2177 uni2177              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2178 uni2178              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2179 uni2179              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+217a uni217A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+217b uni217B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+217c uni217C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+217d uni217D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+217e uni217E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+217f uni217F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2180 uni2180              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2181 uni2181              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2182 uni2182              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2183 uni2183              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2184 uni2184              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2190 arrowleft            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+2191 arrowup              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+2192 arrowright           2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+2193 arrowdown            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+2194 arrowboth            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2195 arrowupdn            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2196 uni2196              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2197 uni2197              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2198 uni2198              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2199 uni2199              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+219a uni219A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+219b uni219B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+219c uni219C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+219d uni219D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+219e uni219E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+219f uni219F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21a0 uni21A0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21a1 uni21A1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21a2 uni21A2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21a3 uni21A3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21a4 uni21A4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21a5 uni21A5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21a6 uni21A6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21a7 uni21A7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21a8 arrowupdnbse         2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21a9 uni21A9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21aa uni21AA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21ab uni21AB              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21ac uni21AC              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21ad uni21AD              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21ae uni21AE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21af uni21AF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21b0 uni21B0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21b1 uni21B1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21b2 uni21B2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21b3 uni21B3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21b4 uni21B4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21b5 carriagereturn       2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21b6 uni21B6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21b7 uni21B7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21b8 uni21B8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21b9 uni21B9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21ba uni21BA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21bb uni21BB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21bc uni21BC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21bd uni21BD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21be uni21BE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21bf uni21BF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21c0 uni21C0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21c1 uni21C1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21c2 uni21C2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21c3 uni21C3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21c4 uni21C4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21c5 uni21C5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21c6 uni21C6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21c7 uni21C7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21c8 uni21C8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21c9 uni21C9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21ca uni21CA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21cb uni21CB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21cc uni21CC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21cd uni21CD              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21ce uni21CE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21cf uni21CF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21d0 arrowdblleft         2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21d1 arrowdblup           2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21d2 arrowdblright        2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21d3 arrowdbldown         2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21d4 arrowdblboth         2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21d5 uni21D5              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21d6 uni21D6              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21d7 uni21D7              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21d8 uni21D8              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21d9 uni21D9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21da uni21DA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21db uni21DB              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21dc uni21DC              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21dd uni21DD              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21de uni21DE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21df uni21DF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21e0 uni21E0              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21e1 uni21E1              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21e2 uni21E2              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21e3 uni21E3              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21e4 uni21E4              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21e5 uni21E5              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21e6 uni21E6              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21e7 uni21E7              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21e8 uni21E8              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21e9 uni21E9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21ea uni21EA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21eb uni21EB              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21ec uni21EC              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21ed uni21ED              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21ee uni21EE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21ef uni21EF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21f0 uni21F0              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21f1 uni21F1              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21f2 uni21F2              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21f3 uni21F3              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21f4 uni21F4              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21f5 uni21F5              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21f6 uni21F6              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21f7 uni21F7              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21f8 uni21F8              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21f9 uni21F9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21fa uni21FA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21fb uni21FB              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21fc uni21FC              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21fd uni21FD              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21fe uni21FE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+21ff uni21FF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2200 universal            2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2201 uni2201              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2202 partialdiff          original
-U+2203 existential          2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2204 uni2204              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2205 emptyset             2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2206 Delta                original
-U+2207 gradient             2.1
-U+2208 element              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2209 notelement           2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+220a uni220A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+220b suchthat             2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+220c uni220C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+220d uni220D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+220e uni220E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+220f product              original
-U+2210 uni2210              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2211 summation            original
-U+2212 minus                original
-U+2213 uni2213              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2214 uni2214              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2215 uni2215              original
-U+2216 uni2216              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+2217 asteriskmath         2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2218 uni2218              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2219 uni2219              original
-U+221a radical              original
-U+221b uni221B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+221c uni221C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+221d proportional         2.1
-U+221e infinity             original
-U+221f orthogonal           2.1
-U+2220 angle                2.3
-U+2221 uni2221              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2222 uni2222              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2223 uni2223              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2224 uni2224              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2225 uni2225              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2226 uni2226              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2227 logicaland           2.1
-U+2228 logicalor            2.1
-U+2229 intersection         2.1
-U+222a union                2.1
-U+222b integral             original
-U+222c uni222C              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+222d uni222D              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+222e uni222E              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+222f uni222F              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2230 uni2230              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2231 uni2231              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2232 uni2232              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2233 uni2233              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2234 therefore            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+2235 uni2235              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+2236 uni2236              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+2237 uni2237              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+2238 uni2238              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2239 uni2239              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+223a uni223A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+223b uni223B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+223c similar              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+223d uni223D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+223e uni223E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+223f uni223F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2240 uni2240              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2241 uni2241              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2242 uni2242              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2243 uni2243              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2244 uni2244              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2245 congruent            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2246 uni2246              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2247 uni2247              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2248 approxequal          original
-U+2249 uni2249              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+224a uni224A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+224b uni224B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+224c uni224C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+224d uni224D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+224e uni224E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+224f uni224F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2250 uni2250              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2251 uni2251              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2252 uni2252              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2253 uni2253              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2254 uni2254              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2255 uni2255              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2256 uni2256              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2257 uni2257              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2258 uni2258              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2259 uni2259              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+225a uni225A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+225b uni225B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+225c uni225C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+225d uni225D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+225e uni225E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+225f uni225F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2260 notequal             original
-U+2261 equivalence          2.1
-U+2262 uni2262              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2263 uni2263              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2264 lessequal            original
-U+2265 greaterequal         original
-U+2266 uni2266              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2267 uni2267              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2268 uni2268              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2269 uni2269              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+226a uni226A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+226b uni226B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+226c uni226C              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+226d uni226D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+226e uni226E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+226f uni226F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2270 uni2270              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2271 uni2271              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2272 uni2272              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2273 uni2273              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2274 uni2274              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2275 uni2275              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2276 uni2276              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2277 uni2277              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2278 uni2278              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2279 uni2279              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+227a uni227A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+227b uni227B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+227c uni227C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+227d uni227D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+227e uni227E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+227f uni227F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2280 uni2280              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2281 uni2281              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2282 propersubset         2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2283 propersuperset       2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2284 notsubset            2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2285 uni2285              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2286 reflexsubset         2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2287 reflexsuperset       2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2288 uni2288              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2289 uni2289              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+228a uni228A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+228b uni228B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+228c uni228C              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+228d uni228D              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+228e uni228E              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+228f uni228F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2290 uni2290              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2291 uni2291              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2292 uni2292              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2293 uni2293              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2294 uni2294              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2295 circleplus           2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2296 uni2296              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2297 circlemultiply       2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2298 uni2298              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2299 uni2299              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+229a uni229A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+229b uni229B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+229c uni229C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+229d uni229D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+229e uni229E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+229f uni229F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+22a0 uni22A0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+22a1 uni22A1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+22a2 uni22A2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+22a3 uni22A3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+22a4 uni22A4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+22a5 perpendicular        2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+22a6 uni22A6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+22a7 uni22A7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+22a8 uni22A8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+22a9 uni22A9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+22aa uni22AA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+22ab uni22AB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+22ac uni22AC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+22ad uni22AD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+22ae uni22AE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+22af uni22AF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+22b0 uni22B0              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22b1 uni22B1              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22b2 uni22B2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22b3 uni22B3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22b4 uni22B4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22b5 uni22B5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22b6 uni22B6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22b7 uni22B7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22b8 uni22B8              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22b9 uni22B9              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22ba uni22BA              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22bb uni22BB              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22bc uni22BC              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22bd uni22BD              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22be uni22BE              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+22bf uni22BF              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+22c0 uni22C0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22c1 uni22C1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22c2 uni22C2              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22c3 uni22C3              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22c4 uni22C4              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22c5 dotmath              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+22c6 uni22C6              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+22c7 uni22C7              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22c8 uni22C8              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22c9 uni22C9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22ca uni22CA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22cb uni22CB              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22cc uni22CC              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22cd uni22CD              2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+22ce uni22CE              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22cf uni22CF              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22d0 uni22D0              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22d1 uni22D1              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22d2 uni22D2              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22d3 uni22D3              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22d4 uni22D4              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22d5 uni22D5              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22d6 uni22D6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22d7 uni22D7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22d8 uni22D8              2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+22d9 uni22D9              2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+22da uni22DA              2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+22db uni22DB              2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+22dc uni22DC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+22dd uni22DD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+22de uni22DE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+22df uni22DF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+22e0 uni22E0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+22e1 uni22E1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+22e2 uni22E2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+22e3 uni22E3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+22e4 uni22E4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+22e5 uni22E5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+22e6 uni22E6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+22e7 uni22E7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+22e8 uni22E8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+22e9 uni22E9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+22ea uni22EA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22eb uni22EB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22ec uni22EC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22ed uni22ED              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22ee uni22EE              2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22ef uni22EF              2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22f0 uni22F0              2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22f1 uni22F1              2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22f2 uni22F2              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22f3 uni22F3              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22f4 uni22F4              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22f5 uni22F5              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22f6 uni22F6              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22f7 uni22F7              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22f8 uni22F8              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22f9 uni22F9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22fa uni22FA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22fb uni22FB              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22fc uni22FC              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22fd uni22FD              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22fe uni22FE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+22ff uni22FF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2300 uni2300              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2301 uni2301              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2302 house                1.14
-U+2303 uni2303              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2304 uni2304              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2305 uni2305              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2306 uni2306              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2307 uni2307              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2308 uni2308              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+2309 uni2309              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+230a uni230A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+230b uni230B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+230c uni230C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+230d uni230D              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+230e uni230E              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+230f uni230F              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2310 revlogicalnot        1.14
-U+2311 uni2311              1.15
-U+2312 uni2312              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2313 uni2313              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2314 uni2314              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2315 uni2315              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2318 uni2318              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+2319 uni2319              1.14
-U+231c uni231C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+231d uni231D              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+231e uni231E              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+231f uni231F              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2320 integraltp           2.3
-U+2321 integralbt           2.3
-U+2324 uni2324              2.16 (Sans, Sans Bold, Sans Bold Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) 2.19 (Sans Condensed Oblique, Sans Oblique)
-U+2325 uni2325              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+2326 uni2326              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2327 uni2327              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2328 uni2328              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2329 angleleft            2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic)
-U+232a angleright           2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic)
-U+232b uni232B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+232c uni232C              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2335 uni2335              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2337 uni2337              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2338 uni2338              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2339 uni2339              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+233a uni233A              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+233b uni233B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+233c uni233C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+233d uni233D              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+233e uni233E              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2341 uni2341              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2342 uni2342              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2343 uni2343              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2344 uni2344              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2347 uni2347              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2348 uni2348              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2349 uni2349              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+234b uni234B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+234c uni234C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+234d uni234D              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2350 uni2350              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2352 uni2352              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2353 uni2353              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2354 uni2354              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2357 uni2357              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2358 uni2358              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2359 uni2359              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+235a uni235A              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+235b uni235B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+235c uni235C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+235e uni235E              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+235f uni235F              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2360 uni2360              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2363 uni2363              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2364 uni2364              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2365 uni2365              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2368 uni2368              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2369 uni2369              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+236b uni236B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+236c uni236C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+236d uni236D              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+236e uni236E              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+236f uni236F              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2370 uni2370              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2373 uni2373              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2374 uni2374              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2375 uni2375              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2376 uni2376              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2377 uni2377              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2378 uni2378              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2379 uni2379              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+237a uni237A              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+237d uni237D              1.15
-U+2380 uni2380              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2381 uni2381              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2382 uni2382              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2383 uni2383              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2387 uni2387              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2388 uni2388              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2389 uni2389              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+238a uni238A              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+238b uni238B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2394 uni2394              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2395 uni2395              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+239b uni239B              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+239c uni239C              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+239d uni239D              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+239e uni239E              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+239f uni239F              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+23a0 uni23A0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+23a1 uni23A1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+23a2 uni23A2              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+23a3 uni23A3              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+23a4 uni23A4              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+23a5 uni23A5              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+23a6 uni23A6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+23a7 uni23A7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+23a8 uni23A8              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+23a9 uni23A9              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+23aa uni23AA              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+23ab uni23AB              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+23ac uni23AC              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+23ad uni23AD              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+23ae uni23AE              2.3
-U+23ce uni23CE              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+23cf uni23CF              2.3
-U+23e3 uni23E3              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+23e5 uni23E5              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2422 uni2422              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2423 uni2423              1.6
-U+2460 uni2460              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2461 uni2461              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2462 uni2462              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2463 uni2463              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2464 uni2464              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2465 uni2465              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2466 uni2466              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2467 uni2467              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2468 uni2468              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2469 uni2469              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2500 SF100000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2501 uni2501              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2502 SF110000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2503 uni2503              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2504 uni2504              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2505 uni2505              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2506 uni2506              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2507 uni2507              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2508 uni2508              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2509 uni2509              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+250a uni250A              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+250b uni250B              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+250c SF010000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+250d uni250D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+250e uni250E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+250f uni250F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2510 SF030000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2511 uni2511              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2512 uni2512              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2513 uni2513              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2514 SF020000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2515 uni2515              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2516 uni2516              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2517 uni2517              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2518 SF040000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2519 uni2519              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+251a uni251A              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+251b uni251B              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+251c SF080000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+251d uni251D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+251e uni251E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+251f uni251F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2520 uni2520              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2521 uni2521              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2522 uni2522              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2523 uni2523              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2524 SF090000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2525 uni2525              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2526 uni2526              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2527 uni2527              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2528 uni2528              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2529 uni2529              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+252a uni252A              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+252b uni252B              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+252c SF060000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+252d uni252D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+252e uni252E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+252f uni252F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2530 uni2530              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2531 uni2531              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2532 uni2532              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2533 uni2533              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2534 SF070000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2535 uni2535              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2536 uni2536              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2537 uni2537              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2538 uni2538              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2539 uni2539              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+253a uni253A              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+253b uni253B              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+253c SF050000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+253d uni253D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+253e uni253E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+253f uni253F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2540 uni2540              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2541 uni2541              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2542 uni2542              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2543 uni2543              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2544 uni2544              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2545 uni2545              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2546 uni2546              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2547 uni2547              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2548 uni2548              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2549 uni2549              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+254a uni254A              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+254b uni254B              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+254c uni254C              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+254d uni254D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+254e uni254E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+254f uni254F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2550 SF430000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2551 SF240000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2552 SF510000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2553 SF520000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2554 SF390000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2555 SF220000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2556 SF210000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2557 SF250000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2558 SF500000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2559 SF490000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+255a SF380000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+255b SF280000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+255c SF270000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+255d SF260000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+255e SF360000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+255f SF370000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2560 SF420000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2561 SF190000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2562 SF200000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2563 SF230000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2564 SF470000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2565 SF480000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2566 SF410000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2567 SF450000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2568 SF460000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2569 SF400000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+256a SF540000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+256b SF530000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+256c SF440000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+256d uni256D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+256e uni256E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+256f uni256F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2570 uni2570              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2571 uni2571              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2572 uni2572              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2573 uni2573              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2574 uni2574              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2575 uni2575              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2576 uni2576              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2577 uni2577              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2578 uni2578              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2579 uni2579              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+257a uni257A              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+257b uni257B              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+257c uni257C              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+257d uni257D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+257e uni257E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+257f uni257F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2580 upblock              1.14
-U+2581 uni2581              1.14
-U+2582 uni2582              1.14
-U+2583 uni2583              1.14
-U+2584 dnblock              1.14
-U+2585 uni2585              1.14
-U+2586 uni2586              1.14
-U+2587 uni2587              1.14
-U+2588 block                1.14
-U+2589 uni2589              1.14
-U+258a uni258A              1.14
-U+258b uni258B              1.14
-U+258c lfblock              1.14
-U+258d uni258D              1.14
-U+258e uni258E              1.14
-U+258f uni258F              1.14
-U+2590 rtblock              1.14
-U+2591 ltshade              1.15
-U+2592 shade                1.15
-U+2593 dkshade              1.15
-U+2594 uni2594              1.14
-U+2595 uni2595              1.14
-U+2596 uni2596              1.14
-U+2597 uni2597              1.14
-U+2598 uni2598              1.14
-U+2599 uni2599              1.14
-U+259a uni259A              1.14
-U+259b uni259B              1.14
-U+259c uni259C              1.14
-U+259d uni259D              1.14
-U+259e uni259E              1.14
-U+259f uni259F              1.14
-U+25a0 filledbox            2.3
-U+25a1 H22073               2.3
-U+25a2 uni25A2              2.3
-U+25a3 uni25A3              2.3
-U+25a4 uni25A4              2.3
-U+25a5 uni25A5              2.3
-U+25a6 uni25A6              2.3
-U+25a7 uni25A7              2.3
-U+25a8 uni25A8              2.3
-U+25a9 uni25A9              2.3
-U+25aa H18543               2.3
-U+25ab H18551               2.3
-U+25ac filledrect           2.3
-U+25ad uni25AD              2.3
-U+25ae uni25AE              2.3
-U+25af uni25AF              2.3
-U+25b0 uni25B0              2.3
-U+25b1 uni25B1              2.3
-U+25b2 triagup              2.3
-U+25b3 uni25B3              2.3
-U+25b4 uni25B4              2.3
-U+25b5 uni25B5              2.3
-U+25b6 uni25B6              2.3
-U+25b7 uni25B7              2.3
-U+25b8 uni25B8              2.3
-U+25b9 uni25B9              2.3
-U+25ba triagrt              2.3
-U+25bb uni25BB              2.3
-U+25bc triagdn              2.3
-U+25bd uni25BD              2.3
-U+25be uni25BE              2.3
-U+25bf uni25BF              2.3
-U+25c0 uni25C0              2.3
-U+25c1 uni25C1              2.3
-U+25c2 uni25C2              2.3
-U+25c3 uni25C3              2.3
-U+25c4 triaglf              2.3
-U+25c5 uni25C5              2.3
-U+25c6 uni25C6              2.3
-U+25c7 uni25C7              2.3
-U+25c8 uni25C8              2.3
-U+25c9 uni25C9              2.3
-U+25ca lozenge              original
-U+25cb circle               2.3
-U+25cc uni25CC              2.3
-U+25cd uni25CD              2.3
-U+25ce uni25CE              2.3
-U+25cf H18533               2.3
-U+25d0 uni25D0              2.3
-U+25d1 uni25D1              2.3
-U+25d2 uni25D2              2.3
-U+25d3 uni25D3              2.3
-U+25d4 uni25D4              2.3
-U+25d5 uni25D5              2.3
-U+25d6 uni25D6              2.3
-U+25d7 uni25D7              2.3
-U+25d8 invbullet            2.2
-U+25d9 invcircle            2.3
-U+25da uni25DA              2.3
-U+25db uni25DB              2.3
-U+25dc uni25DC              2.3
-U+25dd uni25DD              2.3
-U+25de uni25DE              2.3
-U+25df uni25DF              2.3
-U+25e0 uni25E0              2.3
-U+25e1 uni25E1              2.3
-U+25e2 uni25E2              2.3
-U+25e3 uni25E3              2.3
-U+25e4 uni25E4              2.3
-U+25e5 uni25E5              2.3
-U+25e6 openbullet           2.2
-U+25e7 uni25E7              2.3
-U+25e8 uni25E8              2.3
-U+25e9 uni25E9              2.3
-U+25ea uni25EA              2.3
-U+25eb uni25EB              2.3
-U+25ec uni25EC              2.3
-U+25ed uni25ED              2.3
-U+25ee uni25EE              2.3
-U+25ef uni25EF              2.3
-U+25f0 uni25F0              2.3
-U+25f1 uni25F1              2.3
-U+25f2 uni25F2              2.3
-U+25f3 uni25F3              2.3
-U+25f4 uni25F4              2.3
-U+25f5 uni25F5              2.3
-U+25f6 uni25F6              2.3
-U+25f7 uni25F7              2.3
-U+25f8 uni25F8              2.3
-U+25f9 uni25F9              2.3
-U+25fa uni25FA              2.3
-U+25fb uni25FB              2.3
-U+25fc uni25FC              2.3
-U+25fd uni25FD              2.3
-U+25fe uni25FE              2.3
-U+25ff uni25FF              2.3
-U+2600 uni2600              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2601 uni2601              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2602 uni2602              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2603 uni2603              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2604 uni2604              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2605 uni2605              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2606 uni2606              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2607 uni2607              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2608 uni2608              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2609 uni2609              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+260a uni260A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+260b uni260B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+260c uni260C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+260d uni260D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+260e uni260E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+260f uni260F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2610 uni2610              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2611 uni2611              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2612 uni2612              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2613 uni2613              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2614 uni2614              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2615 uni2615              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2616 uni2616              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2617 uni2617              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2618 uni2618              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2619 uni2619              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+261a uni261A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+261b uni261B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+261c uni261C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+261d uni261D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+261e uni261E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+261f uni261F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2620 uni2620              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2621 uni2621              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2622 uni2622              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2623 uni2623              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2624 uni2624              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2625 uni2625              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2626 uni2626              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2627 uni2627              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2628 uni2628              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2629 uni2629              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+262a uni262A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+262b uni262B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+262c uni262C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+262d uni262D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+262e uni262E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+262f uni262F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2630 uni2630              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+2631 uni2631              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+2632 uni2632              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+2633 uni2633              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+2634 uni2634              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+2635 uni2635              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+2636 uni2636              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+2637 uni2637              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+2638 uni2638              1.15
-U+2639 uni2639              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+263a smileface            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+263b invsmileface         2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+263c sun                  2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+263d uni263D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+263e uni263E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+263f uni263F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2640 female               2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2641 uni2641              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2642 male                 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2643 uni2643              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2644 uni2644              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2645 uni2645              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2646 uni2646              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2647 uni2647              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2648 uni2648              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2649 uni2649              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+264a uni264A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+264b uni264B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+264c uni264C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+264d uni264D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+264e uni264E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+264f uni264F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2650 uni2650              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2651 uni2651              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2652 uni2652              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2653 uni2653              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2654 uni2654              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2655 uni2655              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2656 uni2656              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2657 uni2657              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2658 uni2658              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2659 uni2659              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+265a uni265A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+265b uni265B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+265c uni265C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+265d uni265D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+265e uni265E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+265f uni265F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2660 spade                2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2661 uni2661              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2662 uni2662              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2663 club                 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2664 uni2664              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2665 heart                2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2666 diamond              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2667 uni2667              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2668 uni2668              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2669 uni2669              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+266a musicalnote          2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+266b musicalnotedbl       2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+266c uni266C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+266d uni266D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+266e uni266E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+266f uni266F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2670 uni2670              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2671 uni2671              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2672 uni2672              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2673 uni2673              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2674 uni2674              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2675 uni2675              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2676 uni2676              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2677 uni2677              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2678 uni2678              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2679 uni2679              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+267a uni267A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+267b uni267B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+267c uni267C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+267d uni267D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+267e uni267E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+267f uni267F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2680 uni2680              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold)
-U+2681 uni2681              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold)
-U+2682 uni2682              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold)
-U+2683 uni2683              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold)
-U+2684 uni2684              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold)
-U+2685 uni2685              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold)
-U+2686 uni2686              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2687 uni2687              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2688 uni2688              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2689 uni2689              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+268a uni268A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+268b uni268B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+268c uni268C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+268d uni268D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+268e uni268E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+268f uni268F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+2690 uni2690              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2691 uni2691              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2692 uni2692              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2693 uni2693              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2694 uni2694              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2695 uni2695              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2696 uni2696              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2697 uni2697              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2698 uni2698              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2699 uni2699              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+269a uni269A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+269b uni269B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+269c uni269C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+26a0 uni26A0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+26a1 uni26A1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+26a2 uni26A2              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+26a3 uni26A3              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+26a4 uni26A4              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+26a5 uni26A5              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+26a6 uni26A6              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+26a7 uni26A7              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+26a8 uni26A8              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+26a9 uni26A9              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+26aa uni26AA              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+26ab uni26AB              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+26ac uni26AC              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+26ad uni26AD              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+26ae uni26AE              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+26af uni26AF              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+26b0 uni26B0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+26b1 uni26B1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+26b2 uni26B2              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+26b3 uni26B3              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+26b4 uni26B4              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+26b5 uni26B5              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+26b6 uni26B6              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+26b7 uni26B7              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+26b8 uni26B8              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2701 uni2701              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2702 uni2702              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2703 uni2703              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2704 uni2704              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2706 uni2706              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2707 uni2707              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2708 uni2708              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2709 uni2709              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+270c uni270C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+270d uni270D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+270e uni270E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+270f uni270F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2710 uni2710              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2711 uni2711              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2712 uni2712              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2713 uni2713              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2714 uni2714              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2715 uni2715              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2716 uni2716              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2717 uni2717              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2718 uni2718              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2719 uni2719              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+271a uni271A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+271b uni271B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+271c uni271C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+271d uni271D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+271e uni271E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+271f uni271F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2720 uni2720              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2721 uni2721              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2722 uni2722              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2723 uni2723              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2724 uni2724              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2725 uni2725              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2726 uni2726              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2727 uni2727              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2729 uni2729              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+272a uni272A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+272b uni272B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+272c uni272C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+272d uni272D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+272e uni272E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+272f uni272F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2730 uni2730              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2731 uni2731              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2732 uni2732              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2733 uni2733              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2734 uni2734              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2735 uni2735              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2736 uni2736              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2737 uni2737              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2738 uni2738              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2739 uni2739              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+273a uni273A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+273b uni273B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+273c uni273C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+273d uni273D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+273e uni273E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+273f uni273F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2740 uni2740              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2741 uni2741              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2742 uni2742              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2743 uni2743              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2744 uni2744              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2745 uni2745              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2746 uni2746              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2747 uni2747              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2748 uni2748              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2749 uni2749              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+274a uni274A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+274b uni274B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+274d uni274D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+274f uni274F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2750 uni2750              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2751 uni2751              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2752 uni2752              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2756 uni2756              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2758 uni2758              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2759 uni2759              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+275a uni275A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+275b uni275B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+275c uni275C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+275d uni275D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+275e uni275E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2761 uni2761              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2762 uni2762              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2763 uni2763              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2764 uni2764              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2765 uni2765              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2766 uni2766              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2767 uni2767              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2768 uni2768              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2769 uni2769              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+276a uni276A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+276b uni276B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+276c uni276C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+276d uni276D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+276e uni276E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+276f uni276F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2770 uni2770              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2771 uni2771              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2772 uni2772              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2773 uni2773              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2774 uni2774              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2775 uni2775              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
-U+2776 uni2776              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2777 uni2777              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2778 uni2778              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2779 uni2779              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+277a uni277A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+277b uni277B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+277c uni277C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+277d uni277D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+277e uni277E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+277f uni277F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2780 uni2780              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2781 uni2781              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2782 uni2782              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2783 uni2783              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2784 uni2784              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2785 uni2785              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2786 uni2786              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2787 uni2787              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2788 uni2788              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2789 uni2789              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+278a uni278A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+278b uni278B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+278c uni278C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+278d uni278D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+278e uni278E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+278f uni278F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2790 uni2790              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2791 uni2791              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2792 uni2792              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2793 uni2793              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2794 uni2794              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2798 uni2798              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+2799 uni2799              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+279a uni279A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+279b uni279B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+279c uni279C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+279d uni279D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+279e uni279E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+279f uni279F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27a0 uni27A0              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27a1 uni27A1              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+27a2 uni27A2              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27a3 uni27A3              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27a4 uni27A4              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27a5 uni27A5              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27a6 uni27A6              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27a7 uni27A7              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27a8 uni27A8              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27a9 uni27A9              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27aa uni27AA              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27ab uni27AB              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27ac uni27AC              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27ad uni27AD              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27ae uni27AE              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27af uni27AF              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27b1 uni27B1              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27b2 uni27B2              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27b3 uni27B3              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27b4 uni27B4              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27b5 uni27B5              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27b6 uni27B6              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27b7 uni27B7              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27b8 uni27B8              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27b9 uni27B9              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27ba uni27BA              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27bb uni27BB              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27bc uni27BC              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27bd uni27BD              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27be uni27BE              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
-U+27bf uni27BF              2.7 (Sans Mono Bold)
-U+27c5 uni27C5              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+27c6 uni27C6              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+27e0 uni27E0              2.3
-U+27e6 uni27E6              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+27e7 uni27E7              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+27e8 uni27E8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+27e9 uni27E9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+27ea uni27EA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+27eb uni27EB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+27f0 uni27F0              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+27f1 uni27F1              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+27f2 uni27F2              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+27f3 uni27F3              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+27f4 uni27F4              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+27f5 uni27F5              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+27f6 uni27F6              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+27f7 uni27F7              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+27f8 uni27F8              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+27f9 uni27F9              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+27fa uni27FA              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+27fb uni27FB              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+27fc uni27FC              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+27fd uni27FD              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+27fe uni27FE              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+27ff uni27FF              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2800 uni2800              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2801 uni2801              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2802 uni2802              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2803 uni2803              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2804 uni2804              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2805 uni2805              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2806 uni2806              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2807 uni2807              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2808 uni2808              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2809 uni2809              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+280a uni280A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+280b uni280B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+280c uni280C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+280d uni280D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+280e uni280E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+280f uni280F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2810 uni2810              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2811 uni2811              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2812 uni2812              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2813 uni2813              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2814 uni2814              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2815 uni2815              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2816 uni2816              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2817 uni2817              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2818 uni2818              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2819 uni2819              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+281a uni281A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+281b uni281B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+281c uni281C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+281d uni281D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+281e uni281E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+281f uni281F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2820 uni2820              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2821 uni2821              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2822 uni2822              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2823 uni2823              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2824 uni2824              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2825 uni2825              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2826 uni2826              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2827 uni2827              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2828 uni2828              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2829 uni2829              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+282a uni282A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+282b uni282B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+282c uni282C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+282d uni282D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+282e uni282E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+282f uni282F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2830 uni2830              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2831 uni2831              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2832 uni2832              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2833 uni2833              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2834 uni2834              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2835 uni2835              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2836 uni2836              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2837 uni2837              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2838 uni2838              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2839 uni2839              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+283a uni283A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+283b uni283B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+283c uni283C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+283d uni283D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+283e uni283E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+283f uni283F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2840 uni2840              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2841 uni2841              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2842 uni2842              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2843 uni2843              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2844 uni2844              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2845 uni2845              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2846 uni2846              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2847 uni2847              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2848 uni2848              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2849 uni2849              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+284a uni284A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+284b uni284B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+284c uni284C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+284d uni284D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+284e uni284E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+284f uni284F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2850 uni2850              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2851 uni2851              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2852 uni2852              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2853 uni2853              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2854 uni2854              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2855 uni2855              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2856 uni2856              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2857 uni2857              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2858 uni2858              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2859 uni2859              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+285a uni285A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+285b uni285B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+285c uni285C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+285d uni285D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+285e uni285E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+285f uni285F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2860 uni2860              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2861 uni2861              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2862 uni2862              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2863 uni2863              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2864 uni2864              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2865 uni2865              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2866 uni2866              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2867 uni2867              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2868 uni2868              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2869 uni2869              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+286a uni286A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+286b uni286B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+286c uni286C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+286d uni286D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+286e uni286E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+286f uni286F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2870 uni2870              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2871 uni2871              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2872 uni2872              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2873 uni2873              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2874 uni2874              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2875 uni2875              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2876 uni2876              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2877 uni2877              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2878 uni2878              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2879 uni2879              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+287a uni287A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+287b uni287B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+287c uni287C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+287d uni287D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+287e uni287E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+287f uni287F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2880 uni2880              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2881 uni2881              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2882 uni2882              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2883 uni2883              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2884 uni2884              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2885 uni2885              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2886 uni2886              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2887 uni2887              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2888 uni2888              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2889 uni2889              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+288a uni288A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+288b uni288B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+288c uni288C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+288d uni288D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+288e uni288E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+288f uni288F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2890 uni2890              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2891 uni2891              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2892 uni2892              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2893 uni2893              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2894 uni2894              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2895 uni2895              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2896 uni2896              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2897 uni2897              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2898 uni2898              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2899 uni2899              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+289a uni289A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+289b uni289B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+289c uni289C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+289d uni289D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+289e uni289E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+289f uni289F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28a0 uni28A0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28a1 uni28A1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28a2 uni28A2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28a3 uni28A3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28a4 uni28A4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28a5 uni28A5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28a6 uni28A6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28a7 uni28A7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28a8 uni28A8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28a9 uni28A9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28aa uni28AA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28ab uni28AB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28ac uni28AC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28ad uni28AD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28ae uni28AE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28af uni28AF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28b0 uni28B0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28b1 uni28B1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28b2 uni28B2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28b3 uni28B3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28b4 uni28B4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28b5 uni28B5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28b6 uni28B6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28b7 uni28B7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28b8 uni28B8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28b9 uni28B9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28ba uni28BA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28bb uni28BB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28bc uni28BC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28bd uni28BD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28be uni28BE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28bf uni28BF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28c0 uni28C0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28c1 uni28C1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28c2 uni28C2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28c3 uni28C3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28c4 uni28C4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28c5 uni28C5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28c6 uni28C6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28c7 uni28C7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28c8 uni28C8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28c9 uni28C9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28ca uni28CA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28cb uni28CB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28cc uni28CC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28cd uni28CD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28ce uni28CE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28cf uni28CF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28d0 uni28D0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28d1 uni28D1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28d2 uni28D2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28d3 uni28D3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28d4 uni28D4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28d5 uni28D5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28d6 uni28D6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28d7 uni28D7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28d8 uni28D8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28d9 uni28D9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28da uni28DA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28db uni28DB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28dc uni28DC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28dd uni28DD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28de uni28DE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28df uni28DF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28e0 uni28E0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28e1 uni28E1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28e2 uni28E2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28e3 uni28E3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28e4 uni28E4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28e5 uni28E5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28e6 uni28E6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28e7 uni28E7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28e8 uni28E8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28e9 uni28E9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28ea uni28EA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28eb uni28EB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28ec uni28EC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28ed uni28ED              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28ee uni28EE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28ef uni28EF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28f0 uni28F0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28f1 uni28F1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28f2 uni28F2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28f3 uni28F3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28f4 uni28F4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28f5 uni28F5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28f6 uni28F6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28f7 uni28F7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28f8 uni28F8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28f9 uni28F9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28fa uni28FA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28fb uni28FB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28fc uni28FC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28fd uni28FD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28fe uni28FE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+28ff uni28FF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2900 uni2900              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2901 uni2901              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2902 uni2902              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2903 uni2903              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2904 uni2904              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2905 uni2905              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2906 uni2906              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2907 uni2907              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2908 uni2908              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2909 uni2909              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+290a uni290A              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+290b uni290B              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+290c uni290C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+290d uni290D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+290e uni290E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+290f uni290F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2910 uni2910              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2911 uni2911              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2912 uni2912              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2913 uni2913              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2914 uni2914              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2915 uni2915              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2916 uni2916              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2917 uni2917              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2918 uni2918              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2919 uni2919              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+291a uni291A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+291b uni291B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+291c uni291C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+291d uni291D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+291e uni291E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+291f uni291F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2920 uni2920              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2921 uni2921              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2922 uni2922              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2923 uni2923              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2924 uni2924              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2925 uni2925              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2926 uni2926              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2927 uni2927              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2928 uni2928              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2929 uni2929              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+292a uni292A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+292b uni292B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+292c uni292C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+292d uni292D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+292e uni292E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+292f uni292F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2930 uni2930              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2931 uni2931              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2932 uni2932              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2933 uni2933              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2934 uni2934              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2935 uni2935              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2936 uni2936              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2937 uni2937              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2938 uni2938              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2939 uni2939              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+293a uni293A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+293b uni293B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+293c uni293C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+293d uni293D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+293e uni293E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+293f uni293F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2940 uni2940              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2941 uni2941              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2942 uni2942              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2943 uni2943              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2944 uni2944              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2945 uni2945              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2946 uni2946              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2947 uni2947              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2948 uni2948              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2949 uni2949              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+294a uni294A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+294b uni294B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+294c uni294C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+294d uni294D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+294e uni294E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+294f uni294F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2950 uni2950              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2951 uni2951              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2952 uni2952              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2953 uni2953              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2954 uni2954              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2955 uni2955              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2956 uni2956              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2957 uni2957              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2958 uni2958              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2959 uni2959              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+295a uni295A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+295b uni295B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+295c uni295C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+295d uni295D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+295e uni295E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+295f uni295F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2960 uni2960              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2961 uni2961              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2962 uni2962              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2963 uni2963              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2964 uni2964              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2965 uni2965              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2966 uni2966              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2967 uni2967              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2968 uni2968              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2969 uni2969              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+296a uni296A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+296b uni296B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+296c uni296C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+296d uni296D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+296e uni296E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+296f uni296F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2970 uni2970              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2971 uni2971              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2972 uni2972              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2973 uni2973              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2974 uni2974              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2975 uni2975              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2976 uni2976              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2977 uni2977              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2978 uni2978              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2979 uni2979              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+297a uni297A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+297b uni297B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+297c uni297C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+297d uni297D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+297e uni297E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+297f uni297F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2983 uni2983              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2984 uni2984              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+29ce uni29CE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+29cf uni29CF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+29d0 uni29D0              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+29d1 uni29D1              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+29d2 uni29D2              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+29d3 uni29D3              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+29d4 uni29D4              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+29d5 uni29D5              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+29eb uni29EB              2.2
-U+29fa uni29FA              2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+29fb uni29FB              2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+2a00 uni2A00              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a01 uni2A01              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a02 uni2A02              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a0c uni2A0C              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2a0d uni2A0D              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2a0e uni2A0E              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2a0f uni2A0F              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a10 uni2A10              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a11 uni2A11              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a12 uni2A12              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a13 uni2A13              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a14 uni2A14              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a15 uni2A15              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a16 uni2A16              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a17 uni2A17              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a18 uni2A18              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a19 uni2A19              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a1a uni2A1A              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a1b uni2A1B              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a1c uni2A1C              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a2f uni2A2F              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+2a7d uni2A7D              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a7e uni2A7E              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a7f uni2A7F              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a80 uni2A80              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a81 uni2A81              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a82 uni2A82              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a83 uni2A83              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a84 uni2A84              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a85 uni2A85              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a86 uni2A86              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a87 uni2A87              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a88 uni2A88              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a89 uni2A89              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a8a uni2A8A              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a8b uni2A8B              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a8c uni2A8C              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a8d uni2A8D              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a8e uni2A8E              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a8f uni2A8F              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a90 uni2A90              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a91 uni2A91              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a92 uni2A92              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a93 uni2A93              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a94 uni2A94              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a95 uni2A95              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a96 uni2A96              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a97 uni2A97              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a98 uni2A98              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a99 uni2A99              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a9a uni2A9A              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a9b uni2A9B              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a9c uni2A9C              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a9d uni2A9D              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a9e uni2A9E              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2a9f uni2A9F              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2aa0 uni2AA0              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2aae uni2AAE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2aaf uni2AAF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2ab0 uni2AB0              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2ab1 uni2AB1              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2ab2 uni2AB2              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2ab3 uni2AB3              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2ab4 uni2AB4              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2ab5 uni2AB5              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2ab6 uni2AB6              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2ab7 uni2AB7              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2ab8 uni2AB8              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2ab9 uni2AB9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2aba uni2ABA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2af9 uni2AF9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2afa uni2AFA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b00 uni2B00              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2b01 uni2B01              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2b02 uni2B02              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2b03 uni2B03              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2b04 uni2B04              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2b05 uni2B05              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2b06 uni2B06              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2b07 uni2B07              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2b08 uni2B08              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2b09 uni2B09              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2b0a uni2B0A              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2b0b uni2B0B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2b0c uni2B0C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2b0d uni2B0D              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2b0e uni2B0E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2b0f uni2B0F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2b10 uni2B10              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2b11 uni2B11              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2b12 uni2B12              2.3
-U+2b13 uni2B13              2.3
-U+2b14 uni2B14              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+2b15 uni2B15              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+2b16 uni2B16              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+2b17 uni2B17              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+2b18 uni2B18              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+2b19 uni2B19              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+2b1a uni2B1A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+2b1f uni2B1F              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
-U+2b20 uni2B20              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b21 uni2B21              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b22 uni2B22              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b23 uni2B23              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2b24 uni2B24              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
-U+2b53 uni2B53              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
-U+2b54 uni2B54              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
-U+2c60 uni2C60              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2c61 uni2C61              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2c62 uni2C62              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2c63 uni2C63              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2c64 uni2C64              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2c65 uni2C65              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2c66 uni2C66              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2c67 uni2C67              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2c68 uni2C68              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2c69 uni2C69              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2c6a uni2C6A              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2c6b uni2C6B              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2c6c uni2C6C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+2c6d uni2C6D              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2c6e uni2C6E              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2c6f uni2C6F              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2c71 uni2C71              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2c72 uni2C72              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2c73 uni2C73              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2c74 uni2C74              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+2c75 uni2C75              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+2c76 uni2C76              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+2c77 uni2C77              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
-U+2c79 uni2C79              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2c7a uni2C7A              2.27
-U+2c7b uni2C7B              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+2c7c uni2C7C              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2c7d uni2C7D              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+2d00 uni2D00              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d01 uni2D01              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d02 uni2D02              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d03 uni2D03              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d04 uni2D04              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d05 uni2D05              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d06 uni2D06              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d07 uni2D07              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d08 uni2D08              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d09 uni2D09              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d0a uni2D0A              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d0b uni2D0B              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d0c uni2D0C              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d0d uni2D0D              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d0e uni2D0E              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d0f uni2D0F              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d10 uni2D10              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d11 uni2D11              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d12 uni2D12              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d13 uni2D13              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d14 uni2D14              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d15 uni2D15              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d16 uni2D16              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d17 uni2D17              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d18 uni2D18              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d19 uni2D19              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d1a uni2D1A              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d1b uni2D1B              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d1c uni2D1C              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d1d uni2D1D              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d1e uni2D1E              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d1f uni2D1F              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d20 uni2D20              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d21 uni2D21              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d22 uni2D22              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d23 uni2D23              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d24 uni2D24              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d25 uni2D25              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+2d30 uni2D30              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d31 uni2D31              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d32 uni2D32              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d33 uni2D33              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d34 uni2D34              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d35 uni2D35              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d36 uni2D36              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d37 uni2D37              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d38 uni2D38              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d39 uni2D39              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d3a uni2D3A              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d3b uni2D3B              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d3c uni2D3C              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d3d uni2D3D              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d3e uni2D3E              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d3f uni2D3F              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d40 uni2D40              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d41 uni2D41              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d42 uni2D42              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d43 uni2D43              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d44 uni2D44              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d45 uni2D45              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d46 uni2D46              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d47 uni2D47              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d48 uni2D48              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d49 uni2D49              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d4a uni2D4A              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d4b uni2D4B              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d4c uni2D4C              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d4d uni2D4D              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d4e uni2D4E              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d4f uni2D4F              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d50 uni2D50              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d51 uni2D51              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d52 uni2D52              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d53 uni2D53              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d54 uni2D54              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d55 uni2D55              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d56 uni2D56              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d57 uni2D57              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d58 uni2D58              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d59 uni2D59              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d5a uni2D5A              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d5b uni2D5B              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d5c uni2D5C              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d5d uni2D5D              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d5e uni2D5E              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d5f uni2D5F              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d60 uni2D60              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d61 uni2D61              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d62 uni2D62              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d63 uni2D63              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d64 uni2D64              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d65 uni2D65              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2d6f uni2D6F              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+2e18 uni2E18              2.26
-U+2e22 uni2E22              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold)
-U+2e23 uni2E23              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold)
-U+2e24 uni2E24              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold)
-U+2e25 uni2E25              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold)
-U+2e2e uni2E2E              2.26
-U+4dc0 uni4DC0              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dc1 uni4DC1              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dc2 uni4DC2              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dc3 uni4DC3              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dc4 uni4DC4              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dc5 uni4DC5              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dc6 uni4DC6              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dc7 uni4DC7              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dc8 uni4DC8              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dc9 uni4DC9              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dca uni4DCA              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dcb uni4DCB              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dcc uni4DCC              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dcd uni4DCD              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dce uni4DCE              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dcf uni4DCF              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dd0 uni4DD0              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dd1 uni4DD1              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dd2 uni4DD2              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dd3 uni4DD3              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dd4 uni4DD4              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dd5 uni4DD5              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dd6 uni4DD6              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dd7 uni4DD7              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dd8 uni4DD8              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dd9 uni4DD9              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dda uni4DDA              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4ddb uni4DDB              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4ddc uni4DDC              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4ddd uni4DDD              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dde uni4DDE              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4ddf uni4DDF              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4de0 uni4DE0              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4de1 uni4DE1              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4de2 uni4DE2              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4de3 uni4DE3              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4de4 uni4DE4              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4de5 uni4DE5              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4de6 uni4DE6              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4de7 uni4DE7              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4de8 uni4DE8              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4de9 uni4DE9              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dea uni4DEA              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4deb uni4DEB              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dec uni4DEC              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4ded uni4DED              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dee uni4DEE              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4def uni4DEF              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4df0 uni4DF0              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4df1 uni4DF1              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4df2 uni4DF2              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4df3 uni4DF3              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4df4 uni4DF4              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4df5 uni4DF5              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4df6 uni4DF6              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4df7 uni4DF7              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4df8 uni4DF8              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4df9 uni4DF9              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dfa uni4DFA              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dfb uni4DFB              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dfc uni4DFC              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dfd uni4DFD              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dfe uni4DFE              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+4dff uni4DFF              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a644 uniA644              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+a645 uniA645              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+a646 uniA646              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+a647 uniA647              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+a64c uniA64C              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a64d uniA64D              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a650 uniA650              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+a651 uniA651              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+a654 uniA654              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+a655 uniA655              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+a656 uniA656              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+a657 uniA657              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+a662 uniA662              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a663 uniA663              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a664 uniA664              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a665 uniA665              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a666 uniA666              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a667 uniA667              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a668 uniA668              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a669 uniA669              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a66a uniA66A              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a66b uniA66B              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a66c uniA66C              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a66d uniA66D              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a66e uniA66E              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a68a uniA68A              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a68b uniA68B              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a68c uniA68C              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a68d uniA68D              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a694 uniA694              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a695 uniA695              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a708 uniA708              2.27
-U+a709 uniA709              2.27
-U+a70a uniA70A              2.27
-U+a70b uniA70B              2.27
-U+a70c uniA70C              2.27
-U+a70d uniA70D              2.27
-U+a70e uniA70E              2.27
-U+a70f uniA70F              2.27
-U+a710 uniA710              2.27
-U+a711 uniA711              2.27
-U+a712 uniA712              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+a713 uniA713              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+a714 uniA714              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+a715 uniA715              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+a716 uniA716              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+a71b uniA71B              2.27
-U+a71c uniA71C              2.27
-U+a71d uniA71D              2.27
-U+a71e uniA71E              2.27
-U+a71f uniA71F              2.27
-U+a726 uniA726              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+a727 uniA727              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
-U+a728 uniA728              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a729 uniA729              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a72a uniA72A              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a72b uniA72B              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a730 uniA730              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a731 uniA731              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a732 uniA732              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a733 uniA733              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a734 uniA734              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a735 uniA735              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a736 uniA736              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a737 uniA737              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a738 uniA738              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a739 uniA739              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a73a uniA73A              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a73b uniA73B              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a73c uniA73C              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a73d uniA73D              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a73e uniA73E              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a73f uniA73F              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a746 uniA746              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a747 uniA747              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a748 uniA748              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a749 uniA749              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a74a uniA74A              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a74b uniA74B              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a74e uniA74E              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a74f uniA74F              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a780 uniA780              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a781 uniA781              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a782 uniA782              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a783 uniA783              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+a789 uniA789              2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+a78a uniA78A              2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
-U+a78b uniA78B              2.26
-U+a78c uniA78C              2.26
-U+a7fb uniA7FB              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a7fc uniA7FC              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a7fd uniA7FD              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a7fe uniA7FE              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+a7ff uniA7FF              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+e000 uniE000              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+e001 uniE001              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+e002 uniE002              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+e003 uniE003              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+e004 uniE004              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+e005 uniE005              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+e006 uniE006              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+e007 uniE007              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+e008 uniE008              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
-U+e009 uniE009              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+e00a uniE00A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+e00b uniE00B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+e00c uniE00C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+e00d uniE00D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+e00e uniE00E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+e00f uniE00F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+e010 uniE010              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+e011 uniE011              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+e012 uniE012              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+e013 uniE013              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+e014 uniE014              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
-U+e015 uniE015              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+e016 uniE016              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+e017 uniE017              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+e018 uniE018              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+e019 uniE019              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+e01a uniE01A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+e01b uniE01B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+e01c uniE01C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+e01d uniE01D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+f000 uniF000              2.10 (Sans) 2.11 (Sans Condensed)
-U+f001 uniF001              2.10 (Sans) 2.11 (Sans Condensed)
-U+f208 uniF208              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+f20a uniF20A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+f215 uniF215              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+f216 uniF216              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+f217 uniF217              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+f21a uniF21A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+f21b uniF21B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+f25f uniF25F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+f400 uniF400              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f401 uniF401              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f402 uniF402              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f403 uniF403              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f404 uniF404              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f405 uniF405              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f406 uniF406              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f407 uniF407              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f408 uniF408              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f409 uniF409              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f40a uniF40A              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f40b uniF40B              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f40c uniF40C              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f40d uniF40D              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f40e uniF40E              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f40f uniF40F              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f410 uniF410              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f411 uniF411              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f412 uniF412              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f413 uniF413              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f414 uniF414              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f415 uniF415              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f416 uniF416              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f417 uniF417              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f418 uniF418              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f419 uniF419              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f41a uniF41A              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f41b uniF41B              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f41c uniF41C              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f41d uniF41D              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f41e uniF41E              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f41f uniF41F              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f420 uniF420              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f421 uniF421              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f422 uniF422              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f423 uniF423              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f424 uniF424              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f425 uniF425              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f426 uniF426              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f428 uniF428              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed)
-U+f5c5 uniF5C5              2.9 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+f6c4 uniF6C4              2.10 (Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
-U+f6c5 uniF6C5              2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.9 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
-U+f6c6 uniF6C6              2.5 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+f6c7 uniF6C7              2.11 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+f6c8 uniF6C8              2.11 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+f6d1 cyrBreve             2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+f6d4 cyrbreve             2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fb00 uniFB00              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fb01 fi                   original
-U+fb02 fl                   original
-U+fb03 uniFB03              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fb04 uniFB04              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fb05 uniFB05              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fb06 uniFB06              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fb13 uniFB13              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb14 uniFB14              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb15 uniFB15              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb16 uniFB16              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb17 uniFB17              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb1d uniFB1D              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb1e uniFB1E              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+fb1f uniFB1F              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb20 uniFB20              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb21 uniFB21              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+fb22 uniFB22              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+fb23 uniFB23              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+fb24 uniFB24              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+fb25 uniFB25              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+fb26 uniFB26              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+fb27 uniFB27              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+fb28 uniFB28              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+fb29 uniFB29              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+fb2a uniFB2A              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb2b uniFB2B              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb2c uniFB2C              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb2d uniFB2D              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb2e uniFB2E              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb2f uniFB2F              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb30 uniFB30              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb31 uniFB31              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb32 uniFB32              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb33 uniFB33              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb34 uniFB34              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb35 uniFB35              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb36 uniFB36              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb37 uniFB37              2.11 (Sans Condensed Oblique, Sans Oblique)
-U+fb38 uniFB38              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb39 uniFB39              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb3a uniFB3A              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb3b uniFB3B              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb3c uniFB3C              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb3e uniFB3E              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb40 uniFB40              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb41 uniFB41              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb43 uniFB43              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb44 uniFB44              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb46 uniFB46              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb47 uniFB47              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb48 uniFB48              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb49 uniFB49              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb4a uniFB4A              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb4b uniFB4B              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb4c uniFB4C              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb4d uniFB4D              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb4e uniFB4E              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fb4f uniFB4F              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
-U+fb52 uniFB52              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb53 uniFB53              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb54 uniFB54              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb55 uniFB55              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb56 uniFB56              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb57 uniFB57              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb58 uniFB58              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb59 uniFB59              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb5a uniFB5A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb5b uniFB5B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb5c uniFB5C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb5d uniFB5D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb5e uniFB5E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb5f uniFB5F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb60 uniFB60              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb61 uniFB61              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb62 uniFB62              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb63 uniFB63              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb64 uniFB64              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb65 uniFB65              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb66 uniFB66              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb67 uniFB67              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb68 uniFB68              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb69 uniFB69              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb6a uniFB6A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb6b uniFB6B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb6c uniFB6C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb6d uniFB6D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb6e uniFB6E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb6f uniFB6F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb70 uniFB70              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb71 uniFB71              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb72 uniFB72              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb73 uniFB73              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb74 uniFB74              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb75 uniFB75              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb76 uniFB76              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb77 uniFB77              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb78 uniFB78              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb79 uniFB79              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb7a uniFB7A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb7b uniFB7B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb7c uniFB7C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb7d uniFB7D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb7e uniFB7E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb7f uniFB7F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb80 uniFB80              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb81 uniFB81              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb8a uniFB8A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb8b uniFB8B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb8c uniFB8C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb8d uniFB8D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb8e uniFB8E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb8f uniFB8F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb90 uniFB90              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb91 uniFB91              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb92 uniFB92              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb93 uniFB93              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb94 uniFB94              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb95 uniFB95              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb9e uniFB9E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fb9f uniFB9F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fbaa uniFBAA              2.16 (Sans Mono, Sans Mono Bold)
-U+fbab uniFBAB              2.16 (Sans Mono, Sans Mono Bold)
-U+fbac uniFBAC              2.16 (Sans Mono, Sans Mono Bold)
-U+fbad uniFBAD              2.16 (Sans Mono, Sans Mono Bold)
-U+fbd9 uniFBD9              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+fbda uniFBDA              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
-U+fbe8 uniFBE8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fbe9 uniFBE9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fbfc uniFBFC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fbfd uniFBFD              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fbfe uniFBFE              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fbff uniFBFF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe00 uniFE00              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fe01 uniFE01              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fe02 uniFE02              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fe03 uniFE03              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fe04 uniFE04              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fe05 uniFE05              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fe06 uniFE06              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fe07 uniFE07              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fe08 uniFE08              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fe09 uniFE09              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fe0a uniFE0A              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fe0b uniFE0B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fe0c uniFE0C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fe0d uniFE0D              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fe0e uniFE0E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fe0f uniFE0F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fe20 uniFE20              2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fe21 uniFE21              2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fe22 uniFE22              2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fe23 uniFE23              2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+fe70 uniFE70              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe71 uniFE71              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe72 uniFE72              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe73 uniFE73              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe74 uniFE74              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe76 uniFE76              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe77 uniFE77              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe78 uniFE78              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe79 uniFE79              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe7a uniFE7A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe7b uniFE7B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe7c uniFE7C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe7d uniFE7D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe7e uniFE7E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe7f uniFE7F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe80 uniFE80              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe81 uniFE81              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe82 uniFE82              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe83 uniFE83              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe84 uniFE84              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe85 uniFE85              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe86 uniFE86              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe87 uniFE87              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe88 uniFE88              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe89 uniFE89              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe8a uniFE8A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe8b uniFE8B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe8c uniFE8C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe8d uniFE8D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe8e uniFE8E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe8f uniFE8F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe90 uniFE90              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe91 uniFE91              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe92 uniFE92              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe93 uniFE93              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe94 uniFE94              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe95 uniFE95              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe96 uniFE96              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe97 uniFE97              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe98 uniFE98              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe99 uniFE99              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe9a uniFE9A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe9b uniFE9B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe9c uniFE9C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe9d uniFE9D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe9e uniFE9E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fe9f uniFE9F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fea0 uniFEA0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fea1 uniFEA1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fea2 uniFEA2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fea3 uniFEA3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fea4 uniFEA4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fea5 uniFEA5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fea6 uniFEA6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fea7 uniFEA7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fea8 uniFEA8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fea9 uniFEA9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feaa uniFEAA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feab uniFEAB              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feac uniFEAC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fead uniFEAD              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feae uniFEAE              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feaf uniFEAF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feb0 uniFEB0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feb1 uniFEB1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feb2 uniFEB2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feb3 uniFEB3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feb4 uniFEB4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feb5 uniFEB5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feb6 uniFEB6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feb7 uniFEB7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feb8 uniFEB8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feb9 uniFEB9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feba uniFEBA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+febb uniFEBB              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+febc uniFEBC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+febd uniFEBD              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+febe uniFEBE              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+febf uniFEBF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fec0 uniFEC0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fec1 uniFEC1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fec2 uniFEC2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fec3 uniFEC3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fec4 uniFEC4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fec5 uniFEC5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fec6 uniFEC6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fec7 uniFEC7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fec8 uniFEC8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fec9 uniFEC9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feca uniFECA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fecb uniFECB              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fecc uniFECC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fecd uniFECD              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fece uniFECE              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fecf uniFECF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fed0 uniFED0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fed1 uniFED1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fed2 uniFED2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fed3 uniFED3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fed4 uniFED4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fed5 uniFED5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fed6 uniFED6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fed7 uniFED7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fed8 uniFED8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fed9 uniFED9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feda uniFEDA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fedb uniFEDB              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fedc uniFEDC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fedd uniFEDD              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fede uniFEDE              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fedf uniFEDF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fee0 uniFEE0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fee1 uniFEE1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fee2 uniFEE2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fee3 uniFEE3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fee4 uniFEE4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fee5 uniFEE5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fee6 uniFEE6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fee7 uniFEE7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fee8 uniFEE8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fee9 uniFEE9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feea uniFEEA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feeb uniFEEB              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feec uniFEEC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feed uniFEED              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feee uniFEEE              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feef uniFEEF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fef0 uniFEF0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fef1 uniFEF1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fef2 uniFEF2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fef3 uniFEF3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fef4 uniFEF4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fef5 uniFEF5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fef6 uniFEF6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fef7 uniFEF7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fef8 uniFEF8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fef9 uniFEF9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fefa uniFEFA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fefb uniFEFB              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fefc uniFEFC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+feff uniFEFF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
-U+fff9 uniFFF9              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fffa uniFFFA              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fffb uniFFFB              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fffc uniFFFC              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
-U+fffd uniFFFD              1.12
-U+1d300 u1D300               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d301 u1D301               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d302 u1D302               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d303 u1D303               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d304 u1D304               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d305 u1D305               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d306 u1D306               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d307 u1D307               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d308 u1D308               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d309 u1D309               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d30a u1D30A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d30b u1D30B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d30c u1D30C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d30d u1D30D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d30e u1D30E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d30f u1D30F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d310 u1D310               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d311 u1D311               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d312 u1D312               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d313 u1D313               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d314 u1D314               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d315 u1D315               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d316 u1D316               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d317 u1D317               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d318 u1D318               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d319 u1D319               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d31a u1D31A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d31b u1D31B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d31c u1D31C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d31d u1D31D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d31e u1D31E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d31f u1D31F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d320 u1D320               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d321 u1D321               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d322 u1D322               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d323 u1D323               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d324 u1D324               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d325 u1D325               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d326 u1D326               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d327 u1D327               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d328 u1D328               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d329 u1D329               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d32a u1D32A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d32b u1D32B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d32c u1D32C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d32d u1D32D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d32e u1D32E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d32f u1D32F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d330 u1D330               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d331 u1D331               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d332 u1D332               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d333 u1D333               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d334 u1D334               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d335 u1D335               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d336 u1D336               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d337 u1D337               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d338 u1D338               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d339 u1D339               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d33a u1D33A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d33b u1D33B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d33c u1D33C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d33d u1D33D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d33e u1D33E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d33f u1D33F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d340 u1D340               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d341 u1D341               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d342 u1D342               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d343 u1D343               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d344 u1D344               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d345 u1D345               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d346 u1D346               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d347 u1D347               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d348 u1D348               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d349 u1D349               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d34a u1D34A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d34b u1D34B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d34c u1D34C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d34d u1D34D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d34e u1D34E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d34f u1D34F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d350 u1D350               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d351 u1D351               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d352 u1D352               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d353 u1D353               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d354 u1D354               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d355 u1D355               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d356 u1D356               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
-U+1d400 u1D400               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d401 u1D401               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d402 u1D402               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d403 u1D403               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d404 u1D404               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d405 u1D405               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d406 u1D406               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d407 u1D407               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d408 u1D408               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d409 u1D409               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d40a u1D40A               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d40b u1D40B               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d40c u1D40C               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d40d u1D40D               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d40e u1D40E               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d40f u1D40F               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d410 u1D410               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d411 u1D411               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d412 u1D412               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d413 u1D413               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d414 u1D414               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d415 u1D415               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d416 u1D416               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d417 u1D417               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d418 u1D418               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d419 u1D419               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d41a u1D41A               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d41b u1D41B               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d41c u1D41C               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d41d u1D41D               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d41e u1D41E               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d41f u1D41F               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d420 u1D420               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d421 u1D421               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d422 u1D422               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d423 u1D423               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d424 u1D424               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d425 u1D425               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d426 u1D426               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d427 u1D427               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d428 u1D428               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d429 u1D429               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d42a u1D42A               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d42b u1D42B               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d42c u1D42C               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d42d u1D42D               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d42e u1D42E               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d42f u1D42F               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d430 u1D430               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d431 u1D431               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d432 u1D432               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d433 u1D433               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d434 u1D434               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d435 u1D435               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d436 u1D436               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d437 u1D437               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d438 u1D438               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d439 u1D439               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d43a u1D43A               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d43b u1D43B               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d43c u1D43C               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d43d u1D43D               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d43e u1D43E               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d43f u1D43F               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d440 u1D440               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d441 u1D441               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d442 u1D442               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d443 u1D443               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d444 u1D444               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d445 u1D445               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d446 u1D446               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d447 u1D447               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d448 u1D448               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d449 u1D449               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d44a u1D44A               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d44b u1D44B               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d44c u1D44C               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d44d u1D44D               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d44e u1D44E               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d44f u1D44F               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d450 u1D450               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d451 u1D451               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d452 u1D452               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d453 u1D453               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d454 u1D454               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d456 u1D456               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d457 u1D457               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d458 u1D458               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d459 u1D459               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d45a u1D45A               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d45b u1D45B               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d45c u1D45C               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d45d u1D45D               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d45e u1D45E               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d45f u1D45F               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d460 u1D460               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d461 u1D461               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d462 u1D462               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d463 u1D463               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d464 u1D464               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d465 u1D465               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d466 u1D466               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d467 u1D467               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d468 u1D468               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d469 u1D469               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d46a u1D46A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d46b u1D46B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d46c u1D46C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d46d u1D46D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d46e u1D46E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d46f u1D46F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d470 u1D470               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d471 u1D471               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d472 u1D472               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d473 u1D473               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d474 u1D474               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d475 u1D475               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d476 u1D476               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d477 u1D477               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d478 u1D478               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d479 u1D479               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d47a u1D47A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d47b u1D47B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d47c u1D47C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d47d u1D47D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d47e u1D47E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d47f u1D47F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d480 u1D480               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d481 u1D481               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d482 u1D482               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d483 u1D483               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d484 u1D484               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d485 u1D485               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d486 u1D486               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d487 u1D487               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d488 u1D488               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d489 u1D489               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d48a u1D48A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d48b u1D48B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d48c u1D48C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d48d u1D48D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d48e u1D48E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d48f u1D48F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d490 u1D490               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d491 u1D491               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d492 u1D492               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d493 u1D493               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d494 u1D494               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d495 u1D495               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d496 u1D496               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d497 u1D497               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d498 u1D498               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d499 u1D499               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d49a u1D49A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d49b u1D49B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d538 u1D538               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d539 u1D539               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d53b u1D53B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d53c u1D53C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d53d u1D53D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d53e u1D53E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d540 u1D540               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d541 u1D541               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d542 u1D542               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d543 u1D543               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d544 u1D544               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d546 u1D546               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d54a u1D54A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d54b u1D54B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d54c u1D54C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d54d u1D54D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d54e u1D54E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d54f u1D54F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d550 u1D550               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d552 u1D552               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d553 u1D553               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d554 u1D554               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d555 u1D555               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d556 u1D556               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d557 u1D557               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d558 u1D558               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d559 u1D559               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d55a u1D55A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d55b u1D55B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d55c u1D55C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d55d u1D55D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d55e u1D55E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d55f u1D55F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d560 u1D560               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d561 u1D561               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d562 u1D562               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d563 u1D563               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d564 u1D564               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d565 u1D565               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d566 u1D566               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d567 u1D567               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d568 u1D568               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d569 u1D569               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d56a u1D56A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d56b u1D56B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
-U+1d5a0 u1D5A0               2.23 (Sans, Sans Condensed)
-U+1d5a1 u1D5A1               2.23 (Sans, Sans Condensed)
-U+1d5a2 u1D5A2               2.23 (Sans, Sans Condensed)
-U+1d5a3 u1D5A3               2.23 (Sans, Sans Condensed)
-U+1d5a4 u1D5A4               2.23 (Sans, Sans Condensed)
-U+1d5a5 u1D5A5               2.23 (Sans, Sans Condensed)
-U+1d5a6 u1D5A6               2.23 (Sans, Sans Condensed)
-U+1d5a7 u1D5A7               2.23 (Sans, Sans Condensed)
-U+1d5a8 u1D5A8               2.23 (Sans, Sans Condensed)
-U+1d5a9 u1D5A9               2.23 (Sans, Sans Condensed)
-U+1d5aa u1D5AA               2.23 (Sans, Sans Condensed)
-U+1d5ab u1D5AB               2.23 (Sans, Sans Condensed)
-U+1d5ac u1D5AC               2.23 (Sans, Sans Condensed)
-U+1d5ad u1D5AD               2.23 (Sans, Sans Condensed)
-U+1d5ae u1D5AE               2.23 (Sans, Sans Condensed)
-U+1d5af u1D5AF               2.23 (Sans, Sans Condensed)
-U+1d5b0 u1D5B0               2.23 (Sans, Sans Condensed)
-U+1d5b1 u1D5B1               2.23 (Sans, Sans Condensed)
-U+1d5b2 u1D5B2               2.23 (Sans, Sans Condensed)
-U+1d5b3 u1D5B3               2.23 (Sans, Sans Condensed)
-U+1d5b4 u1D5B4               2.23 (Sans, Sans Condensed)
-U+1d5b5 u1D5B5               2.23 (Sans, Sans Condensed)
-U+1d5b6 u1D5B6               2.23 (Sans, Sans Condensed)
-U+1d5b7 u1D5B7               2.23 (Sans, Sans Condensed)
-U+1d5b8 u1D5B8               2.23 (Sans, Sans Condensed)
-U+1d5b9 u1D5B9               2.23 (Sans, Sans Condensed)
-U+1d5ba u1D5BA               2.23 (Sans, Sans Condensed)
-U+1d5bb u1D5BB               2.23 (Sans, Sans Condensed)
-U+1d5bc u1D5BC               2.23 (Sans, Sans Condensed)
-U+1d5bd u1D5BD               2.23 (Sans, Sans Condensed)
-U+1d5be u1D5BE               2.23 (Sans, Sans Condensed)
-U+1d5bf u1D5BF               2.23 (Sans, Sans Condensed)
-U+1d5c0 u1D5C0               2.23 (Sans, Sans Condensed)
-U+1d5c1 u1D5C1               2.23 (Sans, Sans Condensed)
-U+1d5c2 u1D5C2               2.23 (Sans, Sans Condensed)
-U+1d5c3 u1D5C3               2.23 (Sans, Sans Condensed)
-U+1d5c4 u1D5C4               2.23 (Sans, Sans Condensed)
-U+1d5c5 u1D5C5               2.23 (Sans, Sans Condensed)
-U+1d5c6 u1D5C6               2.23 (Sans, Sans Condensed)
-U+1d5c7 u1D5C7               2.23 (Sans, Sans Condensed)
-U+1d5c8 u1D5C8               2.23 (Sans, Sans Condensed)
-U+1d5c9 u1D5C9               2.23 (Sans, Sans Condensed)
-U+1d5ca u1D5CA               2.23 (Sans, Sans Condensed)
-U+1d5cb u1D5CB               2.23 (Sans, Sans Condensed)
-U+1d5cc u1D5CC               2.23 (Sans, Sans Condensed)
-U+1d5cd u1D5CD               2.23 (Sans, Sans Condensed)
-U+1d5ce u1D5CE               2.23 (Sans, Sans Condensed)
-U+1d5cf u1D5CF               2.23 (Sans, Sans Condensed)
-U+1d5d0 u1D5D0               2.23 (Sans, Sans Condensed)
-U+1d5d1 u1D5D1               2.23 (Sans, Sans Condensed)
-U+1d5d2 u1D5D2               2.23 (Sans, Sans Condensed)
-U+1d5d3 u1D5D3               2.23 (Sans, Sans Condensed)
-U+1d5d4 u1D5D4               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5d5 u1D5D5               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5d6 u1D5D6               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5d7 u1D5D7               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5d8 u1D5D8               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5d9 u1D5D9               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5da u1D5DA               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5db u1D5DB               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5dc u1D5DC               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5dd u1D5DD               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5de u1D5DE               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5df u1D5DF               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5e0 u1D5E0               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5e1 u1D5E1               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5e2 u1D5E2               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5e3 u1D5E3               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5e4 u1D5E4               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5e5 u1D5E5               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5e6 u1D5E6               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5e7 u1D5E7               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5e8 u1D5E8               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5e9 u1D5E9               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5ea u1D5EA               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5eb u1D5EB               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5ec u1D5EC               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5ed u1D5ED               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5ee u1D5EE               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5ef u1D5EF               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5f0 u1D5F0               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5f1 u1D5F1               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5f2 u1D5F2               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5f3 u1D5F3               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5f4 u1D5F4               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5f5 u1D5F5               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5f6 u1D5F6               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5f7 u1D5F7               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5f8 u1D5F8               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5f9 u1D5F9               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5fa u1D5FA               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5fb u1D5FB               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5fc u1D5FC               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5fd u1D5FD               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5fe u1D5FE               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d5ff u1D5FF               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d600 u1D600               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d601 u1D601               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d602 u1D602               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d603 u1D603               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d604 u1D604               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d605 u1D605               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d606 u1D606               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d607 u1D607               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d608 u1D608               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d609 u1D609               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d60a u1D60A               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d60b u1D60B               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d60c u1D60C               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d60d u1D60D               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d60e u1D60E               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d60f u1D60F               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d610 u1D610               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d611 u1D611               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d612 u1D612               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d613 u1D613               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d614 u1D614               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d615 u1D615               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d616 u1D616               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d617 u1D617               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d618 u1D618               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d619 u1D619               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d61a u1D61A               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d61b u1D61B               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d61c u1D61C               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d61d u1D61D               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d61e u1D61E               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d61f u1D61F               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d620 u1D620               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d621 u1D621               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d622 u1D622               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d623 u1D623               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d624 u1D624               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d625 u1D625               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d626 u1D626               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d627 u1D627               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d628 u1D628               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d629 u1D629               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d62a u1D62A               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d62b u1D62B               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d62c u1D62C               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d62d u1D62D               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d62e u1D62E               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d62f u1D62F               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d630 u1D630               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d631 u1D631               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d632 u1D632               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d633 u1D633               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d634 u1D634               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d635 u1D635               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d636 u1D636               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d637 u1D637               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d638 u1D638               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d639 u1D639               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d63a u1D63A               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d63b u1D63B               2.23 (Sans Condensed Oblique, Sans Oblique)
-U+1d63c u1D63C               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d63d u1D63D               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d63e u1D63E               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d63f u1D63F               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d640 u1D640               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d641 u1D641               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d642 u1D642               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d643 u1D643               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d644 u1D644               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d645 u1D645               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d646 u1D646               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d647 u1D647               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d648 u1D648               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d649 u1D649               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d64a u1D64A               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d64b u1D64B               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d64c u1D64C               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d64d u1D64D               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d64e u1D64E               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d64f u1D64F               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d650 u1D650               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d651 u1D651               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d652 u1D652               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d653 u1D653               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d654 u1D654               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d655 u1D655               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d656 u1D656               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d657 u1D657               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d658 u1D658               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d659 u1D659               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d65a u1D65A               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d65b u1D65B               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d65c u1D65C               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d65d u1D65D               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d65e u1D65E               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d65f u1D65F               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d660 u1D660               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d661 u1D661               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d662 u1D662               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d663 u1D663               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d664 u1D664               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d665 u1D665               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d666 u1D666               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d667 u1D667               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d668 u1D668               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d669 u1D669               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d66a u1D66A               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d66b u1D66B               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d66c u1D66C               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d66d u1D66D               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d66e u1D66E               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d66f u1D66F               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d670 u1D670               2.23 (Sans Mono)
-U+1d671 u1D671               2.23 (Sans Mono)
-U+1d672 u1D672               2.23 (Sans Mono)
-U+1d673 u1D673               2.23 (Sans Mono)
-U+1d674 u1D674               2.23 (Sans Mono)
-U+1d675 u1D675               2.23 (Sans Mono)
-U+1d676 u1D676               2.23 (Sans Mono)
-U+1d677 u1D677               2.23 (Sans Mono)
-U+1d678 u1D678               2.23 (Sans Mono)
-U+1d679 u1D679               2.23 (Sans Mono)
-U+1d67a u1D67A               2.23 (Sans Mono)
-U+1d67b u1D67B               2.23 (Sans Mono)
-U+1d67c u1D67C               2.23 (Sans Mono)
-U+1d67d u1D67D               2.23 (Sans Mono)
-U+1d67e u1D67E               2.23 (Sans Mono)
-U+1d67f u1D67F               2.23 (Sans Mono)
-U+1d680 u1D680               2.23 (Sans Mono)
-U+1d681 u1D681               2.23 (Sans Mono)
-U+1d682 u1D682               2.23 (Sans Mono)
-U+1d683 u1D683               2.23 (Sans Mono)
-U+1d684 u1D684               2.23 (Sans Mono)
-U+1d685 u1D685               2.23 (Sans Mono)
-U+1d686 u1D686               2.23 (Sans Mono)
-U+1d687 u1D687               2.23 (Sans Mono)
-U+1d688 u1D688               2.23 (Sans Mono)
-U+1d689 u1D689               2.23 (Sans Mono)
-U+1d68a u1D68A               2.23 (Sans Mono)
-U+1d68b u1D68B               2.23 (Sans Mono)
-U+1d68c u1D68C               2.23 (Sans Mono)
-U+1d68d u1D68D               2.23 (Sans Mono)
-U+1d68e u1D68E               2.23 (Sans Mono)
-U+1d68f u1D68F               2.23 (Sans Mono)
-U+1d690 u1D690               2.23 (Sans Mono)
-U+1d691 u1D691               2.23 (Sans Mono)
-U+1d692 u1D692               2.23 (Sans Mono)
-U+1d693 u1D693               2.23 (Sans Mono)
-U+1d694 u1D694               2.23 (Sans Mono)
-U+1d695 u1D695               2.23 (Sans Mono)
-U+1d696 u1D696               2.23 (Sans Mono)
-U+1d697 u1D697               2.23 (Sans Mono)
-U+1d698 u1D698               2.23 (Sans Mono)
-U+1d699 u1D699               2.23 (Sans Mono)
-U+1d69a u1D69A               2.23 (Sans Mono)
-U+1d69b u1D69B               2.23 (Sans Mono)
-U+1d69c u1D69C               2.23 (Sans Mono)
-U+1d69d u1D69D               2.23 (Sans Mono)
-U+1d69e u1D69E               2.23 (Sans Mono)
-U+1d69f u1D69F               2.23 (Sans Mono)
-U+1d6a0 u1D6A0               2.23 (Sans Mono)
-U+1d6a1 u1D6A1               2.23 (Sans Mono)
-U+1d6a2 u1D6A2               2.23 (Sans Mono)
-U+1d6a3 u1D6A3               2.23 (Sans Mono)
-U+1d6a4 u1D6A4               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6a5 u1D6A5               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6a8 u1D6A8               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6a9 u1D6A9               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6aa u1D6AA               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6ab u1D6AB               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6ac u1D6AC               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6ad u1D6AD               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6ae u1D6AE               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6af u1D6AF               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6b0 u1D6B0               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6b1 u1D6B1               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6b2 u1D6B2               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6b3 u1D6B3               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6b4 u1D6B4               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6b5 u1D6B5               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6b6 u1D6B6               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6b7 u1D6B7               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6b8 u1D6B8               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6b9 u1D6B9               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6ba u1D6BA               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6bb u1D6BB               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6bc u1D6BC               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6bd u1D6BD               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6be u1D6BE               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6bf u1D6BF               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6c0 u1D6C0               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6c1 u1D6C1               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6c2 u1D6C2               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6c3 u1D6C3               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6c4 u1D6C4               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6c5 u1D6C5               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6c6 u1D6C6               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6c7 u1D6C7               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6c8 u1D6C8               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6c9 u1D6C9               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6ca u1D6CA               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6cb u1D6CB               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6cc u1D6CC               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6cd u1D6CD               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6ce u1D6CE               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6cf u1D6CF               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6d0 u1D6D0               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6d1 u1D6D1               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6d2 u1D6D2               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6d3 u1D6D3               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6d4 u1D6D4               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6d5 u1D6D5               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6d6 u1D6D6               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6d7 u1D6D7               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6d8 u1D6D8               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6d9 u1D6D9               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6da u1D6DA               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6db u1D6DB               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6dc u1D6DC               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6dd u1D6DD               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6de u1D6DE               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6df u1D6DF               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6e0 u1D6E0               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6e1 u1D6E1               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d6e2 u1D6E2               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6e3 u1D6E3               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6e4 u1D6E4               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6e5 u1D6E5               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6e6 u1D6E6               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6e7 u1D6E7               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6e8 u1D6E8               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6e9 u1D6E9               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6ea u1D6EA               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6eb u1D6EB               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6ec u1D6EC               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6ed u1D6ED               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6ee u1D6EE               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6ef u1D6EF               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6f0 u1D6F0               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6f1 u1D6F1               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6f2 u1D6F2               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6f3 u1D6F3               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6f4 u1D6F4               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6f5 u1D6F5               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6f6 u1D6F6               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6f7 u1D6F7               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6f8 u1D6F8               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6f9 u1D6F9               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6fa u1D6FA               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6fb u1D6FB               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6fc u1D6FC               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6fd u1D6FD               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6fe u1D6FE               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d6ff u1D6FF               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d700 u1D700               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d701 u1D701               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d702 u1D702               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d703 u1D703               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d704 u1D704               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d705 u1D705               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d706 u1D706               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d707 u1D707               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d708 u1D708               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d709 u1D709               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d70a u1D70A               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d70b u1D70B               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d70c u1D70C               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d70d u1D70D               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d70e u1D70E               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d70f u1D70F               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d710 u1D710               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d711 u1D711               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d712 u1D712               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d713 u1D713               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d714 u1D714               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d715 u1D715               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d716 u1D716               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d717 u1D717               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d718 u1D718               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d719 u1D719               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d71a u1D71A               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d71b u1D71B               2.23 (Serif Italic, Serif Italic Condensed)
-U+1d71c u1D71C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d71d u1D71D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d71e u1D71E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d71f u1D71F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d720 u1D720               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d721 u1D721               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d722 u1D722               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d723 u1D723               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d724 u1D724               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d725 u1D725               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d726 u1D726               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d727 u1D727               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d728 u1D728               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d729 u1D729               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d72a u1D72A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d72b u1D72B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d72c u1D72C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d72d u1D72D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d72e u1D72E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d72f u1D72F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d730 u1D730               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d731 u1D731               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d732 u1D732               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d733 u1D733               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d734 u1D734               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d735 u1D735               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d736 u1D736               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d737 u1D737               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d738 u1D738               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d739 u1D739               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d73a u1D73A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d73b u1D73B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d73c u1D73C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d73d u1D73D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d73e u1D73E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d73f u1D73F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d740 u1D740               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d741 u1D741               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d742 u1D742               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d743 u1D743               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d744 u1D744               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d745 u1D745               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d746 u1D746               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d747 u1D747               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d748 u1D748               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d749 u1D749               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d74a u1D74A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d74b u1D74B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d74c u1D74C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d74d u1D74D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d74e u1D74E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d74f u1D74F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d750 u1D750               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d751 u1D751               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d752 u1D752               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d753 u1D753               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d754 u1D754               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d755 u1D755               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
-U+1d756 u1D756               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d757 u1D757               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d758 u1D758               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d759 u1D759               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d75a u1D75A               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d75b u1D75B               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d75c u1D75C               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d75d u1D75D               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d75e u1D75E               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d75f u1D75F               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d760 u1D760               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d761 u1D761               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d762 u1D762               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d763 u1D763               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d764 u1D764               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d765 u1D765               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d766 u1D766               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d767 u1D767               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d768 u1D768               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d769 u1D769               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d76a u1D76A               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d76b u1D76B               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d76c u1D76C               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d76d u1D76D               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d76e u1D76E               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d76f u1D76F               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d770 u1D770               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d771 u1D771               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d772 u1D772               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d773 u1D773               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d774 u1D774               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d775 u1D775               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d776 u1D776               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d777 u1D777               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d778 u1D778               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d779 u1D779               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d77a u1D77A               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d77b u1D77B               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d77c u1D77C               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d77d u1D77D               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d77e u1D77E               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d77f u1D77F               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d780 u1D780               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d781 u1D781               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d782 u1D782               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d783 u1D783               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d784 u1D784               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d785 u1D785               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d786 u1D786               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d787 u1D787               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d788 u1D788               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d789 u1D789               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d78a u1D78A               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d78b u1D78B               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d78c u1D78C               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d78d u1D78D               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d78e u1D78E               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d78f u1D78F               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d790 u1D790               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d791 u1D791               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d792 u1D792               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d793 u1D793               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d794 u1D794               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d795 u1D795               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d796 u1D796               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d797 u1D797               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d798 u1D798               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d799 u1D799               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d79a u1D79A               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d79b u1D79B               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d79c u1D79C               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d79d u1D79D               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d79e u1D79E               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d79f u1D79F               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7a0 u1D7A0               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7a1 u1D7A1               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7a2 u1D7A2               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7a3 u1D7A3               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7a4 u1D7A4               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7a5 u1D7A5               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7a6 u1D7A6               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7a7 u1D7A7               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7a8 u1D7A8               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7a9 u1D7A9               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7aa u1D7AA               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7ab u1D7AB               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7ac u1D7AC               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7ad u1D7AD               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7ae u1D7AE               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7af u1D7AF               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7b0 u1D7B0               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7b1 u1D7B1               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7b2 u1D7B2               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7b3 u1D7B3               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7b4 u1D7B4               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7b5 u1D7B5               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7b6 u1D7B6               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7b7 u1D7B7               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7b8 u1D7B8               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7b9 u1D7B9               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7ba u1D7BA               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7bb u1D7BB               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7bc u1D7BC               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7bd u1D7BD               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7be u1D7BE               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7bf u1D7BF               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7c0 u1D7C0               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7c1 u1D7C1               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7c2 u1D7C2               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7c3 u1D7C3               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7c4 u1D7C4               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7c5 u1D7C5               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7c6 u1D7C6               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7c7 u1D7C7               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7c8 u1D7C8               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7c9 u1D7C9               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
-U+1d7ca u1D7CA               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d7cb u1D7CB               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d7ce u1D7CE               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d7cf u1D7CF               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d7d0 u1D7D0               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d7d1 u1D7D1               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d7d2 u1D7D2               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d7d3 u1D7D3               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d7d4 u1D7D4               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d7d5 u1D7D5               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d7d6 u1D7D6               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d7d7 u1D7D7               2.23 (Serif Bold, Serif Condensed Bold)
-U+1d7d8 u1D7D8               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
-U+1d7d9 u1D7D9               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
-U+1d7da u1D7DA               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
-U+1d7db u1D7DB               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
-U+1d7dc u1D7DC               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
-U+1d7dd u1D7DD               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
-U+1d7de u1D7DE               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
-U+1d7df u1D7DF               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
-U+1d7e0 u1D7E0               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
-U+1d7e1 u1D7E1               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
-U+1d7e2 u1D7E2               2.23 (Sans, Sans Condensed)
-U+1d7e3 u1D7E3               2.23 (Sans, Sans Condensed)
-U+1d7e4 u1D7E4               2.23 (Sans, Sans Condensed)
-U+1d7e5 u1D7E5               2.23 (Sans, Sans Condensed)
-U+1d7e6 u1D7E6               2.23 (Sans, Sans Condensed)
-U+1d7e7 u1D7E7               2.23 (Sans, Sans Condensed)
-U+1d7e8 u1D7E8               2.23 (Sans, Sans Condensed)
-U+1d7e9 u1D7E9               2.23 (Sans, Sans Condensed)
-U+1d7ea u1D7EA               2.23 (Sans, Sans Condensed)
-U+1d7eb u1D7EB               2.23 (Sans, Sans Condensed)
-U+1d7ec u1D7EC               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d7ed u1D7ED               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d7ee u1D7EE               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d7ef u1D7EF               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d7f0 u1D7F0               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d7f1 u1D7F1               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d7f2 u1D7F2               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d7f3 u1D7F3               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d7f4 u1D7F4               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d7f5 u1D7F5               2.23 (Sans Bold, Sans Condensed Bold)
-U+1d7f6 u1D7F6               2.23 (Sans Mono)
-U+1d7f7 u1D7F7               2.23 (Sans Mono)
-U+1d7f8 u1D7F8               2.23 (Sans Mono)
-U+1d7f9 u1D7F9               2.23 (Sans Mono)
-U+1d7fa u1D7FA               2.23 (Sans Mono)
-U+1d7fb u1D7FB               2.23 (Sans Mono)
-U+1d7fc u1D7FC               2.23 (Sans Mono)
-U+1d7fd u1D7FD               2.23 (Sans Mono)
-U+1d7fe u1D7FE               2.23 (Sans Mono)
-U+1d7ff u1D7FF               2.23 (Sans Mono)
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSans-Bold.ttf b/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSans-Bold.ttf
deleted file mode 100644
index ec1a2eb..0000000
Binary files a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSans-Bold.ttf and /dev/null differ
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSans-BoldOblique.ttf b/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSans-BoldOblique.ttf
deleted file mode 100644
index 1a55764..0000000
Binary files a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSans-BoldOblique.ttf and /dev/null differ
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSans-ExtraLight.ttf b/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSans-ExtraLight.ttf
deleted file mode 100644
index 833af86..0000000
Binary files a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSans-ExtraLight.ttf and /dev/null differ
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSans-Oblique.ttf b/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSans-Oblique.ttf
deleted file mode 100644
index becc549..0000000
Binary files a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSans-Oblique.ttf and /dev/null differ
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSans.ttf b/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSans.ttf
deleted file mode 100644
index c1b19d8..0000000
Binary files a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSans.ttf and /dev/null differ
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansCondensed-Bold.ttf b/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansCondensed-Bold.ttf
deleted file mode 100644
index cb48a02..0000000
Binary files a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansCondensed-Bold.ttf and /dev/null differ
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansCondensed-BoldOblique.ttf b/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansCondensed-BoldOblique.ttf
deleted file mode 100644
index 08007e0..0000000
Binary files a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansCondensed-BoldOblique.ttf and /dev/null differ
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansCondensed-Oblique.ttf b/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansCondensed-Oblique.ttf
deleted file mode 100644
index f50b87e..0000000
Binary files a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansCondensed-Oblique.ttf and /dev/null differ
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansCondensed.ttf b/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansCondensed.ttf
deleted file mode 100644
index 783eae4..0000000
Binary files a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansCondensed.ttf and /dev/null differ
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansMono-Bold.ttf b/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansMono-Bold.ttf
deleted file mode 100644
index 32a8695..0000000
Binary files a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansMono-Bold.ttf and /dev/null differ
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansMono-Oblique.ttf b/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansMono-Oblique.ttf
deleted file mode 100644
index 9789ea0..0000000
Binary files a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansMono-Oblique.ttf and /dev/null differ
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansMono.ttf b/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansMono.ttf
deleted file mode 100644
index 6bc854d..0000000
Binary files a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansMono.ttf and /dev/null differ
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerif-Bold.ttf b/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerif-Bold.ttf
deleted file mode 100644
index aee1ae6..0000000
Binary files a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerif-Bold.ttf and /dev/null differ
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerif-BoldItalic.ttf b/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerif-BoldItalic.ttf
deleted file mode 100644
index 1b55e27..0000000
Binary files a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerif-BoldItalic.ttf and /dev/null differ
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerif-Italic.ttf b/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerif-Italic.ttf
deleted file mode 100644
index 4464868..0000000
Binary files a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerif-Italic.ttf and /dev/null differ
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerif.ttf b/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerif.ttf
deleted file mode 100644
index 1f2c94f..0000000
Binary files a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerif.ttf and /dev/null differ
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerifCondensed-Bold.ttf b/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerifCondensed-Bold.ttf
deleted file mode 100644
index 9483a5f..0000000
Binary files a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerifCondensed-Bold.ttf and /dev/null differ
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerifCondensed-BoldItalic.ttf b/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerifCondensed-BoldItalic.ttf
deleted file mode 100644
index d141211..0000000
Binary files a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerifCondensed-BoldItalic.ttf and /dev/null differ
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerifCondensed-Italic.ttf b/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerifCondensed-Italic.ttf
deleted file mode 100644
index 437824a..0000000
Binary files a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerifCondensed-Italic.ttf and /dev/null differ
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerifCondensed.ttf b/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerifCondensed.ttf
deleted file mode 100644
index 2fc9db9..0000000
Binary files a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSerifCondensed.ttf and /dev/null differ
diff --git a/fonts/dejavu-fonts-ttf-2.30/unicover.txt b/fonts/dejavu-fonts-ttf-2.30/unicover.txt
deleted file mode 100644
index bd467ab..0000000
--- a/fonts/dejavu-fonts-ttf-2.30/unicover.txt
+++ /dev/null
@@ -1,177 +0,0 @@
-This is the Unicode coverage file for DejaVu fonts
-($Id$)
-
-Control and similar characters are discounted from totals.
-
-                                                Sans               Serif              Sans Mono          
-U+0000 Basic Latin                              100% (95/95)       100% (95/95)       100% (95/95)      
-U+0080 Latin-1 Supplement                       100% (96/96)       100% (96/96)       100% (96/96)      
-U+0100 Latin Extended-A                         100% (128/128)     100% (128/128)     100% (128/128)    
-U+0180 Latin Extended-B                         100% (208/208)      91% (191/208)      86% (179/208)    
-U+0250 IPA Extensions                           100% (96/96)       100% (96/96)       100% (96/96)      
-U+02b0 Spacing Modifier Letters                  78% (63/80)        56% (45/80)        60% (48/80)      
-U+0300 Combining Diacritical Marks               83% (93/112)       60% (68/112)       59% (67/112)     
-U+0370 Greek and Coptic                         100% (134/134)      85% (115/134)      82% (110/134)    
-U+0400 Cyrillic                                 100% (256/256)      78% (200/256)      69% (178/256)    
-U+0500 Cyrillic Supplement                       94% (34/36)        27% (10/36)        16% (6/36)       
-U+0530 Armenian                                 100% (86/86)            (0/86)             (0/86)       
-U+0590 Hebrew                                    62% (54/87)            (0/87)             (0/87)       
-U+0600 Arabic                                    46% (115/250)          (0/250)        39% (99/250)     
-U+0700 Syriac                                        (0/77)             (0/77)             (0/77)       
-U+0750 Arabic Supplement                             (0/48)             (0/48)             (0/48)       
-U+0780 Thaana                                        (0/50)             (0/50)             (0/50)       
-U+07c0 NKo                                       91% (54/59)            (0/59)             (0/59)       
-U+0900 Devanagari                                    (0/113)            (0/113)            (0/113)      
-U+0980 Bengali                                       (0/91)             (0/91)             (0/91)       
-U+0a00 Gurmukhi                                      (0/79)             (0/79)             (0/79)       
-U+0a80 Gujarati                                      (0/83)             (0/83)             (0/83)       
-U+0b00 Oriya                                         (0/84)             (0/84)             (0/84)       
-U+0b80 Tamil                                         (0/72)             (0/72)             (0/72)       
-U+0c00 Telugu                                        (0/93)             (0/93)             (0/93)       
-U+0c80 Kannada                                       (0/86)             (0/86)             (0/86)       
-U+0d00 Malayalam                                     (0/95)             (0/95)             (0/95)       
-U+0d80 Sinhala                                       (0/80)             (0/80)             (0/80)       
-U+0e00 Thai                                       1% (1/87)             (0/87)             (0/87)       
-U+0e80 Lao                                      100% (65/65)            (0/65)         70% (46/65)      
-U+0f00 Tibetan                                       (0/201)            (0/201)            (0/201)      
-U+1000 Myanmar                                       (0/156)            (0/156)            (0/156)      
-U+10a0 Georgian                                 100% (83/83)       100% (83/83)        54% (45/83)      
-U+1100 Hangul Jamo                                   (0/240)            (0/240)            (0/240)      
-U+1200 Ethiopic                                      (0/356)            (0/356)            (0/356)      
-U+1380 Ethiopic Supplement                           (0/26)             (0/26)             (0/26)       
-U+13a0 Cherokee                                      (0/85)             (0/85)             (0/85)       
-U+1400 Unified Canadian Aboriginal Syllabics     64% (404/630)          (0/630)            (0/630)      
-U+1680 Ogham                                    100% (29/29)            (0/29)             (0/29)       
-U+16a0 Runic                                         (0/81)             (0/81)             (0/81)       
-U+1700 Tagalog                                       (0/20)             (0/20)             (0/20)       
-U+1720 Hanunoo                                       (0/23)             (0/23)             (0/23)       
-U+1740 Buhid                                         (0/20)             (0/20)             (0/20)       
-U+1760 Tagbanwa                                      (0/18)             (0/18)             (0/18)       
-U+1780 Khmer                                         (0/114)            (0/114)            (0/114)      
-U+1800 Mongolian                                     (0/156)            (0/156)            (0/156)      
-U+1900 Limbu                                         (0/66)             (0/66)             (0/66)       
-U+1950 Tai Le                                        (0/35)             (0/35)             (0/35)       
-U+1980 New Tai Lue                                   (0/80)             (0/80)             (0/80)       
-U+19e0 Khmer Symbols                                 (0/32)             (0/32)             (0/32)       
-U+1a00 Buginese                                      (0/30)             (0/30)             (0/30)       
-U+1b00 Balinese                                      (0/121)            (0/121)            (0/121)      
-U+1b80 Sundanese                                     (0/55)             (0/55)             (0/55)       
-U+1c00 Lepcha                                        (0/74)             (0/74)             (0/74)       
-U+1c50 Ol Chiki                                      (0/48)             (0/48)             (0/48)       
-U+1d00 Phonetic Extensions                       82% (105/128)      48% (62/128)       48% (62/128)     
-U+1d80 Phonetic Extensions Supplement            59% (38/64)        57% (37/64)        57% (37/64)      
-U+1dc0 Combining Diacritical Marks Supplement    14% (6/41)         14% (6/41)             (0/41)       
-U+1e00 Latin Extended Additional                 96% (248/256)      76% (196/256)      71% (182/256)    
-U+1f00 Greek Extended                           100% (233/233)     100% (233/233)     100% (233/233)    
-U+2000 General Punctuation                       98% (105/107)      81% (87/107)       47% (51/107)     
-U+2070 Superscripts and Subscripts              100% (34/34)       100% (34/34)       100% (34/34)      
-U+20a0 Currency Symbols                         100% (22/22)        27% (6/22)        100% (22/22)      
-U+20d0 Combining Diacritical Marks for Symbols   21% (7/33)             (0/33)             (0/33)       
-U+2100 Letterlike Symbols                        93% (75/80)        40% (32/80)        21% (17/80)      
-U+2150 Number Forms                              92% (50/54)        92% (50/54)        24% (13/54)      
-U+2190 Arrows                                   100% (112/112)     100% (112/112)     100% (112/112)    
-U+2200 Mathematical Operators                   100% (256/256)      39% (100/256)      58% (151/256)    
-U+2300 Miscellaneous Technical                   27% (64/232)        6% (16/232)       50% (117/232)    
-U+2400 Control Pictures                           5% (2/39)          2% (1/39)          2% (1/39)       
-U+2440 Optical Character Recognition                 (0/11)             (0/11)             (0/11)       
-U+2460 Enclosed Alphanumerics                     6% (10/160)           (0/160)            (0/160)      
-U+2500 Box Drawing                              100% (128/128)     100% (128/128)     100% (128/128)    
-U+2580 Block Elements                           100% (32/32)       100% (32/32)       100% (32/32)      
-U+25a0 Geometric Shapes                         100% (96/96)       100% (96/96)       100% (96/96)      
-U+2600 Miscellaneous Symbols                     95% (182/191)      15% (30/191)       78% (149/191)    
-U+2700 Dingbats                                 100% (174/174)       0% (1/174)        82% (144/174)    
-U+27c0 Miscellaneous Mathematical Symbols-A      20% (9/44)         11% (5/44)         11% (5/44)       
-U+27f0 Supplemental Arrows-A                    100% (16/16)       100% (16/16)            (0/16)       
-U+2800 Braille Patterns                         100% (256/256)     100% (256/256)          (0/256)      
-U+2900 Supplemental Arrows-B                      4% (6/128)       100% (128/128)          (0/128)      
-U+2980 Miscellaneous Mathematical Symbols-B      10% (13/128)        0% (1/128)         2% (3/128)      
-U+2a00 Supplemental Mathematical Operators       28% (72/256)        1% (4/256)         0% (1/256)      
-U+2b00 Miscellaneous Symbols and Arrows          42% (35/82)        32% (27/82)        10% (9/82)       
-U+2c00 Glagolitic                                    (0/94)             (0/94)             (0/94)       
-U+2c60 Latin Extended-C                          96% (28/29)        55% (16/29)        34% (10/29)      
-U+2c80 Coptic                                        (0/114)            (0/114)            (0/114)      
-U+2d00 Georgian Supplement                           (0/38)        100% (38/38)            (0/38)       
-U+2d30 Tifinagh                                 100% (55/55)            (0/55)             (0/55)       
-U+2d80 Ethiopic Extended                             (0/79)             (0/79)             (0/79)       
-U+2de0 Cyrillic Extended-A                           (0/32)             (0/32)             (0/32)       
-U+2e00 Supplemental Punctuation                  12% (6/49)         12% (6/49)         12% (6/49)       
-U+2e80 CJK Radicals Supplement                       (0/115)            (0/115)            (0/115)      
-U+2f00 Kangxi Radicals                               (0/214)            (0/214)            (0/214)      
-U+2ff0 Ideographic Description Characters            (0/12)             (0/12)             (0/12)       
-U+3000 CJK Symbols and Punctuation                   (0/64)             (0/64)             (0/64)       
-U+3040 Hiragana                                      (0/93)             (0/93)             (0/93)       
-U+30a0 Katakana                                      (0/96)             (0/96)             (0/96)       
-U+3100 Bopomofo                                      (0/41)             (0/41)             (0/41)       
-U+3130 Hangul Compatibility Jamo                     (0/94)             (0/94)             (0/94)       
-U+3190 Kanbun                                        (0/16)             (0/16)             (0/16)       
-U+31a0 Bopomofo Extended                             (0/24)             (0/24)             (0/24)       
-U+31c0 CJK Strokes                                   (0/36)             (0/36)             (0/36)       
-U+31f0 Katakana Phonetic Extensions                  (0/16)             (0/16)             (0/16)       
-U+3200 Enclosed CJK Letters and Months               (0/242)            (0/242)            (0/242)      
-U+3300 CJK Compatibility                             (0/256)            (0/256)            (0/256)      
-U+3400 CJK Unified Ideographs Extension A            (0/0)              (0/0)              (0/0)        
-U+4dc0 Yijing Hexagram Symbols                  100% (64/64)            (0/64)             (0/64)       
-U+4e00 CJK Unified Ideographs                        (0/0)              (0/0)              (0/0)        
-U+a000 Yi Syllables                                  (0/1165)           (0/1165)           (0/1165)     
-U+a490 Yi Radicals                                   (0/55)             (0/55)             (0/55)       
-U+a500 Vai                                           (0/300)            (0/300)            (0/300)      
-U+a640 Cyrillic Extended-B                       39% (31/78)        12% (10/78)            (0/78)       
-U+a700 Modifier Tone Letters                     62% (20/32)        62% (20/32)        62% (20/32)      
-U+a720 Latin Extended-D                          37% (43/114)        1% (2/114)         5% (6/114)      
-U+a800 Syloti Nagri                                  (0/44)             (0/44)             (0/44)       
-U+a840 Phags-pa                                      (0/56)             (0/56)             (0/56)       
-U+a880 Saurashtra                                    (0/81)             (0/81)             (0/81)       
-U+a900 Kayah Li                                      (0/48)             (0/48)             (0/48)       
-U+a930 Rejang                                        (0/37)             (0/37)             (0/37)       
-U+aa00 Cham                                          (0/83)             (0/83)             (0/83)       
-U+ac00 Hangul Syllables                              (0/0)              (0/0)              (0/0)        
-U+d800 High Surrogates                               (0/0)              (0/0)              (0/0)        
-U+db80 High Private Use Surrogates                   (0/0)              (0/0)              (0/0)        
-U+dc00 Low Surrogates                                (0/0)              (0/0)              (0/0)        
-U+e000 Private Use Area                              (0/0)              (0/0)              (0/0)        
-U+f900 CJK Compatibility Ideographs                  (0/467)            (0/467)            (0/467)      
-U+fb00 Alphabetic Presentation Forms            100% (58/58)        12% (7/58)          3% (2/58)       
-U+fb50 Arabic Presentation Forms-A               11% (70/595)           (0/595)        12% (72/595)     
-U+fe00 Variation Selectors                      100% (16/16)       100% (16/16)            (0/16)       
-U+fe10 Vertical Forms                                (0/10)             (0/10)             (0/10)       
-U+fe20 Combining Half Marks                      57% (4/7)              (0/7)              (0/7)        
-U+fe30 CJK Compatibility Forms                       (0/32)             (0/32)             (0/32)       
-U+fe50 Small Form Variants                           (0/26)             (0/26)             (0/26)       
-U+fe70 Arabic Presentation Forms-B              100% (141/141)          (0/141)       100% (141/141)    
-U+ff00 Halfwidth and Fullwidth Forms                 (0/225)            (0/225)            (0/225)      
-U+fff0 Specials                                 100% (5/5)         100% (5/5)         100% (5/5)        
-U+10000 Linear B Syllabary                            (0/88)             (0/88)             (0/88)       
-U+10080 Linear B Ideograms                            (0/123)            (0/123)            (0/123)      
-U+10100 Aegean Numbers                                (0/57)             (0/57)             (0/57)       
-U+10140 Ancient Greek Numbers                         (0/75)             (0/75)             (0/75)       
-U+10190 Ancient Symbols                               (0/12)             (0/12)             (0/12)       
-U+101d0 Phaistos Disc                                 (0/46)             (0/46)             (0/46)       
-U+10280 Lycian                                        (0/29)             (0/29)             (0/29)       
-U+102a0 Carian                                        (0/49)             (0/49)             (0/49)       
-U+10300 Old Italic                                    (0/35)             (0/35)             (0/35)       
-U+10330 Gothic                                        (0/27)             (0/27)             (0/27)       
-U+10380 Ugaritic                                      (0/31)             (0/31)             (0/31)       
-U+103a0 Old Persian                                   (0/50)             (0/50)             (0/50)       
-U+10400 Deseret                                       (0/80)             (0/80)             (0/80)       
-U+10450 Shavian                                       (0/48)             (0/48)             (0/48)       
-U+10480 Osmanya                                       (0/40)             (0/40)             (0/40)       
-U+10800 Cypriot Syllabary                             (0/55)             (0/55)             (0/55)       
-U+10900 Phoenician                                    (0/27)             (0/27)             (0/27)       
-U+10920 Lydian                                        (0/27)             (0/27)             (0/27)       
-U+10a00 Kharoshthi                                    (0/65)             (0/65)             (0/65)       
-U+12000 Cuneiform                                     (0/879)            (0/879)            (0/879)      
-U+12400 Cuneiform Numbers and Punctuation             (0/103)            (0/103)            (0/103)      
-U+1d000 Byzantine Musical Symbols                     (0/246)            (0/246)            (0/246)      
-U+1d100 Musical Symbols                               (0/220)            (0/220)            (0/220)      
-U+1d200 Ancient Greek Musical Notation                (0/70)             (0/70)             (0/70)       
-U+1d300 Tai Xuan Jing Symbols                    100% (87/87)            (0/87)             (0/87)       
-U+1d360 Counting Rod Numerals                         (0/18)             (0/18)             (0/18)       
-U+1d400 Mathematical Alphanumeric Symbols         11% (117/996)       5% (55/996)        6% (62/996)     
-U+1f000 Mahjong Tiles                                 (0/44)             (0/44)             (0/44)       
-U+1f030 Domino Tiles                                  (0/100)            (0/100)            (0/100)      
-U+20000 CJK Unified Ideographs Extension B            (0/0)              (0/0)              (0/0)        
-U+2f800 CJK Compatibility Ideographs Supplement       (0/542)            (0/542)            (0/542)      
-U+e0000 Tags                                          (0/98)             (0/98)             (0/98)       
-U+e0100 Variation Selectors Supplement                (0/240)            (0/240)            (0/240)      
-U+f0000 Supplementary Private Use Area-A              (0/0)              (0/0)              (0/0)        
-U+100000 Supplementary Private Use Area-B              (0/0)              (0/0)              (0/0)        
diff --git a/fonts/dejavu-fonts-ttf-2.33/AUTHORS b/fonts/dejavu-fonts-ttf-2.33/AUTHORS
new file mode 100644
index 0000000..48073da
--- /dev/null
+++ b/fonts/dejavu-fonts-ttf-2.33/AUTHORS
@@ -0,0 +1,53 @@
+abysta at yandex.ru
+Adrian Schroeter
+Aleksey Chalabyan
+Andrey Valentinovich Panov
+Ben Laenen
+Besarion Gugushvili
+Bhikkhu Pesala
+Clayborne Arevalo
+Dafydd Harries
+Danilo Segan
+Davide Viti
+David Jez
+David Lawrence Ramsey
+Denis Jacquerye
+Dwayne Bailey
+Eugeniy Meshcheryakov
+Gee Fung Sit
+Heikki Lindroos
+James Cloos
+James Crippen
+John Karp
+Keenan Pepper
+Lars Naesbye Christensen
+Lior Halphon
+MaEr
+Mashrab Kuvatov
+Max Berger
+Mederic Boquien
+Michael Everson
+MihailJP
+Misu Moldovan
+Nguyen Thai Ngoc Duy
+Nicolas Mailhot
+Norayr Chilingarian
+Ognyan Kulev
+Ondrej Koala Vacha
+Peter Cernak
+Remy Oudompheng
+Roozbeh Pournader
+Rouben Hakobian
+Sahak Petrosyan
+Sander Vesik
+Stepan Roh
+Stephen Hartke
+Steve Tinney
+Tavmjong Bah
+Thomas Henlich
+Tim May
+Valentin Stoykov
+Vasek Stodulka
+Wesley Transue
+
+$Id: AUTHORS 2461 2011-02-18 16:38:20Z ben_laenen $
diff --git a/fonts/dejavu-fonts-ttf-2.30/BUGS b/fonts/dejavu-fonts-ttf-2.33/BUGS
similarity index 100%
rename from fonts/dejavu-fonts-ttf-2.30/BUGS
rename to fonts/dejavu-fonts-ttf-2.33/BUGS
diff --git a/fonts/dejavu-fonts-ttf-2.30/LICENSE b/fonts/dejavu-fonts-ttf-2.33/LICENSE
similarity index 100%
rename from fonts/dejavu-fonts-ttf-2.30/LICENSE
rename to fonts/dejavu-fonts-ttf-2.33/LICENSE
diff --git a/fonts/dejavu-fonts-ttf-2.33/NEWS b/fonts/dejavu-fonts-ttf-2.33/NEWS
new file mode 100644
index 0000000..87e3d5e
--- /dev/null
+++ b/fonts/dejavu-fonts-ttf-2.33/NEWS
@@ -0,0 +1,1315 @@
+Changes from 2.32 to 2.33
+
+* added Old Italic block to Sans (by MaEr) 
+* added U+051E, U+051F to Sans (by MaEr) 
+* added U+01BA, U+0372-U+0373, U+0376-U+0377, U+03CF, U+1D00-U+1D01,
+  U+1D03-U+1D07, U+1D0A-U+1D13, U+1D15, U+1D18-U+1D1C, U+1D20-U+1D2B,
+  U+1D2F, U+1D3D, U+1D5C-U+1D61, U+1D66-U+1D6B, U+1DB8, U+1E9C-U+1E9D,
+  U+1EFA-U+1EFB, U+2C60-U+2C61, U+2C63, U+A726-U+A73C, U+A73E-U+A73F,
+  U+A746-U+A747, U+A74A-U+A74B, U+A74E+U+A74F, U+A768-U+A769, U+A77B-U+A77C,
+  U+A780-U+A787, U+A790-U+A791, U+A7FA-U+A7FF to Serif (by Gee Fung Sit 薛至峰) 
+* added alternate forms to U+014A and U+01B7 in Serif (by Gee Fung Sit 薛至峰) 
+* typographical improvements to U+0166-U+0167, U+0197, U+01B5-U+01B6, U+01BB,
+  U+0222-U+0223, U+023D, U+0250-U+0252, U+026E, U+0274, U+028F, U+029F,
+  U+02A3-U+02A5, U+02AB, U+03FE-U+03FF, U+1D02, U+1D14, U+1D1D-U+1D1F, U+1D3B,
+  U+1D43-U+1D46, U+1D59, U+1D9B, U+2C71, U+2C73 in Serif (by Gee Fung Sit 薛至峰) 
+* fixed bugs #31762 and #34700 plus other small fixes (wrong direction,
+  duplicate points, etc.) for Sans and Serif (by Gee Fung Sit 薛至峰) 
+* added U+204B to Mono (by Gee Fung Sit 薛至峰) 
+* added U+26E2 to Sans (by Gee Fung Sit 薛至峰) 
+* added Playing Cards block (U+1F0A0-U+1F0DF) to Sans (by Gee Fung Sit 薛至峰) 
+* emoticons in Sans: replace U+2639-U+263B with better versions, add
+  U+1F601-U+1F610, U+1F612-U+1F614, U+1F616, U+1F618, U+1F61A, U+1F61C-U+1F61E,
+  U+1F620-U+1F624, U+1F625, U+1F628-U+1F62B, U+1F62D, U+1F630-U+1F633,
+  U+1F635-U+1F640 (by Ben Laenen and Denis Jacquerye) 
+* added U+A78E, U+A790-U+A791 to Sans and Mono (by Denis Jacquerye) 
+* added U+A7FA to Sans (by Denis Jacquerye) 
+* subscripts: added U+2095-U+209C to Sans, Serif and Mono, adjusted
+  U+1D49-U+1D4A in Sans and Mono (by Denis Jacquerye) 
+* added U+0243 to Mono (by Denis Jacquerye) 
+* adjusted U+0307 to match dot of i, replaced dotaccent U+02D9 with U+0307 in
+most dependencies in Sans (by Denis Jacquerye) 
+* adjusted anchors of f and added them to long s in Sans (by Denis Jacquerye) 
+* added anchors to precomposed dependencies of D and d (by Denis Jacquerye) 
+* added debug glyphs U+F002 and U+F003 which will show current point size (by
+  Ben Laenen) 
+* use correct version for Serbian italic be (by Eugeniy Meshcheryakov) 
+* added pictograms U+1F42D-U+1F42E, U+1F431, U+1F435 (by Denis Jacquerye) 
+* improved Hebrew in Sans (by Lior Halphon) 
+* improved Armenian in Sans, and added Armenian in Serif and Mono (by Rouben
+  Hakobian (Tarumian), Aleksey Chalabyan and Norayr Chilingarian) 
+* remove "locl" feature for Romanian for S/T/s/t with cedilla/comma accent (by
+  Ben Laenen) 
+* replace wrong "dflt" script tag in Mono with "DFLT" (by Ben Laenen)
+
+Changes from 2.31 to 2.32
+
+* added to Sans: Latin small letter p with stroke (U+1D7D), Latin capital
+  letter p with stroke through descender (U+A750), Latin small letter p with
+  stroke through descender (U+A751), Latin capital letter thorn with stroke
+  (U+A764), Latin small letter thorn with stroke (U+A765), Latin capital letter
+  thorn with stroke through descender (U+A766), Latin small letter thorn with
+  stroke through descender (U+A767), Latin capital letter q with stroke through
+  descender (U+A756), Latin small letter q with stroke through descender
+  (U+A757), Latin capital letter p with flourish (U+A752), Latin small letter p
+  with flourish (U+A753) (by Ben Laenen)
+* add new Indian rupee symbol (U+20B9) to Sans, Serif and Mono (although
+  standardization in Unicode not complete yet, UTC did assign this code point)
+  (by Ben Laenen)
+* Sans: adjusted U+0E3F, U+20AB, U+20AD-U+20AE, U+20B1, U+20B5, U+20B8 to have
+  them take up the same width as digits (by Gee Fung Sit 薛至峰)
+* added U+23E8 to Sans (by Thomas Henlich)
+* fixed numerous bugs (#22579, #28189, #28977, N'Ko in Windows, fixed U+FB4F,
+  anchors for U+0332-U+0333, made extensions in Misc. Technical connect, and
+  other small fixes) (by Gee Fung Sit 薛至峰)
+* added looptail g as stylistic variant to Serif (by Gee Fung Sit 薛至峰)
+* added the remaining precomposed characters in Latin Extended Additional in
+  Serif (by Gee Fung Sit 薛至峰)
+* added Georgian Mkhedruli (U+10D0-U+10FC) to Sans ExtraLight (by Besarion
+  Gugushvili)
+* fix spacing in hinting of U+042E (Ю) in Mono (by Ben Laenen)
+* replaced U+2650 and minor changes to U+2640-U+2642, U+2699, U+26A2-U+26A5,
+  U+26B2-U+26B5, U+26B8 in Sans (by Gee Fung Sit 薛至峰)
+* added U+1E9C-U+1E9D, U+1EFA-U+1EFB, U+2028-U+2029, U+20B8, U+2150-U+2152,
+  U+2189, U+26C0-U+26C3, U+A722-U+A725, U+1F030-U+1F093 to Sans (by Gee Fung
+  Sit 薛至峰)
+* added U+1E9C-U+1E9E, U+1EFA-U+1EFB, U+2028-U+2029, U+20B8, U+2181-U+2182,
+  U+2185 U+A722-U+A725, to Sans ExtraLight (by Gee Fung Sit 薛至峰)
+* added U+20B8, U+22A2-U+22A5, U+A722-U+A725 to Mono (by Gee Fung Sit 薛至峰)
+* added U+02CD, U+01BF, U+01F7, U+0222-U+0223, U+0243-U+0244, U+0246-U+024F,
+  U+2150-U+2152, U+2189, U+239B-U+23AD and U+A73D to Serif (by Gee Fung Sit
+  薛至峰)
+
+Changes from 2.30 to 2.31
+
+* fixed bug where Serif Condensed Italic wouldn't get proper subfamily tags (by
+  Ben Laenen)
+* added math operators U+2234-U+2237 to Mono (by Ben Laenen)
+* removed buggy instructions of U+032D (by Eugeniy Meshcheryakov)
+* added U+2C70, U+2C7E, U+2C7F to Sans and Sans Mono (by Denis Jacquerye)
+* added U+2C7D to Sans Mono (by Denis Jacquerye)
+* added U+2C6D, U+2C70-2C73, U+2C7E-2C7F to Serif (by Denis Jacquerye)
+* added extremas to alpha U+03B1 in Serif-Italic (by Denis Jacquerye)
+* added U+4A4, U+4A5 to Mono (by Andrey V. Panov)
+* added Arabic letters U+0657, U+0670, U+0688-U+0690, U+0693-U+0694,
+  U+0696-U+0697, U+0699-U+06A0, U+06A2-U+06A3, U+06A5, U+06A7-U+06A8,
+  U+06AA-U+06AE, U+06B0-U+06B4, U+06B6-U+06B9, U+06BB-U+06BE and their
+  contextual forms to Sans (by MihailJP)
+* added U+A78D LATIN CAPITAL LETTER TURNED H for coming Unicode 6.0 (by Denis
+  Jacquerye) 
+
+Changes from 2.29 to 2.30
+
+* added U+0462-U+0463 to Mono (by Denis Jacquerye) 
+* corrected U+1E53 in Serif (by Gee Fung Sit) 
+* added U+1E4C-U+1E4D to Mono and Serif (by Gee Fung Sit) 
+* added U+1E78-U+1E79 to Mono (by Gee Fung Sit) 
+* fixed missing diacritics in Latin Extended Additional in Sans ExtraLight
+  (moved stacked diacritics out of PUA in the process) (by Gee Fung Sit) 
+* fixed anchors on U+1E78 in Serif (by Gee Fung Sit) 
+* added U+1DC4-U+1DC9 to Serif (by Denis Jacquerye) 
+* renamed above-mark to above-mark in Serif-Italic (by Denis Jacquerye) 
+* added U+1DC4-U+1DC9 to context class for dotless substitution (by Denis
+  Jacquerye) 
+* changed Doubleacute to Doublegrave in Sans ExtraLight (by Gee Fung Sit) 
+* removed redundant reference in U+01FB in Sans Oblique (by Gee Fung Sit) 
+* added U+A726-U+A727 to Mono (Denis Jacquerye) 
+* changed U+04BE and U+04BF according to recommedations of Sasha Ankwab in Sans
+  (by Andrey V. Panov) 
+* remove "Symbol Charset" from set of codepages in Sans (by Eugeniy
+  Meshcheryakov)
+
+Changes from 2.28 to 2.29
+
+* modified U+10FB in Sans to be a mirror image of U+2056, since U+10FB is not
+  Georgian-specific (by Roozbeh Pournader)
+* added U+2B1F, U+2B24, U+2B53, U+2B54 in Sans (by Roozbeh Pournader)
+* fixed TUR opentype language tag to TRK in Serif (bug 19825) (by Ben Laenen)
+* early implementation of Abkhaz letter U+0524-U+0525 in Sans
+  (by Michael Everson and abysta)
+* flipped U+1D538 in Sans (by Gee Fung Sit)
+* added U+26B3-U+26B8, U+1D7D8-U+1D7E1 in Sans (by Gee Fung Sit)
+* corrected U+1D7A9 in Sans Bold Oblique (by Gee Fung Sit)
+* Fixed U+0649 to be dual-joining in Sans Mono (by Roozbeh Pournader)
+* Remove unnecessary 'isol' feature from Sans Mono (by Roozbeh Pournader)
+* Remove 'cmap' mappings for U+066E, U+066F, U+067C, U+067D, U+0681, U+0682,
+  U+0685, U+0692, U+06A1, U+06B5, U+06BA, U+06C6, U+06CE, and U+06D5
+  in Sans Mono (bug 20323) (by Roozbeh Pournader)
+* add half brackets (U+2E22 - U+2E25, by Steve Tinney) 
+
+Changes from 2.27 to 2.28
+
+* added U+A789, U+A78A in Sans and Sans Mono (by Denis Jacquerye)
+* modified U+02D6, U+02D7, U+02EE in Sans and Sans Mono (by Denis Jacquerye)
+* added U+1E9E (German capital ß) to Sans and Serif (by Denis Jacquerye)
+* adjusted width of U+01B7-U+01B9 in Serif Italic (by Denis Jacquerye)
+* modified U+021C, U+021D in Sans (by Denis Jacquerye)
+* added U+021C, U+021D in Mono (by Denis Jacquerye)
+* added U+F428 (Georgian Nuskhuri "f") in private use area (by Besarion
+  Gugushvili)
+* updated Georgian mkhedruli (U+10D0-U+10FA) with new version (by Besarion
+  Gugushvili)
+* updated Georgian asomtavruli (U+10A0-U+10C5) with new version (by Besarion
+  Gugushvili)
+* added Georgian nuskhuri (U+2D00-U+2D25) (by Besarion Gugushvili)
+* added Georgian mtavruli in private use area (U+F400-U+F426) (by Besarion
+  Gugushvili)
+* added mark anchors above to Cyrillic U+0430-U+0438, U+043A-U+044F,
+  U+0454-U+0455 in Mono (by Ben Laenen)
+* modified/moved up U+0318-U+0319, U+031C-U+031F, U+0329-U+032A, U+032C-U+032D,
+  U+0339-U+033B, U+0348 and U+0353 in Sans to prevent cut-off (by Gee Fung Sit)
+* added U+035A to Sans (by Gee Fung Sit)
+* updated fontconfig files (by Nicolas Mailhot)
+* added U+2032-2037 to Mono (by Denis Jacquerye)
+* added Ogham to Sans ExtraLight (by Gee Fung Sit)
+* added U+2C6F, U+2C79, U+2C7C-2C7D to Mono (by Gee Fung Sit)
+* added U+210F to Serif and Sans ExtraLight (by Gee Fung Sit)
+* changed U+210F to a more common glyph in Sans and Mono (by Gee Fung Sit)
+
+Changes from 2.26 to 2.27
+
+* added some of Michael Everson's new Cyrillic glyphs to Sans (by Wesley
+  Transue)
+* removed blank glyph at U+05EF from Sans Bold Oblique (by Gee Fung Sit)
+* small adjustments to existing tone bars in Sans and Mono (by Gee Fung Sit)
+* added U+0372-U+0373, U+0376-U+0377, U+03CF, U+A668-U+A66E, U+A708-U+A711,
+  U+A71B-U+A71F to Sans (by Gee Fung Sit)
+* copied U+02E5-U+02E9 over from Sans to fix inconsistencies in Serif (by Gee
+  Fung Sit)
+* added U+021C-U+021D, U+0370-U+0371, U+037B-U+037D, U+0470-U+0471,
+  U+0510-U+0515, U+051A-U+051D, U+1E9F, U+2C64, U+2C6E-U+2C6F, U+2C79,
+  U+2C7C-U+2C7D, U+A644-U+A647, U+A650-U+A651, U+A654-U+A657, U+A708-U+A716,
+  U+A71B-U+A71F to Serif (by Gee Fung Sit)
+* added U+A708-U+A716, U+A71B-U+A71F to Mono (by Gee Fung Sit)
+* added anchors to U+017F (ſ) and fixed U+1E9B (ẛ) in Serif (by Gee Fung Sit)
+* made U+0325 smaller in Sans Bold and Serif to match Sans Book (by Gee Fung
+  Sit)
+* fixes to U+02F3 (moved up), U+228F-U+2294 (more square-like) and
+  U+22CE-U+22CF (stroke width) in Sans (by Gee Fung Sit)
+* replaced U+2202 ∂ (Sans and Mono) and U+221D ∝, U+221E ∞ (Sans) with glyphs
+  from Arev (with small changes) (by Gee Fung Sit)
+* added U+22B0-U+22B1, U+22C7, U+22D0-U+22D5 from Arev to Sans to complete the
+  block (by Gee Fung Sit)
+* added U+0514-U+0515 to Sans ExtraLight (by Gee Fung Sit)
+* skewed U+A78C in all Oblique/Italic fonts (by Gee Fung Sit)
+* moved U+2215 to U+2044 in Sans and Serif and replaced U+2215 with reference
+  to U+002F in all fonts (by Gee Fung Sit)
+* added U+2C6E to Mono (by Denis Jacquerye)
+* added U+A782 and U+A783 in Sans (by Wesley Transue)
+* added U+0244, U+024C-024D, U+2C64 in Sans Mono (by Denis Jacquerye)
+* modified U+01AE in Sans Mono (by Denis Jacquerye)
+* added U+2C7A to all fonts (by Gee Fung Sit)
+* italicized/small changes to U+2C76 in Serif (Bold) Italic (by Gee Fung Sit)
+* improved outlines of U+2C68, U+2C6A, U+2C6C in Serif (Bold) Italic (by Gee
+  Fung Sit)
+* rounded U+2C77 at the bottom in Serif (by Gee Fung Sit)
+* added joining behavior for tone letters (U+02E5-U+02E9) in Sans (bug #15669)
+  (by Gee Fung Sit)
+* fixed outline of y.alt in Sans Regular (by Denis Jacquerye) 
+* changed references of U+1D5A8, U+1D5C5, U+1D5DC, U+1D5F9, U+1D610, U+1D62D,
+  U+1D644 and U+1D661 to stylistic alternates to have a better distinction (by
+  Gee Fung Sit)
+* hinted I.alt in Sans Regular (by Gee Fung Sit)
+* added U+0487, completing Cyrillic block (by Gee Fung Sit)
+* extended the bar of U+0463 to the right and moved the anchor (by Gee Fung
+  Sit)
+* added anchors to glyphs in Cyrillic block (by Gee Fung Sit)
+* added (preliminary) hints to tone letter forms (U+02E5.5, U+02E9.1, stem) in
+  Sans Book (by Gee Fung Sit)
+
+Changes from 2.25 to 2.26
+
+- added glyphs for Cyrillic-B to Sans (by Wesley Transue) 
+- added U+0370-U+0371 to Sans (by Wesley Transue) 
+- added U+019C, U+01A2-U+01A3, U+01A6, U+01E4-U+01E5, U+024C-U+024D, U+0285,
+  U+0290, U+02A0, U+0370-U+0371, U+03F1, U+03FC to Sans ExtraLight (by Wesley
+  Transue) 
+- added U+20A0-U+20A5, U+20A7-U+20B3, U+2105, U+210D, U+210F, U+2115, U+2117,
+  U+2119-U+211A, U+211D, U+2124, U+212E, U+2200-U+2204 to Mono (by Heikki
+  Lindroos) 
+- added U+01BA and U+01BF to Mono (by Heikki Lindroos) 
+- merged OpenType "aalt" feature in Latin in Sans (by Denis Jacquerye) 
+- added alternative shape for y in Sans (by Denis Jacquerye) 
+- added saltillo (U+A78B-U+A78C) to all faces (by James Cloos) 
+- changed U+047C-U+047D to references instead of outlines in Sans (by Wesley
+  Transue) 
+- added Latin letter tresillo U+A72A-U+A72B to Sans (by Wesley Transue) 
+- added U+A734-U+A737 to Sans (by Wesley Transue) 
+- added U+2053 to Serif and fixed it bug:9425 in Sans (by Gee Fung Sit) 
+- removed problematic hints for U+0423 bug:10025 (by Gee Fung Sit) 
+- added U+27C5-U+27C6 bug:10255 to all faces (by Gee Fung Sit) 
+- fixed width of U+2016 in Sans Oblique (by Gee Fung Sit) 
+- added U+2016, U+2032-U+2038, U+2042, U+2045-U+2046, U+204B-U+204F,
+  U+2051-U+2052, U+2057 to Serif (by Gee Fung Sit) 
+- made U+2140 bigger to match other n-ary operators (by Gee Fung Sit) 
+- added U+0606-U+0607, U+0609-U+060A to Sans (by Gee Fung Sit) 
+- added U+221B-U+221C to Mono (by Gee Fung Sit) 
+- small adjustments to U+221B-U+221C in Sans and Serif (by Gee Fung Sit) 
+- update U+04B4-U+04B5 in Serif (by Andrey V. Panov) 
+- increased max-storage value from maxp table to 153 (by Andrey V. Panov) 
+- added U+0472-U+0473, U+0510-U+0511, U+051A-U+051D, U+0606-U+0607,
+  U+0609-U+060A, U+1E26-U+1E27, U+1E54-U+1E55, U+1E7C-U+1E7D, U+1E8C-U+1E8D,
+  U+1E90-U+1E91, U+1E97-U+1E99, U+1E9F, U+1EAC-U+1EAD, U+1EB6-U+1EB7,
+  U+1EC6-U+1EC7, U+1ED8-U+1EDD, U+1EE0-U+1EE3, U+1EE8-U+1EEB, U+1EEE-U+1EF1 to
+  Mono (by Gee Fung Sit) 
+- added locl rules for S/T cedilla for Romanian and Moldavian so they get
+  rendered as S/T with comma accent (see Redhat bug #455981) (by Ben Laenen) 
+- removed ligature rule from Armenian U+0587 bug:16113 (by Gee Fung Sit)
+
+Changes from 2.24 to 2.25
+
+- moved/added U+2E18 (by Gee Fung Sit)
+- added empty glyph for U+2064 in Sans and Serif (by Gee Fung Sit)
+- added U+22CE-U+22CF to Sans (by Gee Fung Sit)
+- Sans Oblique and Bold Oblique, Serif: reverted digits hinting instructions back to before revision 1590, which fixed mistaken debian bug #471024. This fixes Debian bug #411308. The original bug was in freetype not in the fonts (by Denis Jacquerye)
+- added U+A726-U+A729, U+A730-U+A733, U+A738-U+A73F, U+A746-U+A74B, U+A74E-U+A74F, U+A780-U+A781, U+A7FB-U+A7FF to Sans (by Gee Fung Sit)
+- added Macedonian italic glyph shape for U+0453 in Serif (by Ben Laenen)
+- changed descenders in U+0446, U+0449, U+0497, U+04A3, U+04AD (by Andrey V. Panov)
+- updated main SFD files to SplineFontDB 3.0 (Denis Jacquerye and Gee Fung Sit)
+- moved U+0561 2 up since it wasn't aligned with the baseline well (by Ben Laenen)
+- added U+2E2E to Sans (by Gee Fung Sit)
+- replaced U+2699 with simpler version in Sans (by Gee Fung Sit)
+- added a lot of hinting instructions to Latin Extended B, Greek and Coptic glyphs Sans Book (by Wesley Transue)
+- differentiated U+2219 from U+22C5 and adjusted affected references in Sans and Mono (by Gee Fung Sit)
+- made Hebrew narrower in Sans Bold and Sans Bold Oblique (by Denis Jacquerye)
+- added Kurdish and Chuvash letters from Unicode 5.1 Cyrillic Extended block (by Wesley Transue)
+- added U+1E9F, U+A644-U+A647, U+A64C-U+A64D, U+A650-U+A651, U+A654-U+A655, U+A712U+A716 to Sans (by Gee Fung Sit)
+- added several glyphs to Sans ExtraLight (by Gee Fung Sit)
+- added hinting instructions to U+046A-U+046B, U+0508-U+0509, U+050B, U+0512-U+0513 in Sans Book (by Wesley Transue)
+- corrected width of U+027E in Sans Book (by Gee Fung Sit)
+- added U+2C79, U+2C7B-U+2C7D to Sans (by Gee Fung Sit)
+- added a bunch of glyphs+small corrections to Sans Light (by Gee Fung Sit)
+- added U+0496, U+0497, U+04B0, U+04B1 (by Andrey V. Panov)
+- updated U+0493, U+049B, U+04B3, U+04B7, U+04F7 (by Andrey V. Panov)
+- further improvements in extended Cyrillic (by Andrey V. Panov) 
+
+Changes from 2.23 to 2.24
+
+- instructions for U+05C0 ׀, U+05C3 ׃, U+05F3 ׳, and U+05F4 ״ in DejaVu 
+   Sans. (by Wesley Transue)
+- instructions for U+2116 in Sans (by Andrey V. Panov)
+- Unicode 5.1 update: moved U+F208 to U+2C6D, U+F25F to U+2C71, added 
+  U+2C6E-U+2C6F, U+2C72-U+2C73, updated outline of U+2C71 in Sans. (by 
+  Denis Jacquerye)
+- updated and instructed U+0401 in Sans (by Andrey V. Panov)
+- fixed the bug in Sans faces where U+02EC ˬ faced the wrong direction. 
+  Also, added a few more glyph instructions. (by Wesley Transue)
+- removed OS2Sub and OS2Strike that weren't intentional in Sans 
+  ExtraLight. (by Denis Jacquerye)
+- updated instructions for U+401, U+44F in Serif Book. (by Andrey V. 
+  Panov)
+- instructions for U+02C4 ˄, U+02C5 ˅, U+03D8 Ϙ, U+03D9 ϙ, U+0494 Ҕ, and 
+  U+0495 ҕ in Sans Book. (by Wesley Transue)
+- instructions for U+01A6 Ʀ, U+0238 ȸ, U+0239 ȹ, U+02EC ˬ, and U+05C6 ׆ 
+  in Sans Book. (by Wesley Transue)
+- DejaVuSans.sfd DejaVuSerif.sfd: updated instructions for U+447 and 
+  U+451 using code generated with xgridfit (by Andrey V. Panov)
+- instructions for a few glyphs in the Latin Extended-B Block, Greek 
+  Block, Cyrillic Block, and N'Ko block. (by Wesley Transue)
+- updated sfdnormalize.pl, and SFD files to new SFD format with empty 
+  lines. (by Denis Jacquerye) 
+
+Changes from 2.22 to 2.23
+
+- fixed bug which made Condensed fonts appear instead of normal width ones
+- added U+20DB, U+20DC, and U+20E1 to Sans (by Roozbeh Pournader)
+- added hinting instructions to U+01A7, U+01AA-U+01AC, U+01AE-U+01AF,
+  U+01BC-U+01BD, U+01BF, U+01F7, U+0277, U+027F, U+0285-U+0286, U+0297, U+02AF,
+  U+02B4-U+02B5, U+02BD, U+030D, U+0311, U+0329, U+04A0-U+04A1 in Sans Book (by
+  Wesley Transue)
+- modified hinting instructions of U+04A2 in Sans Book (by Wesley Transue)
+- added hinting instructions to U+237D, U+2423 in Mono Book and Mono Bold (by
+  Wesley Transue)
+- added mathematical alphanumeric symbols to all styles (by Max Berger)
+- added Unicode 5.1 U+2E18 as U+2E18.u51 (not yet usable) to Sans (by Roozbeh
+  Pournader) 
+- dereferenced all glyphs with mixed references and outlines (by Denis
+  Jacquerye)
+- removed non-zero width from U+0344 in Sans (by Denis Jacquerye)
+
+Changes from 2.21 to 2.22
+
+- directory structure has changed, we now use the Makefile
+- modified Armenian U+0565 in Sans (by Սահակ Պետրոսյան)
+- added double struck letters and numbers U+2102, U+210D, U+2115,
+  U+2119-U+211A, U+211D, U+2124, U+213C-U+2140, U+2145-U+2149, U+1D538-U+1D539,
+  U+1D53B-U+1D53E, U+1D540-U+1D544, U+1D546, U+1D54A-U+1D550, U+1D552-U+1D56B,
+  U+1D7D8-U+1D7E1 to Serif (by Stephen Hartke)
+- added letterlike symbols U+2103, U+2109, U+2127, U+214B, U+2141-U+2144 to
+  Serif (by Ben Laenen)
+- fixed outline direction of U+2143 in Sans Bold/Bold Oblique (by Ben Laenen)
+- added arrow set in Serif: arrows: U+2194-U+21FF; dingbats: U+27A1;
+  supplemental arrows A: U+27F0-U+27FF; supplemental arrows B: U+2900-U+2975,
+  U+297A; miscellaneous symbols and arrows: U+2B00-U+2B11 (by Ben Laenen)
+- added U+0180, U+01DE, U+01E0-01E1, U+022A, U+022C, U+0230, U+1E08-U+1E09,
+  U+1E10-U+1E11, U+1EB0-U+1EB1 to Mono (by Denis Jacquerye)
+- adjusted U+01D5, U+01D7, U+01D9, U+1DB in Mono (by Denis Jacquerye)
+- added Ogham in Sans (by Wesley Transue)
+- added Yijing Hexagram Symbols in Sans (by Wesley Transue)
+- hinting instructions added to Cyrillic U+0460, U+04A6-U+04A7, U+04AC-U+04AD,
+  U+04C7-U+04C8, U+04F6-U+04F7, U+04FA-U+04FB, U+050C-U+050D in Sans Book (by
+  Wesley Transue)
+- adjusted Cyrillic letters U+042A, U+044A, U+044C, U+0459-U+045B, U+0462,
+  U+048C-U+048D in Serif (by Andrey V. Panov)
+- hinting instructions added to Lao U+0EB7 in Sans (by Wesley Transue)
+- added Roman numerals and Claudian letter U+2160-U+2184 in Serif (by Ben
+  Laenen)
+- added U+FFF9-U+FFFD to Sans, Serif and Mono (by Lars Næsbye Christensen)
+- added mathematical symbols to Serif: U+2200, U+2203-U+2204, U+2213-U+2214,
+  U+2217-U+2218, U+2223-U+2226, U+2250-U+2255, U+2295-U+22AF, U+22C5 (by Ben
+  Laenen)
+- modified bullet symbol U+2219 in Serif (by Ben Laenen)
+
+Changes from 2.20 to 2.21
+
+- added U+FE20-U+FE23 (half diacritics) to Sans (by Denis Jacquerye)
+- added anchor "half" to position right half of double marks, U+FE21 or U+FE23
+  to Sans (by Denis Jacquerye)
+- shifted U+0360 up to avoid collision with some outlines in Sans (by Denis
+  Jacquerye)
+- added anchor above-mark anchor to U+035D, U+035E, U+0360, U+0361 in Sans (by
+  Denis Jacquerye)
+- added instructions for ff, ffi, ffl ligatures in Serif Bold (by Eugeniy
+  Meshcheryakov)
+- added instructions to some N'Ko glyphs (by Wesley Transue)
+- added instructions to some Lao glyphs (by Wesley Transue)
+- cleaning up 'liga' Standard Ligature in Latin, in Sans and Sans Mono (by
+  Denis Jacquerye)
+- added U+046A, U+046B (big yus) in Serif (by Andrey V. Panov)
+- added box drawing symbols to Sans and Serif (by Lars Næsbye Christensen)
+- added Makefile to improve font and packages generating (by Nicolas Mailhot)
+
+Changes from 2.19 to 2.20
+
+- removed TeX and TeXData tags from all sfd files (by Eugeniy  Meshcheryakov)
+- removed all 'frac' lookups (by Eugeniy  Meshcheryakov)
+- fixed duplicate glyph names (by Eugeniy  Meshcheryakov)
+- removed standard ligatures with U+00B7 in Mono (by Eugeniy  Meshcheryakov)
+- use reference to U+002D in U+00AD in Sans Oblique, and adjust instructions
+  (by Eugeniy  Meshcheryakov)
+- updated Cyrillic in Sans Extra Light (by Andrey V. Panov)
+- added instructions to N'Ko U+07C1-U+07C6, U+07CA, U+07CE-U+07CF, U+07D1,
+  U+07D3-U+07D4, U+07D8, U+07DB and U+07EB in Sans (by Wesley Transue)
+- added instructions to Lao U+0E8A, U+0E95, U+0E97, U+EA5, U+0EB4 and U+0EB5
+  (by Wesley Transue)
+- adjusted instructions for Hebrew glyphs (by Denis Jacquerye)
+- added instructions for U+0265 in Sans Bold (by Denis Jacquerye)
+- fix U+1D68 in Sans: it had the shape of delta, where it should be a rho (by
+  Ben Laenen)
+- remove U+1D5C glyph in Sans Oblique (it was empty) (by Ben Laenen)
+- fix instructions of U+01AD in Sans Bold  (by Ben Laenen)
+- fix instructions of U+042D in Serif (by Ben Laenen)
+- remove buggy instructions of U+2328 in Serif (by Ben Laenen)
+- corrected width of U+2C75-U+2C76 in Sans Bold and Serif Bold (by Gee Fung Sit)
+- added U+2C75-U+2C77 to Mono (by Gee Fung Sit)
+
+Changes from 2.18 to 2.19
+
+- fixed misplaced symbols (U+2325,2326) in Sans Oblique (by John Karp) 
+- added Mark to Base anchors: 'cedilla' for combining cedilla and
+  'above-legacy' for stacking above precomposed glyphs (just a,e,i,o,u with
+  macron for now) in Sans (by Denis Jacquerye).
+- added contextual substitution for Case and Dotless forms in all Sans variants
+  (by Denis Jacquerye).
+- renamed 'ccmp' lookups for RTL and Basic (LGC, etc.) (by Denis Jacquerye)
+- added anchor 'cedilla' for vowels in Sans. (by Denis Jacquerye)
+- extended contextual dotless and case substitutions to handle both below and
+  above diacritics (by Denis Jacquerye)
+- renamed Dotless and Case Form GSUB lookups in Sans with meaningful names (by
+  Denis Jacquerye)
+
+Changes from 2.17 to 2.18
+
+- Re-encoded the source files for Full Unicode (by Ben Laenen)
+- Re-enabled the "ff", "fl", "fi", "ffl", "ffi" ligatures by default in Serif
+  (by Ben Laenen)
+- Disabled the "fi", "ffi" ligatures for languages with dotless i in Serif (by
+  Ben Laenen)
+- added Tifinagh to Sans Book and Bold, U+2D30-U+2D65, U+2D6F, partially hinted
+  in Sans Book. (by Denis Jacquerye)
+- added Tai Xuan Jing Symbols (U+1D300-1D356) to Sans (by Remy Oudompheng)
+- added double-struck letters (U+1D538-U+1D56B minus reserved code points) to
+  Sans (by Gee Fung Sit)
+- added U+22EE-U+22F1 to Sans (by Gee Fung Sit)
+- added U+2C67-U+2C6C, U+2C75-U+2C77 to Serif (by Gee Fung Sit)
+- italicized various glyphs in Latin Extended-B, IPA Extensions, Spacing
+  Modifier Letters, Phonetic Extension (Supplement) and Super- and Subscripts
+  in Serif Oblique fonts (by Gee Fung Sit)
+- modified outlines, bearings of Hebrew U+05D6, U+05D8, U+05DB, U+05DE, U+05E0,
+  U+05E1, U+05E2, U+05EA in Sans Book and Oblique, adjusted hinting in Book
+  based on Yotam Benshalom's comments. (by Denis Jacquerye)
+- added Braille Patterns (U+2800-U+28FF) to Serif fonts (by Gee Fung Sit)
+- added N'Ko to Sans Book and Bold: U+07C0-U+07E7, U+07EB-U+07F5, U+07F8-U+07FA
+  (by Eugeniy  Meshcheryakov)
+- added U+0ED8 (Lao digit 8) to Sans (by Remy Oudompheng)
+- added Lao diacritics U+0EB0-0EB9, U+0EBB-0EBC, U+0EC8-0ECD to Mono (by Remy
+  Oudompheng)
+- renamed Serif [Bold] Oblique, make it Italic (by Eugeniy  Meshcheryakov)
+- added U+29FA-U+29FB to Sans and Sans Mono (by Gee Fung Sit)
+- swapped glyphs for Eng U+014A from Sami Eng to African Eng, the latter being
+  more common (by Denis Jacquerye)
+- swapped ae U+00E6 and ae.alt in Serif Italics fonts, thus fixing #8213 (by
+  Denis Jacquerye)
+- minor improvements to Misc. Symbols in Sans (by Gee Fung Sit)
+- minor improvements and additions to Sans ExtraLight (by Gee Fung Sit)
+- improved instructions for various Cyrillic letters (by Eugeniy  Meshcheryakov)
+- fixed hinting of theta and chi in Sans Book (by Ben Laenen)
+- added Georgian Mkhedruli to Sans, Serif and Mono, ASumtavruli to Sans and
+  Serif (by Besarion Gugushvili)
+
+Changes from 2.16 to 2.17
+
+- Sans fonts: fix position for certain combinations of Arabic fatha, kasra,
+  shadda, damma, kasratan, dammatan, fathatan and hamza (by Ben Laenen)
+- added 'ae.alt' to Serif Oblique fonts, with design matching shape of italic
+  'a' instead of slanted 'a', see bug #8213 (by Denis Jacquerye)
+- added super- and subscripts to Serif and Mono: U+1D2C-U+1D2E, U+1D30-U+1D3C,
+  U+1D3E-U+1D42, U+1D62-U+1D65, U+1D78, U+2071, U+207A-U+207E, U+208A-U+208E,
+  U+2090-U+2094 (by Gee Fung Sit)
+
+Changes from 2.15 to 2.16
+
+- fixed hinting instructions for digits in DejaVu Sans Oblique, Bold Oblique,
+  and Serif Book to not change glyph width (by Eugeniy  Meshcheryakov)
+- added instructions for U+0404, U+0411, U+0413, U+0414, U+0417-U+041B, U+041F,
+  U+0423, U+0424, U+0426-U+0429, U+042C, U+042E, U+042F, U+0490 in Serif Bold
+  (by Eugeniy  Meshcheryakov)
+- added U+0220 and Eng.alt to Serif fonts (by Denis Jacquerye)
+- added U+232C, U+2394, U+23E3 to Sans fonts (by John Karp)
+- added U+230C-U+230F, U+231C-U+231F to Sans fonts, fixing bug:9547
+  (by John Karp)
+- adjusted dot below, dot above, dieresis above, dieresis below in Sans fonts
+  (by Denis Jacquerye)
+- added U+2300, U+2301, U+2303, U+2304, U+2305, U+2307, U+2326, U+2327, U+232B,
+  arrow.base to Sans fonts (by John Karp)
+- adjusted dot and dieresis below and above in Serif fonts (by Denis Jacquerye)
+- added U+1E1C-U+1E1D to Serif fonts (by Denis Jacquerye)
+- added U+22BE, U+22BF (by Wesley Transue)
+- added U+2324; modified U+2325: more standard proportions, and matches U+2324 
+  and U+2387; added U+2387 : flipped U+2325 with standard arrowhead 
+  (by John Karp)
+- added Lao digits U+0ED0-0ED7, U+0ED9 (by Remy Oudompheng)
+- added to Mono in Arabic block : U+060C, U+0615, U+061B, U+061F, 
+  U+0621-U+063A, U+0640-0655, U+065A, U+0660-066F, U+0674, U+0679-0687, U+0691, 
+  U+0692, U+0698, U+06A1, U+06A4, U+06A9, U+06AF, U+06B5, U+06BA, U+06BE, 
+  U+06C6, U+06CC, U+06CE, U+06D5, U+06F0-06F9 (by Remy Oudompheng)
+- added to Mono in Arabic Presentations Forms-A : U+FB52-FB81, U+FB8A-FB95, 
+  U+FB9E, U+FB9F, U+FBAA-FBAD, U+FBE8, U+FBE9, U+FBFC-FBFF (by Remy Oudompheng)
+- added to Mono in Arabic Presentations Forms-B : U+FE70-FE74, U+FE76-FEFC, 
+  U+FEFF (by Remy Oudompheng)
+- added U+05BA, U+05BE, U+05F3, U+05F4, U+FB1E, U+FB21-U+FB28, U+FB4F to Sans 
+  (by Eugeniy  Meshcheryakov)
+- added U+2102 to Mono (by Eugeniy  Meshcheryakov)
+- added U+2983-U+2984 to Sans (by Gee Fung Sit)
+- added U+2A2F to Sans, Serif and Mono (by Gee Fung Sit)
+- added U+2373-2375, U+237A to Sans (by John Karp)
+- converted kern pairs to kern classes with Tavmjong Bah's scripts 
+  (by Denis Jacquerye)
+- set ScriptLang of kerning classes to just latn because of Pango bug
+  (by Denis Jacquerye)
+- added DNK to ScriptLang latn otherwise it is excluded, and SRB and MDK to
+  cyrl (by Denis Jacquerye)
+- removed flag 0x80 in generate.pe, otherwise it generates kerning tables some
+  systems don't like; thus loosing Apple tables (by Denis Jacquerye)
+- removed ligature for precomposed legacy characters of Sans Oblique fonts
+  (by Denis Jacquerye)
+- added bearings to en dash U+2013, em dash U+2014 and figure dash U+2012
+  by making dashes shorter, preserving character width (by Denis Jacquerye)
+- reduced U+031C, U+0325 (ring below), U+0339 to be entirely visible; 
+  added instructions in Sans Book; changed U+1e00-U+1e01 to use new ring below
+  (by Denis Jacquerye)
+- adjusted circumflex below on U+1E12-U+1E13, U+1E18-U+1E19, U+1E3C-U+1E3D,
+  U+1E4A-U+1E4B, U+1E70-U+1E71, U+1E76-U+1E77 in Sans fonts (by Denis Jacquerye)
+- Added U+0ED4, U+0ED5 to DejaVu Sans (by Remy Oudompheng)
+- Lao-specific anchors (by Remy Oudompheng)
+- added alternate I to match the small capital in Sans (by Gee Fung Sit)
+
+Changes from 2.14 to 2.15
+
+- improved hinting in Sans Oblique to deal with some spacing and inconsistency
+  issues (by Ben Laenen)
+- added anchors to Mono Book, and added GPOS rules for combining diacritics to
+  show up as zero width glyphs (by Ben Laenen)
+- removed U+F21C (PUA), it was copy of U+2C64 from Latin Extended C (by Eugeniy
+  Meshcheryakov)
+- added U+27E6-U+27E7 to Sans (by Gee Fung Sit)
+- added U+1407, U+1409, U+140C-U+141B, U+141D-U+1425, U+1427-U+142E,
+  U+1435-U+1438, U+143A-U+1449, U+1452, U+1454, U+1457-U+1465, U+1467-U+146A,
+  U+1471, U+1474-U+1482, U+1484-U+1488, U+148F, U+1492, U+14A0, U+14A2, U+14A9,
+  U+14AC-U+14BA, U+14BC, U+14BD, U+14C6, U+14C9-U+14CF, U+14D1, U+14D2, U+14D9,
+  U+14DC-U+14E9, U+14EC, U+14F3, U+14F6-U+1504, U+1506, U+1507, U+1510-U+1525,
+  U+152C, U+152F-U+153D, U+1540, U+1541, U+154E, U+154F, U+1552, U+155B, U+155C,
+  U+1568, U+1569, U+1574-U+157B, U+157D, U+15A7-U+15AE, U+1646, U+1647 (by
+  Eugeniy Meshcheryakov)
+- fixed several contours to not intersect, use horizontal or vertical tangents,
+  use integer coordinates, etc in Sans Book (by Denis Jacquerye)
+- added U+0496-U+0497 in Serif (by Andrey V. Panov)
+
+Changes from 2.13 to 2.14
+
+- added Philippine peso glyph U+20B1 (by Clayborne Arevalo)
+- made U+2012 have the same width as digits, according to Unicode 5.0, 
+  page 206 (by Roozbeh Pournader)
+- made all of the "above" combining characters remove the dot of "i", 
+  "j", etc (Soft_Dotted characters), according to Unicode 5.0, 
+  page 228 (by Roozbeh Pournader)
+- made U+012F, U+03F3, U+0456, U+0458, U+1E2D, and U+1ECB (all fonts 
+  except Mono), U+0249, U+2148, and U+2149 (Sans and Sans Condensed), 
+  U+0268 (Sans ExtraLight, Serif and Serif Condensed), and U+029D (Serif 
+  and Serif Condensed) respect the Soft_Dotted property (by Roozbeh 
+  Pournader)
+- added U+223E, U+223F, U+2240, U+22C2, U+22C3 to Sans (by Remy Oudompheng)
+- added U+203D to Serif (by Gee Fung Sit)
+- added zero-width glyphs for U+2061-U+2063 to Sans and Serif (by Gee 
+  Fung Sit)
+- changed isolated forms of Arabic waw (U+0648, U+0624 and U+06C6) (bug #9432) 
+  (by Ben Laenen)
+- added Lao consonants U+0E81, U+0E82, U+0E84, U+0E87, U+0E88, U+0E8A, 
+  U+0E8D, U+0E94-0E97, U+0E99-0E9F, U+0EA1-0EA3, U+0EA5, U+0EA7, U+0EAA, 
+  U+0EAB, U+0EAD-0EAF to Sans Mono (by Remy Oudompheng)
+- added U+0200-U+0217, U+0226-U+0229, U+02F3, U+1E00-U+1E07, 
+  U+1E0A-U+1E0B, U+1E18-U+1E1F, U+1E22-U+1E23, U+1E28-U+1E2D, 
+  U+1E3A-U+1E3B, U+1E40, U+1E48-U+1E49, U+1E56, U+1E58-U+1E59, 
+  U+1E5E-U+1E5F, U+1E60, U+1E68-U+1E6B, U+1E6E-U+1E6F, U+1E72-U+1E77, 
+  U+1E86-U+1E8B, U+1E92-U+1E96, U+1EA0-U+1EA1, U+1EF4-U+1EF5 to Mono 
+  (by Ben Laenen)
+- renamed uppercase variants of diacritics (macron, breve, double grave, 
+  double acute, inverted breve, dot above) to "uni03XX.case" in Mono 
+  (by Ben Laenen)
+- moved uppercase variants of diacritics up in Mono so they properly 
+  vertically align on capitals (by Ben Laenen)
+- precomposed glyphs with macron, breve, double grave, double acute, 
+  inverted breve, dot above, macron below, breve below, inverted breve 
+  below, dot below, cedilla, caron below, circumflex below, diaeresis 
+  below, tilde below now reference to combining diacritics instead of 
+  space modifiers in Mono (by Ben Laenen)
+- made ring below (U+0325), and half rings below (U+031C and U+0339) 
+  smaller in Mono (by Ben Laenen)
+- added U+205F to all fonts (by Roozbeh Pournader)
+- added U+035E-U+035F to Sans (by Roozbeh Pournader)
+- added empty glyphs for U+034F, U+202A-U+202E, U+2060, U+206A-206F, 
+  U+FE00-U+FE0F to non-Mono fonts (by Roozbeh Pournader)
+- added U+2101, U+2107-U+2108, U+210B, U+210C, U+2110, U+2112, U+211B, 
+  U+211F, U+2123, U+2125, U+2128-U+2129, U+212C-U+212D, U+212F, 
+  U+2130-U+2131, U+2133, U+2136-U+213A, U+2141-U+2144, U+2B00-U+2B11, 
+  U+2B20-U+2B23 to Sans (by John Karp)
+- reshaped omega (U+03C9) in Mono (by Ben Laenen)
+- added U+2205, U+22C6, U+2300-U+2301, U+2303-U+2306, U+230C-U+230F, 
+  U+2312-U+2315, U+231C-U+231F, U+2335, U+2337-U+233E, U+2341-U+2344, 
+  U+2347-U+2348, U+234B-U+234D, U+2349-U+2350, U+2352-U+2354, 
+  U+2357-U+2359, U+235A-U+235C, U+235E-U+2360, U+2363-U+2365, 
+  U+2368-U+2369, U+236B-U+2370, U+2373-U+237A, U+2380-U+2383, 
+  U+2388-U+238B, U+2395 in Mono (by Ben Laenen)
+
+Changes from 2.12 to 2.13
+
+- adjusted U+0198B, U+01B3-U+01B4 in Sans, hinted U+01B4 in Sans Book 
+  (by Denis Jacquerye)
+- added U+27F0-U+27FF, U+2906-U+2907, U+290A-U+290B, U+2940-U+2941 to Sans 
+  (by Denis Jacquerye)
+- added U+01E6-U+01E9, U+01EE-U+01EF, U+01F4-U+01F5, U+01FC-U+01FF, 
+  U+021E-U+021F, U+0245, U+02BD, U+02C9, U+1E9B, U+2045-U+2046, U+2213, U+22C5,
+  U+22EF to Sans Mono (by Roozbeh Pournader)
+- added U+04FA-U+04FD to Sans (by Michael Everson)
+- removed U+2329 and U+232A because of their CJK properties, added U+27E8 
+  and U+27E9 in their stead, fixing part of bug #9038 (by Roozbeh Pournader)
+- corrected and improvised U+0466-U+0469, U+046E-U+0471, U+047C-U+047D, U+0482, 
+  U+0484-U+0486, U+0492-U+0493, U+04B0-U+04B1, U+050C-U+050D, and U+204A 
+  in Sans (by Michael Everson)
+- added instructions for U+0402, U+0409, U+040A, U+040B, U+044D, U+040F, 
+  U+0452, U+0459-U+045B, U+045F to Sans Book (by Eugeniy Meshcheryakov)
+- made italic shape for U+431, U+432, U+437, U+43B, U+43C, U+43D, U+444, U+447, 
+  U+44D, U+44F, U+459, U+45A in SerifOblique and SerifBoldOblique 
+  (by Andrey V. Panov)
+- modified U+024C to match glyph in Unicode chart, fixing bug #9039 
+  (by Denis Jacquerye)
+- made some canonically equivalent characters share the same glyph: 
+  U+02B9 = U+0374, U+0343 = U+0313, and U+0387 = U+00B7 also adjusting U+02BA 
+  to look like double U+02B9, fixing parts of bug #9038 (by Roozbeh Pournader)
+- changed shapes for U+0478 and U+0479 in Sans to those in the Unicode charts, 
+  based on a recent decision by Unicode Technical Committee to only use 
+  the digraph form (by Michael Everson)
+- adjusted width of NBSP U+00A0 and NNBSP U+202F, fixing bug #8401 
+  (by Denis Jacquerye)
+- fixed several contours to not intersect, use horizontal or vertical tangents, 
+  use integer coordinates, etc (by Roozbeh Pournader and Denis Jacquerye)
+- added U+1402, U+1430, U+144D, U+146C, U+148A, U+14A4, U+14C1, U+14D4, U+14EE, 
+  U+1527, U+1545, U+157E, U+158E, U+15AF to Sans (by Eugeniy Meshcheryakov)
+- enlarged width of U+459 and U+45A in Serif (by Andrey V. Panov)
+- made traditional shape for U+452, U+45B (by Andrey V. Panov)
+- added euro sign U+20AC to Sans ExtraLight, making fontconfig recognize 
+  the font as supporting English (by Denis Jacquerye)
+
+Changes from 2.11 to 2.12
+
+- added U+0180 to Serif (by Denis Jacquerye)
+- improved and/or hinted Armenian letters U+0542, U+0546, U+0562,
+  U+0563, U+0564, U+0577, U+0582 in Sans (by Ben Laenen)
+- added U+4FE-U+4FF, U+512-U+513, U+2114, U+214E, U+26B2 to Sans
+  (by Gee Fung Sit)
+- adjusted U+0496-U+0497, U+049A-U+04A1 in Sans to match U+0416,
+  U+041A, U+0436 and U+043A (by Gee Fung Sit)
+- Mathematical Operators in Sans: changed U+22C0-U+22C1 to match
+  other n-ary operators, adjusted U+2203-U+2204, changed U+2220 in
+  Sans to match the style of U+2221 (by Gee Fung Sit)
+- added U+1401, U+1403-U+1406, U+140A, U+140B, U+1426, U+142F,
+  U+1431-U+1434, U+1438, U+1439, U+1449, U+144A, U+144C,
+  U+144E-U+1451, U+1455, U+1456, U+1466, U+146B, U+146D-U+1470,
+  U+1472, U+1473, U+1483, U+1489, U+148B-U+148E, U+1490, U+1491,
+  U+14A1, U+14A3, U+14A5-U+14A8, U+14AA, U+14AB, U+14BB, U+14C0,
+  U+14C2-U+14C5, U+14C7, U+14C8, U+14D0, U+14D3, U+14D5-U+14D8,
+  U+14DA, U+14DB, U+14EA, U+14ED, U+14EF-U+14F2, U+14F4, U+14F5,
+  U+1405, U+1526, U+1528-U+152B, U+152D, U+152E, U+153E,
+  U+1542-U+1544, U+1546-U+154D, U+1550, U+1553, U+1555-U+155A,
+  U+1567, U+156A, U+157C, U+157F-U+1585, U+158A-U+158D,
+  U+158F-U+1596, U+15A0-U+15A6, U+15DE, U+15E1, U+166E-U+1676 to
+  Sans (by Eugeniy Meshcheryakov)
+- re-enabled Latin ligatures fi, ffi, fl, ffl and ff in Sans
+  (by Ben Laenen)
+- made italic shape for U+436, U+44A, U+44B, U+44C, U+44E, U+45F,
+  U+463 in SerifOblique and SerifBoldOblique (by Andrey V. Panov)
+- fixed sub- and superscript metrics in Condensed Sans (bug #8848)
+  (by Ben Laenen)
+- added U+474, U+475 in Serif (by Andrey V. Panov)
+- hinted Greek glyphs U+03B7, U+30B8, U+03B9, U+03C1, U+03C3,
+  U+03C6 in Mono Book (by Ben Laenen)
+
+Changes from 2.10 to 2.11
+
+- added instructions for Hebrew glyphs (Sans Book, by Eugeniy
+  Meshcheryakov)
+- changed U+01A6 (Latin Yr) after bug #8212, in Sans, Serif and
+  Sans Mono fonts (by Denis Jacquerye).
+- removed instruction for U+2600-U+26A1 (by Mederic Boquien)
+- added U+202F and set width of U+00A0 (nobreakingspace) to the
+  same as U+0020, space (by Denis Jacquerye).
+- added and improved instructions for various Cyrillic letters
+  (by Eugeniy Meshcheryakov)
+- Changed U+416, U+42F, U+427 (non-Bold), U+436, U+447 (non-Bold),
+  U+44F, U+437 (Bold), corrected U+40F, U+414, U+424, U+426, U+429,
+  U+434, U+438 (Bold), U+446, U+449, U+44D (non-Bold), U+45F in
+  Sans Mono (by Andrey V. Panov)
+- made small corrections to Cyrillic, most appreciable to U+409,
+  U+413, U+41B, U+427 and U+433, U+434, U+43B, U+447, U+459
+  (upright fonts) to Serif (by Andrey V. Panov)
+- adjusted bearings of U+410, U+416, U+41A, U+42F, U+436, U+43A,
+  U+443, U+44F in Serif (by Andrey V. Panov)
+- enlarged width of U+44A, U+44B, U+44C, U+463 in Serif
+  (by Andrey V. Panov)
+- added ligature "iacute" as "afii10103" (U+456) "acutecomb" in
+  Serif (by Andrey V. Panov)
+- made italic shape to U+446, U+448, U+449 in Serif (by Andrey V.
+  Panov)
+- added "afii10831" (U+F6C7), "afii10832" (U+F6C8) in Serif (by
+  Andrey V. Panov)
+- new minimum version of fontforge is 20061014 (by Ben Laenen)
+
+Changes from 2.9 to 2.10:
+
+- added U+0242, U+024A-U+024B, U+024E-U+024F, U+037C-U+037D, U+0E3F, 
+  U+1D2C-U+1D2E, U+1D30-U+1D42, U+1D5D-U+1D6A, U+1D78, U+1DB8, 
+  U+2090-U+2094, U+20D0-U+20D1, U+2C60-U+2C66, U+2C6B-U+2C6C, U+2C74 and 
+  U+FB29 to Sans (by Gee Fung Sit)
+- added Lao glyphs : U+0E81-0E82, U+E084, U+0E87-0E88, U+0E8A, U+0E8D, 
+  U+0E94-0E97, U+0E99-0E9F, U+0EA1-0EA3, U+0EA5, U+0EA7, U+0EAA-0EAB, 
+  U+0EAD-0EB9, U+0EBB-0EBD, U+0EC0-0EC4, U+0EC6, U+0EC8-0ECD, U+0EDC-0EDD 
+  (by Remy Oudompheng)
+- fixed U+0193 not showing in Windows (bug #7897) (by Ben Laenen)
+- changes to U+222B-222D in Sans Mono (by Remy Oudompheng)
+- ported the three remaining currency symbols from Arev (U+20B0, 
+  U+20B2-U+20B3), and replaced one (U+20AF) in Sans (by Lars Naesbye 
+  Christensen)
+- corrected U+20A5 in Sans (by Gee Fung Sit)
+- merged Double-Struck Letters from Arev: U+2102, U+210D, U+2115, 
+  U+2119-U+211A, U+2124, U+213C-U+2140 (by Gee Fung Sit)
+- added U+2308-U+230B and U+2329-U+232A to Sans Mono and Serif faces, 
+  fixed incorrect direction of U+2329 in Sans faces, and improved 
+  U+2308-U+230B in Sans faces per Ben Laenen's suggestions (by David 
+  Lawrence Ramsey)
+- added U+06D5 and final form of it (needed for Kurdish) (by Ben Laenen)
+- added two special glyphs U+F000 and U+F001 in Sans Book that show the 
+  current ppem size (horizontal and vertical) (by Ben Laenen)
+- added U+2318 and U+2325 to Sans Mono faces, based on the Sans versions 
+  (by David Lawrence Ramsey)
+- added U+2B14-U+2B1A to all faces except Sans ExtraLight (by David 
+  Lawrence Ramsey)
+- respaced all Geometric Shapes characters in Serif faces to match those 
+  in Sans faces again, respaced U+23CF in Sans, Sans ExtraLight, and 
+  Serif faces to match U+25A0 (or Sans in Sans ExtraLight's case) again, 
+  and respaced U+2B12-U+2B13 in Sans and Serif faces to match U+25A1 
+  again (by David Lawrence Ramsey)
+- corrected width of Modifier Small Letters U+1D43-1D5B in Sans Oblique 
+  and U+1D9B-U+1DBF in Sans Oblique and Sans Bold Oblique (by Gee Fung Sit)
+- added a bunch of glyphs to Sans ExtraLight (see SVN for details) (by 
+  Gee Fung Sit)
+- adjusted Cyrillic descenders in Sans ExtraLight to sync with Sans (by 
+  Gee Fung Sit)
+- added U+0242, U+0245 to Serif (by Gee Fung Sit)
+- replaced the SHPIX routines which gave them bad spacing at certain 
+  sizes in FreeType for A, V, Z, v and z in Sans Bold (by Ben Laenen) 
+
+Changes from 2.8 to 2.9:
+
+- DejaVuSansExtraLight.sfd: changed family name from "DejaVu Sans" to
+  "DejaVu Sans Light" (in case we add a Light weight variant), so legacy
+  apps that understand only 4 styles are happy. (by Denis Jacquerye)
+- added Name ID 16, aka preferred family name, and Name ID 17, aka
+  preferred style name, so contemporary apps that understand more that 4
+  styles can use big fonts families "DejaVu Sans" and "DejaVu Serif". For
+  those, Extralight and Condensed are just styles not different families.
+  (by Denis Jacquerye)
+- added U+22B6-22BD, U+22C0-22C1, U+22D6-22D7 to Sans. (by Remy Oudompheng)
+- added U+037B, U+2184, U+2C67-U+2C6A and U+2C75-U+2C77 to Sans (by Gee
+  Fung Sit)
+- adjusted asteriskmath (U+2217) for consistency with other mathematical
+  operators in Sans (by Ben Laenen)
+- hinted some Armenian capitals in Sans Book (by Ben Laenen)
+- added U+0246 - U+0249 (by Ben Laenen)
+- BUGFIX : swapped U+224E and U+224F, in Sans, Sans Condensed and Sans Mono
+  (by Remy Oudompheng)
+- adjusted U+20B5 (by Mederic Boquien)
+- swapped U+21DA and U+21DB which were in wrong order (by Heikki Lindroos)
+- added U+222E-2233, U+239B-23AD, U+2A00-2A02, U+2A0F-2A1C to Sans (by Remy
+  Oudompheng)
+- added U+239B-23AD to Mono (by Remy Oudompheng)
+- added U+2024-2025 to Serif (by Mederic Boquien)
+- added U+222C-222D, U+2A0C-2A0E to Serif (by Remy Oudompheng)
+- added U+2190-21FF to Mono (by Heikki Lindroos)
+- added Hebrew glyphs - U+05B0-U+05BD, U+05BF-U+05C3, U+05C6, U+05C7,
+  U+05D0-U+05EA, U+05F0-U+05F2, U+FB1F, U+FB20, U+FB2A-U+FB36,
+  U+FB38-U+FB3C, U+FB3E, U+FB40, U+FB41, U+FB43, U+FB44, U+FB46-U+FB4E (by
+  Gee Fung Sit and Eugeniy Meshcheryakov)
+- adjustments for Cyrillic in Sans (by Andrey V. Panov)
+- made italic shape for U+0434, U+0456, U+0457 in SerifOblique and Serif
+  Bold Oblique (by Andrey V. Panov)
+
+Changes from 2.7 to 2.8:
+
+- fixed instructions for U+0423, U+0427, U+0447, U+0448 in Serif, so they
+  look good at large sizes too (by Eugeniy Meshcheryakov)
+- added U+FB00 and U+FB03 to U+FB06 to Serif typefaces (by Heikki Lindroos)
+- added U+26B0-U+26B1, U+2701-U+2704, U+2706-U+2709, U+270C-U+2727, U+2729
+  to U+274B, U+274D, U+274F to U+2752, U+2756, U+2758-U+275E, U+2761 to
+  U+2775 (by Heikki Lindroos)
+- added and improved instructions for Cyrillic letters in Mono and Serif
+  (Book, by Eugeniy Meshcheryakov)
+- rotated U+26B0 (was too small in mono) (by Gee Fung Sit)
+- adjusted U+1EDA-U+1EDD, U+1EE8-U+1EEB, capitals using capital specific
+  accent and moved diacritics to match position on U+00F2 (ograve), etc.
+  (by Denis Jacquerye)
+- added U+20D6, U+20D7 to Sans (by Gee Fung Sit)
+- made Armenian ligatures discretionary since the Firefox ligature problem
+  still isn't fixed (by Ben Laenen)
+- moved Armenian hyphen U+058A to a higher position (bug #7436) (by Ben
+  Laenen)
+- hinted Greek glyphs in Sans Bold (by Ben Laenen)
+- enabled Arabic lam-alif ligatures when diacritics are used (by Ben Laenen)
+
+Changes from 2.6 to 2.7:
+
+- added glyphs needed for Kurdish: U+0695, U+06B5, U+06C6, U+06CE and their
+  init/medi/fina forms in Sans (by Ben Laenen)
+- added U+02CD, U+01F8 - U+01F9, U+1E3E - U+1E3F, U+1E30 - U+1E35, U+1EBC -
+  U+1EBD, U+1EF8 - U+1EF9 (includes glyphs needed for Yoruba, Maori, Guarani
+  and Twi) (by Ben Laenen)
+- added U+22C8-22CC, U+29CE-29D5, U+2A7D-2AA0, U+2AAE-2ABA, U+2AF9-2AFA to
+  Sans (by Remy Oudompheng)
+- adjusted diacritics on Vietnamese, Pinyin and other characters:
+  U+01A0-U+01A1, U+01AF-U+01B0, U+01D5-U+01DC, U+01DE-01E1, U+01FA-U+01FB
+  U+022A-U+022D, U+0230-U+0231, U+1E14-U+1E17, U+1E4C-U+1E53, U+1E78-U+1E7B,
+  U+1EA4-U+1EF1 in Sans (Book, Bold and Oblique) (by Denis Jacquerye)
+- added basic arrows U+2190-U+2193 in Serif, which completes MES-1 compliance
+  for Serif (by Ben Laenen)
+- added U+01E4, U+01E5, U+01FA, U+01FB, U+02BD, U+02C9 and U+02EE to Serif
+  (by Ben Laenen)
+- fixed U+0209 in Serif Bold Oblique (by Ben Laenen)
+- adjusted Box Drawing block characters U+2500-257F in Mono to fit character
+  cell, shifting them up by 416 (Denis Jacquerye)
+- redid U+0194 in Sans (by Ben Laenen)
+- added U+2217-2218, U+2295-22A1 to Mono (by Remy Oudompheng)
+- added U+0462 to Serif (by Andrey V. Panov)
+- added U+226C, U+228C-228E, U+2293-2294, U+22F2-22FF to Sans (by Remy
+  Oudompheng)
+- adjusted U+2208-220D in Sans (by Remy Oudompheng)
+- improved some Cyrillic glyphs in Mono (by Andrey V. Panov), rewritten
+  instructions for changed glyphs (by Eugeniy Meshcheryakov)
+- added U+1E0E-1E0F, U+1E8E-1E8F to Mono fonts (by Denis Jacquerye). (bug
+  #7166)
+- renamed 'Dotabove' to 'Dotaccent' in Mono Sans Oblique to match other fonts
+  (by Denis Jacquerye).
+- added U+200B-U+200F in Sans faces and Serif faces, U+200B and U+200C were
+  in Sans already (by Lars Naesbye Christensen)
+- added U+2601-U+262F, U+263D, U+263E, U+2648-U+265F, U+2668, U+2670-U+268B,
+  U+2690-U+269C, U+26A0, U+26A1, U+2794, U+2798-U+27AF, U+27B1-U+27BE to Mono
+  (by Heikki Lindroos)
+- replaced the references with unshifted ones for both κ U+03BA and к U+043A
+  in Mono Book (by Denis Jacquerye)
+- fixing glyph for U+04ED in Mono Book, consisted only of dieresis (by Andrey
+  V. Panov).
+
+Changes from 2.5 to 2.6:
+
+- redid U+2032 - U+2037, U+2057 based on Arev in Sans (by Gee Fung Sit)
+- added U+0195, corrected U+039E, U+204B in Sans ExtraLight (by Gee Fung Sit)
+- added instructions for some Cyrillic letters in Sans Bold (by Eugeniy
+  Meshcheryakov)
+- added vulgar fractions U+2153-U+215F for Serif, made with references (by
+  Lars Naesbye Christensen)
+- added U+228F-2292, U+2299-22AF, U+22B2-22B5, U+22CD, U+22D8-22ED to Sans
+  (by Remy Oudompheng)
+- added U+2208-220D, U+2238-223D, U+2278-2281, U+228A-228B, U+228F-2292,
+  U+22CD, U+22DA-22E9 to Mono (by Remy Oudompheng)
+- fixed misplaced dot in U+2250 in Mono (by Remy Oudompheng)
+- added instructions for some Cyrillic letters in Mono Book and Bold(by
+  Eugeniy Meshcheryakov)
+- minor changes to U+2241, U+2261-2263, U+22A4, U+22A5 in Sans (by Remy
+  Oudompheng)
+- added hinting instructions to lowercase Armenian glyphs in Sans Book (by
+  Ben Laenen)
+- changed U+2208, U+220B to match U+2209 and U+220C in Sans Bold (by Remy
+  Oudompheng)
+- added Braille patterns U+2800-U+28FF to Sans (by Mederic Boquien)
+- added instructions for some Cyrillic letters in Serif Book (by Eugeniy
+  Meshcheryakov)
+- renamed BoldOblique fonts to Bold Oblique in TTF Name as originally in
+  Bitstream Vera fonts (by Denis Jacquerye)
+- added hinting instructions to some Latin-B Extended and IPA characters in
+  Sans Book (by Denis Jacquerye and Ben Laenen)
+- adjusted bearings, replaced diacritics, hinted hook and horn for
+  Vietnamese in Sans Book (by Denis Jacquerye)
+- made FAX, TM, TEL, etc. discritionary ligatures in Sans and Serif fonts
+  (by Denis Jacquerye)
+- removed ligatures of precomposed characters in Sans and Serif fonts (by
+  Denis Jacquerye)
+- added U+F208, U+F20A, U+F215-F217, U+F21A-F21B, U+F25F in PUA (from SIL's
+  PUA, probably in Unicode 5.0): U+0243, U+0244, U+0245, U+024C, U+024D,
+  U+2C64, (U+2C6D), (U+2C71)
+- modified some glyphs in Serif Oblique to make them more italic (by Denis
+  Jacquerye)
+
+Changes from 2.4 to 2.5:
+
+- fixed excessive kerning bug that occurs with Pango (by Denis Jacquerye)
+- added U+20AF to Sans and Serif (by Lars Naesbye Christensen)
+- regenerated Condensed faces (by Ben Laenen)
+- added U+035C-U+035D to Sans, fixed U+0361 (by Denis Jacquerye)
+- integrated 255 characters from Arev fonts: Latin Extended-B, Spacing
+  Modifiers, Combining Diacritical Marks, Cyrillic, Cyrillic supplement,
+  General Punctuation, Letterlike Symbols, Arrows, Mathematical Operators,
+  Miscellaneous Technical, Dingbats, Alphabetic Presentation Forms (by Denis
+  Jacquerye)
+- added basic Cyrillic and basic Greek to Sans ExtraLight (by Denis Jacquerye)
+- added U+0498, U+049A, U+04AA, U+04AB, U+04AF to Serif (by Eugeniy
+  Meshcheryakov)
+- added U+0494, U+0495, U+0498, U+0499, U+04AA, U+04AB, U+04C3, U+04C4,
+  U+04C7, U+04C8 to Mono (by Eugeniy Meshcheryakov)
+- adjusted weight of U+0256, U+0257, U+0260, U+0272, U+0273, U+0277, U+029B,
+  U+02A0 and modifed  U+028B and U+027A in Mono (by Denis Jacquerye)
+- added U+2000-200A to Mono (by Denis Jacquerye)
+- added vulgar fractions U+2153 - U+215F to Mono (by Gee Fung Sit)
+- adapted metrics of Arabic glyphs so they stay above cut-off height in Sans
+  (by Ben Laenen)
+- fixed mkmk anchors for Arabic diacritics so they stack properly in Sans (by
+  Ben Laenen)
+- fixed weight of lowercase upsilon in Sans Bold, make small adjustment to
+  lowercase omega in Sans (by Ben Laenen)
+- added U+210E (by Mederic Boquien)
+- unslanted U+2201, U+221B and U+221C in Sans Oblique (by Mederic Boquien)
+- added several mathematical relation symbols to Sans and Mono (U+2241-224C,
+  U+2250-2255, U+2260-2269, U+226E-2277, U+2282-2287) modified U+223C to match
+  other tildes, and U+2282-2284 to have the same shape. (by Remy Oudompheng)
+- made U+2234-U+2237 refer to U+2219 instead of U+00B7 in Sans (by Mederic
+  Boquien)
+- added U+2238-223B, U+226A-226B, U+2278-2281, U+2288-228B to Sans (by Remy
+  Oudompheng)
+- unslanted and changed reference of U+22C5 from U+00B7 to U+2219 in Sans (by
+  Mederic Boquien)
+- added U+224D-225F, U+226D, U+22C6 to Sans and unslanted U+2219 in Sans
+  Oblique. (by Remy Oudompheng)
+- added U+224D-225F, U+226D to Mono, shifted U+2266-2269 higher upwards and
+  unslanted U+2219 in Oblique. (by Remy Oudompheng)
+- merged Coptic glyphs from Arev 0.2 (by Lars Naesbye Christensen)
+- fixed and adjusted various Cyrillic glyphs in Serif (by Andrey V. Panov)
+- made fi, fl... ligatures discretionary ligatures (by Ben Laenen)
+
+Changes from 2.3 to 2.4:
+
+- added U+04A2, U+04A3, U+04AC - U+04AF, U+04BA, U+04BB, U+04C0 -
+  U+04C2, U+04CB, U+04CD, U+04D8 - U+04DF, U+04E2 - U+04E5, U+04E8 - U+04F5,
+  U+04F6 - U+04F9 to Mono (by Eugeniy Meshcheryakov)
+- added U+048C, U+048D, U+0494, U+0495, U+049E - U+04A7, U+04AC -
+  U+04AE, U+04B4- U+04B7, U+04BA, U+04BB, U+04C0 - U+04C4, U+04C7, U+04C8,
+  U+04CB, U+04CC, U+04D8 - U+04DF, U+04E2 - U+04E5, U+04EC - U+04F9 to Serif
+  (by Eugeniy Meshcheryakov)
+- added U+2134 to Sans (by Gee Fung Sit)
+- added U+2080 - U+2089 to all faces (by Gee Fung Sit)
+- several minor corrections to Sans (by Gee Fung Sit)
+- major corrections to Sans Condensed (by Gee Fung Sit)
+- corrected Superscripts and Subscripts in Sans (by Gee Fung Sit)
+- corrected anchors of U+0316-U+0319 (by Denis Jacquerye)
+- Verajja integrated (by Stepan Roh)
+- copied U+2328, U+2600, U+2639-U+263C, U+263F-U+2647, U+2660-U+2667,
+  and U+2669-U+266F from Sans to Serif, and copied scaled-down versions of
+  them to Sans Mono (by David Lawrence Ramsey)
+- added U+20B4 to all faces (by Eugeniy Meshcheryakov)
+- added more minor positional adjustments to U+2638 in all faces to
+  match the other miscellaneous symbols in Verajja, and rescale it in Sans
+  Mono so that it looks better (by David Lawrence Ramsey)
+- added U+2242, U+2243 and U+22A4 (by Mederic Boquien)
+- corrected U+2245 in Sans (by Mederic Boquien)
+- added U+0221, U+0234-0236 (by Denis Jacquerye)
+- added in Arabic block to Sans: U+060C, U+0615, U+061B, U+061F, U+0621
+- U+063A, U+0640 - U+0655, U+0660 - U+066F, U+0679 - U+0687, U+0698, U+06A1,
+  U+06A9, U+06AF, U+06BA, U+06BF, U+06CC, U+06F0 - U+06F9 (by Ben Laenen)
+- added in Arabic Presentation Forms A to Sans: U+FB52 - U+FB81, U+FB8A
+- U+FB95, U+FB9E - U+FB9F, U+FBE8 - U+FBE9, U+FBFC - U+FBFF (by Ben Laenen)
+- added complete Arabic Presentation Forms B to Sans: U+FE70 - U+FE74,
+  U+FE76 - U+FEFC, U+FEFF (by Ben Laenen)
+- added complete Greek Extended block to Mono (by Ben Laenen)
+- modified Greek capitals with tonos in Mono (by Ben Laenen)
+- added U+01C4-01CC, U+01D5, U+01DE, U+01E0-U+01E1, U+01E6-U+01E9,
+  U+01EE-U+01F5, U+01F8-U+0217, U+021E-U+021F, U+0226-U+022A, U+022C to Serif
+  (by Denis Jacquerye)
+- adjusted U+043B and U+044F in Serif (by Denis Jacquerye)
+- added U+2000-U+200A (by Denis Jacquerye)
+- added U+1E00-U+1E0B, U+1E0E-U+1E11, U+1E14-U+1E1C, U+1E1E-U+1E23,
+  U+1E26-U+1E2D, U+1E30-U+1E35, U+1E3A-U+1E3B, U+1E3E-U+1E40, U+1E48-U+1E49,
+  U+1E50-U+1E56, U+1E58-U+1E59, U+1E5E-U+1E60, U+1E68-U+1E6B, U+1E6E-U+1E6F,
+  U+1E72-U+1E7D, U+1E86-U+1E9B, U+1EA0-U+1EA3, U+1EAC-U+1EB7, U+1EBA-U+1EBD,
+  U+1EC6-U+1ECF, U+1ED8-U+1ED9, U+1EE6-U+1EE7, U+1EF4-U+1EF9 to Serif (by
+  Denis Jacquerye)
+- added U+048E, U+048F, U+049C-U+049F, U+04B8, U+04B9, U+04BC-U+04BF,
+  U+04C3, U+04C4 to Sans (by Eugeniy Meshcheryakov)
+- added DejaVu Sans Extra Light (by Denis Jacquerye)
+- Adjusted underline position for (hopefully) improved legibility in
+  Sans, Serif, Mono (Tim May)
+- added auto-generated DejaVu LGC (by Stepan Roh) 
+
+Changes from 2.2 to 2.3:
+
+- fixed bug U+042B and U+044B behave badly in Sans Bold or Oblique (by
+  Keenan Pepper)
+- added and improved TrueType instructions and related settings (by
+  Keenan Pepper)
+- added U+04D0-U+04D7, U+04E6, U+04E7 to Mono (by Eugeniy Meshcheryakov)
+- added U+048A - U+048D, U+0498, U+0499, U+04AA, U+04AB, U+04B0, U+04B1,
+  U+04C0, U+04C9, U+04CA, U+04CE, U+04CD, U+04DA, U+04DB, U+04DE, U+04DF,
+  U+04E2 - U+04E5, U+04EC - U+04F8, U+04F9 to Sans (by Eugeniy Meshcheryakov)
+- added U+04E0, U+04E1 to all faces (by Eugeniy Meshcheryakov)
+- added Greek Extended to Sans and Serif: U+1F00-U+1F15, U+1F18-U+1F1D,
+  U+1F20-U+1F45, U+1F48-U+1F4D, U+1F50-U+1F57, U+1F59, U+1F5B, U+1F5D,
+  U+1F5F-U+1F7D, U+1F80-U+1FB4, U+1FB6-U+1FC4, U+1FC6-U+1FD3, U+1FD6-U+1FDB,
+  U+1FDD-U+1FEF, U+1FF2-U+1FF4, U+1FF6-U+1FFE (by Ben Laenen)
+- added Greek variant letterforms, archaic letters and symbols to Mono:
+  U+03D0-U+03E1, U+03F0-U+03FF (by Ben Laenen)
+- added Armenian block and Armenian ligatures to Sans (U+0531 - U+0556,
+  U+0559 - U+055F, U+0561 - U+0587, U+0589 - U+058A, U+FB13 - U+FB17) (by Ben
+  Laenen)
+- redid some Greek characters in Sans and Mono to make them look better
+  and to correct some errors (by Ben Laenen)
+- added U+27E0 to all faces (by David Lawrence Ramsey)
+- added underscore (U+005F) consistency fixes: extended the Sans Mono
+  and Sans Mono Oblique underscores to touch both horizontal edges, and
+  reduced the height of the Sans Bold Oblique underscore to match the Sans
+  Bold underscore (by David Lawrence Ramsey)
+- added underscore (U+005F) derivatives and consistency fixes for them:
+  made U+0332 a reference to underscore at Denis Jacquerye's suggestion; made
+  U+0333 two references to underscore; made U+033F two references to U+203E;
+  added U+2017 as two references to underscore, and made U+0333 a reference to
+  it; and added U+203E as a reference to underscore, and made U+0305 a
+  reference to it (by David Lawrence Ramsey)
+- added U+201B, U+2220, U+2320-U+2321, U+23AE, U+23CF, all remaining
+  Geometric Shapes glyphs (U+25A0-U+25C9, U+25CB-U+25D7, U+25D9-U+25E5,
+  U+25E7-U+25FF), and U+2B12-U+2B13 to all faces (by David Lawrence Ramsey)
+- added minor positional adjustments to U+2638 in all faces (by David
+  Lawrence Ramsey)
+- added U+201F to Sans Mono and Serif faces (by David Lawrence Ramsey)
+- added U+01B7, U+01F6, U+0464 - U+0465, U+2160 - U+2180, U+2183,
+  U+220A, U+220D, U+2329, U+232A, U+2422, U+27E8 - U+27EB, U+2680 - U+2685 to
+  Sans (by Gee Fung Sit ???)
+- added U+2116 to Sans and Serif (by Gee Fung Sit)
+- changed florin sign U+0192 in Sans (by Gee Fung Sit)
+- added anchor points to some glyphs (by Denis Jacquerye)
+- adjusted height of IPA superscripts U+02B0-02B8, U+02C0-02C1,
+  U+02E0-02E4, U+207F to match with height of U+00B2 (by Denis Jacquerye)
+- added U+0184-U+0185, U+019C, U+019F, U+01A0-U+01A3, U+01A6, U+01AA,
+  U+01AF-U+01B0, U+01B2-U+01B4, U+01B7-U+01B8, U+01BC-U+01BC, U+0224-U+0225,
+  U+023A-U+0240, U+1D16-U+1D17, U+1D1D-U+1D1E, U+1D43-U+1D5B, U+1D7B,
+  U+1D85,U+1D9B-1DB7, U+1DB9-U+1DBF, U+20A6 to all fonts (by Denis Jacquerye)
+- added added U+0182, U+018B, U+018E, U+01A0-U+01A1, U+01B1, U+01B9,
+  U+01C0-U+01C3, U+0238-U+0239, U+1D02, U+1D08-U+1D09, U+1D14, U+1D1F, U+1D77
+  to Serif and Mono (by Denis Jacquerye)
+- added U+0181, U+0183, U+0187-U+0188, U+018A-U+018F, U+0191, U+0193,
+  U+0195-U+019B, U+019D-U+019E, U+01A4-U+01A5, U+01AC-U+01AE, U+01B5-U+01B6,
+  U+01B9, U+01BB, U+01F6 to Serif (by Denis Jacquerye)
+- added U+0181, U+0187-U+0188, U+018A, U+018D, U+018F, U+0191, U+0193,
+  U+0195-U+019F, U+01A4-01A5, U+01AC-01AD, U+01B5-U+01B6, U+1BB, U+01F6,
+  U+01D7-U+01DC, U+0238-U+0239, U+0241 to Mono (by Denis Jacquerye)
+- added to Mono and Serif (by Denis Jacquerye) 
+
+Changes from 2.1 to 2.2:
+
+- reworked the vertical orientation of the Blocks Elements characters
+  in all faces to remove their overly large descenders, in order to fix
+  problems with e.g. terminal emulators (by David Lawrence Ramsey)
+- copied bullet in Sans faces to Serif faces for consistency (by David
+  Lawrence Ramsey)
+- added U+2023, U+25D8, U+25E6, and U+29EB to all faces (by David
+  Lawrence Ramsey)
+- added U+1EB8, U+1EB9, U+1ECA - U+1ECD, U+1EE4, U+1EE5 (by Tim May)
+- added U+01DD, U+02BE, U+02BF, U+02D3 to all, changed U+02D2 in
+  non-Condensed and U+1EE5 in Serif (by Tim May)
+- fixed U+01CE, replacing wrong circumflex by caron (by Denis Jacquerye)
+- added anchor points to some glyphs (by Denis Jacquerye)
+- added U+20B5 (by Denis Jacquerye)
+- added U+0181 - U+0183, U+0187, U+0188, U+018A - U+018D, U+0191,
+  U+0193, U+0195 - U+019B, U+019D, U+019E, U+01A4, U+01A7 - U+01A9, U+01AB -
+  U+01AE, U+01B1, U+01B5, U+01B6, U+01BB, U+01C0 - U+01C3, U+01F1 - U+01F3,
+  U+0238, U+0239, U+1D02, U+1D08, U+1D09, U+1D14, U+1D1F, U+1D77, U+2103,
+  U+2126, U+2127, U+212A, U+212B, U+2132, U+214B, U+2210, U+2217, U+2218,
+  U+2A0C - U+2A0E, U+FB00, U+FB03 and U+FB04 to Sans (by Gee Fung Sit)
+- added U+01A9, U+01C3 and U+2126 to Mono and Serif (by Gee Fung Sit)
+- adjusted bearings of U+028B in Sans (by Gee Fung Sit)
+- added U+018F, U+0494-U+0497, U+04A0-U+04A7, U+04AC-U+04AF,
+  U+04B4-U+04B7, U+04BA-U+04BB, U+04C1-U+04C2, U+04C5-U+04C8, U+04CB-U+04CC,
+  U+04D0-U+04D9, U+04DC-U+04DD, U+04E6-U+04EB to Sans (by Eugeniy
+  Meshcheryakov)
+- replaced with references U+0391-U+0393, U+0395-U+0397, U+0399, U+039A,
+  U+039C, U+039D, U+039F-U+03A1, U+03A4, U+03A5, U+03A7, U+03BF, U+03DC,
+  U+0405, U+0406, U+0408, U+0410, U+0412, U+0415, U+0417, U+041A,
+  U+041C-U+041E, U+0420-U+0422, U+0425, U+0430, U+0435, U+043E, U+0440,
+  U+0441, U+0443, U+0445, U+0455-U+0458 in Serif and Mono (by Eugeniy
+  Meshcheryakov)
+- added U+04D0-U+04D7, U+04E6-U+04EB to Serif (by Eugeniy Meshcheryakov)
+- added U+212A and U+212B to the rest of the faces (by Lars Naesbye
+  Christensen)
+- added U+2318 and U+2325 to Sans and Serif (by Lars Naesbye Christensen)
+- added and improved TrueType instructions and related settings (by
+  Keenan Pepper)
+- completed basic Greek alphabet: added U+0374-U+0375, U+037A, U+037E,
+  U+0384-U+038A, U+038C, U+038E-U+0390, U+03AC-U+03BF, U+03C1-U+03CE (by Ben
+  Laenen)
+- added U+2070 and U+2074-U+2079 (by Mederic Boquien) 
+
+Changes from 2.0 to 2.1:
+
+*** Be aware that names of some TTF files changed since version 2.0. ***
+
+- added U+0323, U+1E0C, U+1E0D, U+1E24, U+1E25, U+1E36 - U+1E39, U+1E42,
+  U+1E43, U+1E46, U+1E47, U+1E5A - U+1E5D, U+1E62, U+1E63, U+1E6C, U+1E6D,
+  U+1E7E, U+1E7F (by Tim May)
+- fixed bug where GNOME applications used Mono Bold Oblique instead of
+  Mono Oblique (by Keenan Pepper)
+- added and improved TrueType instructions and related settings (by
+  Keenan Pepper)
+- added U+1E41, U+1E57, U+1E61 (by Sander Vesik)
+- added U+0189, U+0309, U+0313, U+0314, U+031A, U+031B, U+0327, U+0328,
+  U+032B, U+0333, U+033C (by Denis Jacquerye)
+- adjusted and fixed U+0186, U+0254, U+0291, U+0316 - U+0319, U+031C -
+  U+0320, U+0323 - U+0326, U+0329 - U+032A, U+032C - U+0332, U+0339 - U+033B,
+  U+033E, U+033F (by Denis Jacquerye)
+- fixed U+1E12, U+1E3C, U+1E4A, U+1E70 to have normal below diacritics
+  (by Denis Jacquerye)
+- fixed U+1E82, U+1E84 and U+1EF2 to have uppercase above diacritics (by
+  Denis Jacquerye)
+- added anchor points to some glyphs (by Denis Jacquerye)
+- dropped "-Roman" from font names - affects both internal TTF names and
+  names of generated files (by Stepan Roh)
+- attempt to fix bug Vertical spacing too big for Mono by exchanging
+  LineGap and OS2TypoLinegap values (proofed by Stefan Rank)
+- added Greek capitals U+0391 - U+03A1, U+03A3 - U+03A9, U+03AA, U+03AB
+  in Mono (by Ben Laenen)
+- added the per ten thousand sign U+2031 (by Mederic Boquien)
+- added U+2207, U+221D, U+221F, U+2227 - U+222A, and U+2261 (by David
+  Lawrence Ramsey)
+- new logo (by Gee Fung Sit)
+- added U+0180, U+018E, U+201F, U+2024, U+2025, U+203D, U+2200, U+2203,
+  U+2213, U+222C, U+222D, U+2263 to Sans (by Gee Fung Sit) 
+
+Changes from 1.15 to 2.0:
+
+- "Italized" basic glyphs in all Serif Oblique and their Condensed faces
+  (by David Jez)
+- added and improved TrueType instructions and related settings (by Keenan
+  Pepper)
+- added anchor points to some glyphs (by Denis Jacquerye)
+- many new spacing and combining accents (by Denis Jacquerye)
+- smart substitutions for transforming i and j to dottless form and for
+  using uppercase diacritics (by Denis Jacquerye)
+- fixed remaining erroneously slanted characters in Serif Oblique faces (by
+  David Lawrence Ramsey)
+- copied bullet in Sans faces to Sans Oblique faces for consistency (by
+  David Lawrence Ramsey)
+- added U+203C and U+2047-U+2049 (by David Lawrence Ramsey)
+- added Greek glyphs to Serif (by Ben Laenen, Condensed merge by David Jez)
+- fixed bug LTR glyphs behaving like RTL (by Ben Laenen)
+- fixed wrong glyph directions (by David Jez)
+- fixed repositioned accents in Condensed faces (by David Jez)
+
+Changes from 1.14 to 1.15:
+
+- added and improved TrueType instructions and related settings (by Keenan
+  Pepper)
+- fixed U+2302, U+2319 (by David Lawrence Ramsey)
+- fixed yet another monospace bug (by Stepan Roh)
+- fixed potential "too big ascender/descender" bug (by Stepan Roh)
+- fixed U+026E and U+028E (by Denis Jacquerye)
+- added U+0186, U+0190, U+0300 - U+0304, U+0306 - U+0308, U+030A - U+030C,
+  U+0321, U+0322 (by Denis Jacquerye)
+- added rest of Block Elements: U+2591 - U+2593 (by David Lawrence Ramsey)
+- added U+2311, U+237D and U+2638 (by David Lawrence Ramsey)
+- added U+01CD - U+01D4 (by Denis Jacquerye)
+- fixed accents of U+00F2 - U+00F6 by replacing them with references in Mono
+  Bold (by David Jez)
+- added U+0490, U+0491 (by Eugeniy Meshcheryakov)
+- added hints to U+0404 and U+0454 in Sans (by Eugeniy Meshcheryakov)
+- completed Greek glyphs from U+0370 to U+03CF in Serif (by Ben Laenen)
+- fixed shape of U+0255 in Sans Bold and Sans Bold Oblique (by Denis
+  Jacquerye)
+
+Changes from 1.13 to 1.14:
+
+- fixed bug where Mono faces were not recognized as fixed pitch in Windows
+  by correcting Venda glyphs (by David Jez)
+- added and improved TrueType instructions (by Keenan Pepper)
+- added 6 Uzbekian glyphs (by Mashrab Kuvatov)
+- added Greek glyphs to Sans and Serif, changed pi and omega to fit in (by
+  Ben Laenen)
+- added IPA and related superscript glyphs (by Denis Jacquerye)
+- fixed buggy Venda glyphs (by David Lawrence Ramsey and Stepan Roh)
+- added U+2302, U+2310, U+2319 (by David Lawrence Ramsey)
+- fixed slanted U+00AC in Serif Oblique faces (by David Lawrence Ramsey)
+- added 29 glyphs from Block Elements (by David Lawrence Ramsey)
+
+Changes from 1.12 to 1.13:
+
+- removed all stems (PS hints) (requested by David Jez)
+- added U+01D6, U+01DF, U+022B, U+022D and U+0231 (by Sander Vesik)
+- added 10 Venda glyphs (by Dwayne Bailey)
+- fixed bug when fonts had no name on Microsoft Windows (by Stepan Roh)
+- updated 'missing' glyph U+FFFD (by David Jez)
+- set TTF flag fsType to 'Installable Embedding' (= unrestricted usage)
+  (idea by C. Tiffany)
+
+Changes from 1.11 to 1.12:
+
+- added long s (by James Cloos)
+- prettier comma accent in gcommaaccent (by David Jez)
+- added Hbar, hbar, kgreenlandic, napostrophe, Eng, eng, Tbar, tbar,
+  afii57929 (by David Jez)
+- changed Iogonek, iogonek, IJ, ij to look better (by David Jez)
+- glyph uni0237 renamed to dotlessj (requested by David Jez)
+- fixed accents for dcaron, lcaron, tcaron, Uogonek, uogonek in Serif (by
+  David Jez)
+- added U+2500 - U+257F box drawing glyphs to Sans Mono (by David Jez)
+- fixed accents in Wcircumflex, Ycircumflex and Zdotaccent (by David Jez)
+- extra kerning for F (by Sander Vesik)
+- added 'missing' glyph U+FFFD (by David Jez)
+
+Changes from 1.10 to 1.11:
+
+- kerning updates (by Sander Vesik)
+- added Iogonek, iogonek, IJ, ij, Uogonek, uogonek (from SuSE standard fonts
+  by Adrian Schroeter, SuSE AG)
+- added Gcommaaccent, gcommaaccent, Kcommaaccent, kcommaaccent,
+  Lcommaaccent, lcommaaccent, Ncommaaccent, ncommaaccent, Rcommaaccent,
+  rcommaaccent (by Stepan Roh)
+
+Changes from 1.9 to 1.10:
+
+- added U+022E, U+022F (by Sander Vesik)
+- kerning updates for DejaVu Sans (by Sander Vesik)
+- fixed too wide cyrillic glyphs in DejaVu Sans Mono (by Valentin Stoykov)
+- fixed ligatures bug in Mono (by Stepan Roh)
+
+Changes from 1.8 to 1.9:
+
+- integrated Arev Cyrillics (by Danilo Segan)
+- added U+01EA, U+01EB, U+01EC, U+01ED (by Sander Vesik)
+
+Changes from 1.7 to 1.8:
+
+- fixed accents in Serif Oblique and Serif Bold Oblique (by Stepan Roh)
+
+Changes from 1.6 to 1.7:
+
+- added automatically generated Condensed typefaces (by Stepan Roh)
+
+Changes from 1.5 to 1.6:
+
+- monospace bug fixed (by Stepan Roh)
+- incorrect Bitstream foundry assigned by fontconfig and KDE Font Installer
+fixed (by Stepan Roh)
+- added automatically generated Oblique version of Serif typefaces (by
+Stepan Roh)
+- corrected cyrillic D and d (by Danilo Segan and David Jez)
+- fixed accents position in Oblique version of Serif typefaces (by Danilo
+Segan and Sander Vesik)
+- fixed incorrect computation of OS2Win* fields (by Stepan Roh)
+- added visiblespace U+2423 (by David Jez)
+- fixed 'line height' bug by fixing ascender and descender values (by David
+Jez and Stepan Roh)
+- fixed part of 'worse than Vera' bug (by Peter Cernak)
+- smaller comma accent U+0326 (by David Jez)
+
+Changes from 1.4 to 1.5:
+
+- added Cyrillics (96 characters) and Dcroat to the rest of typefaces (by
+Danilo Segan)
+- fixed bugs in some Cyrillic characters, some of them reported by Sander
+Vesik (by Danilo Segan)
+- added U+0100, U+0101, U+0112, U+0113, U+012A, U+012B, U+014C, U+014D,
+U+016A, U+016B, U+01E2, U+01E3, U+0232 and U+0233 (by Sander Vesik)
+- added Romanian characters (by Misu Moldovan)
+- added U+0108, U+0109, U+010A, U+010B, U+0114, U+0115, U+0116, U+0117,
+U+011C, U+011D, U+0120, U+0121, U+0124, U+0125, U+0128, U+0129, U+012C,
+U+012D, U+0134, U+0135, U+014E, U+014F, U+0150, U+0151, U+015C, U+015D,
+U+0168, U+0169, U+016C, U+016D, U+0170, U+0171 and U+0237 (by James
+Crippen)
+- added U+02BB, U+2010, U+2011, U+2012 and U+2015 (by Stepan Roh)
+
+Changes from 1.3 to 1.4:
+
+- added Polish characters (Aogonek, aogonek, Eogonek, eogonek, Nacute,
+nacute, Sacute, sacute, Zacute, zacute, Zdotaccent, zdotaccent) (by Stepan
+Roh)
+
+Changes from 1.2 to 1.3:
+
+- added Cyrillics (96 characters) and Dcroat to Sans typefaces (by Danilo
+Segan from his BePa fonts)
+
+Changes from 1.1 to 1.2:
+
+- added Ldot, ldot, Wcircumflex, wcircumflex, Ycircumflex, ycircumflex,
+  Wgrave, wgrave, Wacute, wacute, Wdieresis, wdieresis, Ygrave and ygrave
+  (from The Olwen Font Family 0.2 by Dafydd Harries)
+
+Changes from 1.0 to 1.1:
+
+- added Lacute, lacute, Lcaron, lcaron, Racute and racute (by Peter Cernak)
+
+Changes from 0.9.4 to 1.0:
+
+- none, just changed version and updated README
+
+Changes from 0.9.3 to 0.9.4:
+
+- fixed TTF generation (kerning tables were missing)
+
+Changes from 0.9.2 to 0.9.3:
+
+- kerning of added characters
+- proper caron shape for dcaron in Mono (by Ondrej Koala Vacha)
+- minor visual changes
+
+Changes from 0.9.1 to 0.9.2:
+
+- internal bugged version
+
+Changes from 0.9 to 0.9.1:
+
+- proper caron shape for dcaron and tcaron
+- minor visual changes
+
+$Id: NEWS 2471 2011-02-27 14:25:15Z ben_laenen $
diff --git a/fonts/dejavu-fonts-ttf-2.33/README b/fonts/dejavu-fonts-ttf-2.33/README
new file mode 100644
index 0000000..0f2079a
--- /dev/null
+++ b/fonts/dejavu-fonts-ttf-2.33/README
@@ -0,0 +1,59 @@
+DejaVu fonts 2.33 (c)2004-2011 DejaVu fonts team
+------------------------------------------------
+
+The DejaVu fonts are a font family based on the Bitstream Vera Fonts
+(http://gnome.org/fonts/). Its purpose is to provide a wider range of
+characters (see status.txt for more information) while maintaining the
+original look and feel.
+
+DejaVu fonts are based on Bitstream Vera fonts version 1.10.
+
+Available fonts (Sans = sans serif, Mono = monospaced):
+
+DejaVu Sans Mono
+DejaVu Sans Mono Bold
+DejaVu Sans Mono Bold Oblique
+DejaVu Sans Mono Oblique
+DejaVu Sans
+DejaVu Sans Bold
+DejaVu Sans Bold Oblique
+DejaVu Sans Oblique
+DejaVu Sans ExtraLight (experimental)
+DejaVu Serif
+DejaVu Serif Bold
+DejaVu Serif Bold Italic (experimental)
+DejaVu Serif Italic (experimental)
+DejaVu Sans Condensed (experimental)
+DejaVu Sans Condensed Bold (experimental)
+DejaVu Sans Condensed Bold Oblique (experimental)
+DejaVu Sans Condensed Oblique (experimental)
+DejaVu Serif Condensed (experimental)
+DejaVu Serif Condensed Bold (experimental)
+DejaVu Serif Condensed Bold Italic (experimental)
+DejaVu Serif Condensed Italic (experimental)
+
+All fonts are also available as derivative called DejaVu LGC with support
+only for Latin, Greek and Cyrillic scripts.
+
+For license information see LICENSE. What's new is described in NEWS. Known
+bugs are in BUGS. All authors are mentioned in AUTHORS.
+
+Fonts are published in source form as SFD files (Spline Font Database from
+FontForge - http://fontforge.sf.net/) and in compiled form as TTF files
+(TrueType fonts).
+
+For more information go to http://dejavu.sourceforge.net/.
+
+Characters from Arev fonts, Copyright (c) 2006 by Tavmjong Bah:
+---------------------------
+U+01BA, U+01BF, U+01F7, U+021C-U+021D, U+0220, U+0222-U+0223,
+U+02B9, U+02BA, U+02BD, U+02C2-U+02C5, U+02d4-U+02D5,
+U+02D7, U+02EC-U+02EE, U+0346-U+034E, U+0360, U+0362,
+U+03E2-03EF, U+0460-0463, U+0466-U+0486, U+0488-U+0489, U+04A8-U+04A9,
+U+0500-U+050F, U+2055-205E, U+20B0, U+20B2-U+20B3, U+2102, U+210D, U+210F,
+U+2111, U+2113, U+2115, U+2118-U+211A, U+211C-U+211D, U+2124, U+2135,
+U+213C-U+2140, U+2295-U+2298, U+2308-U+230B, U+26A2-U+26B1, U+2701-U+2704,
+U+2706-U+2709, U+270C-U+274B, U+2758-U+275A, U+2761-U+2775, U+2780-U+2794,
+U+2798-U+27AF, U+27B1-U+27BE, U+FB05-U+FB06
+
+$Id: README 2471 2011-02-27 14:25:15Z ben_laenen $
diff --git a/fonts/dejavu-fonts-ttf-2.30/fontconfig/20-unhint-small-dejavu-sans-mono.conf b/fonts/dejavu-fonts-ttf-2.33/fontconfig/20-unhint-small-dejavu-sans-mono.conf
similarity index 100%
rename from fonts/dejavu-fonts-ttf-2.30/fontconfig/20-unhint-small-dejavu-sans-mono.conf
rename to fonts/dejavu-fonts-ttf-2.33/fontconfig/20-unhint-small-dejavu-sans-mono.conf
diff --git a/fonts/dejavu-fonts-ttf-2.30/fontconfig/20-unhint-small-dejavu-sans.conf b/fonts/dejavu-fonts-ttf-2.33/fontconfig/20-unhint-small-dejavu-sans.conf
similarity index 100%
rename from fonts/dejavu-fonts-ttf-2.30/fontconfig/20-unhint-small-dejavu-sans.conf
rename to fonts/dejavu-fonts-ttf-2.33/fontconfig/20-unhint-small-dejavu-sans.conf
diff --git a/fonts/dejavu-fonts-ttf-2.30/fontconfig/20-unhint-small-dejavu-serif.conf b/fonts/dejavu-fonts-ttf-2.33/fontconfig/20-unhint-small-dejavu-serif.conf
similarity index 100%
rename from fonts/dejavu-fonts-ttf-2.30/fontconfig/20-unhint-small-dejavu-serif.conf
rename to fonts/dejavu-fonts-ttf-2.33/fontconfig/20-unhint-small-dejavu-serif.conf
diff --git a/fonts/dejavu-fonts-ttf-2.30/fontconfig/57-dejavu-sans-mono.conf b/fonts/dejavu-fonts-ttf-2.33/fontconfig/57-dejavu-sans-mono.conf
similarity index 100%
rename from fonts/dejavu-fonts-ttf-2.30/fontconfig/57-dejavu-sans-mono.conf
rename to fonts/dejavu-fonts-ttf-2.33/fontconfig/57-dejavu-sans-mono.conf
diff --git a/fonts/dejavu-fonts-ttf-2.30/fontconfig/57-dejavu-sans.conf b/fonts/dejavu-fonts-ttf-2.33/fontconfig/57-dejavu-sans.conf
similarity index 100%
rename from fonts/dejavu-fonts-ttf-2.30/fontconfig/57-dejavu-sans.conf
rename to fonts/dejavu-fonts-ttf-2.33/fontconfig/57-dejavu-sans.conf
diff --git a/fonts/dejavu-fonts-ttf-2.30/fontconfig/57-dejavu-serif.conf b/fonts/dejavu-fonts-ttf-2.33/fontconfig/57-dejavu-serif.conf
similarity index 100%
rename from fonts/dejavu-fonts-ttf-2.30/fontconfig/57-dejavu-serif.conf
rename to fonts/dejavu-fonts-ttf-2.33/fontconfig/57-dejavu-serif.conf
diff --git a/fonts/dejavu-fonts-ttf-2.33/langcover.txt b/fonts/dejavu-fonts-ttf-2.33/langcover.txt
new file mode 100644
index 0000000..f503448
--- /dev/null
+++ b/fonts/dejavu-fonts-ttf-2.33/langcover.txt
@@ -0,0 +1,242 @@
+This is the language coverage file for DejaVu fonts
+($Id$)
+
+                                                Sans               Serif              Sans Mono          
+aa     Afar                                     100% (62/62)       100% (62/62)       100% (62/62)      
+ab     Abkhazia                                 100% (90/90)        93% (84/90)        84% (76/90)      
+af     Afrikaans                                100% (69/69)       100% (69/69)       100% (69/69)      
+ak     Akan                                     100% (73/73)       100% (73/73)       100% (73/73)      
+am     Amharic                                       (0/264)            (0/264)            (0/264)      
+an     Aragonese                                100% (66/66)       100% (66/66)       100% (66/66)      
+ar     Arabic                                   100% (125/125)          (0/125)       100% (125/125)    
+as     Assamese                                      (0/64)             (0/64)             (0/64)       
+ast    Asturian/Bable/Leonese/Asturleonese      100% (66/66)       100% (66/66)       100% (66/66)      
+av     Avaric                                   100% (67/67)       100% (67/67)       100% (67/67)      
+ay     Aymara                                   100% (60/60)       100% (60/60)       100% (60/60)      
+az-az  Azerbaijani in Azerbaijan                100% (66/66)       100% (66/66)       100% (66/66)      
+az-ir  Azerbaijani in Iran                      100% (130/130)          (0/130)       100% (130/130)    
+ba     Bashkir                                  100% (82/82)       100% (82/82)        97% (80/82)      
+be     Byelorussian                             100% (68/68)       100% (68/68)       100% (68/68)      
+ber-dz Berber in Algeria                        100% (70/70)       100% (70/70)       100% (70/70)      
+ber-ma Berber in Morocco                        100% (32/32)            (0/32)             (0/32)       
+bg     Bulgarian                                100% (60/60)       100% (60/60)       100% (60/60)      
+bh     Bihari (Devanagari script)                    (0/68)             (0/68)             (0/68)       
+bho    Bhojpuri (Devanagari script)                  (0/68)             (0/68)             (0/68)       
+bi     Bislama                                  100% (58/58)       100% (58/58)       100% (58/58)      
+bin    Edo or Bini                              100% (78/78)       100% (78/78)       100% (78/78)      
+bm     Bambara                                  100% (60/60)       100% (60/60)       100% (60/60)      
+bn     Bengali                                       (0/63)             (0/63)             (0/63)       
+bo     Tibetan                                       (0/95)             (0/95)             (0/95)       
+br     Breton                                   100% (64/64)       100% (64/64)       100% (64/64)      
+bs     Bosnian                                  100% (62/62)       100% (62/62)       100% (62/62)      
+bua    Buriat (Buryat)                          100% (70/70)       100% (70/70)       100% (70/70)      
+byn    Blin/Bilin                                    (0/255)            (0/255)            (0/255)      
+ca     Catalan                                  100% (74/74)       100% (74/74)       100% (74/74)      
+ce     Chechen                                  100% (67/67)       100% (67/67)       100% (67/67)      
+ch     Chamorro                                 100% (58/58)       100% (58/58)       100% (58/58)      
+chm    Mari (Lower Cheremis / Upper Cheremis)   100% (76/76)       100% (76/76)       100% (76/76)      
+chr    Cherokee                                      (0/85)             (0/85)             (0/85)       
+co     Corsican                                 100% (84/84)       100% (84/84)       100% (84/84)      
+crh    Crimean Tatar/Crimean Turkish            100% (68/68)       100% (68/68)       100% (68/68)      
+cs     Czech                                    100% (82/82)       100% (82/82)       100% (82/82)      
+csb    Kashubian                                100% (74/74)       100% (74/74)       100% (74/74)      
+cu     Old Church Slavonic                      100% (103/103)      86% (89/103)       78% (81/103)     
+cv     Chuvash                                  100% (74/74)       100% (74/74)       100% (74/74)      
+cy     Welsh                                    100% (78/78)       100% (78/78)       100% (78/78)      
+da     Danish                                   100% (70/70)       100% (70/70)       100% (70/70)      
+de     German                                   100% (59/59)       100% (59/59)       100% (59/59)      
+dv     Divehi/Dhivehi/Maldivian                      (0/49)             (0/49)             (0/49)       
+dz     Dzongkha                                      (0/95)             (0/95)             (0/95)       
+ee     Ewe                                      100% (99/99)       100% (99/99)       100% (99/99)      
+el     Greek                                    100% (69/69)       100% (69/69)       100% (69/69)      
+en     English                                  100% (72/72)       100% (72/72)       100% (72/72)      
+eo     Esperanto                                100% (64/64)       100% (64/64)       100% (64/64)      
+es     Spanish                                  100% (66/66)       100% (66/66)       100% (66/66)      
+et     Estonian                                 100% (64/64)       100% (64/64)       100% (64/64)      
+eu     Basque                                   100% (56/56)       100% (56/56)       100% (56/56)      
+fa     Persian                                  100% (129/129)          (0/129)       100% (129/129)    
+fat    Fanti                                    100% (73/73)       100% (73/73)       100% (73/73)      
+ff     Fulah (Fula)                             100% (62/62)       100% (62/62)       100% (62/62)      
+fi     Finnish                                  100% (62/62)       100% (62/62)       100% (62/62)      
+fil    Filipino                                 100% (84/84)       100% (84/84)       100% (84/84)      
+fj     Fijian                                   100% (52/52)       100% (52/52)       100% (52/52)      
+fo     Faroese                                  100% (68/68)       100% (68/68)       100% (68/68)      
+fr     French                                   100% (84/84)       100% (84/84)       100% (84/84)      
+fur    Friulian                                 100% (66/66)       100% (66/66)       100% (66/66)      
+fy     Frisian                                  100% (75/75)       100% (75/75)       100% (75/75)      
+ga     Irish                                    100% (80/80)       100% (80/80)       100% (80/80)      
+gd     Scots Gaelic                             100% (70/70)       100% (70/70)       100% (70/70)      
+gez    Ethiopic (Geez)                               (0/218)            (0/218)            (0/218)      
+gl     Galician                                 100% (66/66)       100% (66/66)       100% (66/66)      
+gn     Guarani                                  100% (70/70)       100% (70/70)       100% (70/70)      
+gu     Gujarati                                      (0/68)             (0/68)             (0/68)       
+gv     Manx Gaelic                              100% (54/54)       100% (54/54)       100% (54/54)      
+ha     Hausa                                    100% (60/60)       100% (60/60)       100% (60/60)      
+haw    Hawaiian                                 100% (63/63)       100% (63/63)       100% (63/63)      
+he     Hebrew                                   100% (27/27)            (0/27)             (0/27)       
+hi     Hindi (Devanagari script)                     (0/68)             (0/68)             (0/68)       
+hne    Chhattisgarhi                                 (0/68)             (0/68)             (0/68)       
+ho     Hiri Motu                                100% (52/52)       100% (52/52)       100% (52/52)      
+hr     Croatian                                 100% (62/62)       100% (62/62)       100% (62/62)      
+hsb    Upper Sorbian                            100% (72/72)       100% (72/72)       100% (72/72)      
+ht     Haitian/Haitian Creole                   100% (56/56)       100% (56/56)       100% (56/56)      
+hu     Hungarian                                100% (70/70)       100% (70/70)       100% (70/70)      
+hy     Armenian                                 100% (77/77)       100% (77/77)       100% (77/77)      
+hz     Herero                                   100% (57/57)       100% (57/57)       100% (57/57)      
+ia     Interlingua                              100% (52/52)       100% (52/52)       100% (52/52)      
+id     Indonesian                               100% (54/54)       100% (54/54)       100% (54/54)      
+ie     Interlingue                              100% (52/52)       100% (52/52)       100% (52/52)      
+ig     Igbo                                     100% (58/58)       100% (58/58)       100% (58/58)      
+ii     Sichuan Yi/Nuosu                              (0/1165)           (0/1165)           (0/1165)     
+ik     Inupiaq (Inupiak, Eskimo)                100% (68/68)       100% (68/68)       100% (68/68)      
+io     Ido                                      100% (52/52)       100% (52/52)       100% (52/52)      
+is     Icelandic                                100% (70/70)       100% (70/70)       100% (70/70)      
+it     Italian                                  100% (72/72)       100% (72/72)       100% (72/72)      
+iu     Inuktitut                                100% (161/161)          (0/161)            (0/161)      
+ja     Japanese                                      (0/6537)           (0/6537)           (0/6537)     
+jv     Javanese                                 100% (56/56)       100% (56/56)       100% (56/56)      
+ka     Georgian                                 100% (33/33)       100% (33/33)       100% (33/33)      
+kaa    Kara-Kalpak (Karakalpak)                 100% (78/78)       100% (78/78)       100% (78/78)      
+kab    Kabyle                                   100% (70/70)       100% (70/70)       100% (70/70)      
+ki     Kikuyu                                   100% (56/56)       100% (56/56)       100% (56/56)      
+kj     Kuanyama/Kwanyama                        100% (52/52)       100% (52/52)       100% (52/52)      
+kk     Kazakh                                   100% (77/77)       100% (77/77)       100% (77/77)      
+kl     Greenlandic                              100% (81/81)       100% (81/81)       100% (81/81)      
+km     Central Khmer                                 (0/63)             (0/63)             (0/63)       
+kn     Kannada                                       (0/70)             (0/70)             (0/70)       
+ko     Korean                                        (0/2443)           (0/2443)           (0/2443)     
+kok    Kokani (Devanagari script)                    (0/68)             (0/68)             (0/68)       
+kr     Kanuri                                   100% (56/56)       100% (56/56)       100% (56/56)      
+ks     Kashmiri                                  98% (143/145)          (0/145)        97% (141/145)    
+ku-am  Kurdish in Armenia                       100% (64/64)       100% (64/64)       100% (64/64)      
+ku-iq  Kurdish in Iraq                          100% (32/32)            (0/32)         87% (28/32)      
+ku-ir  Kurdish in Iran                          100% (32/32)            (0/32)         87% (28/32)      
+ku-tr  Kurdish in Turkey                        100% (62/62)       100% (62/62)       100% (62/62)      
+kum    Kumyk                                    100% (66/66)       100% (66/66)       100% (66/66)      
+kv     Komi (Komi-Permyak/Komi-Siryan)          100% (70/70)       100% (70/70)       100% (70/70)      
+kw     Cornish                                  100% (64/64)       100% (64/64)       100% (64/64)      
+kwm    Kwambi                                   100% (52/52)       100% (52/52)       100% (52/52)      
+ky     Kirgiz                                   100% (70/70)       100% (70/70)       100% (70/70)      
+la     Latin                                    100% (68/68)       100% (68/68)       100% (68/68)      
+lah    Lahnda                                    98% (143/145)          (0/145)        97% (141/145)    
+lb     Luxembourgish (Letzeburgesch)            100% (75/75)       100% (75/75)       100% (75/75)      
+lez    Lezghian (Lezgian)                       100% (67/67)       100% (67/67)       100% (67/67)      
+lg     Ganda                                    100% (54/54)       100% (54/54)       100% (54/54)      
+li     Limburgan/Limburger/Limburgish           100% (62/62)       100% (62/62)       100% (62/62)      
+ln     Lingala                                  100% (81/81)       100% (81/81)       100% (81/81)      
+lo     Lao                                      100% (55/55)            (0/55)         83% (46/55)      
+lt     Lithuanian                               100% (70/70)       100% (70/70)       100% (70/70)      
+lv     Latvian                                  100% (78/78)       100% (78/78)       100% (78/78)      
+mai    Maithili (Devanagari script)                  (0/68)             (0/68)             (0/68)       
+mg     Malagasy                                 100% (56/56)       100% (56/56)       100% (56/56)      
+mh     Marshallese                              100% (62/62)       100% (62/62)       100% (62/62)      
+mi     Maori                                    100% (64/64)       100% (64/64)       100% (64/64)      
+mk     Macedonian                               100% (42/42)       100% (42/42)       100% (42/42)      
+ml     Malayalam                                     (0/68)             (0/68)             (0/68)       
+mn-cn  Mongolian in China                            (0/130)            (0/130)            (0/130)      
+mn-mn  Mongolian in Mongolia                    100% (70/70)       100% (70/70)       100% (70/70)      
+mo     Moldavian                                100% (128/128)     100% (128/128)     100% (128/128)    
+mr     Marathi (Devanagari script)                   (0/68)             (0/68)             (0/68)       
+ms     Malay                                    100% (52/52)       100% (52/52)       100% (52/52)      
+mt     Maltese                                  100% (72/72)       100% (72/72)       100% (72/72)      
+my     Burmese (Myanmar)                             (0/48)             (0/48)             (0/48)       
+na     Nauru                                    100% (60/60)       100% (60/60)       100% (60/60)      
+nb     Norwegian Bokmal                         100% (70/70)       100% (70/70)       100% (70/70)      
+nds    Low Saxon                                100% (59/59)       100% (59/59)       100% (59/59)      
+ne     Nepali (Devanagari script)                    (0/68)             (0/68)             (0/68)       
+ng     Ndonga                                   100% (52/52)       100% (52/52)       100% (52/52)      
+nl     Dutch                                    100% (82/82)       100% (82/82)       100% (82/82)      
+nn     Norwegian Nynorsk                        100% (76/76)       100% (76/76)       100% (76/76)      
+no     Norwegian (Bokmal)                       100% (70/70)       100% (70/70)       100% (70/70)      
+nr     Ndebele, South                           100% (52/52)       100% (52/52)       100% (52/52)      
+nso    Northern Sotho                           100% (58/58)       100% (58/58)       100% (58/58)      
+nv     Navajo/Navaho                            100% (72/72)       100% (72/72)       100% (72/72)      
+ny     Chichewa                                 100% (54/54)       100% (54/54)       100% (54/54)      
+oc     Occitan                                  100% (70/70)       100% (70/70)       100% (70/70)      
+om     Oromo or Galla                           100% (52/52)       100% (52/52)       100% (52/52)      
+or     Oriya                                         (0/68)             (0/68)             (0/68)       
+os     Ossetic                                  100% (66/66)       100% (66/66)       100% (66/66)      
+ota    Ottoman Turkish                          100% (37/37)            (0/37)         97% (36/37)      
+pa     Panjabi/Punjabi                               (0/63)             (0/63)             (0/63)       
+pa-pk  Panjabi/Punjabi in Pakistan               98% (143/145)          (0/145)        97% (141/145)    
+pap-an Papiamento in Netherlands Antilles       100% (72/72)       100% (72/72)       100% (72/72)      
+pap-aw Papiamento in Aruba                      100% (54/54)       100% (54/54)       100% (54/54)      
+pl     Polish                                   100% (70/70)       100% (70/70)       100% (70/70)      
+ps-af  Pashto in Afghanistan                     95% (47/49)            (0/49)         77% (38/49)      
+ps-pk  Pashto in Pakistan                        93% (46/49)            (0/49)         75% (37/49)      
+pt     Portuguese                               100% (82/82)       100% (82/82)       100% (82/82)      
+qu     Quechua                                  100% (55/55)       100% (55/55)       100% (55/55)      
+rm     Rhaeto-Romance (Romansch)                100% (66/66)       100% (66/66)       100% (66/66)      
+rn     Rundi                                    100% (52/52)       100% (52/52)       100% (52/52)      
+ro     Romanian                                 100% (62/62)       100% (62/62)       100% (62/62)      
+ru     Russian                                  100% (66/66)       100% (66/66)       100% (66/66)      
+rw     Kinyarwanda                              100% (52/52)       100% (52/52)       100% (52/52)      
+sa     Sanskrit (Devanagari script)                  (0/68)             (0/68)             (0/68)       
+sah    Yakut                                    100% (76/76)       100% (76/76)       100% (76/76)      
+sc     Sardinian                                100% (62/62)       100% (62/62)       100% (62/62)      
+sco    Scots                                    100% (56/56)       100% (56/56)       100% (56/56)      
+sd     Sindhi                                   100% (54/54)            (0/54)         79% (43/54)      
+se     North Sami                               100% (66/66)       100% (66/66)       100% (66/66)      
+sel    Selkup (Ostyak-Samoyed)                  100% (66/66)       100% (66/66)       100% (66/66)      
+sg     Sango                                    100% (72/72)       100% (72/72)       100% (72/72)      
+sh     Serbo-Croatian                           100% (156/156)     100% (156/156)      98% (154/156)    
+shs    Secwepemctsin                            100% (48/48)       100% (48/48)       100% (48/48)      
+si     Sinhala/Sinhalese                             (0/73)             (0/73)             (0/73)       
+sid    Sidamo                                        (0/281)            (0/281)            (0/281)      
+sk     Slovak                                   100% (86/86)       100% (86/86)       100% (86/86)      
+sl     Slovenian                                100% (62/62)       100% (62/62)       100% (62/62)      
+sm     Samoan                                   100% (53/53)       100% (53/53)       100% (53/53)      
+sma    South Sami                               100% (60/60)       100% (60/60)       100% (60/60)      
+smj    Lule Sami                                100% (60/60)       100% (60/60)       100% (60/60)      
+smn    Inari Sami                               100% (68/68)       100% (68/68)       100% (68/68)      
+sms    Skolt Sami                               100% (80/80)       100% (80/80)        97% (78/80)      
+sn     Shona                                    100% (52/52)       100% (52/52)       100% (52/52)      
+so     Somali                                   100% (52/52)       100% (52/52)       100% (52/52)      
+sq     Albanian                                 100% (56/56)       100% (56/56)       100% (56/56)      
+sr     Serbian                                  100% (60/60)       100% (60/60)       100% (60/60)      
+ss     Swati                                    100% (52/52)       100% (52/52)       100% (52/52)      
+st     Sotho, Southern                          100% (52/52)       100% (52/52)       100% (52/52)      
+su     Sundanese                                100% (54/54)       100% (54/54)       100% (54/54)      
+sv     Swedish                                  100% (68/68)       100% (68/68)       100% (68/68)      
+sw     Swahili                                  100% (52/52)       100% (52/52)       100% (52/52)      
+syr    Syriac                                        (0/45)             (0/45)             (0/45)       
+ta     Tamil                                         (0/48)             (0/48)             (0/48)       
+te     Telugu                                        (0/70)             (0/70)             (0/70)       
+tg     Tajik                                    100% (78/78)       100% (78/78)        97% (76/78)      
+th     Thai                                       1% (1/74)             (0/74)             (0/74)       
+ti-er  Eritrean Tigrinya                             (0/255)            (0/255)            (0/255)      
+ti-et  Ethiopian Tigrinya                            (0/281)            (0/281)            (0/281)      
+tig    Tigre                                         (0/221)            (0/221)            (0/221)      
+tk     Turkmen                                  100% (68/68)       100% (68/68)       100% (68/68)      
+tl     Tagalog                                  100% (84/84)       100% (84/84)       100% (84/84)      
+tn     Tswana                                   100% (58/58)       100% (58/58)       100% (58/58)      
+to     Tonga                                    100% (53/53)       100% (53/53)       100% (53/53)      
+tr     Turkish                                  100% (70/70)       100% (70/70)       100% (70/70)      
+ts     Tsonga                                   100% (52/52)       100% (52/52)       100% (52/52)      
+tt     Tatar                                    100% (76/76)       100% (76/76)       100% (76/76)      
+tw     Twi                                      100% (73/73)       100% (73/73)       100% (73/73)      
+ty     Tahitian                                 100% (65/65)       100% (65/65)       100% (65/65)      
+tyv    Tuvinian                                 100% (70/70)       100% (70/70)       100% (70/70)      
+ug     Uighur                                   100% (125/125)          (0/125)       100% (125/125)    
+uk     Ukrainian                                100% (72/72)       100% (72/72)       100% (72/72)      
+ur     Urdu                                      98% (143/145)          (0/145)        97% (141/145)    
+uz     Uzbek                                    100% (52/52)       100% (52/52)       100% (52/52)      
+ve     Venda                                    100% (62/62)       100% (62/62)       100% (62/62)      
+vi     Vietnamese                               100% (194/194)     100% (194/194)      76% (148/194)    
+vo     Volapuk                                  100% (54/54)       100% (54/54)       100% (54/54)      
+vot    Votic                                    100% (62/62)       100% (62/62)       100% (62/62)      
+wa     Walloon                                  100% (70/70)       100% (70/70)       100% (70/70)      
+wal    Wolaitta/Wolaytta                             (0/281)            (0/281)            (0/281)      
+wen    Sorbian languages (lower and upper)      100% (76/76)       100% (76/76)       100% (76/76)      
+wo     Wolof                                    100% (66/66)       100% (66/66)       100% (66/66)      
+xh     Xhosa                                    100% (52/52)       100% (52/52)       100% (52/52)      
+yap    Yapese                                   100% (58/58)       100% (58/58)       100% (58/58)      
+yi     Yiddish                                  100% (27/27)            (0/27)             (0/27)       
+yo     Yoruba                                   100% (119/119)     100% (119/119)     100% (119/119)    
+za     Zhuang/Chuang                            100% (52/52)       100% (52/52)       100% (52/52)      
+zh-cn  Chinese (simplified)                       0% (2/6765)        0% (2/6765)        0% (2/6765)     
+zh-hk  Chinese Hong Kong Supplementary Character Set      (0/2213)           (0/2213)           (0/2213)     
+zh-mo  Chinese in Macau                              (0/2213)           (0/2213)           (0/2213)     
+zh-sg  Chinese in Singapore                       0% (2/6765)        0% (2/6765)        0% (2/6765)     
+zh-tw  Chinese (traditional)                         (0/13063)          (0/13063)          (0/13063)    
+zu     Zulu                                     100% (52/52)       100% (52/52)       100% (52/52)      
diff --git a/fonts/dejavu-fonts-ttf-2.33/status.txt b/fonts/dejavu-fonts-ttf-2.33/status.txt
new file mode 100644
index 0000000..e860ef4
--- /dev/null
+++ b/fonts/dejavu-fonts-ttf-2.33/status.txt
@@ -0,0 +1,6657 @@
+This is the status file for DejaVu fonts
+($Id: status.txt 2425 2010-08-22 16:07:31Z moyogo $)
+
+original = present in original Bitstream Vera 1.10
+<version> = added in DejaVu fonts <version>
+
+U+0020 space                original
+U+0021 exclam               original
+U+0022 quotedbl             original
+U+0023 numbersign           original
+U+0024 dollar               original
+U+0025 percent              original
+U+0026 ampersand            original
+U+0027 quotesingle          original
+U+0028 parenleft            original
+U+0029 parenright           original
+U+002a asterisk             original
+U+002b plus                 original
+U+002c comma                original
+U+002d hyphen               original
+U+002e period               original
+U+002f slash                original
+U+0030 zero                 original
+U+0031 one                  original
+U+0032 two                  original
+U+0033 three                original
+U+0034 four                 original
+U+0035 five                 original
+U+0036 six                  original
+U+0037 seven                original
+U+0038 eight                original
+U+0039 nine                 original
+U+003a colon                original
+U+003b semicolon            original
+U+003c less                 original
+U+003d equal                original
+U+003e greater              original
+U+003f question             original
+U+0040 at                   original
+U+0041 A                    original
+U+0042 B                    original
+U+0043 C                    original
+U+0044 D                    original
+U+0045 E                    original
+U+0046 F                    original
+U+0047 G                    original
+U+0048 H                    original
+U+0049 I                    original
+U+004a J                    original
+U+004b K                    original
+U+004c L                    original
+U+004d M                    original
+U+004e N                    original
+U+004f O                    original
+U+0050 P                    original
+U+0051 Q                    original
+U+0052 R                    original
+U+0053 S                    original
+U+0054 T                    original
+U+0055 U                    original
+U+0056 V                    original
+U+0057 W                    original
+U+0058 X                    original
+U+0059 Y                    original
+U+005a Z                    original
+U+005b bracketleft          original
+U+005c backslash            original
+U+005d bracketright         original
+U+005e asciicircum          original
+U+005f underscore           original
+U+0060 grave                original
+U+0061 a                    original
+U+0062 b                    original
+U+0063 c                    original
+U+0064 d                    original
+U+0065 e                    original
+U+0066 f                    original
+U+0067 g                    original
+U+0068 h                    original
+U+0069 i                    original
+U+006a j                    original
+U+006b k                    original
+U+006c l                    original
+U+006d m                    original
+U+006e n                    original
+U+006f o                    original
+U+0070 p                    original
+U+0071 q                    original
+U+0072 r                    original
+U+0073 s                    original
+U+0074 t                    original
+U+0075 u                    original
+U+0076 v                    original
+U+0077 w                    original
+U+0078 x                    original
+U+0079 y                    original
+U+007a z                    original
+U+007b braceleft            original
+U+007c bar                  original
+U+007d braceright           original
+U+007e asciitilde           original
+U+00a0 nonbreakingspace     original
+U+00a1 exclamdown           original
+U+00a2 cent                 original
+U+00a3 sterling             original
+U+00a4 currency             original
+U+00a5 yen                  original
+U+00a6 brokenbar            original
+U+00a7 section              original
+U+00a8 dieresis             original
+U+00a9 copyright            original
+U+00aa ordfeminine          original
+U+00ab guillemotleft        original
+U+00ac logicalnot           original
+U+00ad sfthyphen            original
+U+00ae registered           original
+U+00af macron               original
+U+00b0 degree               original
+U+00b1 plusminus            original
+U+00b2 twosuperior          original
+U+00b3 threesuperior        original
+U+00b4 acute                original
+U+00b5 mu                   original
+U+00b6 paragraph            original
+U+00b7 periodcentered       original
+U+00b8 cedilla              original
+U+00b9 onesuperior          original
+U+00ba ordmasculine         original
+U+00bb guillemotright       original
+U+00bc onequarter           original
+U+00bd onehalf              original
+U+00be threequarters        original
+U+00bf questiondown         original
+U+00c0 Agrave               original
+U+00c1 Aacute               original
+U+00c2 Acircumflex          original
+U+00c3 Atilde               original
+U+00c4 Adieresis            original
+U+00c5 Aring                original
+U+00c6 AE                   original
+U+00c7 Ccedilla             original
+U+00c8 Egrave               original
+U+00c9 Eacute               original
+U+00ca Ecircumflex          original
+U+00cb Edieresis            original
+U+00cc Igrave               original
+U+00cd Iacute               original
+U+00ce Icircumflex          original
+U+00cf Idieresis            original
+U+00d0 Eth                  original
+U+00d1 Ntilde               original
+U+00d2 Ograve               original
+U+00d3 Oacute               original
+U+00d4 Ocircumflex          original
+U+00d5 Otilde               original
+U+00d6 Odieresis            original
+U+00d7 multiply             original
+U+00d8 Oslash               original
+U+00d9 Ugrave               original
+U+00da Uacute               original
+U+00db Ucircumflex          original
+U+00dc Udieresis            original
+U+00dd Yacute               original
+U+00de Thorn                original
+U+00df germandbls           original
+U+00e0 agrave               original
+U+00e1 aacute               original
+U+00e2 acircumflex          original
+U+00e3 atilde               original
+U+00e4 adieresis            original
+U+00e5 aring                original
+U+00e6 ae                   original
+U+00e7 ccedilla             original
+U+00e8 egrave               original
+U+00e9 eacute               original
+U+00ea ecircumflex          original
+U+00eb edieresis            original
+U+00ec igrave               original
+U+00ed iacute               original
+U+00ee icircumflex          original
+U+00ef idieresis            original
+U+00f0 eth                  original
+U+00f1 ntilde               original
+U+00f2 ograve               original
+U+00f3 oacute               original
+U+00f4 ocircumflex          original
+U+00f5 otilde               original
+U+00f6 odieresis            original
+U+00f7 divide               original
+U+00f8 oslash               original
+U+00f9 ugrave               original
+U+00fa uacute               original
+U+00fb ucircumflex          original
+U+00fc udieresis            original
+U+00fd yacute               original
+U+00fe thorn                original
+U+00ff ydieresis            original
+U+0100 Amacron              1.5
+U+0101 amacron              1.5
+U+0102 Abreve               1.5
+U+0103 abreve               1.5
+U+0104 Aogonek              1.4
+U+0105 aogonek              1.4
+U+0106 Cacute               original
+U+0107 cacute               original
+U+0108 Ccircumflex          1.5
+U+0109 ccircumflex          1.5
+U+010a Cdotaccent           1.5
+U+010b cdotaccent           1.5
+U+010c Ccaron               original
+U+010d ccaron               original
+U+010e Dcaron               1.0
+U+010f dcaron               1.0
+U+0110 Dcroat               1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0111 dcroat               original
+U+0112 Emacron              1.5
+U+0113 emacron              1.5
+U+0114 Ebreve               1.5
+U+0115 ebreve               1.5
+U+0116 Edotaccent           1.5
+U+0117 edotaccent           1.5
+U+0118 Eogonek              1.4
+U+0119 eogonek              1.4
+U+011a Ecaron               1.0
+U+011b ecaron               1.0
+U+011c Gcircumflex          1.5
+U+011d gcircumflex          1.5
+U+011e Gbreve               original
+U+011f gbreve               original
+U+0120 Gdotaccent           1.5
+U+0121 gdotaccent           1.5
+U+0122 Gcommaaccent         1.11
+U+0123 gcommaaccent         1.11
+U+0124 Hcircumflex          1.5
+U+0125 hcircumflex          1.5
+U+0126 Hbar                 1.12
+U+0127 hbar                 1.12
+U+0128 Itilde               1.5
+U+0129 itilde               1.5
+U+012a Imacron              1.5
+U+012b imacron              1.5
+U+012c Ibreve               1.5
+U+012d ibreve               1.5
+U+012e Iogonek              1.11
+U+012f iogonek              1.11
+U+0130 Idotaccent           original
+U+0131 dotlessi             original
+U+0132 IJ                   1.11
+U+0133 ij                   1.11
+U+0134 Jcircumflex          1.5
+U+0135 jcircumflex          1.5
+U+0136 Kcommaaccent         1.11
+U+0137 kcommaaccent         1.11
+U+0138 kgreenlandic         1.12
+U+0139 Lacute               1.1
+U+013a lacute               1.1
+U+013b Lcommaaccent         1.11
+U+013c lcommaaccent         1.11
+U+013d Lcaron               1.1
+U+013e lcaron               1.1
+U+013f Ldot                 1.2
+U+0140 ldot                 1.2
+U+0141 Lslash               original
+U+0142 lslash               original
+U+0143 Nacute               1.4
+U+0144 nacute               1.4
+U+0145 Ncommaaccent         1.11
+U+0146 ncommaaccent         1.11
+U+0147 Ncaron               1.0
+U+0148 ncaron               1.0
+U+0149 napostrophe          1.12
+U+014a Eng                  1.12
+U+014b eng                  1.12
+U+014c Omacron              1.5
+U+014d omacron              1.5
+U+014e Obreve               1.5
+U+014f obreve               1.5
+U+0150 Ohungarumlaut        1.5
+U+0151 ohungarumlaut        1.5
+U+0152 OE                   original
+U+0153 oe                   original
+U+0154 Racute               1.1
+U+0155 racute               1.1
+U+0156 Rcommaaccent         1.11
+U+0157 rcommaaccent         1.11
+U+0158 Rcaron               1.0
+U+0159 rcaron               1.0
+U+015a Sacute               1.4
+U+015b sacute               1.4
+U+015c Scircumflex          1.5
+U+015d scircumflex          1.5
+U+015e Scedilla             original
+U+015f scedilla             original
+U+0160 Scaron               original
+U+0161 scaron               original
+U+0162 Tcommaaccent         1.5
+U+0163 tcommaaccent         1.5
+U+0164 Tcaron               1.0
+U+0165 tcaron               1.0
+U+0166 Tbar                 1.12
+U+0167 tbar                 1.12
+U+0168 Utilde               1.5
+U+0169 utilde               1.5
+U+016a Umacron              1.5
+U+016b umacron              1.5
+U+016c Ubreve               1.5
+U+016d ubreve               1.5
+U+016e Uring                1.0
+U+016f uring                1.0
+U+0170 Uhungarumlaut        1.5
+U+0171 uhungarumlaut        1.5
+U+0172 Uogonek              1.11
+U+0173 uogonek              1.11
+U+0174 Wcircumflex          1.2
+U+0175 wcircumflex          1.2
+U+0176 Ycircumflex          1.2
+U+0177 ycircumflex          1.2
+U+0178 Ydieresis            original
+U+0179 Zacute               1.4
+U+017a zacute               1.4
+U+017b Zdotaccent           1.4
+U+017c zdotaccent           1.4
+U+017d Zcaron               original
+U+017e zcaron               original
+U+017f longs                1.12
+U+0180 uni0180              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0181 uni0181              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0182 uni0182              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0183 uni0183              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0184 uni0184              2.3
+U+0185 uni0185              2.3
+U+0186 uni0186              1.15
+U+0187 uni0187              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0188 uni0188              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0189 uni0189              2.1
+U+018a uni018A              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+018b uni018B              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+018c uni018C              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+018d uni018D              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+018e uni018E              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+018f uni018F              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0190 uni0190              1.15
+U+0191 uni0191              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0192 florin               original
+U+0193 uni0193              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0194 uni0194              1.14
+U+0195 uni0195              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.6 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0196 uni0196              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0197 uni0197              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0198 uni0198              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0199 uni0199              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+019a uni019A              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+019b uni019B              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+019c uni019C              2.3
+U+019d uni019D              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+019e uni019E              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+019f uni019F              2.3
+U+01a0 Ohorn                2.3
+U+01a1 ohorn                2.3
+U+01a2 uni01A2              2.3
+U+01a3 uni01A3              2.3
+U+01a4 uni01A4              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01a5 uni01A5              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01a6 uni01A6              2.3
+U+01a7 uni01A7              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01a8 uni01A8              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01a9 uni01A9              2.2
+U+01aa uni01AA              2.3
+U+01ab uni01AB              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01ac uni01AC              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01ad uni01AD              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01ae uni01AE              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01af Uhorn                2.3
+U+01b0 uhorn                2.3
+U+01b1 uni01B1              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01b2 uni01B2              2.3
+U+01b3 uni01B3              2.3
+U+01b4 uni01B4              2.3
+U+01b5 uni01B5              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01b6 uni01B6              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01b7 uni01B7              2.3
+U+01b8 uni01B8              2.3
+U+01b9 uni01B9              2.3
+U+01ba uni01BA              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+01bb uni01BB              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01bc uni01BC              2.3
+U+01bd uni01BD              2.3
+U+01be uni01BE              2.3
+U+01bf uni01BF              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+01c0 uni01C0              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01c1 uni01C1              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01c2 uni01C2              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01c3 uni01C3              2.2
+U+01c4 uni01C4              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01c5 uni01C5              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01c6 uni01C6              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01c7 uni01C7              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01c8 uni01C8              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01c9 uni01C9              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01ca uni01CA              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01cb uni01CB              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01cc uni01CC              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01cd uni01CD              1.15
+U+01ce uni01CE              1.15
+U+01cf uni01CF              1.15
+U+01d0 uni01D0              1.15
+U+01d1 uni01D1              1.15
+U+01d2 uni01D2              1.15
+U+01d3 uni01D3              1.15
+U+01d4 uni01D4              1.15
+U+01d5 uni01D5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01d6 uni01D6              1.13
+U+01d7 uni01D7              2.3
+U+01d8 uni01D8              2.3
+U+01d9 uni01D9              2.3
+U+01da uni01DA              2.3
+U+01db uni01DB              2.3
+U+01dc uni01DC              2.3
+U+01dd uni01DD              2.2
+U+01de uni01DE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique) 2.23 (Serif Italic Condensed)
+U+01df uni01DF              1.13
+U+01e0 uni01E0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01e1 uni01E1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01e2 uni01E2              1.5
+U+01e3 uni01E3              1.5
+U+01e4 uni01E4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+01e5 uni01E5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+01e6 Gcaron               2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01e7 gcaron               2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01e8 uni01E8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01e9 uni01E9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01ea uni01EA              1.9
+U+01eb uni01EB              1.9
+U+01ec uni01EC              1.9
+U+01ed uni01ED              1.9
+U+01ee uni01EE              2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01ef uni01EF              2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01f0 uni01F0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono) 2.22 (Sans Mono Bold) 2.23 (Serif Italic Condensed)
+U+01f1 uni01F1              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01f2 uni01F2              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01f3 uni01F3              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01f4 uni01F4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01f5 uni01F5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01f6 uni01F6              2.3
+U+01f7 uni01F7              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+01f8 uni01F8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01f9 uni01F9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01fa Aringacute           2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01fb aringacute           2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01fc AEacute              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01fd aeacute              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01fe Oslashacute          2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01ff oslashacute          2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0200 uni0200              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0201 uni0201              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0202 uni0202              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0203 uni0203              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0204 uni0204              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0205 uni0205              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0206 uni0206              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0207 uni0207              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0208 uni0208              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0209 uni0209              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+020a uni020A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+020b uni020B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+020c uni020C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+020d uni020D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+020e uni020E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+020f uni020F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0210 uni0210              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0211 uni0211              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0212 uni0212              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0213 uni0213              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0214 uni0214              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0215 uni0215              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0216 uni0216              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0217 uni0217              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0218 Scommaaccent         1.5
+U+0219 scommaaccent         1.5
+U+021a uni021A              1.5
+U+021b uni021B              1.5
+U+021c uni021C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+021d uni021D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+021e uni021E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+021f uni021F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0220 uni0220              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.18 (Sans Mono, Sans Mono Bold) 2.23 (Serif Italic Condensed)
+U+0221 uni0221              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0222 uni0222              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0223 uni0223              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0224 uni0224              2.3
+U+0225 uni0225              2.3
+U+0226 uni0226              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0227 uni0227              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0228 uni0228              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0229 uni0229              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+022a uni022A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+022b uni022B              1.13
+U+022c uni022C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+022d uni022D              1.13
+U+022e uni022E              1.10
+U+022f uni022F              1.10
+U+0230 uni0230              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0231 uni0231              1.13
+U+0232 uni0232              1.5
+U+0233 uni0233              1.5
+U+0234 uni0234              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0235 uni0235              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0236 uni0236              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0237 dotlessj             1.5
+U+0238 uni0238              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0239 uni0239              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+023a uni023A              2.3
+U+023b uni023B              2.3
+U+023c uni023C              2.3
+U+023d uni023D              2.3
+U+023e uni023E              2.3
+U+023f uni023F              2.3
+U+0240 uni0240              2.3
+U+0241 uni0241              2.3
+U+0242 uni0242              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+0243 uni0243              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0244 uni0244              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0245 uni0245              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0246 uni0246              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0247 uni0247              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0248 uni0248              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0249 uni0249              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+024a uni024A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+024b uni024B              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+024c uni024C              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+024d uni024D              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+024e uni024E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+024f uni024F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0250 uni0250              1.14
+U+0251 uni0251              1.14
+U+0252 uni0252              1.14
+U+0253 uni0253              1.14
+U+0254 uni0254              1.14
+U+0255 uni0255              1.14
+U+0256 uni0256              1.14
+U+0257 uni0257              1.14
+U+0258 uni0258              1.14
+U+0259 uni0259              1.14
+U+025a uni025A              1.14
+U+025b uni025B              1.14
+U+025c uni025C              1.14
+U+025d uni025D              1.14
+U+025e uni025E              1.14
+U+025f uni025F              1.14
+U+0260 uni0260              1.14
+U+0261 uni0261              1.14
+U+0262 uni0262              1.14
+U+0263 uni0263              1.14
+U+0264 uni0264              1.14
+U+0265 uni0265              1.14
+U+0266 uni0266              1.14
+U+0267 uni0267              1.14
+U+0268 uni0268              1.14
+U+0269 uni0269              1.14
+U+026a uni026A              1.14
+U+026b uni026B              1.14
+U+026c uni026C              1.14
+U+026d uni026D              1.14
+U+026e uni026E              1.14
+U+026f uni026F              1.14
+U+0270 uni0270              1.14
+U+0271 uni0271              1.14
+U+0272 uni0272              1.14
+U+0273 uni0273              1.14
+U+0274 uni0274              1.14
+U+0275 uni0275              1.14
+U+0276 uni0276              1.14
+U+0277 uni0277              1.14
+U+0278 uni0278              1.14
+U+0279 uni0279              1.14
+U+027a uni027A              1.14
+U+027b uni027B              1.14
+U+027c uni027C              1.14
+U+027d uni027D              1.14
+U+027e uni027E              1.14
+U+027f uni027F              1.14
+U+0280 uni0280              1.14
+U+0281 uni0281              1.14
+U+0282 uni0282              1.14
+U+0283 uni0283              1.14
+U+0284 uni0284              1.14
+U+0285 uni0285              1.14
+U+0286 uni0286              1.14
+U+0287 uni0287              1.14
+U+0288 uni0288              1.14
+U+0289 uni0289              1.14
+U+028a uni028A              1.14
+U+028b uni028B              1.14
+U+028c uni028C              1.14
+U+028d uni028D              1.14
+U+028e uni028E              1.14
+U+028f uni028F              1.14
+U+0290 uni0290              1.14
+U+0291 uni0291              1.14
+U+0292 uni0292              1.14
+U+0293 uni0293              1.14
+U+0294 uni0294              1.14
+U+0295 uni0295              1.14
+U+0296 uni0296              1.14
+U+0297 uni0297              1.14
+U+0298 uni0298              1.14
+U+0299 uni0299              1.14
+U+029a uni029A              1.14
+U+029b uni029B              1.14
+U+029c uni029C              1.14
+U+029d uni029D              1.14
+U+029e uni029E              1.14
+U+029f uni029F              1.14
+U+02a0 uni02A0              1.14
+U+02a1 uni02A1              1.14
+U+02a2 uni02A2              1.14
+U+02a3 uni02A3              1.14
+U+02a4 uni02A4              1.14
+U+02a5 uni02A5              1.14
+U+02a6 uni02A6              1.14
+U+02a7 uni02A7              1.14
+U+02a8 uni02A8              1.14
+U+02a9 uni02A9              1.14
+U+02aa uni02AA              1.14
+U+02ab uni02AB              1.14
+U+02ac uni02AC              1.14
+U+02ad uni02AD              1.14
+U+02ae uni02AE              1.14
+U+02af uni02AF              1.14
+U+02b0 uni02B0              1.14
+U+02b1 uni02B1              1.14
+U+02b2 uni02B2              1.14
+U+02b3 uni02B3              1.14
+U+02b4 uni02B4              1.14
+U+02b5 uni02B5              1.14
+U+02b6 uni02B6              1.14
+U+02b7 uni02B7              1.14
+U+02b8 uni02B8              1.14
+U+02b9 uni02B9              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+02ba uni02BA              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+02bb uni02BB              1.5
+U+02bc uni02BC              1.12
+U+02bd uni02BD              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+02be uni02BE              2.2
+U+02bf uni02BF              2.2
+U+02c0 uni02C0              1.14
+U+02c1 uni02C1              1.14
+U+02c2 uni02C2              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+02c3 uni02C3              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+02c4 uni02C4              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+02c5 uni02C5              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+02c6 circumflex           original
+U+02c7 caron                original
+U+02c8 uni02C8              2.0
+U+02c9 uni02C9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+02ca uni02CA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+02cb uni02CB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+02cc uni02CC              2.0
+U+02cd uni02CD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+02ce uni02CE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+02cf uni02CF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+02d0 uni02D0              1.14
+U+02d1 uni02D1              1.14
+U+02d2 uni02D2              2.0
+U+02d3 uni02D3              2.2
+U+02d4 uni02D4              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+02d5 uni02D5              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+02d6 uni02D6              2.0
+U+02d7 uni02D7              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+02d8 breve                original
+U+02d9 dotaccent            original
+U+02da ring                 original
+U+02db ogonek               original
+U+02dc tilde                original
+U+02dd hungarumlaut         original
+U+02de uni02DE              2.0
+U+02df uni02DF              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+02e0 uni02E0              1.14
+U+02e1 uni02E1              1.14
+U+02e2 uni02E2              1.14
+U+02e3 uni02E3              1.14
+U+02e4 uni02E4              1.14
+U+02e5 uni02E5              2.0
+U+02e6 uni02E6              2.0
+U+02e7 uni02E7              2.0
+U+02e8 uni02E8              2.0
+U+02e9 uni02E9              2.0
+U+02ec uni02EC              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+02ed uni02ED              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+02ee uni02EE              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+02f3 uni02F3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+02f7 uni02F7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+0300 gravecomb            1.15
+U+0301 acutecomb            1.15
+U+0302 uni0302              1.15
+U+0303 tildecomb            1.15
+U+0304 uni0304              1.15
+U+0305 uni0305              2.0
+U+0306 uni0306              1.15
+U+0307 uni0307              1.15
+U+0308 uni0308              1.15
+U+0309 hookabovecomb        2.1
+U+030a uni030A              1.15
+U+030b uni030B              1.15
+U+030c uni030C              1.15
+U+030d uni030D              2.0
+U+030e uni030E              2.0
+U+030f uni030F              2.0
+U+0310 uni0310              2.0
+U+0311 uni0311              2.0
+U+0312 uni0312              1.11
+U+0313 uni0313              2.1
+U+0314 uni0314              2.1
+U+0315 uni0315              2.0
+U+0316 uni0316              2.0
+U+0317 uni0317              2.0
+U+0318 uni0318              2.0
+U+0319 uni0319              2.0
+U+031a uni031A              2.1
+U+031b uni031B              2.1
+U+031c uni031C              2.0
+U+031d uni031D              2.0
+U+031e uni031E              2.0
+U+031f uni031F              2.0
+U+0320 uni0320              2.0
+U+0321 uni0321              1.15
+U+0322 uni0322              1.15
+U+0323 dotbelowcomb         2.1
+U+0324 uni0324              2.0
+U+0325 uni0325              2.0
+U+0326 uni0326              1.5
+U+0327 uni0327              2.1
+U+0328 uni0328              2.1
+U+0329 uni0329              2.0
+U+032a uni032A              2.0
+U+032b uni032B              2.1
+U+032c uni032C              2.0
+U+032d uni032D              2.0
+U+032e uni032E              2.0
+U+032f uni032F              2.0
+U+0330 uni0330              2.0
+U+0331 uni0331              2.0
+U+0332 uni0332              2.0
+U+0333 uni0333              2.1
+U+0334 uni0334              2.3
+U+0335 uni0335              2.3
+U+0336 uni0336              2.3
+U+0337 uni0337              2.3
+U+0338 uni0338              2.3
+U+0339 uni0339              2.0
+U+033a uni033A              2.0
+U+033b uni033B              2.0
+U+033c uni033C              2.1
+U+033d uni033D              2.0
+U+033e uni033E              2.1
+U+033f uni033F              2.1
+U+0340 uni0340              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0341 uni0341              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0342 uni0342              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0343 uni0343              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0344 uni0344              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0345 uni0345              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0346 uni0346              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0347 uni0347              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0348 uni0348              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0349 uni0349              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+034a uni034A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+034b uni034B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+034c uni034C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+034d uni034D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+034e uni034E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+034f uni034F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0351 uni0351              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0352 uni0352              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) 2.28 (Sans Condensed Oblique, Sans Oblique)
+U+0353 uni0353              2.5 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0357 uni0357              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0358 uni0358              2.3
+U+035a uni035A              2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+035c uni035C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+035d uni035D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+035e uni035E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+035f uni035F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0360 uni0360              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0361 uni0361              2.0
+U+0362 uni0362              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0370 uni0370              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+0371 uni0371              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+0372 uni0372              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0373 uni0373              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0374 uni0374              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0375 uni0375              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0376 uni0376              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0377 uni0377              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+037a uni037A              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+037b uni037B              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+037c uni037C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+037d uni037D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+037e uni037E              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0384 tonos                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0385 dieresistonos        1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0386 Alphatonos           1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0387 anoteleia            1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0388 Epsilontonos         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0389 Etatonos             1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+038a Iotatonos            1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+038c Omicrontonos         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+038e Upsilontonos         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+038f Omegatonos           1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0390 iotadieresistonos    1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0391 Alpha                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0392 Beta                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0393 Gamma                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0394 uni0394              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0395 Epsilon              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0396 Zeta                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0397 Eta                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0398 Theta                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0399 Iota                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+039a Kappa                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+039b Lambda               1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+039c Mu                   1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+039d Nu                   1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+039e Xi                   1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+039f Omicron              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03a0 Pi                   1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03a1 Rho                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03a3 Sigma                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03a4 Tau                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03a5 Upsilon              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03a6 Phi                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03a7 Chi                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03a8 Psi                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03a9 Omega                original
+U+03aa Iotadieresis         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03ab Upsilondieresis      1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03ac alphatonos           1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03ad epsilontonos         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03ae etatonos             1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03af iotatonos            1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03b0 upsilondieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03b1 alpha                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03b2 beta                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03b3 gamma                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03b4 delta                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03b5 epsilon              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03b6 zeta                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03b7 eta                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03b8 theta                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03b9 iota                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03ba kappa                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03bb lambda               1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03bc uni03BC              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03bd nu                   1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03be xi                   1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03bf omicron              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03c0 pi                   original
+U+03c1 rho                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03c2 sigma1               1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03c3 sigma                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03c4 tau                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03c5 upsilon              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03c6 phi                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03c7 chi                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03c8 psi                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03c9 omega                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03ca iotadieresis         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03cb upsilondieresis      1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03cc omicrontonos         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03cd upsilontonos         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03ce omegatonos           1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03cf uni03CF              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+03d0 uni03D0              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03d1 theta1               1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03d2 Upsilon1             1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03d3 uni03D3              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03d4 uni03D4              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03d5 phi1                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.18 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03d6 omega1               1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+03d7 uni03D7              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03d8 uni03D8              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+03d9 uni03D9              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+03da uni03DA              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03db uni03DB              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03dc uni03DC              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03dd uni03DD              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03de uni03DE              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03df uni03DF              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03e0 uni03E0              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03e1 uni03E1              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03e2 uni03E2              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03e3 uni03E3              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03e4 uni03E4              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03e5 uni03E5              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03e6 uni03E6              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03e7 uni03E7              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03e8 uni03E8              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03e9 uni03E9              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03ea uni03EA              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03eb uni03EB              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03ec uni03EC              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03ed uni03ED              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03ee uni03EE              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03ef uni03EF              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03f0 uni03F0              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03f1 uni03F1              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+03f2 uni03F2              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03f3 uni03F3              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03f4 uni03F4              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03f5 uni03F5              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03f6 uni03F6              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03f7 uni03F7              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03f8 uni03F8              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03f9 uni03F9              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03fa uni03FA              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03fb uni03FB              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03fc uni03FC              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+03fd uni03FD              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03fe uni03FE              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03ff uni03FF              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0400 uni0400              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0401 uni0401              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0402 uni0402              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0403 uni0403              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0404 uni0404              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0405 uni0405              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0406 uni0406              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0407 uni0407              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0408 uni0408              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0409 uni0409              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+040a uni040A              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+040b uni040B              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+040c uni040C              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+040d uni040D              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+040e uni040E              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+040f uni040F              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0410 uni0410              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0411 uni0411              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0412 uni0412              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0413 uni0413              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0414 uni0414              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0415 uni0415              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0416 uni0416              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0417 uni0417              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0418 uni0418              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0419 uni0419              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+041a uni041A              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+041b uni041B              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+041c uni041C              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+041d uni041D              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+041e uni041E              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+041f uni041F              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0420 uni0420              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0421 uni0421              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0422 uni0422              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0423 uni0423              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0424 uni0424              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0425 uni0425              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0426 uni0426              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0427 uni0427              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0428 uni0428              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0429 uni0429              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+042a uni042A              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+042b uni042B              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+042c uni042C              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+042d uni042D              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+042e uni042E              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+042f uni042F              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0430 uni0430              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0431 uni0431              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0432 uni0432              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0433 uni0433              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0434 uni0434              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0435 uni0435              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0436 uni0436              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0437 uni0437              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0438 uni0438              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0439 uni0439              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+043a uni043A              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+043b uni043B              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+043c uni043C              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+043d uni043D              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+043e uni043E              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+043f uni043F              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0440 uni0440              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0441 uni0441              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0442 uni0442              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0443 uni0443              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0444 uni0444              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0445 uni0445              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0446 uni0446              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0447 uni0447              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0448 uni0448              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0449 uni0449              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+044a uni044A              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+044b uni044B              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+044c uni044C              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+044d uni044D              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+044e uni044E              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+044f uni044F              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0450 uni0450              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0451 uni0451              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0452 uni0452              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0453 uni0453              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0454 uni0454              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0455 uni0455              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0456 uni0456              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0457 uni0457              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0458 uni0458              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0459 uni0459              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+045a uni045A              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+045b uni045B              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+045c uni045C              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+045d uni045D              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+045e uni045E              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+045f uni045F              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0460 uni0460              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0461 uni0461              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
+U+0462 uni0462              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0463 uni0463              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0464 uni0464              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0465 uni0465              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0466 uni0466              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0467 uni0467              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0468 uni0468              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0469 uni0469              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+046a uni046A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.21 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+046b uni046B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.21 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+046c uni046C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+046d uni046D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+046e uni046E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+046f uni046F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0470 uni0470              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+0471 uni0471              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+0472 uni0472              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0473 uni0473              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0474 uni0474              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0475 uni0475              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0476 uni0476              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0477 uni0477              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0478 uni0478              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0479 uni0479              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+047a uni047A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+047b uni047B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+047c uni047C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+047d uni047D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+047e uni047E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+047f uni047F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0480 uni0480              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0481 uni0481              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0482 uni0482              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0483 uni0483              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0484 uni0484              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0485 uni0485              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0486 uni0486              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0487 uni0487              2.9 (Sans, Sans Condensed) 2.27 (Sans Bold, Sans Bold Oblique, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0488 uni0488              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0489 uni0489              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+048a uni048A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+048b uni048B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+048c uni048C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+048d uni048D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+048e uni048E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+048f uni048F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0490 uni0490              1.15
+U+0491 uni0491              1.15
+U+0492 uni0492              1.14
+U+0493 uni0493              1.14
+U+0494 uni0494              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0495 uni0495              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0496 uni0496              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0497 uni0497              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0498 uni0498              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0499 uni0499              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+049a uni049A              1.14
+U+049b uni049B              1.14
+U+049c uni049C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+049d uni049D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+049e uni049E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+049f uni049F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04a0 uni04A0              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+04a1 uni04A1              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+04a2 uni04A2              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04a3 uni04A3              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04a4 uni04A4              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+04a5 uni04A5              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+04a6 uni04A6              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04a7 uni04A7              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04a8 uni04A8              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04a9 uni04A9              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04aa uni04AA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04ab uni04AB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04ac uni04AC              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04ad uni04AD              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04ae uni04AE              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04af uni04AF              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04b0 uni04B0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+04b1 uni04B1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+04b2 uni04B2              1.14
+U+04b3 uni04B3              1.14
+U+04b4 uni04B4              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04b5 uni04B5              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04b6 uni04B6              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04b7 uni04B7              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04b8 uni04B8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04b9 uni04B9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04ba uni04BA              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04bb uni04BB              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04bc uni04BC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04bd uni04BD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04be uni04BE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04bf uni04BF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04c0 uni04C0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04c1 uni04C1              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04c2 uni04C2              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04c3 uni04C3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+04c4 uni04C4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+04c5 uni04C5              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04c6 uni04C6              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04c7 uni04C7              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+04c8 uni04C8              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+04c9 uni04C9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04ca uni04CA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04cb uni04CB              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04cc uni04CC              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04cd uni04CD              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04ce uni04CE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04cf uni04CF              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04d0 uni04D0              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04d1 uni04D1              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04d2 uni04D2              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04d3 uni04D3              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04d4 uni04D4              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04d5 uni04D5              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04d6 uni04D6              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04d7 uni04D7              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04d8 uni04D8              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04d9 uni04D9              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04da uni04DA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04db uni04DB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04dc uni04DC              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04dd uni04DD              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04de uni04DE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04df uni04DF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04e0 uni04E0              2.3
+U+04e1 uni04E1              2.3
+U+04e2 uni04E2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04e3 uni04E3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04e4 uni04E4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04e5 uni04E5              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04e6 uni04E6              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04e7 uni04E7              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04e8 uni04E8              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+04e9 uni04E9              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+04ea uni04EA              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+04eb uni04EB              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+04ec uni04EC              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04ed uni04ED              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04ee uni04EE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04ef uni04EF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04f0 uni04F0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04f1 uni04F1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04f2 uni04F2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04f3 uni04F3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04f4 uni04F4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04f5 uni04F5              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04f6 uni04F6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04f7 uni04F7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04f8 uni04F8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04f9 uni04F9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04fa uni04FA              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04fb uni04FB              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04fc uni04FC              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04fd uni04FD              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04fe uni04FE              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
+U+04ff uni04FF              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
+U+0500 uni0500              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
+U+0501 uni0501              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
+U+0502 uni0502              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0503 uni0503              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0504 uni0504              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0505 uni0505              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0506 uni0506              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0507 uni0507              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0508 uni0508              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0509 uni0509              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+050a uni050A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+050b uni050B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+050c uni050C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+050d uni050D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+050e uni050E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+050f uni050F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0510 uni0510              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+0511 uni0511              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+0512 uni0512              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+0513 uni0513              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+0514 uni0514              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+0515 uni0515              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+0516 uni0516              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0517 uni0517              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0518 uni0518              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0519 uni0519              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+051a uni051A              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+051b uni051B              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+051c uni051C              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+051d uni051D              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+051e uni051E              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+051f uni051F              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0520 uni0520              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0521 uni0521              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0522 uni0522              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0523 uni0523              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0524 uni0524              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0525 uni0525              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0531 uni0531              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0532 uni0532              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0533 uni0533              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0534 uni0534              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0535 uni0535              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0536 uni0536              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0537 uni0537              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0538 uni0538              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0539 uni0539              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+053a uni053A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+053b uni053B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+053c uni053C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+053d uni053D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+053e uni053E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+053f uni053F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0540 uni0540              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0541 uni0541              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0542 uni0542              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0543 uni0543              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0544 uni0544              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0545 uni0545              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0546 uni0546              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0547 uni0547              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0548 uni0548              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0549 uni0549              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+054a uni054A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+054b uni054B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+054c uni054C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+054d uni054D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+054e uni054E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+054f uni054F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0550 uni0550              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0551 uni0551              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0552 uni0552              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0553 uni0553              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0554 uni0554              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0555 uni0555              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0556 uni0556              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0559 uni0559              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+055a uni055A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+055b uni055B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+055c uni055C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+055d uni055D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+055e uni055E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+055f uni055F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0561 uni0561              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0562 uni0562              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0563 uni0563              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0564 uni0564              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0565 uni0565              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0566 uni0566              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0567 uni0567              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0568 uni0568              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0569 uni0569              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+056a uni056A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+056b uni056B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+056c uni056C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+056d uni056D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+056e uni056E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+056f uni056F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0570 uni0570              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0571 uni0571              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0572 uni0572              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0573 uni0573              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0574 uni0574              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0575 uni0575              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0576 uni0576              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0577 uni0577              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0578 uni0578              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0579 uni0579              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+057a uni057A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+057b uni057B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+057c uni057C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+057d uni057D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+057e uni057E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+057f uni057F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0580 uni0580              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0581 uni0581              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0582 uni0582              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0583 uni0583              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0584 uni0584              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0585 uni0585              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0586 uni0586              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0587 uni0587              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0589 uni0589              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+058a uni058A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+05b0 uni05B0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05b1 uni05B1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05b2 uni05B2              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05b3 uni05B3              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05b4 uni05B4              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05b5 uni05B5              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05b6 uni05B6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05b7 uni05B7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05b8 uni05B8              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05b9 uni05B9              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05ba uni05BA              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+05bb uni05BB              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05bc uni05BC              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05bd uni05BD              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05be uni05BE              2.9 (Sans Condensed Oblique, Sans Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique)
+U+05bf uni05BF              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05c0 uni05C0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05c1 uni05C1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05c2 uni05C2              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05c3 uni05C3              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05c6 uni05C6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05c7 uni05C7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05d0 uni05D0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05d1 uni05D1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05d2 uni05D2              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05d3 uni05D3              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05d4 uni05D4              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05d5 uni05D5              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05d6 uni05D6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05d7 uni05D7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05d8 uni05D8              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05d9 uni05D9              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05da uni05DA              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05db uni05DB              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05dc uni05DC              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05dd uni05DD              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05de uni05DE              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05df uni05DF              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05e0 uni05E0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05e1 uni05E1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05e2 uni05E2              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05e3 uni05E3              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05e4 uni05E4              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05e5 uni05E5              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05e6 uni05E6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05e7 uni05E7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05e8 uni05E8              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05e9 uni05E9              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05ea uni05EA              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05f0 uni05F0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05f1 uni05F1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05f2 uni05F2              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05f3 uni05F3              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+05f4 uni05F4              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0606 uni0606              2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold)
+U+0607 uni0607              2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold)
+U+0609 uni0609              2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold)
+U+060a uni060A              2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold)
+U+060c uni060C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0615 uni0615              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+061b uni061B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+061f uni061F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0621 uni0621              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0622 uni0622              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0623 uni0623              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0624 uni0624              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0625 uni0625              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0626 uni0626              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0627 uni0627              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0628 uni0628              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0629 uni0629              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+062a uni062A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+062b uni062B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+062c uni062C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+062d uni062D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+062e uni062E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+062f uni062F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0630 uni0630              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0631 uni0631              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0632 uni0632              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0633 uni0633              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0634 uni0634              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0635 uni0635              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0636 uni0636              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0637 uni0637              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0638 uni0638              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0639 uni0639              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+063a uni063A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0640 uni0640              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0641 uni0641              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0642 uni0642              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0643 uni0643              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0644 uni0644              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0645 uni0645              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0646 uni0646              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0647 uni0647              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0648 uni0648              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0649 uni0649              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+064a uni064A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+064b uni064B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+064c uni064C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+064d uni064D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+064e uni064E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+064f uni064F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0650 uni0650              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0651 uni0651              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0652 uni0652              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0653 uni0653              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0654 uni0654              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0655 uni0655              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0657 uni0657              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+065a uni065A              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0660 uni0660              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0661 uni0661              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0662 uni0662              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0663 uni0663              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0664 uni0664              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0665 uni0665              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0666 uni0666              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0667 uni0667              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0668 uni0668              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0669 uni0669              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+066a uni066A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+066b uni066B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+066c uni066C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+066d uni066D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+066e uni066E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+066f uni066F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0670 uni0670              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+0674 uni0674              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans ExtraLight) 2.16 (Sans Mono, Sans Mono Bold)
+U+0679 uni0679              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+067a uni067A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+067b uni067B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+067c uni067C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+067d uni067D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+067e uni067E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+067f uni067F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0680 uni0680              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0681 uni0681              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0682 uni0682              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0683 uni0683              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0684 uni0684              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0685 uni0685              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0686 uni0686              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0687 uni0687              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0688 uni0688              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+0689 uni0689              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+068a uni068A              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+068b uni068B              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+068c uni068C              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+068d uni068D              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+068e uni068E              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+068f uni068F              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+0690 uni0690              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+0691 uni0691              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0692 uni0692              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0693 uni0693              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+0694 uni0694              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+0695 uni0695              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+0696 uni0696              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+0697 uni0697              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+0698 uni0698              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0699 uni0699              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+069a uni069A              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+069b uni069B              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+069c uni069C              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+069d uni069D              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+069e uni069E              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+069f uni069F              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06a0 uni06A0              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06a1 uni06A1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06a2 uni06A2              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06a3 uni06A3              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06a4 uni06A4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06a5 uni06A5              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06a6 uni06A6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06a7 uni06A7              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06a8 uni06A8              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06a9 uni06A9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06aa uni06AA              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06ab uni06AB              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06ac uni06AC              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06ad uni06AD              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06ae uni06AE              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06af uni06AF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06b0 uni06B0              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06b1 uni06B1              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06b2 uni06B2              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06b3 uni06B3              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06b4 uni06B4              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06b5 uni06B5              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06b6 uni06B6              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06b7 uni06B7              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06b8 uni06B8              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06b9 uni06B9              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06ba uni06BA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06bb uni06BB              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06bc uni06BC              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06bd uni06BD              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06be uni06BE              2.16 (Sans Mono, Sans Mono Bold) 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06bf uni06BF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06c6 uni06C6              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06cc uni06CC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06ce uni06CE              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06d5 uni06D5              2.10 (Sans, Sans Bold) 2.11 (Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06f0 uni06F0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06f1 uni06F1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06f2 uni06F2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06f3 uni06F3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06f4 uni06F4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06f5 uni06F5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06f6 uni06F6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06f7 uni06F7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06f8 uni06F8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06f9 uni06F9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+07c0 uni07C0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07c1 uni07C1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07c2 uni07C2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07c3 uni07C3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07c4 uni07C4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07c5 uni07C5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07c6 uni07C6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07c7 uni07C7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07c8 uni07C8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07c9 uni07C9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07ca uni07CA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07cb uni07CB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07cc uni07CC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07cd uni07CD              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07ce uni07CE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07cf uni07CF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07d0 uni07D0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07d1 uni07D1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07d2 uni07D2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07d3 uni07D3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07d4 uni07D4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07d5 uni07D5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07d6 uni07D6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07d7 uni07D7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07d8 uni07D8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07d9 uni07D9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07da uni07DA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07db uni07DB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07dc uni07DC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07dd uni07DD              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07de uni07DE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07df uni07DF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07e0 uni07E0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07e1 uni07E1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07e2 uni07E2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07e3 uni07E3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07e4 uni07E4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07e5 uni07E5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07e6 uni07E6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07e7 uni07E7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07eb uni07EB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07ec uni07EC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07ed uni07ED              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07ee uni07EE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07ef uni07EF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07f0 uni07F0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07f1 uni07F1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07f2 uni07F2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07f3 uni07F3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07f4 uni07F4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07f5 uni07F5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07f8 uni07F8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07f9 uni07F9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07fa uni07FA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+0e3f uni0E3F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0e81 uni0E81              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e82 uni0E82              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e84 uni0E84              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e87 uni0E87              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e88 uni0E88              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e8a uni0E8A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e8d uni0E8D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e94 uni0E94              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e95 uni0E95              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e96 uni0E96              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e97 uni0E97              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e99 uni0E99              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e9a uni0E9A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e9b uni0E9B              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e9c uni0E9C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e9d uni0E9D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e9e uni0E9E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e9f uni0E9F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ea1 uni0EA1              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ea2 uni0EA2              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ea3 uni0EA3              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ea5 uni0EA5              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ea7 uni0EA7              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eaa uni0EAA              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eab uni0EAB              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ead uni0EAD              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eae uni0EAE              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eaf uni0EAF              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eb0 uni0EB0              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eb1 uni0EB1              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eb2 uni0EB2              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eb3 uni0EB3              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eb4 uni0EB4              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eb5 uni0EB5              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eb6 uni0EB6              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eb7 uni0EB7              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eb8 uni0EB8              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eb9 uni0EB9              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ebb uni0EBB              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ebc uni0EBC              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ebd uni0EBD              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ec0 uni0EC0              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ec1 uni0EC1              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ec2 uni0EC2              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ec3 uni0EC3              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ec4 uni0EC4              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ec6 uni0EC6              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ec8 uni0EC8              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ec9 uni0EC9              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eca uni0ECA              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ecb uni0ECB              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ecc uni0ECC              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ecd uni0ECD              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ed0 uni0ED0              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ed1 uni0ED1              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ed2 uni0ED2              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ed3 uni0ED3              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ed4 uni0ED4              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ed5 uni0ED5              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ed6 uni0ED6              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ed7 uni0ED7              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ed8 uni0ED8              2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0ed9 uni0ED9              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0edc uni0EDC              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0edd uni0EDD              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+10a0 uni10A0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10a1 uni10A1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10a2 uni10A2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10a3 uni10A3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10a4 uni10A4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10a5 uni10A5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10a6 uni10A6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10a7 uni10A7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10a8 uni10A8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10a9 uni10A9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10aa uni10AA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10ab uni10AB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10ac uni10AC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10ad uni10AD              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10ae uni10AE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10af uni10AF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10b0 uni10B0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10b1 uni10B1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10b2 uni10B2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10b3 uni10B3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10b4 uni10B4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10b5 uni10B5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10b6 uni10B6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10b7 uni10B7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10b8 uni10B8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10b9 uni10B9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10ba uni10BA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10bb uni10BB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10bc uni10BC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10bd uni10BD              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10be uni10BE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10bf uni10BF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10c0 uni10C0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10c1 uni10C1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10c2 uni10C2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10c3 uni10C3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10c4 uni10C4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10c5 uni10C5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10d0 uni10D0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10d1 uni10D1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10d2 uni10D2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10d3 uni10D3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10d4 uni10D4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10d5 uni10D5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10d6 uni10D6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10d7 uni10D7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10d8 uni10D8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10d9 uni10D9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10da uni10DA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10db uni10DB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10dc uni10DC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10dd uni10DD              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10de uni10DE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10df uni10DF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10e0 uni10E0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10e1 uni10E1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10e2 uni10E2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10e3 uni10E3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10e4 uni10E4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10e5 uni10E5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10e6 uni10E6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10e7 uni10E7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10e8 uni10E8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10e9 uni10E9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10ea uni10EA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10eb uni10EB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10ec uni10EC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10ed uni10ED              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10ee uni10EE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10ef uni10EF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10f0 uni10F0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10f1 uni10F1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10f2 uni10F2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10f3 uni10F3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10f4 uni10F4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10f5 uni10F5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10f6 uni10F6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10f7 uni10F7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10f8 uni10F8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10f9 uni10F9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10fa uni10FA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10fb uni10FB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10fc uni10FC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+1401 uni1401              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1402 uni1402              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1403 uni1403              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1404 uni1404              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1405 uni1405              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1406 uni1406              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1407 uni1407              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1409 uni1409              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+140a uni140A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+140b uni140B              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+140c uni140C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+140d uni140D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+140e uni140E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+140f uni140F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1410 uni1410              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1411 uni1411              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1412 uni1412              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1413 uni1413              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1414 uni1414              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1415 uni1415              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1416 uni1416              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1417 uni1417              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1418 uni1418              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1419 uni1419              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+141a uni141A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+141b uni141B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+141d uni141D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+141e uni141E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+141f uni141F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1420 uni1420              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1421 uni1421              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1422 uni1422              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1423 uni1423              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1424 uni1424              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1425 uni1425              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1426 uni1426              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1427 uni1427              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1428 uni1428              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1429 uni1429              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+142a uni142A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+142b uni142B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+142c uni142C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+142d uni142D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+142e uni142E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+142f uni142F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1430 uni1430              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1431 uni1431              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1432 uni1432              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1433 uni1433              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1434 uni1434              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1435 uni1435              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1437 uni1437              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1438 uni1438              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1439 uni1439              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+143a uni143A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+143b uni143B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+143c uni143C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+143d uni143D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+143e uni143E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+143f uni143F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1440 uni1440              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1441 uni1441              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1442 uni1442              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1443 uni1443              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1444 uni1444              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1445 uni1445              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1446 uni1446              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1447 uni1447              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1448 uni1448              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1449 uni1449              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+144a uni144A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+144c uni144C              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+144d uni144D              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+144e uni144E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+144f uni144F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1450 uni1450              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1451 uni1451              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1452 uni1452              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1454 uni1454              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1455 uni1455              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1456 uni1456              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1457 uni1457              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1458 uni1458              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1459 uni1459              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+145a uni145A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+145b uni145B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+145c uni145C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+145d uni145D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+145e uni145E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+145f uni145F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1460 uni1460              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1461 uni1461              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1462 uni1462              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1463 uni1463              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1464 uni1464              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1465 uni1465              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1466 uni1466              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1467 uni1467              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1468 uni1468              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1469 uni1469              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+146a uni146A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+146b uni146B              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+146c uni146C              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+146d uni146D              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+146e uni146E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+146f uni146F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1470 uni1470              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1471 uni1471              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1472 uni1472              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1473 uni1473              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1474 uni1474              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1475 uni1475              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1476 uni1476              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1477 uni1477              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1478 uni1478              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1479 uni1479              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+147a uni147A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+147b uni147B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+147c uni147C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+147d uni147D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+147e uni147E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+147f uni147F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1480 uni1480              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1481 uni1481              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1482 uni1482              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1483 uni1483              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1484 uni1484              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1485 uni1485              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1486 uni1486              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1487 uni1487              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1488 uni1488              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1489 uni1489              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+148a uni148A              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+148b uni148B              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+148c uni148C              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+148d uni148D              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+148e uni148E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+148f uni148F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1490 uni1490              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1491 uni1491              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1492 uni1492              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1493 uni1493              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1494 uni1494              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1495 uni1495              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1496 uni1496              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1497 uni1497              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1498 uni1498              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1499 uni1499              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+149a uni149A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+149b uni149B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+149c uni149C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+149d uni149D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+149e uni149E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+149f uni149F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14a0 uni14A0              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14a1 uni14A1              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14a2 uni14A2              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14a3 uni14A3              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14a4 uni14A4              2.13 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.15 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+14a5 uni14A5              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14a6 uni14A6              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14a7 uni14A7              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14a8 uni14A8              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14a9 uni14A9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14aa uni14AA              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ab uni14AB              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ac uni14AC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ad uni14AD              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ae uni14AE              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14af uni14AF              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14b0 uni14B0              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14b1 uni14B1              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14b2 uni14B2              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14b3 uni14B3              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14b4 uni14B4              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14b5 uni14B5              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14b6 uni14B6              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14b7 uni14B7              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14b8 uni14B8              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14b9 uni14B9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ba uni14BA              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14bb uni14BB              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14bc uni14BC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14bd uni14BD              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14c0 uni14C0              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14c1 uni14C1              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14c2 uni14C2              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14c3 uni14C3              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14c4 uni14C4              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14c5 uni14C5              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14c6 uni14C6              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14c7 uni14C7              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14c8 uni14C8              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14c9 uni14C9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ca uni14CA              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14cb uni14CB              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14cc uni14CC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14cd uni14CD              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ce uni14CE              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14cf uni14CF              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14d0 uni14D0              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14d1 uni14D1              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14d2 uni14D2              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14d3 uni14D3              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14d4 uni14D4              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14d5 uni14D5              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14d6 uni14D6              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14d7 uni14D7              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14d8 uni14D8              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14d9 uni14D9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14da uni14DA              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14db uni14DB              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14dc uni14DC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14dd uni14DD              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14de uni14DE              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14df uni14DF              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14e0 uni14E0              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14e1 uni14E1              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14e2 uni14E2              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14e3 uni14E3              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14e4 uni14E4              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14e5 uni14E5              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14e6 uni14E6              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14e7 uni14E7              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14e8 uni14E8              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14e9 uni14E9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ea uni14EA              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ec uni14EC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ed uni14ED              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ee uni14EE              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ef uni14EF              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14f0 uni14F0              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14f1 uni14F1              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14f2 uni14F2              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14f3 uni14F3              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14f4 uni14F4              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14f5 uni14F5              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14f6 uni14F6              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14f7 uni14F7              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14f8 uni14F8              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14f9 uni14F9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14fa uni14FA              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14fb uni14FB              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14fc uni14FC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14fd uni14FD              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14fe uni14FE              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ff uni14FF              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1500 uni1500              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1501 uni1501              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1502 uni1502              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1503 uni1503              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1504 uni1504              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1505 uni1505              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1506 uni1506              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1507 uni1507              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1510 uni1510              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1511 uni1511              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1512 uni1512              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1513 uni1513              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1514 uni1514              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1515 uni1515              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1516 uni1516              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1517 uni1517              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1518 uni1518              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1519 uni1519              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+151a uni151A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+151b uni151B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+151c uni151C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+151d uni151D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+151e uni151E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+151f uni151F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1520 uni1520              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1521 uni1521              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1522 uni1522              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1523 uni1523              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1524 uni1524              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1525 uni1525              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1526 uni1526              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1527 uni1527              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1528 uni1528              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1529 uni1529              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+152a uni152A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+152b uni152B              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+152c uni152C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+152d uni152D              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+152e uni152E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+152f uni152F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1530 uni1530              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1531 uni1531              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1532 uni1532              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1533 uni1533              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1534 uni1534              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1535 uni1535              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1536 uni1536              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1537 uni1537              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1538 uni1538              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1539 uni1539              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+153a uni153A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+153b uni153B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+153c uni153C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+153d uni153D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+153e uni153E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1540 uni1540              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1541 uni1541              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1542 uni1542              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1543 uni1543              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1544 uni1544              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1545 uni1545              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1546 uni1546              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1547 uni1547              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1548 uni1548              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1549 uni1549              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+154a uni154A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+154b uni154B              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+154c uni154C              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+154d uni154D              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+154e uni154E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+154f uni154F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1550 uni1550              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1552 uni1552              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1553 uni1553              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1554 uni1554              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1555 uni1555              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1556 uni1556              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1557 uni1557              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1558 uni1558              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1559 uni1559              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+155a uni155A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+155b uni155B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+155c uni155C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+155d uni155D              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+155e uni155E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+155f uni155F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1560 uni1560              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1561 uni1561              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1562 uni1562              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1563 uni1563              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1564 uni1564              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1565 uni1565              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1566 uni1566              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1567 uni1567              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1568 uni1568              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1569 uni1569              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+156a uni156A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1574 uni1574              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1575 uni1575              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1576 uni1576              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1577 uni1577              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1578 uni1578              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1579 uni1579              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+157a uni157A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+157b uni157B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+157c uni157C              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+157d uni157D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+157e uni157E              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+157f uni157F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1580 uni1580              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1581 uni1581              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1582 uni1582              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1583 uni1583              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1584 uni1584              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1585 uni1585              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+158a uni158A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+158b uni158B              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+158c uni158C              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+158d uni158D              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+158e uni158E              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+158f uni158F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1590 uni1590              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1591 uni1591              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1592 uni1592              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1593 uni1593              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1594 uni1594              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1595 uni1595              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1596 uni1596              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15a0 uni15A0              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15a1 uni15A1              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15a2 uni15A2              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15a3 uni15A3              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15a4 uni15A4              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15a5 uni15A5              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15a6 uni15A6              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15a7 uni15A7              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15a8 uni15A8              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15a9 uni15A9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15aa uni15AA              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15ab uni15AB              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15ac uni15AC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15ad uni15AD              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15ae uni15AE              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15af uni15AF              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15de uni15DE              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15e1 uni15E1              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1646 uni1646              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1647 uni1647              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+166e uni166E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+166f uni166F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1670 uni1670              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1671 uni1671              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1672 uni1672              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1673 uni1673              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1674 uni1674              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1675 uni1675              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1676 uni1676              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1680 uni1680              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1681 uni1681              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1682 uni1682              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1683 uni1683              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1684 uni1684              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1685 uni1685              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1686 uni1686              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1687 uni1687              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1688 uni1688              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1689 uni1689              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+168a uni168A              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+168b uni168B              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+168c uni168C              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+168d uni168D              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+168e uni168E              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+168f uni168F              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1690 uni1690              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1691 uni1691              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1692 uni1692              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1693 uni1693              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1694 uni1694              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1695 uni1695              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1696 uni1696              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1697 uni1697              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1698 uni1698              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1699 uni1699              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+169a uni169A              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+169b uni169B              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+169c uni169C              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1d00 uni1D00              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d01 uni1D01              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d02 uni1D02              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1d03 uni1D03              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d04 uni1D04              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d05 uni1D05              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d06 uni1D06              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d07 uni1D07              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d08 uni1D08              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+1d09 uni1D09              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1d0a uni1D0A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d0b uni1D0B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d0c uni1D0C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d0d uni1D0D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d0e uni1D0E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d0f uni1D0F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d10 uni1D10              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d11 uni1D11              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d12 uni1D12              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d13 uni1D13              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d14 uni1D14              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1d15 uni1D15              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d16 uni1D16              2.3
+U+1d17 uni1D17              2.3
+U+1d18 uni1D18              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d19 uni1D19              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d1a uni1D1A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d1b uni1D1B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d1c uni1D1C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d1d uni1D1D              2.3
+U+1d1e uni1D1E              2.3
+U+1d1f uni1D1F              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+1d20 uni1D20              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d21 uni1D21              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d22 uni1D22              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d23 uni1D23              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d24 uni1D24              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d25 uni1D25              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d26 uni1D26              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d27 uni1D27              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d28 uni1D28              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d29 uni1D29              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d2a uni1D2A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d2b uni1D2B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d2c uni1D2C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d2d uni1D2D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d2e uni1D2E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d2f uni1D2F              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d30 uni1D30              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d31 uni1D31              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d32 uni1D32              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d33 uni1D33              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d34 uni1D34              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d35 uni1D35              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d36 uni1D36              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d37 uni1D37              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d38 uni1D38              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d39 uni1D39              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d3a uni1D3A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d3b uni1D3B              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d3c uni1D3C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d3d uni1D3D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d3e uni1D3E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d3f uni1D3F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d40 uni1D40              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d41 uni1D41              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d42 uni1D42              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d43 uni1D43              2.3
+U+1d44 uni1D44              2.3
+U+1d45 uni1D45              2.3
+U+1d46 uni1D46              2.3
+U+1d47 uni1D47              2.3
+U+1d48 uni1D48              2.3
+U+1d49 uni1D49              2.3
+U+1d4a uni1D4A              2.3
+U+1d4b uni1D4B              2.3
+U+1d4c uni1D4C              2.3
+U+1d4d uni1D4D              2.3
+U+1d4e uni1D4E              2.3
+U+1d4f uni1D4F              2.3
+U+1d50 uni1D50              2.3
+U+1d51 uni1D51              2.3
+U+1d52 uni1D52              2.3
+U+1d53 uni1D53              2.3
+U+1d54 uni1D54              2.3
+U+1d55 uni1D55              2.3
+U+1d56 uni1D56              2.3
+U+1d57 uni1D57              2.3
+U+1d58 uni1D58              2.3
+U+1d59 uni1D59              2.3
+U+1d5a uni1D5A              2.3
+U+1d5b uni1D5B              2.3
+U+1d5c uni1D5C              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d5d uni1D5D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d5e uni1D5E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d5f uni1D5F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d60 uni1D60              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d61 uni1D61              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d62 uni1D62              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d63 uni1D63              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d64 uni1D64              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d65 uni1D65              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d66 uni1D66              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d67 uni1D67              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d68 uni1D68              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d69 uni1D69              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d6a uni1D6A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d6b uni1D6B              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d77 uni1D77              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1d78 uni1D78              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d7b uni1D7B              2.3
+U+1d7d uni1D7D              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d85 uni1D85              2.3
+U+1d9b uni1D9B              2.3
+U+1d9c uni1D9C              2.3
+U+1d9d uni1D9D              2.3
+U+1d9e uni1D9E              2.3
+U+1d9f uni1D9F              2.3
+U+1da0 uni1DA0              2.3
+U+1da1 uni1DA1              2.3
+U+1da2 uni1DA2              2.3
+U+1da3 uni1DA3              2.3
+U+1da4 uni1DA4              2.3
+U+1da5 uni1DA5              2.3
+U+1da6 uni1DA6              2.3
+U+1da7 uni1DA7              2.3
+U+1da8 uni1DA8              2.3
+U+1da9 uni1DA9              2.3
+U+1daa uni1DAA              2.3
+U+1dab uni1DAB              2.3
+U+1dac uni1DAC              2.3
+U+1dad uni1DAD              2.3
+U+1dae uni1DAE              2.3
+U+1daf uni1DAF              2.3
+U+1db0 uni1DB0              2.3
+U+1db1 uni1DB1              2.3
+U+1db2 uni1DB2              2.3
+U+1db3 uni1DB3              2.3
+U+1db4 uni1DB4              2.3
+U+1db5 uni1DB5              2.3
+U+1db6 uni1DB6              2.3
+U+1db7 uni1DB7              2.3
+U+1db8 uni1DB8              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1db9 uni1DB9              2.3
+U+1dba uni1DBA              2.3
+U+1dbb uni1DBB              2.3
+U+1dbc uni1DBC              2.3
+U+1dbd uni1DBD              2.3
+U+1dbe uni1DBE              2.3
+U+1dbf uni1DBF              2.3
+U+1dc4 uni1DC4              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1dc5 uni1DC5              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1dc6 uni1DC6              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1dc7 uni1DC7              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1dc8 uni1DC8              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1dc9 uni1DC9              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1e00 uni1E00              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e01 uni1E01              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e02 uni1E02              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e03 uni1E03              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e04 uni1E04              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e05 uni1E05              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e06 uni1E06              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e07 uni1E07              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e08 uni1E08              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e09 uni1E09              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e0a uni1E0A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e0b uni1E0B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e0c uni1E0C              2.1
+U+1e0d uni1E0D              2.1
+U+1e0e uni1E0E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e0f uni1E0F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e10 uni1E10              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e11 uni1E11              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e12 uni1E12              1.13
+U+1e13 uni1E13              1.13
+U+1e14 uni1E14              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e15 uni1E15              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e16 uni1E16              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e17 uni1E17              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e18 uni1E18              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e19 uni1E19              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e1a uni1E1A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e1b uni1E1B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e1c uni1E1C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1e1d uni1E1D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1e1e uni1E1E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e1f uni1E1F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e20 uni1E20              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e21 uni1E21              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e22 uni1E22              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e23 uni1E23              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e24 uni1E24              2.1
+U+1e25 uni1E25              2.1
+U+1e26 uni1E26              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e27 uni1E27              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e28 uni1E28              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e29 uni1E29              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e2a uni1E2A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e2b uni1E2B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e2c uni1E2C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e2d uni1E2D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e2e uni1E2E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1e2f uni1E2F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1e30 uni1E30              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e31 uni1E31              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e32 uni1E32              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e33 uni1E33              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e34 uni1E34              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e35 uni1E35              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e36 uni1E36              2.1
+U+1e37 uni1E37              2.1
+U+1e38 uni1E38              2.1
+U+1e39 uni1E39              2.1
+U+1e3a uni1E3A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e3b uni1E3B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e3c uni1E3C              1.13
+U+1e3d uni1E3D              1.13
+U+1e3e uni1E3E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e3f uni1E3F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e40 uni1E40              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e41 uni1E41              2.1
+U+1e42 uni1E42              2.1
+U+1e43 uni1E43              2.1
+U+1e44 uni1E44              1.13
+U+1e45 uni1E45              1.13
+U+1e46 uni1E46              2.1
+U+1e47 uni1E47              2.1
+U+1e48 uni1E48              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e49 uni1E49              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e4a uni1E4A              1.13
+U+1e4b uni1E4B              1.13
+U+1e4c uni1E4C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1e4d uni1E4D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1e4e uni1E4E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1e4f uni1E4F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1e50 uni1E50              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e51 uni1E51              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e52 uni1E52              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e53 uni1E53              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e54 uni1E54              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e55 uni1E55              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e56 uni1E56              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e57 uni1E57              2.1
+U+1e58 uni1E58              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e59 uni1E59              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e5a uni1E5A              2.1
+U+1e5b uni1E5B              2.1
+U+1e5c uni1E5C              2.1
+U+1e5d uni1E5D              2.1
+U+1e5e uni1E5E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e5f uni1E5F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e60 uni1E60              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e61 uni1E61              2.1
+U+1e62 uni1E62              2.1
+U+1e63 uni1E63              2.1
+U+1e64 uni1E64              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1e65 uni1E65              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1e66 uni1E66              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1e67 uni1E67              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1e68 uni1E68              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e69 uni1E69              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e6a uni1E6A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e6b uni1E6B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e6c uni1E6C              2.1
+U+1e6d uni1E6D              2.1
+U+1e6e uni1E6E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e6f uni1E6F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e70 uni1E70              1.13
+U+1e71 uni1E71              1.13
+U+1e72 uni1E72              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e73 uni1E73              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e74 uni1E74              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e75 uni1E75              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e76 uni1E76              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e77 uni1E77              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e78 uni1E78              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e79 uni1E79              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e7a uni1E7A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e7b uni1E7B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e7c uni1E7C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e7d uni1E7D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e7e uni1E7E              2.1
+U+1e7f uni1E7F              2.1
+U+1e80 Wgrave               1.2
+U+1e81 wgrave               1.2
+U+1e82 Wacute               1.2
+U+1e83 wacute               1.2
+U+1e84 Wdieresis            1.2
+U+1e85 wdieresis            1.2
+U+1e86 uni1E86              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e87 uni1E87              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e88 uni1E88              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e89 uni1E89              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e8a uni1E8A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e8b uni1E8B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e8c uni1E8C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e8d uni1E8D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e8e uni1E8E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e8f uni1E8F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e90 uni1E90              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e91 uni1E91              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e92 uni1E92              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e93 uni1E93              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e94 uni1E94              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e95 uni1E95              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e96 uni1E96              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e97 uni1E97              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e98 uni1E98              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e99 uni1E99              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e9a uni1E9A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e9b uni1E9B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e9c uni1E9C              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1e9d uni1E9D              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1e9e uni1E9E              2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) 2.32 (Sans ExtraLight)
+U+1e9f uni1E9F              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1ea0 uni1EA0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ea1 uni1EA1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ea2 uni1EA2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ea3 uni1EA3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ea4 uni1EA4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ea5 uni1EA5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ea6 uni1EA6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ea7 uni1EA7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ea8 uni1EA8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ea9 uni1EA9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1eaa uni1EAA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1eab uni1EAB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1eac uni1EAC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1ead uni1EAD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1eae uni1EAE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1eaf uni1EAF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1eb0 uni1EB0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1eb1 uni1EB1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1eb2 uni1EB2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1eb3 uni1EB3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1eb4 uni1EB4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1eb5 uni1EB5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1eb6 uni1EB6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1eb7 uni1EB7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1eb8 uni1EB8              2.2
+U+1eb9 uni1EB9              2.2
+U+1eba uni1EBA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ebb uni1EBB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ebc uni1EBC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ebd uni1EBD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ebe uni1ebe              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ebf uni1ebF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ec0 uni1EC0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ec1 uni1EC1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ec2 uni1EC2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ec3 uni1EC3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ec4 uni1EC4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ec5 uni1EC5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ec6 uni1EC6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1ec7 uni1EC7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1ec8 uni1EC8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ec9 uni1EC9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1eca uni1ECA              2.2
+U+1ecb uni1ECB              2.2
+U+1ecc uni1ECC              2.2
+U+1ecd uni1ECD              2.2
+U+1ece uni1ECE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ecf uni1ECF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ed0 uni1ED0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ed1 uni1ED1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ed2 uni1ED2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ed3 uni1ED3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ed4 uni1ED4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ed5 uni1ED5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ed6 uni1ED6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ed7 uni1ED7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ed8 uni1ED8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1ed9 uni1ED9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1eda uni1EDA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1edb uni1EDB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1edc uni1EDC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1edd uni1EDD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ede uni1EDE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1edf uni1EDF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ee0 uni1EE0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ee1 uni1EE1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ee2 uni1EE2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ee3 uni1EE3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ee4 uni1EE4              2.2
+U+1ee5 uni1EE5              2.2
+U+1ee6 uni1EE6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ee7 uni1EE7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ee8 uni1EE8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ee9 uni1EE9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1eea uni1EEA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1eeb uni1EEB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1eec uni1EEC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1eed uni1EED              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1eee uni1EEE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1eef uni1EEF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ef0 uni1EF0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ef1 uni1EF1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ef2 Ygrave               1.2
+U+1ef3 ygrave               1.2
+U+1ef4 uni1EF4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ef5 uni1EF5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ef6 uni1EF6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ef7 uni1EF7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ef8 uni1EF8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ef9 uni1EF9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1efa uni1EFA              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1efb uni1EFB              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1f00 uni1F00              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f01 uni1F01              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f02 uni1F02              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f03 uni1F03              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f04 uni1F04              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f05 uni1F05              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f06 uni1F06              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f07 uni1F07              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f08 uni1F08              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f09 uni1F09              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f0a uni1F0A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f0b uni1F0B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f0c uni1F0C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f0d uni1F0D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f0e uni1F0E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f0f uni1F0F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f10 uni1F10              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f11 uni1F11              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f12 uni1F12              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f13 uni1F13              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f14 uni1F14              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f15 uni1F15              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f18 uni1F18              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f19 uni1F19              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f1a uni1F1A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f1b uni1F1B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f1c uni1F1C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f1d uni1F1D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f20 uni1F20              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f21 uni1F21              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f22 uni1F22              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f23 uni1F23              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f24 uni1F24              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f25 uni1F25              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f26 uni1F26              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f27 uni1F27              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f28 uni1F28              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f29 uni1F29              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f2a uni1F2A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f2b uni1F2B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f2c uni1F2C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f2d uni1F2D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f2e uni1F2E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f2f uni1F2F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f30 uni1F30              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f31 uni1F31              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f32 uni1F32              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f33 uni1F33              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f34 uni1F34              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f35 uni1F35              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f36 uni1F36              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f37 uni1F37              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f38 uni1F38              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f39 uni1F39              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f3a uni1F3A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f3b uni1F3B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f3c uni1F3C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f3d uni1F3D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f3e uni1F3E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f3f uni1F3F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f40 uni1F40              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f41 uni1F41              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f42 uni1F42              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f43 uni1F43              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f44 uni1F44              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f45 uni1F45              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f48 uni1F48              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f49 uni1F49              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f4a uni1F4A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f4b uni1F4B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f4c uni1F4C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f4d uni1F4D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f50 uni1F50              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f51 uni1F51              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f52 uni1F52              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f53 uni1F53              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f54 uni1F54              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f55 uni1F55              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f56 uni1F56              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f57 uni1F57              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f59 uni1F59              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f5b uni1F5B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f5d uni1F5D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f5f uni1F5F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f60 uni1F60              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f61 uni1F61              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f62 uni1F62              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f63 uni1F63              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f64 uni1F64              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f65 uni1F65              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f66 uni1F66              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f67 uni1F67              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f68 uni1F68              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f69 uni1F69              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f6a uni1F6A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f6b uni1F6B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f6c uni1F6C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f6d uni1F6D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f6e uni1F6E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f6f uni1F6F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f70 uni1F70              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1f71 uni1F71              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1f72 uni1F72              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1f73 uni1F73              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1f74 uni1F74              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1f75 uni1F75              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1f76 uni1F76              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f77 uni1F77              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f78 uni1F78              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1f79 uni1F79              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1f7a uni1F7A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f7b uni1F7B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f7c uni1F7C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f7d uni1F7D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f80 uni1F80              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f81 uni1F81              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f82 uni1F82              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f83 uni1F83              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f84 uni1F84              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f85 uni1F85              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f86 uni1F86              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f87 uni1F87              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f88 uni1F88              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f89 uni1F89              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f8a uni1F8A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f8b uni1F8B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f8c uni1F8C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f8d uni1F8D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f8e uni1F8E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f8f uni1F8F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f90 uni1F90              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f91 uni1F91              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f92 uni1F92              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f93 uni1F93              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f94 uni1F94              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f95 uni1F95              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f96 uni1F96              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f97 uni1F97              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f98 uni1F98              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f99 uni1F99              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f9a uni1F9A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f9b uni1F9B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f9c uni1F9C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f9d uni1F9D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f9e uni1F9E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f9f uni1F9F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fa0 uni1FA0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fa1 uni1FA1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fa2 uni1FA2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fa3 uni1FA3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fa4 uni1FA4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fa5 uni1FA5              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fa6 uni1FA6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fa7 uni1FA7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fa8 uni1FA8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fa9 uni1FA9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1faa uni1FAA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fab uni1FAB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fac uni1FAC              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fad uni1FAD              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fae uni1FAE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1faf uni1FAF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fb0 uni1FB0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fb1 uni1FB1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fb2 uni1FB2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fb3 uni1FB3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fb4 uni1FB4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fb6 uni1FB6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fb7 uni1FB7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fb8 uni1FB8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fb9 uni1FB9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fba uni1FBA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fbb uni1FBB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fbc uni1FBC              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fbd uni1FBD              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fbe uni1FBE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fbf uni1FBF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fc0 uni1FC0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fc1 uni1FC1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fc2 uni1FC2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fc3 uni1FC3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fc4 uni1FC4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fc6 uni1FC6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fc7 uni1FC7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fc8 uni1FC8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fc9 uni1FC9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fca uni1FCA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fcb uni1FCB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fcc uni1FCC              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fcd uni1FCD              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fce uni1FCE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fcf uni1FCF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fd0 uni1FD0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fd1 uni1FD1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fd2 uni1FD2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fd3 uni1FD3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fd6 uni1FD6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fd7 uni1FD7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fd8 uni1FD8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fd9 uni1FD9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fda uni1FDA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fdb uni1FDB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fdd uni1FDD              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fde uni1FDE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fdf uni1FDF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fe0 uni1FE0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fe1 uni1FE1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fe2 uni1FE2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fe3 uni1FE3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fe4 uni1FE4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fe5 uni1FE5              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fe6 uni1FE6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fe7 uni1FE7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fe8 uni1FE8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fe9 uni1FE9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fea uni1FEA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1feb uni1FEB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fec uni1FEC              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fed uni1FED              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fee uni1FEE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fef uni1FEF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ff2 uni1FF2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ff3 uni1FF3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ff4 uni1FF4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ff6 uni1FF6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ff7 uni1FF7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ff8 uni1FF8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ff9 uni1FF9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ffa uni1FFA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ffb uni1FFB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ffc uni1FFC              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ffd uni1FFD              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ffe uni1FFE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+2000 uni2000              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2001 uni2001              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2002 uni2002              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2003 uni2003              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2004 uni2004              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2005 uni2005              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2006 uni2006              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2007 uni2007              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2008 uni2008              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2009 uni2009              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+200a uni200A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+200b uni200B              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+200c uni200C              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+200d uni200D              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+200e uni200E              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+200f uni200F              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2010 uni2010              1.5
+U+2011 uni2011              1.5
+U+2012 figuredash           1.5
+U+2013 endash               original
+U+2014 emdash               original
+U+2015 uni2015              1.5
+U+2016 uni2016              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2017 underscoredbl        2.3
+U+2018 quoteleft            original
+U+2019 quoteright           original
+U+201a quotesinglbase       original
+U+201b quotereversed        2.3
+U+201c quotedblleft         original
+U+201d quotedblright        original
+U+201e quotedblbase         original
+U+201f uni201F              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+2020 dagger               original
+U+2021 daggerdbl            original
+U+2022 bullet               original
+U+2023 uni2023              2.2
+U+2024 onedotenleader       2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2025 twodotenleader       2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2026 ellipsis             original
+U+2027 uni2027              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2028 uni2028              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2029 uni2029              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+202a uni202A              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+202b uni202B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+202c uni202C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+202d uni202D              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+202e uni202E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+202f uni202F              2.11 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.23 (Serif Italic Condensed)
+U+2030 perthousand          original
+U+2031 uni2031              2.1
+U+2032 minute               2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+2033 second               2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+2034 uni2034              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+2035 uni2035              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+2036 uni2036              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+2037 uni2037              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+2038 uni2038              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2039 guilsinglleft        original
+U+203a guilsinglright       original
+U+203b uni203B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+203c exclamdbl            2.0
+U+203d uni203D              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.11 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.14 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+203e uni203E              2.3
+U+203f uni203F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2040 uni2040              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2041 uni2041              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2042 uni2042              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2043 uni2043              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2044 fraction             2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2045 uni2045              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2046 uni2046              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2047 uni2047              2.0
+U+2048 uni2048              2.0
+U+2049 uni2049              2.0
+U+204a uni204A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+204b uni204B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+204c uni204C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+204d uni204D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+204e uni204E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+204f uni204F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2050 uni2050              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2051 uni2051              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2052 uni2052              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2053 uni2053              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2054 uni2054              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2055 uni2055              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2056 uni2056              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2057 uni2057              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2058 uni2058              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2059 uni2059              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+205a uni205A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+205b uni205B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+205c uni205C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+205d uni205D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+205e uni205E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+205f uni205F              2.14
+U+2060 uni2060              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2061 uni2061              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2062 uni2062              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2063 uni2063              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2064 uni2064              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+206a uni206A              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+206b uni206B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+206c uni206C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+206d uni206D              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+206e uni206E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+206f uni206F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2070 uni2070              2.2
+U+2071 uni2071              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2074 uni2074              2.2
+U+2075 uni2075              2.2
+U+2076 uni2076              2.2
+U+2077 uni2077              2.2
+U+2078 uni2078              2.2
+U+2079 uni2079              2.2
+U+207a uni207A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+207b uni207B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+207c uni207C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+207d uni207D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+207e uni207E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+207f uni207F              1.14
+U+2080 uni2080              2.4
+U+2081 uni2081              2.4
+U+2082 uni2082              2.4
+U+2083 uni2083              2.4
+U+2084 uni2084              2.4
+U+2085 uni2085              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2086 uni2086              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2087 uni2087              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2088 uni2088              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2089 uni2089              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+208a uni208A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+208b uni208B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+208c uni208C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+208d uni208D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+208e uni208E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2090 uni2090              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2091 uni2091              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2092 uni2092              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2093 uni2093              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2094 uni2094              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2095 uni2095              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2096 uni2096              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2097 uni2097              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2098 uni2098              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2099 uni2099              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+209a uni209A              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+209b uni209B              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+209c uni209C              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+20a0 uni20A0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20a1 colonmonetary        2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20a2 uni20A2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20a3 franc                2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20a4 lira                 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20a5 uni20A5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20a6 uni20A6              2.3
+U+20a7 peseta               2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20a8 uni20A8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20a9 uni20A9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20aa uni20AA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20ab dong                 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20ac Euro                 original
+U+20ad uni20AD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20ae uni20AE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20af uni20AF              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20b0 uni20B0              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20b1 uni20B1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+20b2 uni20B2              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20b3 uni20B3              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20b4 uni20B4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+20b5 uni20B5              2.2
+U+20b8 uni20B8              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+20b9 uni20B9              2.32
+U+20d0 uni20D0              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+20d1 uni20D1              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+20d6 uni20D6              2.8 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+20d7 uni20D7              2.8 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+20db uni20DB              2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+20dc uni20DC              2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+20e1 uni20E1              2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2100 uni2100              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2101 uni2101              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2102 uni2102              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.16 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Condensed)
+U+2103 uni2103              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2104 uni2104              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2105 uni2105              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2106 uni2106              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2107 uni2107              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2108 uni2108              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2109 uni2109              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+210b uni210B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+210c uni210C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+210d uni210D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+210e uni210E              2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+210f uni210F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.28 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2110 uni2110              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2111 Ifraktur             2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2112 uni2112              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2113 uni2113              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2114 uni2114              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2115 uni2115              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2116 uni2116              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2117 uni2117              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2118 weierstrass          2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2119 uni2119              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+211a uni211A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+211b uni211B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+211c Rfraktur             2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+211d uni211D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+211e prescription         2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+211f uni211F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2120 uni2120              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2121 uni2121              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2122 trademark            original
+U+2123 uni2123              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2124 uni2124              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2125 uni2125              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2126 uni2126              2.2
+U+2127 uni2127              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2128 uni2128              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2129 uni2129              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+212a uni212A              2.2
+U+212b uni212B              2.2
+U+212c uni212C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+212d uni212D              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+212e estimated            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+212f uni212F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2130 uni2130              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2131 uni2131              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2132 uni2132              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
+U+2133 uni2133              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2134 uni2134              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2135 aleph                2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2136 uni2136              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2137 uni2137              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2138 uni2138              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2139 uni2139              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+213a uni213A              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+213b uni213B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+213c uni213C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
+U+213d uni213D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
+U+213e uni213E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
+U+213f uni213F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
+U+2140 uni2140              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
+U+2141 uni2141              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2142 uni2142              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2143 uni2143              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2144 uni2144              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2145 uni2145              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
+U+2146 uni2146              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
+U+2147 uni2147              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
+U+2148 uni2148              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
+U+2149 uni2149              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
+U+214b uni214B              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+214e uni214E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2150 uni2150              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2151 uni2151              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2152 uni2152              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2153 onethird             2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2154 twothirds            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2155 uni2155              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2156 uni2156              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2157 uni2157              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2158 uni2158              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2159 uni2159              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+215a uni215A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+215b oneeighth            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+215c threeeighths         2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+215d fiveeighths          2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+215e seveneighths         2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+215f uni215F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2160 uni2160              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2161 uni2161              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2162 uni2162              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2163 uni2163              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2164 uni2164              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2165 uni2165              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2166 uni2166              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2167 uni2167              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2168 uni2168              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2169 uni2169              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+216a uni216A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+216b uni216B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+216c uni216C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+216d uni216D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+216e uni216E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+216f uni216F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2170 uni2170              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2171 uni2171              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2172 uni2172              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2173 uni2173              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2174 uni2174              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2175 uni2175              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2176 uni2176              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2177 uni2177              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2178 uni2178              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2179 uni2179              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+217a uni217A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+217b uni217B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+217c uni217C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+217d uni217D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+217e uni217E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+217f uni217F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2180 uni2180              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2181 uni2181              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+2182 uni2182              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+2183 uni2183              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2184 uni2184              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2185 uni2185              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2189 uni2189              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2190 arrowleft            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2191 arrowup              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2192 arrowright           2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2193 arrowdown            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2194 arrowboth            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2195 arrowupdn            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2196 uni2196              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2197 uni2197              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2198 uni2198              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2199 uni2199              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+219a uni219A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+219b uni219B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+219c uni219C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+219d uni219D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+219e uni219E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+219f uni219F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21a0 uni21A0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21a1 uni21A1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21a2 uni21A2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21a3 uni21A3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21a4 uni21A4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21a5 uni21A5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21a6 uni21A6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21a7 uni21A7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21a8 arrowupdnbse         2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21a9 uni21A9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21aa uni21AA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ab uni21AB              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ac uni21AC              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ad uni21AD              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ae uni21AE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21af uni21AF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21b0 uni21B0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21b1 uni21B1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21b2 uni21B2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21b3 uni21B3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21b4 uni21B4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21b5 carriagereturn       2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21b6 uni21B6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21b7 uni21B7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21b8 uni21B8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21b9 uni21B9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ba uni21BA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21bb uni21BB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21bc uni21BC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21bd uni21BD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21be uni21BE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21bf uni21BF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21c0 uni21C0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21c1 uni21C1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21c2 uni21C2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21c3 uni21C3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21c4 uni21C4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21c5 uni21C5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21c6 uni21C6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21c7 uni21C7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21c8 uni21C8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21c9 uni21C9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ca uni21CA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21cb uni21CB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21cc uni21CC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21cd uni21CD              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ce uni21CE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21cf uni21CF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21d0 arrowdblleft         2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21d1 arrowdblup           2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21d2 arrowdblright        2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21d3 arrowdbldown         2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21d4 arrowdblboth         2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21d5 uni21D5              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21d6 uni21D6              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21d7 uni21D7              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21d8 uni21D8              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21d9 uni21D9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21da uni21DA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21db uni21DB              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21dc uni21DC              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21dd uni21DD              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21de uni21DE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21df uni21DF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21e0 uni21E0              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21e1 uni21E1              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21e2 uni21E2              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21e3 uni21E3              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21e4 uni21E4              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21e5 uni21E5              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21e6 uni21E6              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21e7 uni21E7              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21e8 uni21E8              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21e9 uni21E9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ea uni21EA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21eb uni21EB              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ec uni21EC              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ed uni21ED              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ee uni21EE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ef uni21EF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21f0 uni21F0              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21f1 uni21F1              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21f2 uni21F2              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21f3 uni21F3              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21f4 uni21F4              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21f5 uni21F5              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21f6 uni21F6              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21f7 uni21F7              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21f8 uni21F8              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21f9 uni21F9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21fa uni21FA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21fb uni21FB              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21fc uni21FC              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21fd uni21FD              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21fe uni21FE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ff uni21FF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2200 universal            2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2201 uni2201              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2202 partialdiff          original
+U+2203 existential          2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2204 uni2204              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2205 emptyset             2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2206 Delta                original
+U+2207 gradient             2.1
+U+2208 element              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2209 notelement           2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+220a uni220A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+220b suchthat             2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+220c uni220C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+220d uni220D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+220e uni220E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+220f product              original
+U+2210 uni2210              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2211 summation            original
+U+2212 minus                original
+U+2213 uni2213              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2214 uni2214              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2215 uni2215              original
+U+2216 uni2216              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2217 asteriskmath         2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2218 uni2218              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2219 uni2219              original
+U+221a radical              original
+U+221b uni221B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+221c uni221C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+221d proportional         2.1
+U+221e infinity             original
+U+221f orthogonal           2.1
+U+2220 angle                2.3
+U+2221 uni2221              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2222 uni2222              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2223 uni2223              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2224 uni2224              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2225 uni2225              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2226 uni2226              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2227 logicaland           2.1
+U+2228 logicalor            2.1
+U+2229 intersection         2.1
+U+222a union                2.1
+U+222b integral             original
+U+222c uni222C              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+222d uni222D              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+222e uni222E              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+222f uni222F              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2230 uni2230              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2231 uni2231              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2232 uni2232              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2233 uni2233              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2234 therefore            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2235 uni2235              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2236 uni2236              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2237 uni2237              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2238 uni2238              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2239 uni2239              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+223a uni223A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+223b uni223B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+223c similar              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+223d uni223D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+223e uni223E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+223f uni223F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2240 uni2240              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2241 uni2241              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2242 uni2242              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2243 uni2243              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2244 uni2244              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2245 congruent            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2246 uni2246              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2247 uni2247              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2248 approxequal          original
+U+2249 uni2249              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+224a uni224A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+224b uni224B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+224c uni224C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+224d uni224D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+224e uni224E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+224f uni224F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2250 uni2250              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2251 uni2251              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2252 uni2252              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2253 uni2253              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2254 uni2254              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2255 uni2255              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2256 uni2256              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2257 uni2257              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2258 uni2258              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2259 uni2259              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+225a uni225A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+225b uni225B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+225c uni225C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+225d uni225D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+225e uni225E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+225f uni225F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2260 notequal             original
+U+2261 equivalence          2.1
+U+2262 uni2262              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2263 uni2263              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2264 lessequal            original
+U+2265 greaterequal         original
+U+2266 uni2266              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2267 uni2267              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2268 uni2268              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2269 uni2269              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+226a uni226A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+226b uni226B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+226c uni226C              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+226d uni226D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+226e uni226E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+226f uni226F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2270 uni2270              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2271 uni2271              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2272 uni2272              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2273 uni2273              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2274 uni2274              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2275 uni2275              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2276 uni2276              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2277 uni2277              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2278 uni2278              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2279 uni2279              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+227a uni227A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+227b uni227B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+227c uni227C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+227d uni227D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+227e uni227E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+227f uni227F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2280 uni2280              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2281 uni2281              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2282 propersubset         2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2283 propersuperset       2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2284 notsubset            2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2285 uni2285              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2286 reflexsubset         2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2287 reflexsuperset       2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2288 uni2288              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2289 uni2289              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+228a uni228A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+228b uni228B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+228c uni228C              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+228d uni228D              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+228e uni228E              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+228f uni228F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2290 uni2290              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2291 uni2291              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2292 uni2292              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2293 uni2293              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2294 uni2294              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2295 circleplus           2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2296 uni2296              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2297 circlemultiply       2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2298 uni2298              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2299 uni2299              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+229a uni229A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+229b uni229B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+229c uni229C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+229d uni229D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+229e uni229E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+229f uni229F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22a0 uni22A0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22a1 uni22A1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22a2 uni22A2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+22a3 uni22A3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+22a4 uni22A4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+22a5 perpendicular        2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+22a6 uni22A6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22a7 uni22A7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22a8 uni22A8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22a9 uni22A9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22aa uni22AA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22ab uni22AB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22ac uni22AC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22ad uni22AD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22ae uni22AE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22af uni22AF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22b0 uni22B0              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22b1 uni22B1              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22b2 uni22B2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22b3 uni22B3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22b4 uni22B4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22b5 uni22B5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22b6 uni22B6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22b7 uni22B7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22b8 uni22B8              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22b9 uni22B9              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22ba uni22BA              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22bb uni22BB              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22bc uni22BC              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22bd uni22BD              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22be uni22BE              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+22bf uni22BF              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+22c0 uni22C0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22c1 uni22C1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22c2 uni22C2              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22c3 uni22C3              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22c4 uni22C4              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22c5 dotmath              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22c6 uni22C6              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+22c7 uni22C7              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22c8 uni22C8              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22c9 uni22C9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22ca uni22CA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22cb uni22CB              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22cc uni22CC              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22cd uni22CD              2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+22ce uni22CE              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22cf uni22CF              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22d0 uni22D0              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22d1 uni22D1              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22d2 uni22D2              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22d3 uni22D3              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22d4 uni22D4              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22d5 uni22D5              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22d6 uni22D6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22d7 uni22D7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22d8 uni22D8              2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+22d9 uni22D9              2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+22da uni22DA              2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+22db uni22DB              2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+22dc uni22DC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22dd uni22DD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22de uni22DE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22df uni22DF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22e0 uni22E0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22e1 uni22E1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22e2 uni22E2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22e3 uni22E3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22e4 uni22E4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22e5 uni22E5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22e6 uni22E6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22e7 uni22E7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22e8 uni22E8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22e9 uni22E9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22ea uni22EA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22eb uni22EB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22ec uni22EC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22ed uni22ED              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22ee uni22EE              2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22ef uni22EF              2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22f0 uni22F0              2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22f1 uni22F1              2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22f2 uni22F2              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22f3 uni22F3              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22f4 uni22F4              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22f5 uni22F5              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22f6 uni22F6              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22f7 uni22F7              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22f8 uni22F8              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22f9 uni22F9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22fa uni22FA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22fb uni22FB              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22fc uni22FC              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22fd uni22FD              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22fe uni22FE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22ff uni22FF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2300 uni2300              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2301 uni2301              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2302 house                1.14
+U+2303 uni2303              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2304 uni2304              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2305 uni2305              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2306 uni2306              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2307 uni2307              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2308 uni2308              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2309 uni2309              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+230a uni230A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+230b uni230B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+230c uni230C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+230d uni230D              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+230e uni230E              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+230f uni230F              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2310 revlogicalnot        1.14
+U+2311 uni2311              1.15
+U+2312 uni2312              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2313 uni2313              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2314 uni2314              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2315 uni2315              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2318 uni2318              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2319 uni2319              1.14
+U+231c uni231C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+231d uni231D              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+231e uni231E              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+231f uni231F              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2320 integraltp           2.3
+U+2321 integralbt           2.3
+U+2324 uni2324              2.16 (Sans, Sans Bold, Sans Bold Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) 2.19 (Sans Condensed Oblique, Sans Oblique)
+U+2325 uni2325              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2326 uni2326              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2327 uni2327              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2328 uni2328              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2329 angleleft            2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic)
+U+232a angleright           2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic)
+U+232b uni232B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+232c uni232C              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2335 uni2335              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2337 uni2337              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2338 uni2338              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2339 uni2339              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+233a uni233A              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+233b uni233B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+233c uni233C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+233d uni233D              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+233e uni233E              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2341 uni2341              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2342 uni2342              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2343 uni2343              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2344 uni2344              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2347 uni2347              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2348 uni2348              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2349 uni2349              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+234b uni234B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+234c uni234C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+234d uni234D              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2350 uni2350              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2352 uni2352              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2353 uni2353              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2354 uni2354              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2357 uni2357              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2358 uni2358              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2359 uni2359              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+235a uni235A              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+235b uni235B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+235c uni235C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+235e uni235E              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+235f uni235F              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2360 uni2360              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2363 uni2363              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2364 uni2364              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2365 uni2365              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2368 uni2368              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2369 uni2369              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+236b uni236B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+236c uni236C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+236d uni236D              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+236e uni236E              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+236f uni236F              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2370 uni2370              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2373 uni2373              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2374 uni2374              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2375 uni2375              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2376 uni2376              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2377 uni2377              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2378 uni2378              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2379 uni2379              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+237a uni237A              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+237d uni237D              1.15
+U+2380 uni2380              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2381 uni2381              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2382 uni2382              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2383 uni2383              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2387 uni2387              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2388 uni2388              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2389 uni2389              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+238a uni238A              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+238b uni238B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2394 uni2394              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2395 uni2395              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+239b uni239B              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+239c uni239C              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+239d uni239D              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+239e uni239E              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+239f uni239F              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23a0 uni23A0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23a1 uni23A1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23a2 uni23A2              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23a3 uni23A3              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23a4 uni23A4              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23a5 uni23A5              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23a6 uni23A6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23a7 uni23A7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23a8 uni23A8              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23a9 uni23A9              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23aa uni23AA              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23ab uni23AB              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23ac uni23AC              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23ad uni23AD              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23ae uni23AE              2.3
+U+23ce uni23CE              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+23cf uni23CF              2.3
+U+23e3 uni23E3              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+23e5 uni23E5              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+23e8 uni23E8              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2422 uni2422              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2423 uni2423              1.6
+U+2460 uni2460              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2461 uni2461              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2462 uni2462              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2463 uni2463              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2464 uni2464              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2465 uni2465              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2466 uni2466              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2467 uni2467              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2468 uni2468              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2469 uni2469              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2500 SF100000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2501 uni2501              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2502 SF110000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2503 uni2503              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2504 uni2504              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2505 uni2505              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2506 uni2506              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2507 uni2507              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2508 uni2508              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2509 uni2509              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+250a uni250A              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+250b uni250B              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+250c SF010000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+250d uni250D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+250e uni250E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+250f uni250F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2510 SF030000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2511 uni2511              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2512 uni2512              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2513 uni2513              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2514 SF020000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2515 uni2515              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2516 uni2516              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2517 uni2517              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2518 SF040000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2519 uni2519              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+251a uni251A              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+251b uni251B              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+251c SF080000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+251d uni251D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+251e uni251E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+251f uni251F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2520 uni2520              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2521 uni2521              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2522 uni2522              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2523 uni2523              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2524 SF090000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2525 uni2525              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2526 uni2526              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2527 uni2527              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2528 uni2528              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2529 uni2529              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+252a uni252A              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+252b uni252B              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+252c SF060000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+252d uni252D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+252e uni252E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+252f uni252F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2530 uni2530              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2531 uni2531              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2532 uni2532              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2533 uni2533              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2534 SF070000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2535 uni2535              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2536 uni2536              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2537 uni2537              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2538 uni2538              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2539 uni2539              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+253a uni253A              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+253b uni253B              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+253c SF050000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+253d uni253D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+253e uni253E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+253f uni253F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2540 uni2540              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2541 uni2541              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2542 uni2542              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2543 uni2543              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2544 uni2544              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2545 uni2545              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2546 uni2546              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2547 uni2547              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2548 uni2548              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2549 uni2549              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+254a uni254A              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+254b uni254B              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+254c uni254C              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+254d uni254D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+254e uni254E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+254f uni254F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2550 SF430000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2551 SF240000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2552 SF510000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2553 SF520000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2554 SF390000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2555 SF220000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2556 SF210000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2557 SF250000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2558 SF500000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2559 SF490000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+255a SF380000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+255b SF280000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+255c SF270000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+255d SF260000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+255e SF360000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+255f SF370000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2560 SF420000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2561 SF190000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2562 SF200000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2563 SF230000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2564 SF470000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2565 SF480000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2566 SF410000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2567 SF450000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2568 SF460000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2569 SF400000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+256a SF540000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+256b SF530000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+256c SF440000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+256d uni256D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+256e uni256E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+256f uni256F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2570 uni2570              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2571 uni2571              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2572 uni2572              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2573 uni2573              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2574 uni2574              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2575 uni2575              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2576 uni2576              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2577 uni2577              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2578 uni2578              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2579 uni2579              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+257a uni257A              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+257b uni257B              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+257c uni257C              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+257d uni257D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+257e uni257E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+257f uni257F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2580 upblock              1.14
+U+2581 uni2581              1.14
+U+2582 uni2582              1.14
+U+2583 uni2583              1.14
+U+2584 dnblock              1.14
+U+2585 uni2585              1.14
+U+2586 uni2586              1.14
+U+2587 uni2587              1.14
+U+2588 block                1.14
+U+2589 uni2589              1.14
+U+258a uni258A              1.14
+U+258b uni258B              1.14
+U+258c lfblock              1.14
+U+258d uni258D              1.14
+U+258e uni258E              1.14
+U+258f uni258F              1.14
+U+2590 rtblock              1.14
+U+2591 ltshade              1.15
+U+2592 shade                1.15
+U+2593 dkshade              1.15
+U+2594 uni2594              1.14
+U+2595 uni2595              1.14
+U+2596 uni2596              1.14
+U+2597 uni2597              1.14
+U+2598 uni2598              1.14
+U+2599 uni2599              1.14
+U+259a uni259A              1.14
+U+259b uni259B              1.14
+U+259c uni259C              1.14
+U+259d uni259D              1.14
+U+259e uni259E              1.14
+U+259f uni259F              1.14
+U+25a0 filledbox            2.3
+U+25a1 H22073               2.3
+U+25a2 uni25A2              2.3
+U+25a3 uni25A3              2.3
+U+25a4 uni25A4              2.3
+U+25a5 uni25A5              2.3
+U+25a6 uni25A6              2.3
+U+25a7 uni25A7              2.3
+U+25a8 uni25A8              2.3
+U+25a9 uni25A9              2.3
+U+25aa H18543               2.3
+U+25ab H18551               2.3
+U+25ac filledrect           2.3
+U+25ad uni25AD              2.3
+U+25ae uni25AE              2.3
+U+25af uni25AF              2.3
+U+25b0 uni25B0              2.3
+U+25b1 uni25B1              2.3
+U+25b2 triagup              2.3
+U+25b3 uni25B3              2.3
+U+25b4 uni25B4              2.3
+U+25b5 uni25B5              2.3
+U+25b6 uni25B6              2.3
+U+25b7 uni25B7              2.3
+U+25b8 uni25B8              2.3
+U+25b9 uni25B9              2.3
+U+25ba triagrt              2.3
+U+25bb uni25BB              2.3
+U+25bc triagdn              2.3
+U+25bd uni25BD              2.3
+U+25be uni25BE              2.3
+U+25bf uni25BF              2.3
+U+25c0 uni25C0              2.3
+U+25c1 uni25C1              2.3
+U+25c2 uni25C2              2.3
+U+25c3 uni25C3              2.3
+U+25c4 triaglf              2.3
+U+25c5 uni25C5              2.3
+U+25c6 uni25C6              2.3
+U+25c7 uni25C7              2.3
+U+25c8 uni25C8              2.3
+U+25c9 uni25C9              2.3
+U+25ca lozenge              original
+U+25cb circle               2.3
+U+25cc uni25CC              2.3
+U+25cd uni25CD              2.3
+U+25ce uni25CE              2.3
+U+25cf H18533               2.3
+U+25d0 uni25D0              2.3
+U+25d1 uni25D1              2.3
+U+25d2 uni25D2              2.3
+U+25d3 uni25D3              2.3
+U+25d4 uni25D4              2.3
+U+25d5 uni25D5              2.3
+U+25d6 uni25D6              2.3
+U+25d7 uni25D7              2.3
+U+25d8 invbullet            2.2
+U+25d9 invcircle            2.3
+U+25da uni25DA              2.3
+U+25db uni25DB              2.3
+U+25dc uni25DC              2.3
+U+25dd uni25DD              2.3
+U+25de uni25DE              2.3
+U+25df uni25DF              2.3
+U+25e0 uni25E0              2.3
+U+25e1 uni25E1              2.3
+U+25e2 uni25E2              2.3
+U+25e3 uni25E3              2.3
+U+25e4 uni25E4              2.3
+U+25e5 uni25E5              2.3
+U+25e6 openbullet           2.2
+U+25e7 uni25E7              2.3
+U+25e8 uni25E8              2.3
+U+25e9 uni25E9              2.3
+U+25ea uni25EA              2.3
+U+25eb uni25EB              2.3
+U+25ec uni25EC              2.3
+U+25ed uni25ED              2.3
+U+25ee uni25EE              2.3
+U+25ef uni25EF              2.3
+U+25f0 uni25F0              2.3
+U+25f1 uni25F1              2.3
+U+25f2 uni25F2              2.3
+U+25f3 uni25F3              2.3
+U+25f4 uni25F4              2.3
+U+25f5 uni25F5              2.3
+U+25f6 uni25F6              2.3
+U+25f7 uni25F7              2.3
+U+25f8 uni25F8              2.3
+U+25f9 uni25F9              2.3
+U+25fa uni25FA              2.3
+U+25fb uni25FB              2.3
+U+25fc uni25FC              2.3
+U+25fd uni25FD              2.3
+U+25fe uni25FE              2.3
+U+25ff uni25FF              2.3
+U+2600 uni2600              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2601 uni2601              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2602 uni2602              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2603 uni2603              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2604 uni2604              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2605 uni2605              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2606 uni2606              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2607 uni2607              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2608 uni2608              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2609 uni2609              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+260a uni260A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+260b uni260B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+260c uni260C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+260d uni260D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+260e uni260E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+260f uni260F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2610 uni2610              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2611 uni2611              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2612 uni2612              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2613 uni2613              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2614 uni2614              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2615 uni2615              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2616 uni2616              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2617 uni2617              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2618 uni2618              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2619 uni2619              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+261a uni261A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+261b uni261B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+261c uni261C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+261d uni261D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+261e uni261E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+261f uni261F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2620 uni2620              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2621 uni2621              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2622 uni2622              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2623 uni2623              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2624 uni2624              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2625 uni2625              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2626 uni2626              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2627 uni2627              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2628 uni2628              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2629 uni2629              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+262a uni262A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+262b uni262B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+262c uni262C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+262d uni262D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+262e uni262E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+262f uni262F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2630 uni2630              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2631 uni2631              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2632 uni2632              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2633 uni2633              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2634 uni2634              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2635 uni2635              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2636 uni2636              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2637 uni2637              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2638 uni2638              1.15
+U+2639 uni2639              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+263a smileface            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+263b invsmileface         2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+263c sun                  2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+263d uni263D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+263e uni263E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+263f uni263F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2640 female               2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2641 uni2641              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2642 male                 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2643 uni2643              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2644 uni2644              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2645 uni2645              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2646 uni2646              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2647 uni2647              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2648 uni2648              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2649 uni2649              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+264a uni264A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+264b uni264B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+264c uni264C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+264d uni264D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+264e uni264E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+264f uni264F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2650 uni2650              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2651 uni2651              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2652 uni2652              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2653 uni2653              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2654 uni2654              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2655 uni2655              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2656 uni2656              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2657 uni2657              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2658 uni2658              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2659 uni2659              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+265a uni265A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+265b uni265B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+265c uni265C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+265d uni265D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+265e uni265E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+265f uni265F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2660 spade                2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2661 uni2661              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2662 uni2662              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2663 club                 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2664 uni2664              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2665 heart                2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2666 diamond              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2667 uni2667              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2668 uni2668              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2669 uni2669              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+266a musicalnote          2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+266b musicalnotedbl       2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+266c uni266C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+266d uni266D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+266e uni266E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+266f uni266F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2670 uni2670              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2671 uni2671              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2672 uni2672              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2673 uni2673              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2674 uni2674              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2675 uni2675              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2676 uni2676              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2677 uni2677              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2678 uni2678              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2679 uni2679              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+267a uni267A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+267b uni267B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+267c uni267C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+267d uni267D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+267e uni267E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+267f uni267F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2680 uni2680              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold)
+U+2681 uni2681              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold)
+U+2682 uni2682              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold)
+U+2683 uni2683              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold)
+U+2684 uni2684              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold)
+U+2685 uni2685              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold)
+U+2686 uni2686              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2687 uni2687              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2688 uni2688              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2689 uni2689              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+268a uni268A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+268b uni268B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+268c uni268C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+268d uni268D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+268e uni268E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+268f uni268F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2690 uni2690              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2691 uni2691              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2692 uni2692              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2693 uni2693              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2694 uni2694              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2695 uni2695              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2696 uni2696              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2697 uni2697              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2698 uni2698              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2699 uni2699              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+269a uni269A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+269b uni269B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+269c uni269C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+26a0 uni26A0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+26a1 uni26A1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+26a2 uni26A2              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26a3 uni26A3              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26a4 uni26A4              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26a5 uni26A5              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26a6 uni26A6              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26a7 uni26A7              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26a8 uni26A8              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26a9 uni26A9              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26aa uni26AA              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26ab uni26AB              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26ac uni26AC              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26ad uni26AD              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26ae uni26AE              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26af uni26AF              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26b0 uni26B0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+26b1 uni26B1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+26b2 uni26B2              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26b3 uni26B3              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26b4 uni26B4              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26b5 uni26B5              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26b6 uni26B6              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26b7 uni26B7              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26b8 uni26B8              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26c0 uni26C0              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26c1 uni26C1              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26c2 uni26C2              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26c3 uni26C3              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26e2 uni26E2              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2701 uni2701              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2702 uni2702              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2703 uni2703              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2704 uni2704              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2706 uni2706              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2707 uni2707              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2708 uni2708              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2709 uni2709              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+270c uni270C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+270d uni270D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+270e uni270E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+270f uni270F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2710 uni2710              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2711 uni2711              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2712 uni2712              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2713 uni2713              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2714 uni2714              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2715 uni2715              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2716 uni2716              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2717 uni2717              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2718 uni2718              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2719 uni2719              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+271a uni271A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+271b uni271B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+271c uni271C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+271d uni271D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+271e uni271E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+271f uni271F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2720 uni2720              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2721 uni2721              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2722 uni2722              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2723 uni2723              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2724 uni2724              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2725 uni2725              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2726 uni2726              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2727 uni2727              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2729 uni2729              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+272a uni272A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+272b uni272B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+272c uni272C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+272d uni272D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+272e uni272E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+272f uni272F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2730 uni2730              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2731 uni2731              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2732 uni2732              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2733 uni2733              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2734 uni2734              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2735 uni2735              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2736 uni2736              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2737 uni2737              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2738 uni2738              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2739 uni2739              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+273a uni273A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+273b uni273B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+273c uni273C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+273d uni273D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+273e uni273E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+273f uni273F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2740 uni2740              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2741 uni2741              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2742 uni2742              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2743 uni2743              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2744 uni2744              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2745 uni2745              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2746 uni2746              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2747 uni2747              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2748 uni2748              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2749 uni2749              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+274a uni274A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+274b uni274B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+274d uni274D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+274f uni274F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2750 uni2750              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2751 uni2751              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2752 uni2752              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2756 uni2756              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2758 uni2758              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2759 uni2759              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+275a uni275A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+275b uni275B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+275c uni275C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+275d uni275D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+275e uni275E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2761 uni2761              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2762 uni2762              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2763 uni2763              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2764 uni2764              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2765 uni2765              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2766 uni2766              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2767 uni2767              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2768 uni2768              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2769 uni2769              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+276a uni276A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+276b uni276B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+276c uni276C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+276d uni276D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+276e uni276E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+276f uni276F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2770 uni2770              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2771 uni2771              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2772 uni2772              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2773 uni2773              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2774 uni2774              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2775 uni2775              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2776 uni2776              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2777 uni2777              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2778 uni2778              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2779 uni2779              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+277a uni277A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+277b uni277B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+277c uni277C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+277d uni277D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+277e uni277E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+277f uni277F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2780 uni2780              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2781 uni2781              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2782 uni2782              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2783 uni2783              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2784 uni2784              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2785 uni2785              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2786 uni2786              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2787 uni2787              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2788 uni2788              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2789 uni2789              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+278a uni278A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+278b uni278B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+278c uni278C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+278d uni278D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+278e uni278E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+278f uni278F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2790 uni2790              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2791 uni2791              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2792 uni2792              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2793 uni2793              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2794 uni2794              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2798 uni2798              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2799 uni2799              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+279a uni279A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+279b uni279B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+279c uni279C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+279d uni279D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+279e uni279E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+279f uni279F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27a0 uni27A0              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27a1 uni27A1              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27a2 uni27A2              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27a3 uni27A3              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27a4 uni27A4              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27a5 uni27A5              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27a6 uni27A6              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27a7 uni27A7              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27a8 uni27A8              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27a9 uni27A9              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27aa uni27AA              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27ab uni27AB              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27ac uni27AC              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27ad uni27AD              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27ae uni27AE              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27af uni27AF              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27b1 uni27B1              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27b2 uni27B2              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27b3 uni27B3              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27b4 uni27B4              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27b5 uni27B5              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27b6 uni27B6              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27b7 uni27B7              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27b8 uni27B8              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27b9 uni27B9              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27ba uni27BA              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27bb uni27BB              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27bc uni27BC              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27bd uni27BD              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27be uni27BE              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27bf uni27BF              2.7 (Sans Mono Bold)
+U+27c5 uni27C5              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+27c6 uni27C6              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+27e0 uni27E0              2.3
+U+27e6 uni27E6              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+27e7 uni27E7              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+27e8 uni27E8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27e9 uni27E9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27ea uni27EA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+27eb uni27EB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+27f0 uni27F0              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27f1 uni27F1              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27f2 uni27F2              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27f3 uni27F3              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27f4 uni27F4              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27f5 uni27F5              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27f6 uni27F6              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27f7 uni27F7              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27f8 uni27F8              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27f9 uni27F9              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27fa uni27FA              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27fb uni27FB              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27fc uni27FC              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27fd uni27FD              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27fe uni27FE              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27ff uni27FF              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2800 uni2800              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2801 uni2801              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2802 uni2802              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2803 uni2803              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2804 uni2804              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2805 uni2805              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2806 uni2806              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2807 uni2807              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2808 uni2808              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2809 uni2809              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+280a uni280A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+280b uni280B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+280c uni280C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+280d uni280D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+280e uni280E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+280f uni280F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2810 uni2810              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2811 uni2811              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2812 uni2812              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2813 uni2813              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2814 uni2814              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2815 uni2815              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2816 uni2816              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2817 uni2817              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2818 uni2818              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2819 uni2819              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+281a uni281A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+281b uni281B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+281c uni281C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+281d uni281D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+281e uni281E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+281f uni281F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2820 uni2820              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2821 uni2821              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2822 uni2822              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2823 uni2823              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2824 uni2824              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2825 uni2825              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2826 uni2826              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2827 uni2827              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2828 uni2828              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2829 uni2829              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+282a uni282A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+282b uni282B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+282c uni282C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+282d uni282D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+282e uni282E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+282f uni282F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2830 uni2830              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2831 uni2831              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2832 uni2832              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2833 uni2833              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2834 uni2834              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2835 uni2835              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2836 uni2836              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2837 uni2837              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2838 uni2838              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2839 uni2839              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+283a uni283A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+283b uni283B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+283c uni283C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+283d uni283D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+283e uni283E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+283f uni283F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2840 uni2840              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2841 uni2841              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2842 uni2842              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2843 uni2843              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2844 uni2844              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2845 uni2845              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2846 uni2846              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2847 uni2847              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2848 uni2848              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2849 uni2849              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+284a uni284A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+284b uni284B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+284c uni284C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+284d uni284D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+284e uni284E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+284f uni284F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2850 uni2850              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2851 uni2851              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2852 uni2852              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2853 uni2853              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2854 uni2854              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2855 uni2855              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2856 uni2856              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2857 uni2857              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2858 uni2858              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2859 uni2859              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+285a uni285A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+285b uni285B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+285c uni285C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+285d uni285D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+285e uni285E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+285f uni285F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2860 uni2860              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2861 uni2861              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2862 uni2862              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2863 uni2863              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2864 uni2864              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2865 uni2865              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2866 uni2866              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2867 uni2867              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2868 uni2868              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2869 uni2869              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+286a uni286A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+286b uni286B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+286c uni286C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+286d uni286D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+286e uni286E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+286f uni286F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2870 uni2870              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2871 uni2871              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2872 uni2872              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2873 uni2873              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2874 uni2874              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2875 uni2875              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2876 uni2876              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2877 uni2877              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2878 uni2878              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2879 uni2879              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+287a uni287A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+287b uni287B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+287c uni287C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+287d uni287D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+287e uni287E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+287f uni287F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2880 uni2880              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2881 uni2881              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2882 uni2882              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2883 uni2883              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2884 uni2884              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2885 uni2885              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2886 uni2886              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2887 uni2887              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2888 uni2888              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2889 uni2889              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+288a uni288A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+288b uni288B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+288c uni288C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+288d uni288D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+288e uni288E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+288f uni288F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2890 uni2890              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2891 uni2891              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2892 uni2892              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2893 uni2893              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2894 uni2894              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2895 uni2895              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2896 uni2896              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2897 uni2897              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2898 uni2898              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2899 uni2899              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+289a uni289A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+289b uni289B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+289c uni289C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+289d uni289D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+289e uni289E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+289f uni289F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28a0 uni28A0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28a1 uni28A1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28a2 uni28A2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28a3 uni28A3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28a4 uni28A4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28a5 uni28A5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28a6 uni28A6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28a7 uni28A7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28a8 uni28A8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28a9 uni28A9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28aa uni28AA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ab uni28AB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ac uni28AC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ad uni28AD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ae uni28AE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28af uni28AF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28b0 uni28B0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28b1 uni28B1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28b2 uni28B2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28b3 uni28B3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28b4 uni28B4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28b5 uni28B5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28b6 uni28B6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28b7 uni28B7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28b8 uni28B8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28b9 uni28B9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ba uni28BA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28bb uni28BB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28bc uni28BC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28bd uni28BD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28be uni28BE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28bf uni28BF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28c0 uni28C0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28c1 uni28C1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28c2 uni28C2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28c3 uni28C3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28c4 uni28C4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28c5 uni28C5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28c6 uni28C6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28c7 uni28C7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28c8 uni28C8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28c9 uni28C9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ca uni28CA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28cb uni28CB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28cc uni28CC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28cd uni28CD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ce uni28CE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28cf uni28CF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28d0 uni28D0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28d1 uni28D1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28d2 uni28D2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28d3 uni28D3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28d4 uni28D4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28d5 uni28D5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28d6 uni28D6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28d7 uni28D7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28d8 uni28D8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28d9 uni28D9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28da uni28DA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28db uni28DB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28dc uni28DC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28dd uni28DD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28de uni28DE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28df uni28DF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28e0 uni28E0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28e1 uni28E1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28e2 uni28E2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28e3 uni28E3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28e4 uni28E4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28e5 uni28E5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28e6 uni28E6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28e7 uni28E7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28e8 uni28E8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28e9 uni28E9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ea uni28EA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28eb uni28EB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ec uni28EC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ed uni28ED              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ee uni28EE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ef uni28EF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28f0 uni28F0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28f1 uni28F1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28f2 uni28F2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28f3 uni28F3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28f4 uni28F4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28f5 uni28F5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28f6 uni28F6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28f7 uni28F7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28f8 uni28F8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28f9 uni28F9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28fa uni28FA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28fb uni28FB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28fc uni28FC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28fd uni28FD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28fe uni28FE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ff uni28FF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2900 uni2900              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2901 uni2901              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2902 uni2902              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2903 uni2903              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2904 uni2904              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2905 uni2905              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2906 uni2906              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2907 uni2907              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2908 uni2908              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2909 uni2909              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+290a uni290A              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+290b uni290B              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+290c uni290C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+290d uni290D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+290e uni290E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+290f uni290F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2910 uni2910              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2911 uni2911              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2912 uni2912              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2913 uni2913              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2914 uni2914              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2915 uni2915              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2916 uni2916              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2917 uni2917              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2918 uni2918              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2919 uni2919              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+291a uni291A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+291b uni291B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+291c uni291C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+291d uni291D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+291e uni291E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+291f uni291F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2920 uni2920              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2921 uni2921              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2922 uni2922              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2923 uni2923              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2924 uni2924              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2925 uni2925              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2926 uni2926              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2927 uni2927              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2928 uni2928              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2929 uni2929              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+292a uni292A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+292b uni292B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+292c uni292C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+292d uni292D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+292e uni292E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+292f uni292F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2930 uni2930              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2931 uni2931              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2932 uni2932              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2933 uni2933              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2934 uni2934              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2935 uni2935              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2936 uni2936              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2937 uni2937              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2938 uni2938              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2939 uni2939              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+293a uni293A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+293b uni293B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+293c uni293C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+293d uni293D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+293e uni293E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+293f uni293F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2940 uni2940              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2941 uni2941              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2942 uni2942              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2943 uni2943              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2944 uni2944              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2945 uni2945              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2946 uni2946              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2947 uni2947              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2948 uni2948              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2949 uni2949              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+294a uni294A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+294b uni294B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+294c uni294C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+294d uni294D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+294e uni294E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+294f uni294F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2950 uni2950              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2951 uni2951              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2952 uni2952              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2953 uni2953              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2954 uni2954              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2955 uni2955              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2956 uni2956              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2957 uni2957              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2958 uni2958              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2959 uni2959              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+295a uni295A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+295b uni295B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+295c uni295C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+295d uni295D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+295e uni295E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+295f uni295F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2960 uni2960              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2961 uni2961              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2962 uni2962              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2963 uni2963              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2964 uni2964              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2965 uni2965              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2966 uni2966              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2967 uni2967              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2968 uni2968              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2969 uni2969              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+296a uni296A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+296b uni296B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+296c uni296C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+296d uni296D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+296e uni296E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+296f uni296F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2970 uni2970              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2971 uni2971              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2972 uni2972              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2973 uni2973              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2974 uni2974              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2975 uni2975              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2976 uni2976              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2977 uni2977              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2978 uni2978              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2979 uni2979              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+297a uni297A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+297b uni297B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+297c uni297C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+297d uni297D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+297e uni297E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+297f uni297F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2983 uni2983              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2984 uni2984              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+29ce uni29CE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+29cf uni29CF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+29d0 uni29D0              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+29d1 uni29D1              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+29d2 uni29D2              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+29d3 uni29D3              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+29d4 uni29D4              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+29d5 uni29D5              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+29eb uni29EB              2.2
+U+29fa uni29FA              2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+29fb uni29FB              2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2a00 uni2A00              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a01 uni2A01              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a02 uni2A02              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a0c uni2A0C              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2a0d uni2A0D              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2a0e uni2A0E              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2a0f uni2A0F              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a10 uni2A10              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a11 uni2A11              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a12 uni2A12              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a13 uni2A13              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a14 uni2A14              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a15 uni2A15              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a16 uni2A16              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a17 uni2A17              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a18 uni2A18              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a19 uni2A19              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a1a uni2A1A              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a1b uni2A1B              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a1c uni2A1C              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a2f uni2A2F              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2a7d uni2A7D              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a7e uni2A7E              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a7f uni2A7F              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a80 uni2A80              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a81 uni2A81              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a82 uni2A82              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a83 uni2A83              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a84 uni2A84              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a85 uni2A85              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a86 uni2A86              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a87 uni2A87              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a88 uni2A88              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a89 uni2A89              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a8a uni2A8A              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a8b uni2A8B              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a8c uni2A8C              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a8d uni2A8D              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a8e uni2A8E              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a8f uni2A8F              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a90 uni2A90              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a91 uni2A91              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a92 uni2A92              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a93 uni2A93              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a94 uni2A94              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a95 uni2A95              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a96 uni2A96              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a97 uni2A97              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a98 uni2A98              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a99 uni2A99              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a9a uni2A9A              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a9b uni2A9B              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a9c uni2A9C              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a9d uni2A9D              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a9e uni2A9E              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a9f uni2A9F              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2aa0 uni2AA0              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2aae uni2AAE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2aaf uni2AAF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2ab0 uni2AB0              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2ab1 uni2AB1              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2ab2 uni2AB2              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2ab3 uni2AB3              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2ab4 uni2AB4              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2ab5 uni2AB5              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2ab6 uni2AB6              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2ab7 uni2AB7              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2ab8 uni2AB8              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2ab9 uni2AB9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2aba uni2ABA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2af9 uni2AF9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2afa uni2AFA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2b00 uni2B00              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b01 uni2B01              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b02 uni2B02              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b03 uni2B03              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b04 uni2B04              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b05 uni2B05              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b06 uni2B06              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b07 uni2B07              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b08 uni2B08              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b09 uni2B09              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b0a uni2B0A              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b0b uni2B0B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b0c uni2B0C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b0d uni2B0D              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b0e uni2B0E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b0f uni2B0F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b10 uni2B10              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b11 uni2B11              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b12 uni2B12              2.3
+U+2b13 uni2B13              2.3
+U+2b14 uni2B14              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2b15 uni2B15              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2b16 uni2B16              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2b17 uni2B17              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2b18 uni2B18              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2b19 uni2B19              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2b1a uni2B1A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2b1f uni2B1F              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+2b20 uni2B20              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2b21 uni2B21              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2b22 uni2B22              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2b23 uni2B23              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2b24 uni2B24              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+2b53 uni2B53              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+2b54 uni2B54              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+2c60 uni2C60              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2c61 uni2C61              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2c62 uni2C62              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2c63 uni2C63              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2c64 uni2C64              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2c65 uni2C65              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2c66 uni2C66              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2c67 uni2C67              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2c68 uni2C68              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2c69 uni2C69              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2c6a uni2C6A              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2c6b uni2C6B              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2c6c uni2C6C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2c6d uni2C6D              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2c6e uni2C6E              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2c6f uni2C6F              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+2c70 uni2C70              2.31 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2c71 uni2C71              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.31 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2c72 uni2C72              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.31 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2c73 uni2C73              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.31 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2c74 uni2C74              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2c75 uni2C75              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2c76 uni2C76              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2c77 uni2C77              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2c79 uni2C79              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+2c7a uni2C7A              2.27
+U+2c7b uni2C7B              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2c7c uni2C7C              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+2c7d uni2C7D              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+2c7e uni2C7E              2.31 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2c7f uni2C7F              2.31 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2d00 uni2D00              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d01 uni2D01              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d02 uni2D02              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d03 uni2D03              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d04 uni2D04              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d05 uni2D05              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d06 uni2D06              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d07 uni2D07              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d08 uni2D08              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d09 uni2D09              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d0a uni2D0A              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d0b uni2D0B              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d0c uni2D0C              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d0d uni2D0D              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d0e uni2D0E              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d0f uni2D0F              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d10 uni2D10              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d11 uni2D11              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d12 uni2D12              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d13 uni2D13              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d14 uni2D14              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d15 uni2D15              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d16 uni2D16              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d17 uni2D17              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d18 uni2D18              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d19 uni2D19              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d1a uni2D1A              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d1b uni2D1B              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d1c uni2D1C              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d1d uni2D1D              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d1e uni2D1E              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d1f uni2D1F              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d20 uni2D20              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d21 uni2D21              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d22 uni2D22              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d23 uni2D23              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d24 uni2D24              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d25 uni2D25              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d30 uni2D30              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d31 uni2D31              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d32 uni2D32              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d33 uni2D33              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d34 uni2D34              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d35 uni2D35              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d36 uni2D36              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d37 uni2D37              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d38 uni2D38              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d39 uni2D39              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d3a uni2D3A              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d3b uni2D3B              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d3c uni2D3C              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d3d uni2D3D              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d3e uni2D3E              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d3f uni2D3F              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d40 uni2D40              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d41 uni2D41              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d42 uni2D42              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d43 uni2D43              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d44 uni2D44              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d45 uni2D45              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d46 uni2D46              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d47 uni2D47              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d48 uni2D48              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d49 uni2D49              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d4a uni2D4A              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d4b uni2D4B              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d4c uni2D4C              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d4d uni2D4D              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d4e uni2D4E              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d4f uni2D4F              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d50 uni2D50              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d51 uni2D51              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d52 uni2D52              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d53 uni2D53              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d54 uni2D54              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d55 uni2D55              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d56 uni2D56              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d57 uni2D57              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d58 uni2D58              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d59 uni2D59              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d5a uni2D5A              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d5b uni2D5B              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d5c uni2D5C              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d5d uni2D5D              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d5e uni2D5E              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d5f uni2D5F              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d60 uni2D60              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d61 uni2D61              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d62 uni2D62              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d63 uni2D63              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d64 uni2D64              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d65 uni2D65              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d6f uni2D6F              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2e18 uni2E18              2.26
+U+2e22 uni2E22              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold) 2.31 (Serif Condensed Italic)
+U+2e23 uni2E23              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold) 2.31 (Serif Condensed Italic)
+U+2e24 uni2E24              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold) 2.31 (Serif Condensed Italic)
+U+2e25 uni2E25              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold) 2.31 (Serif Condensed Italic)
+U+2e2e uni2E2E              2.26
+U+4dc0 uni4DC0              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dc1 uni4DC1              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dc2 uni4DC2              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dc3 uni4DC3              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dc4 uni4DC4              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dc5 uni4DC5              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dc6 uni4DC6              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dc7 uni4DC7              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dc8 uni4DC8              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dc9 uni4DC9              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dca uni4DCA              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dcb uni4DCB              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dcc uni4DCC              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dcd uni4DCD              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dce uni4DCE              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dcf uni4DCF              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dd0 uni4DD0              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dd1 uni4DD1              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dd2 uni4DD2              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dd3 uni4DD3              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dd4 uni4DD4              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dd5 uni4DD5              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dd6 uni4DD6              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dd7 uni4DD7              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dd8 uni4DD8              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dd9 uni4DD9              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dda uni4DDA              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4ddb uni4DDB              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4ddc uni4DDC              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4ddd uni4DDD              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dde uni4DDE              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4ddf uni4DDF              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4de0 uni4DE0              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4de1 uni4DE1              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4de2 uni4DE2              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4de3 uni4DE3              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4de4 uni4DE4              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4de5 uni4DE5              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4de6 uni4DE6              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4de7 uni4DE7              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4de8 uni4DE8              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4de9 uni4DE9              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dea uni4DEA              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4deb uni4DEB              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dec uni4DEC              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4ded uni4DED              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dee uni4DEE              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4def uni4DEF              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4df0 uni4DF0              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4df1 uni4DF1              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4df2 uni4DF2              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4df3 uni4DF3              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4df4 uni4DF4              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4df5 uni4DF5              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4df6 uni4DF6              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4df7 uni4DF7              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4df8 uni4DF8              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4df9 uni4DF9              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dfa uni4DFA              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dfb uni4DFB              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dfc uni4DFC              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dfd uni4DFD              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dfe uni4DFE              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dff uni4DFF              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a644 uniA644              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a645 uniA645              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a646 uniA646              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a647 uniA647              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a64c uniA64C              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a64d uniA64D              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a650 uniA650              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a651 uniA651              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a654 uniA654              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a655 uniA655              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a656 uniA656              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a657 uniA657              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a662 uniA662              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a663 uniA663              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a664 uniA664              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a665 uniA665              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a666 uniA666              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a667 uniA667              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a668 uniA668              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a669 uniA669              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a66a uniA66A              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a66b uniA66B              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a66c uniA66C              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a66d uniA66D              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a66e uniA66E              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a68a uniA68A              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a68b uniA68B              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a68c uniA68C              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a68d uniA68D              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a694 uniA694              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a695 uniA695              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a708 uniA708              2.27
+U+a709 uniA709              2.27
+U+a70a uniA70A              2.27
+U+a70b uniA70B              2.27
+U+a70c uniA70C              2.27
+U+a70d uniA70D              2.27
+U+a70e uniA70E              2.27
+U+a70f uniA70F              2.27
+U+a710 uniA710              2.27
+U+a711 uniA711              2.27
+U+a712 uniA712              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a713 uniA713              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a714 uniA714              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a715 uniA715              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a716 uniA716              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a71b uniA71B              2.27
+U+a71c uniA71C              2.27
+U+a71d uniA71D              2.27
+U+a71e uniA71E              2.27
+U+a71f uniA71F              2.27
+U+a722 uniA722              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+a723 uniA723              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+a724 uniA724              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+a725 uniA725              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+a726 uniA726              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a727 uniA727              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a728 uniA728              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a729 uniA729              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a72a uniA72A              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a72b uniA72B              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a72c uniA72C              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a72d uniA72D              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a72e uniA72E              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a72f uniA72F              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a730 uniA730              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a731 uniA731              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a732 uniA732              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a733 uniA733              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a734 uniA734              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a735 uniA735              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a736 uniA736              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a737 uniA737              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a738 uniA738              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a739 uniA739              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a73a uniA73A              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a73b uniA73B              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a73c uniA73C              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a73d uniA73D              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a73e uniA73E              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a73f uniA73F              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a746 uniA746              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a747 uniA747              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a748 uniA748              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a749 uniA749              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a74a uniA74A              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a74b uniA74B              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a74e uniA74E              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a74f uniA74F              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a750 uniA750              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a751 uniA751              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a752 uniA752              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a753 uniA753              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a756 uniA756              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a757 uniA757              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a764 uniA764              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a765 uniA765              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a766 uniA766              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a767 uniA767              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a768 uniA768              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a769 uniA769              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a77b uniA77B              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a77c uniA77C              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a780 uniA780              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a781 uniA781              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a782 uniA782              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a783 uniA783              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a784 uniA784              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a785 uniA785              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a786 uniA786              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a787 uniA787              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a789 uniA789              2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+a78a uniA78A              2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+a78b uniA78B              2.26
+U+a78c uniA78C              2.26
+U+a78d uniA78D              2.31
+U+a78e uniA78E              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+a790 uniA790              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a791 uniA791              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a7fa uniA7FA              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a7fb uniA7FB              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a7fc uniA7FC              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a7fd uniA7FD              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a7fe uniA7FE              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a7ff uniA7FF              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+e000 uniE000              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+e001 uniE001              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+e002 uniE002              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+e003 uniE003              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+e004 uniE004              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+e005 uniE005              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+e006 uniE006              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+e007 uniE007              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+e008 uniE008              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+e009 uniE009              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e00a uniE00A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e00b uniE00B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e00c uniE00C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e00d uniE00D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e00e uniE00E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e00f uniE00F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e010 uniE010              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e011 uniE011              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e012 uniE012              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e013 uniE013              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e014 uniE014              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e015 uniE015              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+e016 uniE016              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+e017 uniE017              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+e018 uniE018              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+e019 uniE019              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+e01a uniE01A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+e01b uniE01B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+e01c uniE01C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+e01d uniE01D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef00 uni02E5.5            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef01 uni02E6.5            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef02 uni02E7.5            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef03 uni02E8.5            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef04 uni02E9.5            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef05 uni02E5.4            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef06 uni02E6.4            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef07 uni02E7.4            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef08 uni02E8.4            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef09 uni02E9.4            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef0a uni02E5.3            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef0b uni02E6.3            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef0c uni02E7.3            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef0d uni02E8.3            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef0e uni02E9.3            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef0f uni02E5.2            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef10 uni02E6.2            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef11 uni02E7.2            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef12 uni02E8.2            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef13 uni02E9.2            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef14 uni02E5.1            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef15 uni02E6.1            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef16 uni02E7.1            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef17 uni02E8.1            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef18 uni02E9.1            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef19 stem                 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+f000 uniF000              2.10 (Sans) 2.11 (Sans Condensed)
+U+f001 uniF001              2.10 (Sans) 2.11 (Sans Condensed)
+U+f002 uniF002              2.33 (Sans, Sans Condensed)
+U+f003 uniF003              2.33 (Sans, Sans Condensed)
+U+f208 uniF208              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+f20a uniF20A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+f215 uniF215              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+f216 uniF216              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+f217 uniF217              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+f21a uniF21A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+f21b uniF21B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+f25f uniF25F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+f400 uniF400              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f401 uniF401              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f402 uniF402              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f403 uniF403              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f404 uniF404              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f405 uniF405              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f406 uniF406              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f407 uniF407              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f408 uniF408              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f409 uniF409              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f40a uniF40A              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f40b uniF40B              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f40c uniF40C              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f40d uniF40D              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f40e uniF40E              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f40f uniF40F              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f410 uniF410              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f411 uniF411              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f412 uniF412              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f413 uniF413              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f414 uniF414              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f415 uniF415              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f416 uniF416              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f417 uniF417              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f418 uniF418              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f419 uniF419              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f41a uniF41A              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f41b uniF41B              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f41c uniF41C              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f41d uniF41D              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f41e uniF41E              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f41f uniF41F              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f420 uniF420              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f421 uniF421              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f422 uniF422              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f423 uniF423              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f424 uniF424              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f425 uniF425              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f426 uniF426              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f428 uniF428              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f5c5 uniF5C5              2.9 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+f6c4 uniF6C4              2.10 (Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+f6c5 uniF6C5              2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.9 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+f6c6 uniF6C6              2.5 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+f6c7 uniF6C7              2.11 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+f6c8 uniF6C8              2.11 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+f6d1 cyrBreve             2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+f6d4 cyrbreve             2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fb00 uniFB00              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fb01 fi                   original
+U+fb02 fl                   original
+U+fb03 uniFB03              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fb04 uniFB04              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fb05 uniFB05              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fb06 uniFB06              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fb13 uniFB13              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb14 uniFB14              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb15 uniFB15              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb16 uniFB16              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb17 uniFB17              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb1d uniFB1D              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb1e uniFB1E              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb1f uniFB1F              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb20 uniFB20              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb21 uniFB21              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb22 uniFB22              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb23 uniFB23              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb24 uniFB24              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb25 uniFB25              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb26 uniFB26              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb27 uniFB27              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb28 uniFB28              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb29 uniFB29              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb2a uniFB2A              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb2b uniFB2B              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb2c uniFB2C              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb2d uniFB2D              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb2e uniFB2E              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb2f uniFB2F              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb30 uniFB30              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb31 uniFB31              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb32 uniFB32              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb33 uniFB33              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb34 uniFB34              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb35 uniFB35              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb36 uniFB36              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb37 uniFB37              2.11 (Sans Condensed Oblique, Sans Oblique) 2.33 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+fb38 uniFB38              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb39 uniFB39              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb3a uniFB3A              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb3b uniFB3B              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb3c uniFB3C              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb3d uniFB3D              2.33 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb3e uniFB3E              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb3f uniFB3F              2.33 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb40 uniFB40              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb41 uniFB41              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb42 uniFB42              2.33 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb43 uniFB43              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb44 uniFB44              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb45 uniFB45              2.33 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb46 uniFB46              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb47 uniFB47              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb48 uniFB48              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb49 uniFB49              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb4a uniFB4A              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb4b uniFB4B              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb4c uniFB4C              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb4d uniFB4D              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb4e uniFB4E              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb4f uniFB4F              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb52 uniFB52              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb53 uniFB53              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb54 uniFB54              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb55 uniFB55              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb56 uniFB56              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb57 uniFB57              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb58 uniFB58              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb59 uniFB59              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb5a uniFB5A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb5b uniFB5B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb5c uniFB5C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb5d uniFB5D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb5e uniFB5E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb5f uniFB5F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb60 uniFB60              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb61 uniFB61              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb62 uniFB62              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb63 uniFB63              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb64 uniFB64              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb65 uniFB65              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb66 uniFB66              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb67 uniFB67              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb68 uniFB68              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb69 uniFB69              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb6a uniFB6A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb6b uniFB6B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb6c uniFB6C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb6d uniFB6D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb6e uniFB6E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb6f uniFB6F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb70 uniFB70              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb71 uniFB71              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb72 uniFB72              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb73 uniFB73              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb74 uniFB74              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb75 uniFB75              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb76 uniFB76              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb77 uniFB77              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb78 uniFB78              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb79 uniFB79              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb7a uniFB7A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb7b uniFB7B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb7c uniFB7C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb7d uniFB7D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb7e uniFB7E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb7f uniFB7F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb80 uniFB80              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb81 uniFB81              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb82 uniFB82              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb83 uniFB83              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb84 uniFB84              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb85 uniFB85              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb86 uniFB86              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb87 uniFB87              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb88 uniFB88              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb89 uniFB89              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb8a uniFB8A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb8b uniFB8B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb8c uniFB8C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb8d uniFB8D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb8e uniFB8E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb8f uniFB8F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb90 uniFB90              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb91 uniFB91              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb92 uniFB92              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb93 uniFB93              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb94 uniFB94              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb95 uniFB95              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb96 uniFB96              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb97 uniFB97              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb98 uniFB98              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb99 uniFB99              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb9a uniFB9A              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb9b uniFB9B              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb9c uniFB9C              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb9d uniFB9D              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb9e uniFB9E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb9f uniFB9F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fba0 uniFBA0              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fba1 uniFBA1              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fba2 uniFBA2              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fba3 uniFBA3              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbaa uniFBAA              2.16 (Sans Mono, Sans Mono Bold) 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbab uniFBAB              2.16 (Sans Mono, Sans Mono Bold) 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbac uniFBAC              2.16 (Sans Mono, Sans Mono Bold) 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbad uniFBAD              2.16 (Sans Mono, Sans Mono Bold) 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbd3 uniFBD3              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbd4 uniFBD4              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbd5 uniFBD5              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbd6 uniFBD6              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbd9 uniFBD9              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbda uniFBDA              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbe8 uniFBE8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fbe9 uniFBE9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fbfc uniFBFC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fbfd uniFBFD              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fbfe uniFBFE              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fbff uniFBFF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe00 uniFE00              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe01 uniFE01              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe02 uniFE02              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe03 uniFE03              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe04 uniFE04              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe05 uniFE05              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe06 uniFE06              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe07 uniFE07              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe08 uniFE08              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe09 uniFE09              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe0a uniFE0A              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe0b uniFE0B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe0c uniFE0C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe0d uniFE0D              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe0e uniFE0E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe0f uniFE0F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe20 uniFE20              2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fe21 uniFE21              2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fe22 uniFE22              2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fe23 uniFE23              2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fe70 uniFE70              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe71 uniFE71              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe72 uniFE72              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe73 uniFE73              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe74 uniFE74              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe76 uniFE76              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe77 uniFE77              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe78 uniFE78              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe79 uniFE79              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe7a uniFE7A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe7b uniFE7B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe7c uniFE7C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe7d uniFE7D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe7e uniFE7E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe7f uniFE7F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe80 uniFE80              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe81 uniFE81              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe82 uniFE82              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe83 uniFE83              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe84 uniFE84              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe85 uniFE85              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe86 uniFE86              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe87 uniFE87              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe88 uniFE88              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe89 uniFE89              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe8a uniFE8A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe8b uniFE8B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe8c uniFE8C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe8d uniFE8D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe8e uniFE8E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe8f uniFE8F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe90 uniFE90              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe91 uniFE91              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe92 uniFE92              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe93 uniFE93              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe94 uniFE94              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe95 uniFE95              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe96 uniFE96              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe97 uniFE97              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe98 uniFE98              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe99 uniFE99              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe9a uniFE9A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe9b uniFE9B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe9c uniFE9C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe9d uniFE9D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe9e uniFE9E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe9f uniFE9F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fea0 uniFEA0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fea1 uniFEA1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fea2 uniFEA2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fea3 uniFEA3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fea4 uniFEA4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fea5 uniFEA5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fea6 uniFEA6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fea7 uniFEA7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fea8 uniFEA8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fea9 uniFEA9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feaa uniFEAA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feab uniFEAB              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feac uniFEAC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fead uniFEAD              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feae uniFEAE              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feaf uniFEAF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feb0 uniFEB0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feb1 uniFEB1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feb2 uniFEB2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feb3 uniFEB3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feb4 uniFEB4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feb5 uniFEB5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feb6 uniFEB6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feb7 uniFEB7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feb8 uniFEB8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feb9 uniFEB9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feba uniFEBA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+febb uniFEBB              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+febc uniFEBC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+febd uniFEBD              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+febe uniFEBE              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+febf uniFEBF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fec0 uniFEC0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fec1 uniFEC1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fec2 uniFEC2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fec3 uniFEC3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fec4 uniFEC4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fec5 uniFEC5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fec6 uniFEC6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fec7 uniFEC7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fec8 uniFEC8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fec9 uniFEC9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feca uniFECA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fecb uniFECB              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fecc uniFECC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fecd uniFECD              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fece uniFECE              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fecf uniFECF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fed0 uniFED0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fed1 uniFED1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fed2 uniFED2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fed3 uniFED3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fed4 uniFED4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fed5 uniFED5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fed6 uniFED6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fed7 uniFED7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fed8 uniFED8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fed9 uniFED9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feda uniFEDA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fedb uniFEDB              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fedc uniFEDC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fedd uniFEDD              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fede uniFEDE              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fedf uniFEDF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fee0 uniFEE0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fee1 uniFEE1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fee2 uniFEE2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fee3 uniFEE3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fee4 uniFEE4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fee5 uniFEE5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fee6 uniFEE6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fee7 uniFEE7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fee8 uniFEE8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fee9 uniFEE9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feea uniFEEA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feeb uniFEEB              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feec uniFEEC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feed uniFEED              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feee uniFEEE              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feef uniFEEF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fef0 uniFEF0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fef1 uniFEF1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fef2 uniFEF2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fef3 uniFEF3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fef4 uniFEF4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fef5 uniFEF5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fef6 uniFEF6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fef7 uniFEF7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fef8 uniFEF8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fef9 uniFEF9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fefa uniFEFA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fefb uniFEFB              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fefc uniFEFC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feff uniFEFF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fff9 uniFFF9              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fffa uniFFFA              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fffb uniFFFB              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fffc uniFFFC              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fffd uniFFFD              1.12
+U+10300 u10300               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10301 u10301               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10302 u10302               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10303 u10303               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10304 u10304               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10305 u10305               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10306 u10306               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10307 u10307               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10308 u10308               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10309 u10309               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1030a u1030A               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1030b u1030B               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1030c u1030C               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1030d u1030D               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1030e u1030E               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1030f u1030F               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10310 u10310               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10311 u10311               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10312 u10312               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10313 u10313               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10314 u10314               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10315 u10315               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10316 u10316               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10317 u10317               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10318 u10318               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10319 u10319               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1031a u1031A               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1031b u1031B               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1031c u1031C               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1031d u1031D               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1031e u1031E               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10320 u10320               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10321 u10321               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10322 u10322               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10323 u10323               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d300 u1D300               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d301 u1D301               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d302 u1D302               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d303 u1D303               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d304 u1D304               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d305 u1D305               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d306 u1D306               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d307 u1D307               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d308 u1D308               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d309 u1D309               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d30a u1D30A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d30b u1D30B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d30c u1D30C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d30d u1D30D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d30e u1D30E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d30f u1D30F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d310 u1D310               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d311 u1D311               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d312 u1D312               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d313 u1D313               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d314 u1D314               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d315 u1D315               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d316 u1D316               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d317 u1D317               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d318 u1D318               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d319 u1D319               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d31a u1D31A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d31b u1D31B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d31c u1D31C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d31d u1D31D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d31e u1D31E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d31f u1D31F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d320 u1D320               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d321 u1D321               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d322 u1D322               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d323 u1D323               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d324 u1D324               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d325 u1D325               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d326 u1D326               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d327 u1D327               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d328 u1D328               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d329 u1D329               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d32a u1D32A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d32b u1D32B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d32c u1D32C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d32d u1D32D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d32e u1D32E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d32f u1D32F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d330 u1D330               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d331 u1D331               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d332 u1D332               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d333 u1D333               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d334 u1D334               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d335 u1D335               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d336 u1D336               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d337 u1D337               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d338 u1D338               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d339 u1D339               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d33a u1D33A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d33b u1D33B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d33c u1D33C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d33d u1D33D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d33e u1D33E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d33f u1D33F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d340 u1D340               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d341 u1D341               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d342 u1D342               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d343 u1D343               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d344 u1D344               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d345 u1D345               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d346 u1D346               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d347 u1D347               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d348 u1D348               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d349 u1D349               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d34a u1D34A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d34b u1D34B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d34c u1D34C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d34d u1D34D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d34e u1D34E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d34f u1D34F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d350 u1D350               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d351 u1D351               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d352 u1D352               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d353 u1D353               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d354 u1D354               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d355 u1D355               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d356 u1D356               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d400 u1D400               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d401 u1D401               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d402 u1D402               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d403 u1D403               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d404 u1D404               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d405 u1D405               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d406 u1D406               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d407 u1D407               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d408 u1D408               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d409 u1D409               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d40a u1D40A               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d40b u1D40B               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d40c u1D40C               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d40d u1D40D               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d40e u1D40E               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d40f u1D40F               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d410 u1D410               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d411 u1D411               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d412 u1D412               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d413 u1D413               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d414 u1D414               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d415 u1D415               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d416 u1D416               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d417 u1D417               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d418 u1D418               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d419 u1D419               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d41a u1D41A               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d41b u1D41B               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d41c u1D41C               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d41d u1D41D               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d41e u1D41E               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d41f u1D41F               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d420 u1D420               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d421 u1D421               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d422 u1D422               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d423 u1D423               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d424 u1D424               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d425 u1D425               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d426 u1D426               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d427 u1D427               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d428 u1D428               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d429 u1D429               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d42a u1D42A               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d42b u1D42B               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d42c u1D42C               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d42d u1D42D               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d42e u1D42E               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d42f u1D42F               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d430 u1D430               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d431 u1D431               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d432 u1D432               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d433 u1D433               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d434 u1D434               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d435 u1D435               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d436 u1D436               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d437 u1D437               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d438 u1D438               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d439 u1D439               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d43a u1D43A               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d43b u1D43B               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d43c u1D43C               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d43d u1D43D               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d43e u1D43E               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d43f u1D43F               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d440 u1D440               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d441 u1D441               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d442 u1D442               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d443 u1D443               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d444 u1D444               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d445 u1D445               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d446 u1D446               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d447 u1D447               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d448 u1D448               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d449 u1D449               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d44a u1D44A               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d44b u1D44B               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d44c u1D44C               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d44d u1D44D               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d44e u1D44E               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d44f u1D44F               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d450 u1D450               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d451 u1D451               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d452 u1D452               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d453 u1D453               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d454 u1D454               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d456 u1D456               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d457 u1D457               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d458 u1D458               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d459 u1D459               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d45a u1D45A               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d45b u1D45B               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d45c u1D45C               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d45d u1D45D               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d45e u1D45E               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d45f u1D45F               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d460 u1D460               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d461 u1D461               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d462 u1D462               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d463 u1D463               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d464 u1D464               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d465 u1D465               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d466 u1D466               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d467 u1D467               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d468 u1D468               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d469 u1D469               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d46a u1D46A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d46b u1D46B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d46c u1D46C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d46d u1D46D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d46e u1D46E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d46f u1D46F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d470 u1D470               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d471 u1D471               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d472 u1D472               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d473 u1D473               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d474 u1D474               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d475 u1D475               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d476 u1D476               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d477 u1D477               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d478 u1D478               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d479 u1D479               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d47a u1D47A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d47b u1D47B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d47c u1D47C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d47d u1D47D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d47e u1D47E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d47f u1D47F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d480 u1D480               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d481 u1D481               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d482 u1D482               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d483 u1D483               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d484 u1D484               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d485 u1D485               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d486 u1D486               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d487 u1D487               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d488 u1D488               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d489 u1D489               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d48a u1D48A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d48b u1D48B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d48c u1D48C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d48d u1D48D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d48e u1D48E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d48f u1D48F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d490 u1D490               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d491 u1D491               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d492 u1D492               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d493 u1D493               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d494 u1D494               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d495 u1D495               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d496 u1D496               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d497 u1D497               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d498 u1D498               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d499 u1D499               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d49a u1D49A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d49b u1D49B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d538 u1D538               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d539 u1D539               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d53b u1D53B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d53c u1D53C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d53d u1D53D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d53e u1D53E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d540 u1D540               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d541 u1D541               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d542 u1D542               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d543 u1D543               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d544 u1D544               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d546 u1D546               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d54a u1D54A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d54b u1D54B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d54c u1D54C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d54d u1D54D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d54e u1D54E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d54f u1D54F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d550 u1D550               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d552 u1D552               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d553 u1D553               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d554 u1D554               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d555 u1D555               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d556 u1D556               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d557 u1D557               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d558 u1D558               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d559 u1D559               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d55a u1D55A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d55b u1D55B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d55c u1D55C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d55d u1D55D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d55e u1D55E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d55f u1D55F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d560 u1D560               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d561 u1D561               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d562 u1D562               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d563 u1D563               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d564 u1D564               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d565 u1D565               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d566 u1D566               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d567 u1D567               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d568 u1D568               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d569 u1D569               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d56a u1D56A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d56b u1D56B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d5a0 u1D5A0               2.23 (Sans, Sans Condensed)
+U+1d5a1 u1D5A1               2.23 (Sans, Sans Condensed)
+U+1d5a2 u1D5A2               2.23 (Sans, Sans Condensed)
+U+1d5a3 u1D5A3               2.23 (Sans, Sans Condensed)
+U+1d5a4 u1D5A4               2.23 (Sans, Sans Condensed)
+U+1d5a5 u1D5A5               2.23 (Sans, Sans Condensed)
+U+1d5a6 u1D5A6               2.23 (Sans, Sans Condensed)
+U+1d5a7 u1D5A7               2.23 (Sans, Sans Condensed)
+U+1d5a8 u1D5A8               2.23 (Sans, Sans Condensed)
+U+1d5a9 u1D5A9               2.23 (Sans, Sans Condensed)
+U+1d5aa u1D5AA               2.23 (Sans, Sans Condensed)
+U+1d5ab u1D5AB               2.23 (Sans, Sans Condensed)
+U+1d5ac u1D5AC               2.23 (Sans, Sans Condensed)
+U+1d5ad u1D5AD               2.23 (Sans, Sans Condensed)
+U+1d5ae u1D5AE               2.23 (Sans, Sans Condensed)
+U+1d5af u1D5AF               2.23 (Sans, Sans Condensed)
+U+1d5b0 u1D5B0               2.23 (Sans, Sans Condensed)
+U+1d5b1 u1D5B1               2.23 (Sans, Sans Condensed)
+U+1d5b2 u1D5B2               2.23 (Sans, Sans Condensed)
+U+1d5b3 u1D5B3               2.23 (Sans, Sans Condensed)
+U+1d5b4 u1D5B4               2.23 (Sans, Sans Condensed)
+U+1d5b5 u1D5B5               2.23 (Sans, Sans Condensed)
+U+1d5b6 u1D5B6               2.23 (Sans, Sans Condensed)
+U+1d5b7 u1D5B7               2.23 (Sans, Sans Condensed)
+U+1d5b8 u1D5B8               2.23 (Sans, Sans Condensed)
+U+1d5b9 u1D5B9               2.23 (Sans, Sans Condensed)
+U+1d5ba u1D5BA               2.23 (Sans, Sans Condensed)
+U+1d5bb u1D5BB               2.23 (Sans, Sans Condensed)
+U+1d5bc u1D5BC               2.23 (Sans, Sans Condensed)
+U+1d5bd u1D5BD               2.23 (Sans, Sans Condensed)
+U+1d5be u1D5BE               2.23 (Sans, Sans Condensed)
+U+1d5bf u1D5BF               2.23 (Sans, Sans Condensed)
+U+1d5c0 u1D5C0               2.23 (Sans, Sans Condensed)
+U+1d5c1 u1D5C1               2.23 (Sans, Sans Condensed)
+U+1d5c2 u1D5C2               2.23 (Sans, Sans Condensed)
+U+1d5c3 u1D5C3               2.23 (Sans, Sans Condensed)
+U+1d5c4 u1D5C4               2.23 (Sans, Sans Condensed)
+U+1d5c5 u1D5C5               2.23 (Sans, Sans Condensed)
+U+1d5c6 u1D5C6               2.23 (Sans, Sans Condensed)
+U+1d5c7 u1D5C7               2.23 (Sans, Sans Condensed)
+U+1d5c8 u1D5C8               2.23 (Sans, Sans Condensed)
+U+1d5c9 u1D5C9               2.23 (Sans, Sans Condensed)
+U+1d5ca u1D5CA               2.23 (Sans, Sans Condensed)
+U+1d5cb u1D5CB               2.23 (Sans, Sans Condensed)
+U+1d5cc u1D5CC               2.23 (Sans, Sans Condensed)
+U+1d5cd u1D5CD               2.23 (Sans, Sans Condensed)
+U+1d5ce u1D5CE               2.23 (Sans, Sans Condensed)
+U+1d5cf u1D5CF               2.23 (Sans, Sans Condensed)
+U+1d5d0 u1D5D0               2.23 (Sans, Sans Condensed)
+U+1d5d1 u1D5D1               2.23 (Sans, Sans Condensed)
+U+1d5d2 u1D5D2               2.23 (Sans, Sans Condensed)
+U+1d5d3 u1D5D3               2.23 (Sans, Sans Condensed)
+U+1d5d4 u1D5D4               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5d5 u1D5D5               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5d6 u1D5D6               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5d7 u1D5D7               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5d8 u1D5D8               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5d9 u1D5D9               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5da u1D5DA               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5db u1D5DB               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5dc u1D5DC               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5dd u1D5DD               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5de u1D5DE               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5df u1D5DF               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5e0 u1D5E0               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5e1 u1D5E1               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5e2 u1D5E2               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5e3 u1D5E3               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5e4 u1D5E4               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5e5 u1D5E5               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5e6 u1D5E6               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5e7 u1D5E7               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5e8 u1D5E8               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5e9 u1D5E9               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5ea u1D5EA               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5eb u1D5EB               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5ec u1D5EC               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5ed u1D5ED               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5ee u1D5EE               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5ef u1D5EF               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5f0 u1D5F0               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5f1 u1D5F1               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5f2 u1D5F2               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5f3 u1D5F3               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5f4 u1D5F4               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5f5 u1D5F5               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5f6 u1D5F6               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5f7 u1D5F7               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5f8 u1D5F8               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5f9 u1D5F9               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5fa u1D5FA               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5fb u1D5FB               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5fc u1D5FC               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5fd u1D5FD               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5fe u1D5FE               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5ff u1D5FF               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d600 u1D600               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d601 u1D601               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d602 u1D602               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d603 u1D603               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d604 u1D604               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d605 u1D605               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d606 u1D606               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d607 u1D607               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d608 u1D608               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d609 u1D609               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d60a u1D60A               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d60b u1D60B               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d60c u1D60C               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d60d u1D60D               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d60e u1D60E               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d60f u1D60F               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d610 u1D610               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d611 u1D611               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d612 u1D612               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d613 u1D613               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d614 u1D614               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d615 u1D615               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d616 u1D616               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d617 u1D617               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d618 u1D618               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d619 u1D619               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d61a u1D61A               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d61b u1D61B               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d61c u1D61C               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d61d u1D61D               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d61e u1D61E               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d61f u1D61F               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d620 u1D620               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d621 u1D621               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d622 u1D622               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d623 u1D623               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d624 u1D624               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d625 u1D625               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d626 u1D626               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d627 u1D627               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d628 u1D628               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d629 u1D629               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d62a u1D62A               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d62b u1D62B               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d62c u1D62C               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d62d u1D62D               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d62e u1D62E               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d62f u1D62F               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d630 u1D630               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d631 u1D631               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d632 u1D632               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d633 u1D633               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d634 u1D634               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d635 u1D635               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d636 u1D636               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d637 u1D637               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d638 u1D638               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d639 u1D639               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d63a u1D63A               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d63b u1D63B               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d63c u1D63C               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d63d u1D63D               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d63e u1D63E               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d63f u1D63F               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d640 u1D640               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d641 u1D641               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d642 u1D642               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d643 u1D643               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d644 u1D644               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d645 u1D645               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d646 u1D646               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d647 u1D647               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d648 u1D648               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d649 u1D649               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d64a u1D64A               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d64b u1D64B               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d64c u1D64C               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d64d u1D64D               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d64e u1D64E               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d64f u1D64F               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d650 u1D650               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d651 u1D651               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d652 u1D652               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d653 u1D653               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d654 u1D654               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d655 u1D655               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d656 u1D656               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d657 u1D657               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d658 u1D658               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d659 u1D659               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d65a u1D65A               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d65b u1D65B               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d65c u1D65C               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d65d u1D65D               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d65e u1D65E               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d65f u1D65F               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d660 u1D660               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d661 u1D661               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d662 u1D662               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d663 u1D663               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d664 u1D664               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d665 u1D665               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d666 u1D666               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d667 u1D667               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d668 u1D668               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d669 u1D669               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d66a u1D66A               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d66b u1D66B               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d66c u1D66C               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d66d u1D66D               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d66e u1D66E               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d66f u1D66F               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d670 u1D670               2.23 (Sans Mono)
+U+1d671 u1D671               2.23 (Sans Mono)
+U+1d672 u1D672               2.23 (Sans Mono)
+U+1d673 u1D673               2.23 (Sans Mono)
+U+1d674 u1D674               2.23 (Sans Mono)
+U+1d675 u1D675               2.23 (Sans Mono)
+U+1d676 u1D676               2.23 (Sans Mono)
+U+1d677 u1D677               2.23 (Sans Mono)
+U+1d678 u1D678               2.23 (Sans Mono)
+U+1d679 u1D679               2.23 (Sans Mono)
+U+1d67a u1D67A               2.23 (Sans Mono)
+U+1d67b u1D67B               2.23 (Sans Mono)
+U+1d67c u1D67C               2.23 (Sans Mono)
+U+1d67d u1D67D               2.23 (Sans Mono)
+U+1d67e u1D67E               2.23 (Sans Mono)
+U+1d67f u1D67F               2.23 (Sans Mono)
+U+1d680 u1D680               2.23 (Sans Mono)
+U+1d681 u1D681               2.23 (Sans Mono)
+U+1d682 u1D682               2.23 (Sans Mono)
+U+1d683 u1D683               2.23 (Sans Mono)
+U+1d684 u1D684               2.23 (Sans Mono)
+U+1d685 u1D685               2.23 (Sans Mono)
+U+1d686 u1D686               2.23 (Sans Mono)
+U+1d687 u1D687               2.23 (Sans Mono)
+U+1d688 u1D688               2.23 (Sans Mono)
+U+1d689 u1D689               2.23 (Sans Mono)
+U+1d68a u1D68A               2.23 (Sans Mono)
+U+1d68b u1D68B               2.23 (Sans Mono)
+U+1d68c u1D68C               2.23 (Sans Mono)
+U+1d68d u1D68D               2.23 (Sans Mono)
+U+1d68e u1D68E               2.23 (Sans Mono)
+U+1d68f u1D68F               2.23 (Sans Mono)
+U+1d690 u1D690               2.23 (Sans Mono)
+U+1d691 u1D691               2.23 (Sans Mono)
+U+1d692 u1D692               2.23 (Sans Mono)
+U+1d693 u1D693               2.23 (Sans Mono)
+U+1d694 u1D694               2.23 (Sans Mono)
+U+1d695 u1D695               2.23 (Sans Mono)
+U+1d696 u1D696               2.23 (Sans Mono)
+U+1d697 u1D697               2.23 (Sans Mono)
+U+1d698 u1D698               2.23 (Sans Mono)
+U+1d699 u1D699               2.23 (Sans Mono)
+U+1d69a u1D69A               2.23 (Sans Mono)
+U+1d69b u1D69B               2.23 (Sans Mono)
+U+1d69c u1D69C               2.23 (Sans Mono)
+U+1d69d u1D69D               2.23 (Sans Mono)
+U+1d69e u1D69E               2.23 (Sans Mono)
+U+1d69f u1D69F               2.23 (Sans Mono)
+U+1d6a0 u1D6A0               2.23 (Sans Mono)
+U+1d6a1 u1D6A1               2.23 (Sans Mono)
+U+1d6a2 u1D6A2               2.23 (Sans Mono)
+U+1d6a3 u1D6A3               2.23 (Sans Mono)
+U+1d6a4 u1D6A4               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6a5 u1D6A5               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6a8 u1D6A8               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6a9 u1D6A9               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6aa u1D6AA               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6ab u1D6AB               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6ac u1D6AC               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6ad u1D6AD               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6ae u1D6AE               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6af u1D6AF               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6b0 u1D6B0               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6b1 u1D6B1               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6b2 u1D6B2               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6b3 u1D6B3               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6b4 u1D6B4               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6b5 u1D6B5               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6b6 u1D6B6               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6b7 u1D6B7               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6b8 u1D6B8               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6b9 u1D6B9               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6ba u1D6BA               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6bb u1D6BB               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6bc u1D6BC               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6bd u1D6BD               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6be u1D6BE               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6bf u1D6BF               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6c0 u1D6C0               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6c1 u1D6C1               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6c2 u1D6C2               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6c3 u1D6C3               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6c4 u1D6C4               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6c5 u1D6C5               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6c6 u1D6C6               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6c7 u1D6C7               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6c8 u1D6C8               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6c9 u1D6C9               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6ca u1D6CA               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6cb u1D6CB               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6cc u1D6CC               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6cd u1D6CD               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6ce u1D6CE               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6cf u1D6CF               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6d0 u1D6D0               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6d1 u1D6D1               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6d2 u1D6D2               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6d3 u1D6D3               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6d4 u1D6D4               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6d5 u1D6D5               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6d6 u1D6D6               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6d7 u1D6D7               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6d8 u1D6D8               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6d9 u1D6D9               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6da u1D6DA               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6db u1D6DB               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6dc u1D6DC               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6dd u1D6DD               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6de u1D6DE               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6df u1D6DF               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6e0 u1D6E0               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6e1 u1D6E1               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6e2 u1D6E2               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6e3 u1D6E3               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6e4 u1D6E4               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6e5 u1D6E5               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6e6 u1D6E6               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6e7 u1D6E7               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6e8 u1D6E8               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6e9 u1D6E9               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6ea u1D6EA               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6eb u1D6EB               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6ec u1D6EC               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6ed u1D6ED               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6ee u1D6EE               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6ef u1D6EF               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6f0 u1D6F0               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6f1 u1D6F1               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6f2 u1D6F2               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6f3 u1D6F3               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6f4 u1D6F4               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6f5 u1D6F5               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6f6 u1D6F6               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6f7 u1D6F7               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6f8 u1D6F8               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6f9 u1D6F9               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6fa u1D6FA               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6fb u1D6FB               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6fc u1D6FC               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6fd u1D6FD               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6fe u1D6FE               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6ff u1D6FF               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d700 u1D700               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d701 u1D701               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d702 u1D702               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d703 u1D703               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d704 u1D704               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d705 u1D705               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d706 u1D706               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d707 u1D707               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d708 u1D708               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d709 u1D709               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d70a u1D70A               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d70b u1D70B               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d70c u1D70C               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d70d u1D70D               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d70e u1D70E               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d70f u1D70F               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d710 u1D710               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d711 u1D711               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d712 u1D712               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d713 u1D713               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d714 u1D714               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d715 u1D715               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d716 u1D716               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d717 u1D717               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d718 u1D718               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d719 u1D719               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d71a u1D71A               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d71b u1D71B               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d71c u1D71C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d71d u1D71D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d71e u1D71E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d71f u1D71F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d720 u1D720               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d721 u1D721               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d722 u1D722               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d723 u1D723               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d724 u1D724               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d725 u1D725               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d726 u1D726               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d727 u1D727               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d728 u1D728               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d729 u1D729               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d72a u1D72A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d72b u1D72B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d72c u1D72C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d72d u1D72D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d72e u1D72E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d72f u1D72F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d730 u1D730               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d731 u1D731               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d732 u1D732               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d733 u1D733               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d734 u1D734               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d735 u1D735               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d736 u1D736               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d737 u1D737               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d738 u1D738               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d739 u1D739               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d73a u1D73A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d73b u1D73B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d73c u1D73C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d73d u1D73D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d73e u1D73E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d73f u1D73F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d740 u1D740               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d741 u1D741               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d742 u1D742               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d743 u1D743               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d744 u1D744               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d745 u1D745               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d746 u1D746               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d747 u1D747               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d748 u1D748               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d749 u1D749               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d74a u1D74A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d74b u1D74B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d74c u1D74C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d74d u1D74D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d74e u1D74E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d74f u1D74F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d750 u1D750               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d751 u1D751               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d752 u1D752               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d753 u1D753               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d754 u1D754               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d755 u1D755               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d756 u1D756               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d757 u1D757               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d758 u1D758               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d759 u1D759               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d75a u1D75A               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d75b u1D75B               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d75c u1D75C               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d75d u1D75D               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d75e u1D75E               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d75f u1D75F               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d760 u1D760               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d761 u1D761               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d762 u1D762               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d763 u1D763               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d764 u1D764               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d765 u1D765               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d766 u1D766               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d767 u1D767               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d768 u1D768               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d769 u1D769               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d76a u1D76A               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d76b u1D76B               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d76c u1D76C               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d76d u1D76D               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d76e u1D76E               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d76f u1D76F               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d770 u1D770               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d771 u1D771               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d772 u1D772               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d773 u1D773               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d774 u1D774               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d775 u1D775               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d776 u1D776               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d777 u1D777               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d778 u1D778               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d779 u1D779               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d77a u1D77A               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d77b u1D77B               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d77c u1D77C               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d77d u1D77D               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d77e u1D77E               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d77f u1D77F               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d780 u1D780               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d781 u1D781               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d782 u1D782               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d783 u1D783               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d784 u1D784               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d785 u1D785               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d786 u1D786               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d787 u1D787               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d788 u1D788               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d789 u1D789               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d78a u1D78A               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d78b u1D78B               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d78c u1D78C               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d78d u1D78D               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d78e u1D78E               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d78f u1D78F               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d790 u1D790               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d791 u1D791               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d792 u1D792               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d793 u1D793               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d794 u1D794               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d795 u1D795               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d796 u1D796               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d797 u1D797               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d798 u1D798               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d799 u1D799               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d79a u1D79A               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d79b u1D79B               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d79c u1D79C               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d79d u1D79D               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d79e u1D79E               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d79f u1D79F               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7a0 u1D7A0               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7a1 u1D7A1               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7a2 u1D7A2               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7a3 u1D7A3               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7a4 u1D7A4               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7a5 u1D7A5               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7a6 u1D7A6               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7a7 u1D7A7               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7a8 u1D7A8               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7a9 u1D7A9               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7aa u1D7AA               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7ab u1D7AB               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7ac u1D7AC               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7ad u1D7AD               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7ae u1D7AE               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7af u1D7AF               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7b0 u1D7B0               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7b1 u1D7B1               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7b2 u1D7B2               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7b3 u1D7B3               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7b4 u1D7B4               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7b5 u1D7B5               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7b6 u1D7B6               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7b7 u1D7B7               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7b8 u1D7B8               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7b9 u1D7B9               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7ba u1D7BA               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7bb u1D7BB               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7bc u1D7BC               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7bd u1D7BD               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7be u1D7BE               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7bf u1D7BF               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7c0 u1D7C0               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7c1 u1D7C1               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7c2 u1D7C2               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7c3 u1D7C3               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7c4 u1D7C4               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7c5 u1D7C5               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7c6 u1D7C6               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7c7 u1D7C7               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7c8 u1D7C8               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7c9 u1D7C9               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7ca u1D7CA               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7cb u1D7CB               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7ce u1D7CE               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7cf u1D7CF               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7d0 u1D7D0               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7d1 u1D7D1               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7d2 u1D7D2               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7d3 u1D7D3               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7d4 u1D7D4               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7d5 u1D7D5               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7d6 u1D7D6               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7d7 u1D7D7               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7d8 u1D7D8               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+1d7d9 u1D7D9               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+1d7da u1D7DA               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+1d7db u1D7DB               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+1d7dc u1D7DC               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+1d7dd u1D7DD               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+1d7de u1D7DE               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+1d7df u1D7DF               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+1d7e0 u1D7E0               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+1d7e1 u1D7E1               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+1d7e2 u1D7E2               2.23 (Sans, Sans Condensed)
+U+1d7e3 u1D7E3               2.23 (Sans, Sans Condensed)
+U+1d7e4 u1D7E4               2.23 (Sans, Sans Condensed)
+U+1d7e5 u1D7E5               2.23 (Sans, Sans Condensed)
+U+1d7e6 u1D7E6               2.23 (Sans, Sans Condensed)
+U+1d7e7 u1D7E7               2.23 (Sans, Sans Condensed)
+U+1d7e8 u1D7E8               2.23 (Sans, Sans Condensed)
+U+1d7e9 u1D7E9               2.23 (Sans, Sans Condensed)
+U+1d7ea u1D7EA               2.23 (Sans, Sans Condensed)
+U+1d7eb u1D7EB               2.23 (Sans, Sans Condensed)
+U+1d7ec u1D7EC               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d7ed u1D7ED               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d7ee u1D7EE               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d7ef u1D7EF               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d7f0 u1D7F0               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d7f1 u1D7F1               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d7f2 u1D7F2               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d7f3 u1D7F3               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d7f4 u1D7F4               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d7f5 u1D7F5               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d7f6 u1D7F6               2.23 (Sans Mono)
+U+1d7f7 u1D7F7               2.23 (Sans Mono)
+U+1d7f8 u1D7F8               2.23 (Sans Mono)
+U+1d7f9 u1D7F9               2.23 (Sans Mono)
+U+1d7fa u1D7FA               2.23 (Sans Mono)
+U+1d7fb u1D7FB               2.23 (Sans Mono)
+U+1d7fc u1D7FC               2.23 (Sans Mono)
+U+1d7fd u1D7FD               2.23 (Sans Mono)
+U+1d7fe u1D7FE               2.23 (Sans Mono)
+U+1d7ff u1D7FF               2.23 (Sans Mono)
+U+1f030 u1F030               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f031 u1F031               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f032 u1F032               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f033 u1F033               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f034 u1F034               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f035 u1F035               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f036 u1F036               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f037 u1F037               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f038 u1F038               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f039 u1F039               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f03a u1F03A               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f03b u1F03B               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f03c u1F03C               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f03d u1F03D               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f03e u1F03E               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f03f u1F03F               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f040 u1F040               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f041 u1F041               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f042 u1F042               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f043 u1F043               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f044 u1F044               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f045 u1F045               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f046 u1F046               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f047 u1F047               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f048 u1F048               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f049 u1F049               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f04a u1F04A               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f04b u1F04B               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f04c u1F04C               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f04d u1F04D               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f04e u1F04E               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f04f u1F04F               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f050 u1F050               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f051 u1F051               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f052 u1F052               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f053 u1F053               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f054 u1F054               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f055 u1F055               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f056 u1F056               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f057 u1F057               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f058 u1F058               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f059 u1F059               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f05a u1F05A               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f05b u1F05B               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f05c u1F05C               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f05d u1F05D               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f05e u1F05E               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f05f u1F05F               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f060 u1F060               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f061 u1F061               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f062 u1F062               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f063 u1F063               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f064 u1F064               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f065 u1F065               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f066 u1F066               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f067 u1F067               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f068 u1F068               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f069 u1F069               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f06a u1F06A               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f06b u1F06B               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f06c u1F06C               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f06d u1F06D               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f06e u1F06E               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f06f u1F06F               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f070 u1F070               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f071 u1F071               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f072 u1F072               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f073 u1F073               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f074 u1F074               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f075 u1F075               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f076 u1F076               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f077 u1F077               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f078 u1F078               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f079 u1F079               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f07a u1F07A               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f07b u1F07B               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f07c u1F07C               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f07d u1F07D               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f07e u1F07E               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f07f u1F07F               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f080 u1F080               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f081 u1F081               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f082 u1F082               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f083 u1F083               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f084 u1F084               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f085 u1F085               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f086 u1F086               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f087 u1F087               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f088 u1F088               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f089 u1F089               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f08a u1F08A               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f08b u1F08B               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f08c u1F08C               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f08d u1F08D               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f08e u1F08E               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f08f u1F08F               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f090 u1F090               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f091 u1F091               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f092 u1F092               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f093 u1F093               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0a0 u1F0A0               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0a1 u1F0A1               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0a2 u1F0A2               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0a3 u1F0A3               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0a4 u1F0A4               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0a5 u1F0A5               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0a6 u1F0A6               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0a7 u1F0A7               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0a8 u1F0A8               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0a9 u1F0A9               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0aa u1F0AA               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0ab u1F0AB               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0ac u1F0AC               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0ad u1F0AD               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0ae u1F0AE               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0b1 u1F0B1               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0b2 u1F0B2               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0b3 u1F0B3               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0b4 u1F0B4               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0b5 u1F0B5               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0b6 u1F0B6               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0b7 u1F0B7               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0b8 u1F0B8               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0b9 u1F0B9               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0ba u1F0BA               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0bb u1F0BB               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0bc u1F0BC               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0bd u1F0BD               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0be u1F0BE               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0c1 u1F0C1               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0c2 u1F0C2               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0c3 u1F0C3               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0c4 u1F0C4               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0c5 u1F0C5               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0c6 u1F0C6               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0c7 u1F0C7               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0c8 u1F0C8               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0c9 u1F0C9               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0ca u1F0CA               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0cb u1F0CB               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0cc u1F0CC               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0cd u1F0CD               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0ce u1F0CE               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0cf u1F0CF               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0d1 u1F0D1               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0d2 u1F0D2               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0d3 u1F0D3               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0d4 u1F0D4               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0d5 u1F0D5               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0d6 u1F0D6               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0d7 u1F0D7               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0d8 u1F0D8               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0d9 u1F0D9               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0da u1F0DA               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0db u1F0DB               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0dc u1F0DC               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0dd u1F0DD               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0de u1F0DE               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0df u1F0DF               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f42d u1F42D               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f42e u1F42E               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f431 u1F431               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f435 u1F435               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f601 u1F601               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f602 u1F602               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f603 u1F603               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f604 u1F604               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f605 u1F605               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f606 u1F606               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f607 u1F607               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f608 u1F608               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f609 u1F609               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f60a u1F60A               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f60b u1F60B               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f60c u1F60C               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f60d u1F60D               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f60e u1F60E               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f60f u1F60F               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f610 u1F610               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f612 u1F612               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f613 u1F613               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f614 u1F614               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f616 u1F616               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f618 u1F618               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f61a u1F61A               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f61c u1F61C               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f61d u1F61D               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f61e u1F61E               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f620 u1F620               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f621 u1F621               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f622 u1F622               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f623 u1F623               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f625 u1F625               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f628 u1F628               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f629 u1F629               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f62a u1F62A               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f62b u1F62B               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f62d u1F62D               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f630 u1F630               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f631 u1F631               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f632 u1F632               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f633 u1F633               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f635 u1F635               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f636 u1F636               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f637 u1F637               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f638 u1F638               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f639 u1F639               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f63a u1F63A               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f63b u1F63B               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f63c u1F63C               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f63d u1F63D               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f63e u1F63E               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f63f u1F63F               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f640 u1F640               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSans-Bold.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSans-Bold.ttf
new file mode 100644
index 0000000..0f4d5e9
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSans-Bold.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSans-BoldOblique.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSans-BoldOblique.ttf
new file mode 100644
index 0000000..48f06a8
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSans-BoldOblique.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSans-ExtraLight.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSans-ExtraLight.ttf
new file mode 100644
index 0000000..01a5652
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSans-ExtraLight.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSans-Oblique.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSans-Oblique.ttf
new file mode 100644
index 0000000..4485638
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSans-Oblique.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSans.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSans.ttf
new file mode 100644
index 0000000..27cff47
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSans.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansCondensed-Bold.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansCondensed-Bold.ttf
new file mode 100644
index 0000000..9edd89c
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansCondensed-Bold.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansCondensed-BoldOblique.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansCondensed-BoldOblique.ttf
new file mode 100644
index 0000000..e2db5ce
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansCondensed-BoldOblique.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansCondensed-Oblique.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansCondensed-Oblique.ttf
new file mode 100644
index 0000000..7cec04c
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansCondensed-Oblique.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansCondensed.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansCondensed.ttf
new file mode 100644
index 0000000..826e619
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansCondensed.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansMono-Bold.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansMono-Bold.ttf
new file mode 100644
index 0000000..09d4279
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansMono-Bold.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansMono-BoldOblique.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansMono-BoldOblique.ttf
new file mode 100644
index 0000000..0344c22
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansMono-BoldOblique.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansMono-Oblique.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansMono-Oblique.ttf
new file mode 100644
index 0000000..bc16d51
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansMono-Oblique.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansMono.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansMono.ttf
new file mode 100644
index 0000000..7260bd6
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSansMono.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerif-Bold.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerif-Bold.ttf
new file mode 100644
index 0000000..afa2d5e
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerif-Bold.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerif-BoldItalic.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerif-BoldItalic.ttf
new file mode 100644
index 0000000..ce9443e
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerif-BoldItalic.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerif-Italic.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerif-Italic.ttf
new file mode 100644
index 0000000..c1864a3
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerif-Italic.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerif.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerif.ttf
new file mode 100644
index 0000000..ed53a29
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerif.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerifCondensed-Bold.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerifCondensed-Bold.ttf
new file mode 100644
index 0000000..55adca4
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerifCondensed-Bold.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerifCondensed-BoldItalic.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerifCondensed-BoldItalic.ttf
new file mode 100644
index 0000000..e211957
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerifCondensed-BoldItalic.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerifCondensed-Italic.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerifCondensed-Italic.ttf
new file mode 100644
index 0000000..275b26d
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerifCondensed-Italic.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerifCondensed.ttf b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerifCondensed.ttf
new file mode 100644
index 0000000..83120cd
Binary files /dev/null and b/fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSerifCondensed.ttf differ
diff --git a/fonts/dejavu-fonts-ttf-2.33/unicover.txt b/fonts/dejavu-fonts-ttf-2.33/unicover.txt
new file mode 100644
index 0000000..42c2122
--- /dev/null
+++ b/fonts/dejavu-fonts-ttf-2.33/unicover.txt
@@ -0,0 +1,215 @@
+This is the Unicode coverage file for DejaVu fonts
+($Id$)
+
+Control and similar characters are discounted from totals.
+
+                                                Sans               Serif              Sans Mono          
+U+0000 Basic Latin                              100% (95/95)       100% (95/95)       100% (95/95)      
+U+0080 Latin-1 Supplement                       100% (96/96)       100% (96/96)       100% (96/96)      
+U+0100 Latin Extended-A                         100% (128/128)     100% (128/128)     100% (128/128)    
+U+0180 Latin Extended-B                         100% (208/208)     100% (208/208)      86% (180/208)    
+U+0250 IPA Extensions                           100% (96/96)       100% (96/96)       100% (96/96)      
+U+02b0 Spacing Modifier Letters                  78% (63/80)        57% (46/80)        60% (48/80)      
+U+0300 Combining Diacritical Marks               83% (93/112)       60% (68/112)       59% (67/112)     
+U+0370 Greek and Coptic                         100% (134/134)      89% (120/134)      82% (110/134)    
+U+0400 Cyrillic                                 100% (256/256)      78% (200/256)      70% (180/256)    
+U+0500 Cyrillic Supplement                       95% (38/40)        25% (10/40)        15% (6/40)       
+U+0530 Armenian                                 100% (86/86)       100% (86/86)       100% (86/86)      
+U+0590 Hebrew                                    62% (54/87)            (0/87)             (0/87)       
+U+0600 Arabic                                    63% (161/252)          (0/252)        39% (99/252)     
+U+0700 Syriac                                        (0/77)             (0/77)             (0/77)       
+U+0750 Arabic Supplement                             (0/48)             (0/48)             (0/48)       
+U+0780 Thaana                                        (0/50)             (0/50)             (0/50)       
+U+07c0 NKo                                       91% (54/59)            (0/59)             (0/59)       
+U+0800 Samaritan                                     (0/61)             (0/61)             (0/61)       
+U+0840 Mandaic                                       (0/29)             (0/29)             (0/29)       
+U+0900 Devanagari                                    (0/127)            (0/127)            (0/127)      
+U+0980 Bengali                                       (0/92)             (0/92)             (0/92)       
+U+0a00 Gurmukhi                                      (0/79)             (0/79)             (0/79)       
+U+0a80 Gujarati                                      (0/83)             (0/83)             (0/83)       
+U+0b00 Oriya                                         (0/90)             (0/90)             (0/90)       
+U+0b80 Tamil                                         (0/72)             (0/72)             (0/72)       
+U+0c00 Telugu                                        (0/93)             (0/93)             (0/93)       
+U+0c80 Kannada                                       (0/86)             (0/86)             (0/86)       
+U+0d00 Malayalam                                     (0/98)             (0/98)             (0/98)       
+U+0d80 Sinhala                                       (0/80)             (0/80)             (0/80)       
+U+0e00 Thai                                       1% (1/87)             (0/87)             (0/87)       
+U+0e80 Lao                                      100% (65/65)            (0/65)         70% (46/65)      
+U+0f00 Tibetan                                       (0/211)            (0/211)            (0/211)      
+U+1000 Myanmar                                       (0/160)            (0/160)            (0/160)      
+U+10a0 Georgian                                 100% (83/83)       100% (83/83)        54% (45/83)      
+U+1100 Hangul Jamo                                   (0/256)            (0/256)            (0/256)      
+U+1200 Ethiopic                                      (0/358)            (0/358)            (0/358)      
+U+1380 Ethiopic Supplement                           (0/26)             (0/26)             (0/26)       
+U+13a0 Cherokee                                      (0/85)             (0/85)             (0/85)       
+U+1400 Unified Canadian Aboriginal Syllabics     63% (404/640)          (0/640)            (0/640)      
+U+1680 Ogham                                    100% (29/29)            (0/29)             (0/29)       
+U+16a0 Runic                                         (0/81)             (0/81)             (0/81)       
+U+1700 Tagalog                                       (0/20)             (0/20)             (0/20)       
+U+1720 Hanunoo                                       (0/23)             (0/23)             (0/23)       
+U+1740 Buhid                                         (0/20)             (0/20)             (0/20)       
+U+1760 Tagbanwa                                      (0/18)             (0/18)             (0/18)       
+U+1780 Khmer                                         (0/114)            (0/114)            (0/114)      
+U+1800 Mongolian                                     (0/156)            (0/156)            (0/156)      
+U+18b0 Unified Canadian Aboriginal Syllabics Extended      (0/70)             (0/70)             (0/70)       
+U+1900 Limbu                                         (0/66)             (0/66)             (0/66)       
+U+1950 Tai Le                                        (0/35)             (0/35)             (0/35)       
+U+1980 New Tai Lue                                   (0/83)             (0/83)             (0/83)       
+U+19e0 Khmer Symbols                                 (0/32)             (0/32)             (0/32)       
+U+1a00 Buginese                                      (0/30)             (0/30)             (0/30)       
+U+1a20 Tai Tham                                      (0/127)            (0/127)            (0/127)      
+U+1b00 Balinese                                      (0/121)            (0/121)            (0/121)      
+U+1b80 Sundanese                                     (0/55)             (0/55)             (0/55)       
+U+1bc0 Batak                                         (0/56)             (0/56)             (0/56)       
+U+1c00 Lepcha                                        (0/74)             (0/74)             (0/74)       
+U+1c50 Ol Chiki                                      (0/48)             (0/48)             (0/48)       
+U+1cd0 Vedic Extensions                              (0/35)             (0/35)             (0/35)       
+U+1d00 Phonetic Extensions                       82% (106/128)      86% (111/128)      48% (62/128)     
+U+1d80 Phonetic Extensions Supplement            59% (38/64)        59% (38/64)        57% (37/64)      
+U+1dc0 Combining Diacritical Marks Supplement    13% (6/43)         13% (6/43)             (0/43)       
+U+1e00 Latin Extended Additional                 98% (252/256)      98% (252/256)      71% (182/256)    
+U+1f00 Greek Extended                           100% (233/233)     100% (233/233)     100% (233/233)    
+U+2000 General Punctuation                      100% (107/107)      81% (87/107)       48% (52/107)     
+U+2070 Superscripts and Subscripts              100% (42/42)       100% (42/42)       100% (42/42)      
+U+20a0 Currency Symbols                          92% (24/26)        26% (7/26)         92% (24/26)      
+U+20d0 Combining Diacritical Marks for Symbols   21% (7/33)             (0/33)             (0/33)       
+U+2100 Letterlike Symbols                        93% (75/80)        40% (32/80)        21% (17/80)      
+U+2150 Number Forms                              94% (55/58)        94% (55/58)        22% (13/58)      
+U+2190 Arrows                                   100% (112/112)     100% (112/112)     100% (112/112)    
+U+2200 Mathematical Operators                   100% (256/256)      39% (100/256)      62% (159/256)    
+U+2300 Miscellaneous Technical                   26% (65/244)       14% (35/244)       47% (117/244)    
+U+2400 Control Pictures                           5% (2/39)          2% (1/39)          2% (1/39)       
+U+2440 Optical Character Recognition                 (0/11)             (0/11)             (0/11)       
+U+2460 Enclosed Alphanumerics                     6% (10/160)           (0/160)            (0/160)      
+U+2500 Box Drawing                              100% (128/128)     100% (128/128)     100% (128/128)    
+U+2580 Block Elements                           100% (32/32)       100% (32/32)       100% (32/32)      
+U+25a0 Geometric Shapes                         100% (96/96)       100% (96/96)       100% (96/96)      
+U+2600 Miscellaneous Symbols                     73% (187/256)      11% (30/256)       58% (149/256)    
+U+2700 Dingbats                                  91% (174/191)       0% (1/191)        75% (144/191)    
+U+27c0 Miscellaneous Mathematical Symbols-A      19% (9/46)         10% (5/46)         10% (5/46)       
+U+27f0 Supplemental Arrows-A                    100% (16/16)       100% (16/16)            (0/16)       
+U+2800 Braille Patterns                         100% (256/256)     100% (256/256)          (0/256)      
+U+2900 Supplemental Arrows-B                      4% (6/128)       100% (128/128)          (0/128)      
+U+2980 Miscellaneous Mathematical Symbols-B      10% (13/128)        0% (1/128)         2% (3/128)      
+U+2a00 Supplemental Mathematical Operators       28% (72/256)        1% (4/256)         0% (1/256)      
+U+2b00 Miscellaneous Symbols and Arrows          40% (35/87)        31% (27/87)        10% (9/87)       
+U+2c00 Glagolitic                                    (0/94)             (0/94)             (0/94)       
+U+2c60 Latin Extended-C                          96% (31/32)        81% (26/32)        43% (14/32)      
+U+2c80 Coptic                                        (0/121)            (0/121)            (0/121)      
+U+2d00 Georgian Supplement                           (0/38)        100% (38/38)            (0/38)       
+U+2d30 Tifinagh                                  96% (55/57)            (0/57)             (0/57)       
+U+2d80 Ethiopic Extended                             (0/79)             (0/79)             (0/79)       
+U+2de0 Cyrillic Extended-A                           (0/32)             (0/32)             (0/32)       
+U+2e00 Supplemental Punctuation                  12% (6/50)         12% (6/50)         12% (6/50)       
+U+2e80 CJK Radicals Supplement                       (0/115)            (0/115)            (0/115)      
+U+2f00 Kangxi Radicals                               (0/214)            (0/214)            (0/214)      
+U+2ff0 Ideographic Description Characters            (0/12)             (0/12)             (0/12)       
+U+3000 CJK Symbols and Punctuation                   (0/64)             (0/64)             (0/64)       
+U+3040 Hiragana                                      (0/93)             (0/93)             (0/93)       
+U+30a0 Katakana                                      (0/96)             (0/96)             (0/96)       
+U+3100 Bopomofo                                      (0/41)             (0/41)             (0/41)       
+U+3130 Hangul Compatibility Jamo                     (0/94)             (0/94)             (0/94)       
+U+3190 Kanbun                                        (0/16)             (0/16)             (0/16)       
+U+31a0 Bopomofo Extended                             (0/27)             (0/27)             (0/27)       
+U+31c0 CJK Strokes                                   (0/36)             (0/36)             (0/36)       
+U+31f0 Katakana Phonetic Extensions                  (0/16)             (0/16)             (0/16)       
+U+3200 Enclosed CJK Letters and Months               (0/254)            (0/254)            (0/254)      
+U+3300 CJK Compatibility                             (0/256)            (0/256)            (0/256)      
+U+3400 CJK Unified Ideographs Extension A            (0/0)              (0/0)              (0/0)        
+U+4dc0 Yijing Hexagram Symbols                  100% (64/64)            (0/64)             (0/64)       
+U+4e00 CJK Unified Ideographs                        (0/0)              (0/0)              (0/0)        
+U+a000 Yi Syllables                                  (0/1165)           (0/1165)           (0/1165)     
+U+a490 Yi Radicals                                   (0/55)             (0/55)             (0/55)       
+U+a4d0 Lisu                                          (0/48)             (0/48)             (0/48)       
+U+a500 Vai                                           (0/300)            (0/300)            (0/300)      
+U+a640 Cyrillic Extended-B                       38% (31/80)        12% (10/80)            (0/80)       
+U+a6a0 Bamum                                         (0/88)             (0/88)             (0/88)       
+U+a700 Modifier Tone Letters                     62% (20/32)        62% (20/32)        62% (20/32)      
+U+a720 Latin Extended-D                          48% (62/129)       42% (55/129)       10% (14/129)     
+U+a800 Syloti Nagri                                  (0/44)             (0/44)             (0/44)       
+U+a830 Common Indic Number Forms                     (0/10)             (0/10)             (0/10)       
+U+a840 Phags-pa                                      (0/56)             (0/56)             (0/56)       
+U+a880 Saurashtra                                    (0/81)             (0/81)             (0/81)       
+U+a8e0 Devanagari Extended                           (0/28)             (0/28)             (0/28)       
+U+a900 Kayah Li                                      (0/48)             (0/48)             (0/48)       
+U+a930 Rejang                                        (0/37)             (0/37)             (0/37)       
+U+a960 Hangul Jamo Extended-A                        (0/29)             (0/29)             (0/29)       
+U+a980 Javanese                                      (0/91)             (0/91)             (0/91)       
+U+aa00 Cham                                          (0/83)             (0/83)             (0/83)       
+U+aa60 Myanmar Extended-A                            (0/28)             (0/28)             (0/28)       
+U+aa80 Tai Viet                                      (0/72)             (0/72)             (0/72)       
+U+ab00 Ethiopic Extended-A                           (0/33)             (0/33)             (0/33)       
+U+abc0 Meetei Mayek                                  (0/56)             (0/56)             (0/56)       
+U+ac00 Hangul Syllables                              (0/0)              (0/0)              (0/0)        
+U+d7b0 Hangul Jamo Extended-B                        (0/72)             (0/72)             (0/72)       
+U+d800 High Surrogates                               (0/0)              (0/0)              (0/0)        
+U+db80 High Private Use Surrogates                   (0/0)              (0/0)              (0/0)        
+U+dc00 Low Surrogates                                (0/0)              (0/0)              (0/0)        
+U+e000 Private Use Area                              (0/0)              (0/0)              (0/0)        
+U+f900 CJK Compatibility Ideographs                  (0/470)            (0/470)            (0/470)      
+U+fb00 Alphabetic Presentation Forms            100% (58/58)        12% (7/58)          3% (2/58)       
+U+fb50 Arabic Presentation Forms-A               16% (98/611)           (0/611)        11% (72/611)     
+U+fe00 Variation Selectors                      100% (16/16)       100% (16/16)            (0/16)       
+U+fe10 Vertical Forms                                (0/10)             (0/10)             (0/10)       
+U+fe20 Combining Half Marks                      57% (4/7)              (0/7)              (0/7)        
+U+fe30 CJK Compatibility Forms                       (0/32)             (0/32)             (0/32)       
+U+fe50 Small Form Variants                           (0/26)             (0/26)             (0/26)       
+U+fe70 Arabic Presentation Forms-B              100% (141/141)          (0/141)       100% (141/141)    
+U+ff00 Halfwidth and Fullwidth Forms                 (0/225)            (0/225)            (0/225)      
+U+fff0 Specials                                 100% (5/5)         100% (5/5)         100% (5/5)        
+U+10000 Linear B Syllabary                            (0/88)             (0/88)             (0/88)       
+U+10080 Linear B Ideograms                            (0/123)            (0/123)            (0/123)      
+U+10100 Aegean Numbers                                (0/57)             (0/57)             (0/57)       
+U+10140 Ancient Greek Numbers                         (0/75)             (0/75)             (0/75)       
+U+10190 Ancient Symbols                               (0/12)             (0/12)             (0/12)       
+U+101d0 Phaistos Disc                                 (0/46)             (0/46)             (0/46)       
+U+10280 Lycian                                        (0/29)             (0/29)             (0/29)       
+U+102a0 Carian                                        (0/49)             (0/49)             (0/49)       
+U+10300 Old Italic                               100% (35/35)            (0/35)             (0/35)       
+U+10330 Gothic                                        (0/27)             (0/27)             (0/27)       
+U+10380 Ugaritic                                      (0/31)             (0/31)             (0/31)       
+U+103a0 Old Persian                                   (0/50)             (0/50)             (0/50)       
+U+10400 Deseret                                       (0/80)             (0/80)             (0/80)       
+U+10450 Shavian                                       (0/48)             (0/48)             (0/48)       
+U+10480 Osmanya                                       (0/40)             (0/40)             (0/40)       
+U+10800 Cypriot Syllabary                             (0/55)             (0/55)             (0/55)       
+U+10840 Imperial Aramaic                              (0/31)             (0/31)             (0/31)       
+U+10900 Phoenician                                    (0/29)             (0/29)             (0/29)       
+U+10920 Lydian                                        (0/27)             (0/27)             (0/27)       
+U+10a00 Kharoshthi                                    (0/65)             (0/65)             (0/65)       
+U+10a60 Old South Arabian                             (0/32)             (0/32)             (0/32)       
+U+10b00 Avestan                                       (0/61)             (0/61)             (0/61)       
+U+10b40 Inscriptional Parthian                        (0/30)             (0/30)             (0/30)       
+U+10b60 Inscriptional Pahlavi                         (0/27)             (0/27)             (0/27)       
+U+10c00 Old Turkic                                    (0/73)             (0/73)             (0/73)       
+U+10e60 Rumi Numeral Symbols                          (0/31)             (0/31)             (0/31)       
+U+11000 Brahmi                                        (0/108)            (0/108)            (0/108)      
+U+11080 Kaithi                                        (0/66)             (0/66)             (0/66)       
+U+12000 Cuneiform                                     (0/879)            (0/879)            (0/879)      
+U+12400 Cuneiform Numbers and Punctuation             (0/103)            (0/103)            (0/103)      
+U+13000 Egyptian Hieroglyphs                          (0/1071)           (0/1071)           (0/1071)     
+U+16800 Bamum Supplement                              (0/569)            (0/569)            (0/569)      
+U+1b000 Kana Supplement                               (0/2)              (0/2)              (0/2)        
+U+1d000 Byzantine Musical Symbols                     (0/246)            (0/246)            (0/246)      
+U+1d100 Musical Symbols                               (0/220)            (0/220)            (0/220)      
+U+1d200 Ancient Greek Musical Notation                (0/70)             (0/70)             (0/70)       
+U+1d300 Tai Xuan Jing Symbols                    100% (87/87)            (0/87)             (0/87)       
+U+1d360 Counting Rod Numerals                         (0/18)             (0/18)             (0/18)       
+U+1d400 Mathematical Alphanumeric Symbols         11% (117/996)       5% (55/996)        6% (62/996)     
+U+1f000 Mahjong Tiles                                 (0/44)             (0/44)             (0/44)       
+U+1f030 Domino Tiles                             100% (100/100)          (0/100)            (0/100)      
+U+1f0a0 Playing Cards                            100% (59/59)            (0/59)             (0/59)       
+U+1f100 Enclosed Alphanumeric Supplement              (0/169)            (0/169)            (0/169)      
+U+1f200 Enclosed Ideographic Supplement               (0/57)             (0/57)             (0/57)       
+U+1f300 Miscellaneous Symbols And Pictographs      0% (4/529)            (0/529)            (0/529)      
+U+1f600 Emoticons                                 80% (51/63)            (0/63)             (0/63)       
+U+1f680 Transport And Map Symbols                     (0/70)             (0/70)             (0/70)       
+U+1f700 Alchemical Symbols                            (0/116)            (0/116)            (0/116)      
+U+20000 CJK Unified Ideographs Extension B            (0/0)              (0/0)              (0/0)        
+U+2a700 CJK Unified Ideographs Extension C            (0/0)              (0/0)              (0/0)        
+U+2b740 CJK Unified Ideographs Extension D            (0/0)              (0/0)              (0/0)        
+U+2f800 CJK Compatibility Ideographs Supplement       (0/542)            (0/542)            (0/542)      
+U+e0000 Tags                                          (0/98)             (0/98)             (0/98)       
+U+e0100 Variation Selectors Supplement                (0/240)            (0/240)            (0/240)      
+U+f0000 Supplementary Private Use Area-A              (0/0)              (0/0)              (0/0)        
+U+100000 Supplementary Private Use Area-B              (0/0)              (0/0)              (0/0)        
diff --git a/include/mapnik/agg_pattern_source.hpp b/include/mapnik/agg_pattern_source.hpp
new file mode 100644
index 0000000..1a9046d
--- /dev/null
+++ b/include/mapnik/agg_pattern_source.hpp
@@ -0,0 +1,64 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#ifndef MAPNIK_AGG_PATTERN_SOURCE_HPP
+#define MAPNIK_AGG_PATTERN_SOURCE_HPP
+
+// mapnik
+#include <mapnik/image_data.hpp>
+// boost
+#include <boost/utility.hpp>
+// agg
+#include "agg_color_rgba.h"
+
+namespace mapnik
+{
+
+class pattern_source : private boost::noncopyable
+{
+public:
+    pattern_source(image_data_32 const& pattern)
+        : pattern_(pattern) {}
+
+    unsigned int width() const
+    {
+        return pattern_.width();
+    }
+    unsigned int height() const
+    {
+        return pattern_.height();
+    }
+    agg::rgba8 pixel(int x, int y) const
+    {
+        unsigned c = pattern_(x,y);
+        return agg::rgba8(c & 0xff,
+                          (c >> 8) & 0xff,
+                          (c >> 16) & 0xff,
+                          (c >> 24) & 0xff);
+    }
+private:
+    image_data_32 const& pattern_;
+};
+}
+
+#endif //MAPNIK_AGG_PATTERN_SOURCE_HPP
diff --git a/include/mapnik/agg_rasterizer.hpp b/include/mapnik/agg_rasterizer.hpp
new file mode 100644
index 0000000..44ee4ee
--- /dev/null
+++ b/include/mapnik/agg_rasterizer.hpp
@@ -0,0 +1,36 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#ifndef MAPNIK_AGG_RASTERIZER_HPP
+#define MAPNIK_AGG_RASTERIZER_HPP
+
+#include <boost/utility.hpp>
+#include "agg_rasterizer_scanline_aa.h"
+
+namespace mapnik {
+
+struct rasterizer :  agg::rasterizer_scanline_aa<>, boost::noncopyable {};
+
+}
+
+#endif //MAPNIK_AGG_RASTERIZER_HPP
diff --git a/include/mapnik/agg_renderer.hpp b/include/mapnik/agg_renderer.hpp
index b8fb7f8..08a48d4 100644
--- a/include/mapnik/agg_renderer.hpp
+++ b/include/mapnik/agg_renderer.hpp
@@ -32,67 +32,99 @@
 #include <mapnik/label_collision_detector.hpp>
 #include <mapnik/placement_finder.hpp>
 #include <mapnik/map.hpp>
+//#include <mapnik/marker.hpp>
+
+// agg
+//#include "agg_trans_affine.h"
 
 // boost
 #include <boost/utility.hpp>
 #include <boost/scoped_ptr.hpp>
-   
+
+// FIXME
+// forward declare so that
+// apps using mapnik do not
+// need agg headers
+namespace agg {
+  struct trans_affine;
+}
+
 namespace mapnik {
+
+class marker;
    
-   struct rasterizer;
+struct rasterizer;
    
-   template <typename T>
-   class MAPNIK_DECL agg_renderer : public feature_style_processor<agg_renderer<T> >,
-                                    private boost::noncopyable
-   {
+template <typename T>
+class MAPNIK_DECL agg_renderer : public feature_style_processor<agg_renderer<T> >,
+                                 private boost::noncopyable
+{
      
-     public:
-      agg_renderer(Map const& m, T & pixmap, unsigned offset_x=0, unsigned offset_y=0);
-      ~agg_renderer();
-      void start_map_processing(Map const& map);
-      void end_map_processing(Map const& map);
-      void start_layer_processing(Layer const& lay);
-      void end_layer_processing(Layer const& lay);
-      void process(point_symbolizer const& sym,
-                   Feature const& feature,
-                   proj_transform const& prj_trans);
-      void process(line_symbolizer const& sym,
-                   Feature const& feature,
-                   proj_transform const& prj_trans);
-      void process(line_pattern_symbolizer const& sym,
-                   Feature const& feature,
-                   proj_transform const& prj_trans);
-      void process(polygon_symbolizer const& sym,
-                   Feature const& feature,
-                   proj_transform const& prj_trans);
-      void process(polygon_pattern_symbolizer const& sym,
-                   Feature const& feature,
-                   proj_transform const& prj_trans);
-      void process(raster_symbolizer const& sym,
-                   Feature const& feature,
-                   proj_transform const& prj_trans);
-      void process(shield_symbolizer const& sym,
-                   Feature const& feature,
-                   proj_transform const& prj_trans);
-      void process(text_symbolizer const& sym,
-                   Feature const& feature,
-                   proj_transform const& prj_trans);
-      void process(building_symbolizer const& sym,
-                   Feature const& feature,
-                   proj_transform const& prj_trans);
-      void process(markers_symbolizer const& sym,
-                   Feature const& feature,
-                   proj_transform const& prj_trans);
-     private:
-      T & pixmap_;
-      unsigned width_;
-      unsigned height_;
-      CoordTransform t_;
-      freetype_engine font_engine_;
-      face_manager<freetype_engine> font_manager_;
-      label_collision_detector4 detector_;
-      boost::scoped_ptr<rasterizer> ras_ptr;
-   };
+public:
+    agg_renderer(Map const& m, T & pixmap, double scale_factor=1.0, unsigned offset_x=0, unsigned offset_y=0);
+    ~agg_renderer();
+    void start_map_processing(Map const& map);
+    void end_map_processing(Map const& map);
+    void start_layer_processing(layer const& lay);
+    void end_layer_processing(layer const& lay);
+    void render_marker(const int x, const int y, marker &marker, const agg::trans_affine & tr, double opacity);
+
+    void process(point_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(line_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(line_pattern_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(polygon_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(polygon_pattern_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(raster_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(shield_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(text_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(building_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(markers_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(glyph_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);    
+    inline bool process(rule::symbolizers const& /*syms*/,
+                        Feature const& /*feature*/,
+                        proj_transform const& /*prj_trans*/)
+    {
+        // agg renderer doesn't support processing of multiple symbolizers.
+        return false;
+    };
+    void painted(bool painted)
+    {
+        pixmap_.painted(painted);
+    }
+
+private:
+    T & pixmap_;
+    unsigned width_;
+    unsigned height_;
+    double scale_factor_;
+    CoordTransform t_;
+    freetype_engine font_engine_;
+    face_manager<freetype_engine> font_manager_;
+    label_collision_detector4 detector_;
+    boost::scoped_ptr<rasterizer> ras_ptr;
+};
 }
 
 #endif //AGG_RENDERER_HPP
diff --git a/include/mapnik/arrow.hpp b/include/mapnik/arrow.hpp
index 57176ad..d070427 100644
--- a/include/mapnik/arrow.hpp
+++ b/include/mapnik/arrow.hpp
@@ -25,23 +25,23 @@
 #ifndef ARROW_HPP
 #define ARROW_HPP
 
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 
 namespace mapnik {
 
-   class arrow
-   {
-      public:
-         arrow();
-         void rewind(unsigned path_id);
-         unsigned vertex(double* x, double* y);
-         Envelope<double> extent() const;   
-      private:
-         unsigned pos_;
-         double x_[7];
-         double y_[7];
-         unsigned cmd_[9];
-   };   
+class arrow
+{
+public:
+    arrow();
+    void rewind(unsigned path_id);
+    unsigned vertex(double* x, double* y);
+    box2d<double> extent() const;   
+private:
+    unsigned pos_;
+    double x_[7];
+    double y_[7];
+    unsigned cmd_[9];
+};   
 }
 
 #endif // ARROW_HPP
diff --git a/include/mapnik/attribute.hpp b/include/mapnik/attribute.hpp
index d7daaf0..7a34c30 100644
--- a/include/mapnik/attribute.hpp
+++ b/include/mapnik/attribute.hpp
@@ -2,7 +2,7 @@
  * 
  * This file is part of Mapnik (c++ mapping toolkit)
  *
- * Copyright (C) 2006 Artem Pavlenko
+ * Copyright (C) 2010 Artem Pavlenko
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -20,203 +20,28 @@
  *
  *****************************************************************************/
 
-//$Id: attribute.hpp 41 2005-04-13 20:21:56Z pavlenko $
+//$Id$
 
-#ifndef ATTRIBUTE_HPP
-#define ATTRIBUTE_HPP
+#ifndef MAPNIK_ATTRIBUTE_HPP
+#define MAPNIK_ATTRIBUTE_HPP
 
-// boost
-#include <boost/any.hpp>
-// stl
-#include <typeinfo>
-#include <sstream>
-#include <map>
+#include <string>
 
 namespace mapnik {
-    template <typename T>
-    struct attribute_traits
-    {
-        static std::string to_string(const T& value)
-        {
-            std::stringstream ss;
-            ss << value;
-            return ss.str();
-        }
-    };
 
-    template <>
-    struct attribute_traits<std::string>
-    {
-        static std::string to_string(const std::string& value)
-        {
-            return value;
-        }
-    };
+struct attribute
+{
+    std::string name_;
+    explicit attribute(std::string const& name)
+        : name_(name) {}
     
-    class MAPNIK_DECL attribute
-    {	
-    public:
-        attribute()
-            : base_(0) {}
-
-        template <typename T>
-        attribute(const T& value)
-            : base_(new attribute_impl<T>(value)) 
-        {}
-
-        attribute(const attribute& rhs)
-            : base_(rhs.base_ ? rhs.base_->clone() : 0)
-        {}
-
-        ~attribute() 
-        {
-            delete base_;
-        }
-
-        template<typename T>
-        attribute& operator=(const T& rhs)
-        {
-            attribute(rhs).swap(*this);
-            return *this;
-        }
-
-        attribute& operator=(const attribute& rhs)
-        {
-            attribute(rhs).swap(*this);
-            return *this;
-        }
-
-        bool empty() const
-        {
-            return !base_;
-        }
-
-        const std::type_info & type() const
-        {
-            return base_ ? base_->type() : typeid(void);
-        }
-
-        const std::string to_string() const
-        {
-            return base_ ? base_->to_string() : "";
-        }
-    private:
-        attribute& swap(attribute& rhs)
-        {
-            std::swap(base_,rhs.base_);
-            return *this;
-        }
-	
-        class attribute_base
-        {
-        public:
-            virtual ~attribute_base() {}
-            virtual attribute_base* clone() const=0;
-            virtual std::string to_string() const=0;
-            virtual const std::type_info& type()  const=0;
-        };
-
-        template <typename T,typename ATraits=attribute_traits<T> >
-        class attribute_impl : public attribute_base
-        {	    
-        public:
-            typedef T value_type;
-            attribute_impl(const value_type& value)
-                : value_(value) {}
-	    
-            virtual std::string to_string() const
-            {
-                return  ATraits::to_string(value_);
-            }
-	    
-            virtual attribute_base* clone() const
-            {
-                return new attribute_impl(value_);
-            }
-            virtual const std::type_info& type() const 
-            {
-                return typeid(value_);
-            }
-            value_type value_;
-        };
-    private:
-        template<typename value_type>
-        friend value_type* attribute_cast(attribute*);
-        attribute_base* base_;
-    };
-    
-    
-    template<typename T>
-    struct bad_attribute_cast : public std::bad_cast
-    {
-        virtual const char* what() const throw()
-        {
-            return "attribute::failed conversion";
-        }
-    };
-    
-    template <typename T> 
-    bool is_type(const attribute& attr)
-    {
-        return attr.type()==typeid(T);
-    }
-    
-    template <typename T>
-    T* attribute_cast(attribute* attr)
-    {
-        return attr && attr->type() == typeid(T)
-            ? &static_cast<attribute::attribute_impl<T>*>(attr->base_)->value_
-            : 0;
-    }
-
-    template <typename T>
-    const T* attribute_cast(const attribute* attr)
-    {
-        return attribute_cast<T>(const_cast<attribute*>(attr));
-    }
-    
-    template <typename T>
-    T attribute_cast(const attribute& attr)
-    {
-        using namespace boost;
-        typedef BOOST_DEDUCED_TYPENAME remove_reference<T>::type nonref;
-        const nonref * result=attribute_cast<nonref>(&attr);
-        if (!result)
-        {
-            throw bad_attribute_cast<T>();
-        }
-        return *result;
-    }
-    
-    template <typename T>
-    T attribute_cast(attribute& attr)
-    {
-        using namespace boost;
-        typedef BOOST_DEDUCED_TYPENAME remove_reference<T>::type nonref;
-        nonref * result=attribute_cast<nonref>(&attr);
-        if (!result)
-            throw bad_attribute_cast<T>();
-        return *result;
-    }
-    
-       
-    template <typename T>
-    attribute attribute_from_string(const std::string& val)
-    {
-        std::istringstream is(val);
-        T t;
-        is >> t;
-        return attribute(t);
-    }
-
-    template <typename charT, typename traits>
-    inline std::basic_ostream<charT,traits>& 
-    operator << (std::basic_ostream<charT,traits>& out,
-                 const attribute& attr)
+    template <typename V ,typename F>
+    V value(F const& f) const
     {
-        out << attr.to_string();
-        return out; 
+        return f[name_];
     }
+    std::string const& name() const { return name_;}
+};
 }
 
-#endif //ATTRIBUTE_HPP
+#endif // MAPNIK_ATTRIBUTE_HPP
diff --git a/include/mapnik/attribute_collector.hpp b/include/mapnik/attribute_collector.hpp
index 029dd62..9f386a5 100644
--- a/include/mapnik/attribute_collector.hpp
+++ b/include/mapnik/attribute_collector.hpp
@@ -26,77 +26,249 @@
 #define ATTRIBUTE_COLLECTOR_HPP
 
 // mapnik
-#include <mapnik/filter.hpp>
-#include <mapnik/expression.hpp>
 #include <mapnik/feature_layer_desc.hpp>
 #include <mapnik/rule.hpp>
+#include <mapnik/path_expression_grammar.hpp>
+#include <mapnik/parse_path.hpp>
+// boost
+#include <boost/utility.hpp>
+#include <boost/variant.hpp>
+#include <boost/concept_check.hpp>
 // stl
 #include <set>
 #include <iostream>
 
 namespace mapnik {
+
+struct expression_attributes : boost::static_visitor<void>
+{
+    explicit expression_attributes(std::set<std::string> & names)
+        : names_(names) {}
+    
+    void operator() (value_type const& x) const 
+    {
+        boost::ignore_unused_variable_warning(x);
+    }
+    
+    void operator() (attribute const& attr) const
+    {
+        names_.insert(attr.name());
+    }
+    
+    template <typename Tag> 
+    void operator() (binary_node<Tag> const& x) const
+    {
+        boost::apply_visitor(expression_attributes(names_),x.left);
+        boost::apply_visitor(expression_attributes(names_),x.right);
+        
+    }
+
+    template <typename Tag>
+    void operator() (unary_node<Tag> const& x) const
+    {
+        boost::apply_visitor(expression_attributes(names_),x.expr);     
+    }
+    
+    void operator() (regex_match_node const& x) const
+    {
+        boost::apply_visitor(expression_attributes(names_),x.expr);
+    }
+    
+    void operator() (regex_replace_node const& x) const
+    {
+        boost::apply_visitor(expression_attributes(names_),x.expr);
+    }
+    
+private:
+    std::set<std::string>& names_;
+};
+
+struct symbolizer_attributes : public boost::static_visitor<>
+{
+    symbolizer_attributes(std::set<std::string>& names)
+        : names_(names) {}
+        
+    template <typename T>
+    void operator () (T const&) const {}
+    
+    void operator () (text_symbolizer const& sym)
+    {
+        expression_ptr const& name_expr = sym.get_name();
+        if (name_expr)
+        {
+            expression_attributes f_attr(names_);
+            boost::apply_visitor(f_attr,*name_expr);
+        }
+
+        expression_ptr const& orientation_expr = sym.get_orientation();
+        if (orientation_expr)
+        {
+            expression_attributes f_attr(names_);
+            boost::apply_visitor(f_attr,*orientation_expr);
+        }
+        collect_metawriter(sym);
+    }
+    
+    void operator () (point_symbolizer const& sym)
+    {   
+        path_expression_ptr const& filename_expr = sym.get_filename();
+        if (filename_expr)
+        {
+            path_processor_type::collect_attributes(*filename_expr,names_);
+        }
+        collect_metawriter(sym);
+
+    }
+
+    void operator () (line_symbolizer const& sym)
+    {
+        collect_metawriter(sym);
+    }
+
+    void operator () (line_pattern_symbolizer const& sym)
+    {   
+        path_expression_ptr const& filename_expr = sym.get_filename();
+        if (filename_expr)
+        {
+            path_processor_type::collect_attributes(*filename_expr,names_);
+        }
+        collect_metawriter(sym);
+    }
+
+    void operator () (polygon_symbolizer const& sym)
+    {
+        collect_metawriter(sym);
+    }
+
+    void operator () (polygon_pattern_symbolizer const& sym)
+    {   
+        path_expression_ptr const& filename_expr = sym.get_filename();
+        if (filename_expr)
+        {
+            path_processor_type::collect_attributes(*filename_expr,names_);
+        }
+        collect_metawriter(sym);
+    }
     
-    struct symbolizer_attributes : public boost::static_visitor<>
-    {
-        symbolizer_attributes(std::set<std::string>& names)
-            : names_(names) {}
-	
-        template <typename T>
-        void operator () (T const&) const {}
-        void operator () (text_symbolizer const& sym)
+    void operator () (shield_symbolizer const& sym)
+    {
+        expression_ptr const& name_expr = sym.get_name();
+        if (name_expr)
         {
-            names_.insert(sym.get_name());
+            expression_attributes name_attr(names_);
+            boost::apply_visitor(name_attr,*name_expr);
         }
-      	void operator () (shield_symbolizer const& sym)
-      	{
-      	    names_.insert(sym.get_name());
-      	}
-    private:
-        std::set<std::string>& names_;
-    };
-
-    template <typename FeatureT>
-    class attribute_collector : public filter_visitor<FeatureT>
-    {
-    private:
-        std::set<std::string>& names_;
-    public:
-	
-        attribute_collector(std::set<std::string>& names)
-            : names_(names) {}
-	
-        void visit(filter<FeatureT>& /*filter*/) 
-        { 
-            //not interested
+        
+        path_expression_ptr const& filename_expr = sym.get_filename();
+        if (filename_expr)
+        {
+            path_processor_type::collect_attributes(*filename_expr,names_);
         }
-	
-        void visit(expression<FeatureT>& exp)
+        collect_metawriter(sym);
+    }
+
+    void operator () (glyph_symbolizer const& sym)
+    {
+        expression_ptr const& char_expr = sym.get_char();
+        if (char_expr)
         {
-            property<FeatureT>* pf;
-            if ((pf = dynamic_cast<property<FeatureT>*>(&exp)))
-            {
-                names_.insert(pf->name());
-            }
+            expression_attributes f_attr(names_);
+            boost::apply_visitor(f_attr,*char_expr);
         }
-        void visit(rule_type const& r)
-        {	    
-            const symbolizers& symbols = r.get_symbolizers();
-            symbolizers::const_iterator symIter=symbols.begin();
-            symbolizer_attributes attr(names_);
-            while (symIter != symbols.end())
-            {
-                boost::apply_visitor(attr,*symIter++);
-            }
-            filter_ptr const& filter = r.get_filter();
-            filter->accept(*this);
+
+        expression_ptr const& angle_expr = sym.get_angle();
+        if (angle_expr)
+        {
+            expression_attributes f_attr(names_);
+            boost::apply_visitor(f_attr,*angle_expr);
         }
 
-        virtual ~attribute_collector() {}
-    private:	
-        // no copying 
-        attribute_collector(attribute_collector const&);
-        attribute_collector& operator=(attribute_collector const&);
-    };   
-}
+        expression_ptr const& value_expr = sym.get_value();
+        if (value_expr)
+        {
+            expression_attributes f_attr(names_);
+            boost::apply_visitor(f_attr,*value_expr);
+        }
+
+        expression_ptr const& size_expr = sym.get_size();
+        if (size_expr)
+        {
+            expression_attributes f_attr(names_);
+            boost::apply_visitor(f_attr,*size_expr);
+        }
+
+        expression_ptr const& color_expr = sym.get_color();
+        if (color_expr)
+        {
+            expression_attributes f_attr(names_);
+            boost::apply_visitor(f_attr,*color_expr);
+        }
+        collect_metawriter(sym);
+    }
+
+    void operator () (markers_symbolizer const& sym)
+    {
+        collect_metawriter(sym);
+    }
+
+    void operator () (building_symbolizer const& sym)
+    {
+        collect_metawriter(sym);
+    }
+    // TODO - support remaining syms
+    
+private:
+    std::set<std::string>& names_;
+    void collect_metawriter(symbolizer_base const& sym)
+    {
+        metawriter_properties const& properties = sym.get_metawriter_properties();
+        names_.insert(properties.begin(), properties.end());
+    }
+};
+
+
+class attribute_collector : public boost::noncopyable
+{
+private:
+    std::set<std::string>& names_;
+public:
+    
+    attribute_collector(std::set<std::string>& names)
+        : names_(names) {}
+        
+    template <typename RuleType>
+    void operator() (RuleType const& r)
+    {
+        typename RuleType::symbolizers const& symbols = r.get_symbolizers();
+        typename RuleType::symbolizers::const_iterator symIter=symbols.begin();
+        symbolizer_attributes s_attr(names_);
+        while (symIter != symbols.end())
+        {
+            boost::apply_visitor(s_attr,*symIter++);
+        }
+        
+        expression_ptr const& expr = r.get_filter();
+        expression_attributes f_attr(names_);
+        boost::apply_visitor(f_attr,*expr);
+    }   
+};
+
+struct directive_collector : public boost::static_visitor<>
+{
+    directive_collector(double * filter_factor)
+        : filter_factor_(filter_factor) {}
+        
+    template <typename T>
+    void operator () (T const&) const {}
+    
+    void operator () (raster_symbolizer const& sym)
+    {
+        *filter_factor_ = sym.calculate_filter_factor();
+    }
+private:
+    double * filter_factor_;
+};
+
+} // namespace mapnik
 
 #endif //ATTRIBUTE_COLLECTOR_HPP
diff --git a/include/mapnik/attribute_descriptor.hpp b/include/mapnik/attribute_descriptor.hpp
index c71b7e6..72e1583 100644
--- a/include/mapnik/attribute_descriptor.hpp
+++ b/include/mapnik/attribute_descriptor.hpp
@@ -28,11 +28,94 @@
 #include <string>
 
 namespace mapnik {
-    struct attribute_desc
+
+enum eAttributeType {
+    Integer=1,
+    Float  =2,
+    Double =3,
+    String =4,
+    Boolean =5,
+    Geometry=6,
+    Object=7 
+};
+
+class attribute_descriptor
+{
+public:
+    attribute_descriptor(std::string const& name,unsigned type,
+                         bool primary_key=false,
+                         int size=-1,
+                         int precision=-1)
+        : name_(name),
+          type_(type),
+          primary_key_(primary_key),
+          size_(size),
+          precision_(precision) {}
+              
+    attribute_descriptor(attribute_descriptor const& other)
+        : name_(other.name_),
+          type_(other.type_),
+          primary_key_(other.primary_key_),
+          size_(other.size_),
+          precision_(other.precision_) {}
+
+    attribute_descriptor& operator=(attribute_descriptor const& other)
+    {
+        if (this == &other)
+            return *this;           
+        name_=other.name_;
+        type_=other.type_;
+        primary_key_=other.primary_key_;
+        size_=other.size_;
+        precision_=other.precision_;
+        return *this;
+    }
+
+    std::string const& get_name() const
+    {
+        return name_;
+    }
+
+    unsigned get_type() const
+    {
+        return type_;
+    }
+
+    bool is_primary_key() const
+    {
+        return primary_key_;
+    }
+
+    int get_size() const
+    {
+        return size_;
+    } 
+        
+    int get_precision() const
     {
-        std::string name;
-        eType type;
-    };
+        return precision_;
+    }
+
+private:
+    std::string name_;
+    int type_;
+    bool primary_key_;
+    int size_;
+    int precision_;
+};
+     
+template <typename charT,typename traits>
+inline std::basic_ostream<charT,traits>&
+operator << (std::basic_ostream<charT,traits>& out,
+             attribute_descriptor const& ad)
+{
+    out << "name=" << ad.get_name() << "\n";
+    out << "type=" << ad.get_type() << "\n";
+    out << "size=" << ad.get_size() << "\n";
+    return out;
+}
+
+
 }
 
 #endif // ATTRIBUTE_DESCRIPTOR_HPP
diff --git a/include/mapnik/boolean_filter.hpp b/include/mapnik/boolean_filter.hpp
deleted file mode 100644
index 244f77a..0000000
--- a/include/mapnik/boolean_filter.hpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2008 Tom Hughes
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-
-
-//$Id$
-
-#ifndef BOOLEAN_FILTER_HPP
-#define BOOLEAN_FILTER_HPP
-// mapnik
-#include <mapnik/filter.hpp>
-#include <mapnik/expression.hpp>
-
-namespace mapnik
-{ 
-    template <typename FeatureT>
-    struct boolean_filter : public filter<FeatureT>
-    {
-
-        boolean_filter(expression<FeatureT> const& exp)
-            : filter<FeatureT>(),
-              exp_(exp.clone()) {}
-	
-        boolean_filter(boolean_filter const& other)
-            :  filter<FeatureT>(),
-               exp_(other.exp_->clone()) {}
-	
-        bool pass(FeatureT const& feature) const
-        {
-            return exp_->get_value(feature).to_bool();
-        } 
-	
-        void accept(filter_visitor<FeatureT>& v)
-        {
-            exp_->accept(v);
-            v.visit(*this);
-        }
-	
-        filter<FeatureT>* clone() const
-        {
-            return new boolean_filter(*this);
-        }
-        std::string to_string() const
-        {
-            return exp_->to_string();
-        }
-        ~boolean_filter()
-        {
-            delete exp_;
-        }
-	
-    private:
-        expression<FeatureT>* exp_;
-	
-    };   
-}
-
-
-#endif //BOOLEAN_FILTER_HPP
diff --git a/include/mapnik/box2d.hpp b/include/mapnik/box2d.hpp
new file mode 100644
index 0000000..edb4a85
--- /dev/null
+++ b/include/mapnik/box2d.hpp
@@ -0,0 +1,111 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id: box2d.hpp 39 2005-04-10 20:39:53Z pavlenko $
+
+#ifndef MAPNIK_BOX2D_HPP
+#define MAPNIK_BOX2D_HPP
+
+// mapnik
+#include <mapnik/config.hpp>
+#include <mapnik/coord.hpp>
+// boost
+#include <boost/operators.hpp>
+// stl
+#include <iomanip>
+
+namespace mapnik {
+  
+/*!
+ * A spatial envelope (i.e. bounding box) which also defines some basic operators.
+ */
+template <typename T> class MAPNIK_DECL box2d  
+: boost::equality_comparable<box2d<T> ,
+                             boost::addable<box2d<T>, 
+                                            boost::subtractable<box2d<T>, 
+                                                                boost::dividable2<box2d<T>, T,
+                                                                                  boost::multipliable2<box2d<T>, T > > > > >
+{
+public:
+    typedef box2d<T> box2d_type;
+private:
+    T minx_;
+    T miny_;
+    T maxx_;
+    T maxy_;
+public:
+    box2d();
+    box2d(T minx,T miny,T maxx,T maxy);
+    box2d(const coord<T,2>& c0,const coord<T,2>& c1);
+    box2d(const box2d_type& rhs);
+    T minx() const;
+    T miny() const;
+    T maxx() const;
+    T maxy() const;
+    T width() const;
+    T height() const;
+    void width(T w);
+    void height(T h);
+    coord<T,2> center() const;
+    void expand_to_include(T x,T y);
+    void expand_to_include(const coord<T,2>& c);
+    void expand_to_include(const box2d_type& other);
+    bool contains(const coord<T,2> &c) const;
+    bool contains(T x,T y) const;
+    bool contains(const box2d_type &other) const;
+    bool intersects(const coord<T,2> &c) const;
+    bool intersects(T x,T y) const;
+    bool intersects(const box2d_type &other) const;
+    box2d_type intersect(const box2d_type& other) const;
+    bool operator==(const box2d_type &other) const;
+    void re_center(T cx,T cy);
+    void re_center(const coord<T,2>& c);
+    void init(T x0,T y0,T x1,T y1);
+    void clip(const box2d_type &other);
+    bool from_string(const std::string& s);
+    bool valid() const;
+        
+    // define some operators 
+    box2d_type& operator+=(box2d_type const& other);
+    box2d_type& operator-=(box2d_type const& other);
+    box2d_type& operator*=(T);
+    box2d_type& operator/=(T);
+    T operator[](int index) const;
+};
+    
+template <class charT,class traits,class T>
+inline std::basic_ostream<charT,traits>&
+operator << (std::basic_ostream<charT,traits>& out,
+             const box2d<T>& e)
+{
+    std::basic_ostringstream<charT,traits> s;
+    s.copyfmt(out);
+    s.width(0);
+    s <<"box2d(" << std::setprecision(16) 
+      << e.minx() << "," << e.miny() <<"," 
+      << e.maxx() << "," << e.maxy() <<")";
+    out << s.str();
+    return out;
+}
+}
+
+#endif // MAPNIK_BOX2D_HPP
diff --git a/include/mapnik/cairo_renderer.hpp b/include/mapnik/cairo_renderer.hpp
index fe7655a..60a79b1 100644
--- a/include/mapnik/cairo_renderer.hpp
+++ b/include/mapnik/cairo_renderer.hpp
@@ -36,6 +36,7 @@
 #include <mapnik/label_collision_detector.hpp>
 #include <mapnik/placement_finder.hpp>
 #include <mapnik/map.hpp>
+//#include <mapnik/marker.hpp>
 
 // cairo
 #include <cairomm/context.h>
@@ -45,83 +46,110 @@
 #include <boost/utility.hpp>
 #include <boost/scoped_ptr.hpp>
 
+// FIXME
+// forward declare so that
+// apps using mapnik do not
+// need agg headers
+namespace agg {
+  struct trans_affine;
+}
+
 namespace mapnik {
 
-   class cairo_face;
-
-   typedef boost::shared_ptr<cairo_face> cairo_face_ptr;
-
-   class cairo_face_manager : private boost::noncopyable
-   {
-     public:
-      cairo_face_manager(boost::shared_ptr<freetype_engine> engine,
-                         face_manager<freetype_engine> & manager);
-      cairo_face_ptr get_face(face_ptr face);
-
-     private:
-      typedef std::map<face_ptr,cairo_face_ptr> cairo_face_cache;
-      boost::shared_ptr<freetype_engine> font_engine_;
-      face_manager<freetype_engine> & font_manager_;
-      cairo_face_cache cache_;
-   };
-
-   class MAPNIK_DECL cairo_renderer_base : private boost::noncopyable
-   {
-     protected:
-      cairo_renderer_base(Map const& m, Cairo::RefPtr<Cairo::Context> const& context, unsigned offset_x=0, unsigned offset_y=0);
-     public:
-      ~cairo_renderer_base();
-      void start_map_processing(Map const& map);
-      void start_layer_processing(Layer const& lay);
-      void end_layer_processing(Layer const& lay);
-      void process(point_symbolizer const& sym,
-                   Feature const& feature,
-                   proj_transform const& prj_trans);
-      void process(line_symbolizer const& sym,
-                   Feature const& feature,
-                   proj_transform const& prj_trans);
-      void process(line_pattern_symbolizer const& sym,
-                   Feature const& feature,
-                   proj_transform const& prj_trans);
-      void process(polygon_symbolizer const& sym,
-                   Feature const& feature,
-                   proj_transform const& prj_trans);
-      void process(polygon_pattern_symbolizer const& sym,
-                   Feature const& feature,
-                   proj_transform const& prj_trans);
-      void process(raster_symbolizer const& sym,
-                   Feature const& feature,
-                   proj_transform const& prj_trans);
-      void process(shield_symbolizer const& sym,
-                   Feature const& feature,
-                   proj_transform const& prj_trans);
-      void process(text_symbolizer const& sym,
-                   Feature const& feature,
-                   proj_transform const& prj_trans);
-      void process(building_symbolizer const& sym,
-                   Feature const& feature,
-                   proj_transform const& prj_trans);
-      void process(markers_symbolizer const& sym,
-                   Feature const& feature,
-                   proj_transform const& prj_trans);
-     protected:
-      Map const& m_;
-      Cairo::RefPtr<Cairo::Context> context_;
-      CoordTransform t_;
-      boost::shared_ptr<freetype_engine> font_engine_;
-      face_manager<freetype_engine> font_manager_;
-      cairo_face_manager face_manager_;
-      label_collision_detector4 detector_;
-   };
-
-   template <typename T>
-   class MAPNIK_DECL cairo_renderer : public feature_style_processor<cairo_renderer<T> >,
-                                      public cairo_renderer_base
-   {
-     public:
-      cairo_renderer(Map const& m, Cairo::RefPtr<T> const& surface, unsigned offset_x=0, unsigned offset_y=0);
-      void end_map_processing(Map const& map);
-   };
+class marker;
+
+class cairo_face;
+
+typedef boost::shared_ptr<cairo_face> cairo_face_ptr;
+
+class cairo_face_manager : private boost::noncopyable
+{
+public:
+    cairo_face_manager(boost::shared_ptr<freetype_engine> engine,
+                       face_manager<freetype_engine> & manager);
+    cairo_face_ptr get_face(face_ptr face);
+
+private:
+    typedef std::map<face_ptr,cairo_face_ptr> cairo_face_cache;
+    boost::shared_ptr<freetype_engine> font_engine_;
+    face_manager<freetype_engine> & font_manager_;
+    cairo_face_cache cache_;
+};
+
+class MAPNIK_DECL cairo_renderer_base : private boost::noncopyable
+{
+protected:
+    cairo_renderer_base(Map const& m, Cairo::RefPtr<Cairo::Context> const& context, unsigned offset_x=0, unsigned offset_y=0);
+public:
+    ~cairo_renderer_base();
+    void start_map_processing(Map const& map);
+    void start_layer_processing(layer const& lay);
+    void end_layer_processing(layer const& lay);
+    void process(point_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(line_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(line_pattern_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(polygon_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(polygon_pattern_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(raster_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(shield_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(text_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(building_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(markers_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(glyph_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    inline bool process(rule::symbolizers const& /*syms*/,
+      Feature const& /*feature*/,
+      proj_transform const& /*prj_trans*/)
+    {
+        // cairo renderer doesn't support processing of multiple symbolizers.
+        return false;
+    };
+    void painted(bool /*painted*/)
+    {
+        // nothing to do
+    }
+
+protected:
+    void render_marker(const int x, const int y, marker &marker, const agg::trans_affine & mtx, double opacity=1.0);
+
+    Map const& m_;
+    Cairo::RefPtr<Cairo::Context> context_;
+    CoordTransform t_;
+    boost::shared_ptr<freetype_engine> font_engine_;
+    face_manager<freetype_engine> font_manager_;
+    cairo_face_manager face_manager_;
+    label_collision_detector4 detector_;
+};
+
+template <typename T>
+class MAPNIK_DECL cairo_renderer : public feature_style_processor<cairo_renderer<T> >,
+                                   public cairo_renderer_base
+{
+public:
+    cairo_renderer(Map const& m, Cairo::RefPtr<T> const& surface, unsigned offset_x=0, unsigned offset_y=0);
+    void end_map_processing(Map const& map);
+};
 }
 
 #endif
diff --git a/include/mapnik/color.hpp b/include/mapnik/color.hpp
index b7a96c2..a923d32 100644
--- a/include/mapnik/color.hpp
+++ b/include/mapnik/color.hpp
@@ -30,115 +30,115 @@
 #include <mapnik/global.hpp>
 
 //boost
-#include <boost/format.hpp>
 #include <boost/cstdint.hpp>
-
+#include <boost/operators.hpp>
 // stl
 #include <sstream>
 
 namespace mapnik {
      
-    class MAPNIK_DECL color
-    {
-    private:
-        boost::uint8_t red_;
-        boost::uint8_t green_;
-        boost::uint8_t blue_;
-        boost::uint8_t alpha_;
+class MAPNIK_DECL color 
+    : boost::equality_comparable<color>
+{
+private:
+    boost::uint8_t red_;
+    boost::uint8_t green_;
+    boost::uint8_t blue_;
+    boost::uint8_t alpha_;
         
-    public:
-        color()
-            : red_(0xff),
-            green_(0xff),
-            blue_(0xff),
-            alpha_(0xff)
-            {}
-
-        color(int red,int green,int blue,int alpha=0xff)
-            :  red_(red),
-            green_(green),
-            blue_(blue),
-            alpha_(alpha)
-            {}
+public:
+    color()
+        : red_(0xff),
+        green_(0xff),
+        blue_(0xff),
+        alpha_(0xff)
+        {}
+    
+    color(unsigned red, unsigned green, unsigned blue, unsigned alpha = 0xff)
+        :  red_(red),
+        green_(green),
+        blue_(blue),
+        alpha_(alpha)
+        {}
+    
+    color( std::string const& css_string);
         
-        color( std::string const& css_string);
-        
-        color(const color& rhs)
-            : red_(rhs.red_),
-            green_(rhs.green_),
-            blue_(rhs.blue_),
-            alpha_(rhs.alpha_) 
-            {}
+    color(const color& rhs)
+        : red_(rhs.red_),
+        green_(rhs.green_),
+        blue_(rhs.blue_),
+        alpha_(rhs.alpha_) 
+        {}
 
-        color& operator=(const color& rhs)
-        {
-            if (this==&rhs) return *this;
-            red_=rhs.red_;
-            green_=rhs.green_;
-            blue_=rhs.blue_;
-            alpha_=rhs.alpha_;
-            return *this;
-        }
+    color& operator=(const color& rhs)
+    {
+        if (this==&rhs) return *this;
+        red_=rhs.red_;
+        green_=rhs.green_;
+        blue_=rhs.blue_;
+        alpha_=rhs.alpha_;
+        return *this;
+    }
         
-        inline unsigned red() const
-        {
-            return red_;
-        }
+    inline unsigned red() const
+    {
+        return red_;
+    }
         
-        inline unsigned int green() const
-        {
-            return green_;
-        }
-        inline unsigned int blue() const
-        {
-            return blue_;
-        }
-        inline unsigned int alpha() const
-        {
-            return alpha_;
-        }	
+    inline unsigned green() const
+    {
+        return green_;
+    }
+    inline unsigned blue() const
+    {
+        return blue_;
+    }
+    inline unsigned alpha() const
+    {
+        return alpha_;
+    }   
         
-        inline void set_red(unsigned red)
-        {
-            red_ = red;
-        }
-        inline void set_green(unsigned green)
-        {
-            green_ = green;
-        }
+    inline void set_red(unsigned red)
+    {
+        red_ = red;
+    }
+    inline void set_green(unsigned green)
+    {
+        green_ = green;
+    }
         
-        inline void set_blue(unsigned blue)
-        {
-            blue_ = blue;
-        }
-        inline void set_alpha(unsigned int alpha)
-        {
-            alpha_ = alpha;
-        }
+    inline void set_blue(unsigned blue)
+    {
+        blue_ = blue;
+    }
+    inline void set_alpha(unsigned alpha)
+    {
+        alpha_ = alpha;
+    }
 
-        inline unsigned int rgba() const
-        {
+    inline unsigned rgba() const
+    {
 #ifdef MAPNIK_BIG_ENDIAN
-            return (alpha_) | (blue_ << 8) | (green_ << 16) | (red_ << 24) ;
+        return (alpha_) | (blue_ << 8) | (green_ << 16) | (red_ << 24) ;
 #else
-            return (alpha_ << 24) | (blue_ << 16) | (green_ << 8) | (red_) ;
+        return (alpha_ << 24) | (blue_ << 16) | (green_ << 8) | (red_) ;
 #endif
-        }
-        
-        inline bool operator==(color const& other) const
-        {
-            return rgba() == other.rgba();
-        }
-        
-        inline bool operator!=(color const& other) const
-        {
-            return rgba() != other.rgba();
-        }
-        
-        std::string to_string() const;
+    }
+    
+    inline bool operator==(color const& rhs) const
+    {
+        return (red_== rhs.red()) &&
+            (green_ == rhs.green()) &&
+            (blue_  == rhs.blue()) &&
+            (alpha_ == rhs.alpha());
         
-        std::string to_hex_string() const;
-    };    
+    }
+    
+    std::string to_string() const;        
+    std::string to_hex_string() const;
+};    
+
+
 }
 
 #endif //COLOR_HPP
diff --git a/include/mapnik/color_factory.hpp b/include/mapnik/color_factory.hpp
index ac84bf5..15a3e07 100644
--- a/include/mapnik/color_factory.hpp
+++ b/include/mapnik/color_factory.hpp
@@ -2,7 +2,7 @@
  * 
  * This file is part of Mapnik (c++ mapping toolkit)
  *
- * Copyright (C) 2006 Artem Pavlenko
+ * Copyright (C) 2011 Artem Pavlenko
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -22,46 +22,102 @@
 
 //$Id$
 
-#ifndef COLOR_FACTORY_HPP
-#define COLOR_FACTORY_HPP
+#ifndef MAPNIK_COLOR_FACTORY_HPP
+#define MAPNIK_COLOR_FACTORY_HPP
 
 // mapnik
 #include <mapnik/config.hpp>
 #include <mapnik/color.hpp>
-#include <mapnik/css_color_parser.hpp>
 #include <mapnik/config_error.hpp>
 
-using namespace boost::spirit;
+// boost
+#include <boost/utility.hpp>
+#include <boost/version.hpp>
+
+// boost 1.41 -> 1.44 compatibility, to be removed in mapnik 2.1 (dane)
+#if BOOST_VERSION >= 104500
+#include <mapnik/css_color_grammar.hpp>
 
 namespace mapnik {    
    
-    class MAPNIK_DECL color_factory
-    {
-    public:
-       
-        static void init_from_string(color & c, char const* css_color)
-        {   
-            actions<color> a(c);
-            css_color_grammar<actions<color> > grammar(a);
-            parse_info<> info = parse(css_color, grammar, space_p);
-            if ( ! info.full) {
-                throw config_error(std::string("Failed to parse color value: ") +
-                        "Expected a color, but got '" + css_color + "'");
-            }
-        }    
+class MAPNIK_DECL color_factory : boost::noncopyable
+{
+public:
+    
+    static void init_from_string(color & c, std::string const& css_color)
+    {   
+        typedef std::string::const_iterator iterator_type;
+        typedef mapnik::css_color_grammar<iterator_type> css_color_grammar; 
         
-        static color from_string(char const* css_color)
-        {   
-            color c;
-            init_from_string(c,css_color);
-            return c;
+        css_color_grammar g;
+        iterator_type first = css_color.begin();
+        iterator_type last =  css_color.end();
+        bool result =
+            boost::spirit::qi::phrase_parse(first,
+                                            last,
+                                            g,
+                                            boost::spirit::ascii::space,
+                                            c);
+        if (!result) 
+        {
+            throw config_error(std::string("Failed to parse color value: ") +
+                               "Expected a CSS color, but got '" + css_color + "'");
         }
+    }    
+    
+    static color from_string(std::string const& css_color)
+    {   
+        color c;
+        init_from_string(c,css_color);
+        return c;
+    }
+};
+}
+
+#else
+#include <mapnik/css_color_grammar_deprecated.hpp>
+
+namespace mapnik {    
+   
+class MAPNIK_DECL color_factory : boost::noncopyable
+{
+public:
+    
+    static void init_from_string(color & c, std::string const& css_color)
+    {   
+        typedef std::string::const_iterator iterator_type;
+        typedef mapnik::css_color_grammar<iterator_type> css_color_grammar; 
 
-    private:
-        color_factory();
-        color_factory(color_factory const&);
-        color_factory& operator=(color_factory const&);
-    };
+        css_color_grammar g;
+        iterator_type first = css_color.begin();
+        iterator_type last =  css_color.end();
+        mapnik::css css_;
+        bool result =
+            boost::spirit::qi::phrase_parse(first,
+                                            last,
+                                            g,
+                                            boost::spirit::ascii::space,
+                                            css_);
+        if (!result) 
+        {
+            throw config_error(std::string("Failed to parse color value: ") +
+                               "Expected a CSS color, but got '" + css_color + "'");
+        }
+        c.set_red(css_.r);
+        c.set_green(css_.g);
+        c.set_blue(css_.b);
+        c.set_alpha(css_.a);
+    }    
+    
+    static color from_string(std::string const& css_color)
+    {   
+        color c;
+        init_from_string(c,css_color);
+        return c;
+    }
+};
 }
 
-#endif //COLOR_FACTORY_HPP
+#endif
+
+#endif //MAPNIK_COLOR_FACTORY_HPP
diff --git a/include/mapnik/comparison.hpp b/include/mapnik/comparison.hpp
deleted file mode 100644
index fa6e610..0000000
--- a/include/mapnik/comparison.hpp
+++ /dev/null
@@ -1,149 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-//$Id$
-
-#ifndef COMPARISON_HPP
-#define COMPARISON_HPP
-
-#include <mapnik/filter.hpp>
-#include <mapnik/expression.hpp>
-#include <mapnik/attribute.hpp>
-
-namespace mapnik {   
-    template <typename T>  
-    struct greater_than
-    {
-        bool operator() (T const& left, T const& right) const
-        {
-            return left > right;
-        }
-        static std::string to_string()
-        {
-            return ">";
-        }
-    };
-
-    template <typename T>  
-    struct greater_than_or_equal
-    {
-        bool operator() (T const& left, T const& right) const
-        {
-            return left >= right;
-        }
-        static std::string to_string()
-        {
-            return ">=";
-        }
-    };
-    template <typename T>  
-    struct less_than
-    {
-        bool operator() (T const& left, T const& right) const
-        {
-            return left < right;
-        }
-        static std::string to_string()
-        {
-            return "<";
-        }
-    };
-    template <typename T>  
-    struct less_than_or_equal
-    {
-        bool operator() (T const& left, T const& right) const
-        {
-            return left <= right;
-        }
-        static std::string to_string()
-        {
-            return "<=";
-        }
-    };
-    template <typename T>  
-    struct equals
-    {
-        bool operator() (T const& left, T const& right) const
-        {
-            return left == right;
-        }
-        static std::string to_string()
-        {
-            return "=";
-        }
-    };
-    
-    template <typename T>  
-    struct not_equals
-    {
-        bool operator() (T const& left, T const& right) const
-        {
-            return left != right;
-        }
-        static std::string to_string()
-        {
-            return "<>";
-        }
-    };
-    
-    template <typename FeatureT,typename Op>
-    struct compare_filter : public filter<FeatureT>
-    {
-        compare_filter(expression<FeatureT> const& left,
-                       expression<FeatureT> const& right)
-            : filter<FeatureT>(),
-              left_(left.clone()), right_(right.clone()) {}
-
-        compare_filter(compare_filter const& other)
-            : filter<FeatureT>(),
-              left_(other.left_->clone()),right_(other.right_->clone()) {}
-	
-        bool pass(const FeatureT& feature) const
-        {   
-            return Op()(left_->get_value(feature),right_->get_value(feature));     
-        }
-        void accept(filter_visitor<FeatureT>& v)
-        {
-            left_->accept(v);
-            right_->accept(v);
-            v.visit(*this);
-        }
-        std::string to_string() const
-        {
-            return "("+left_->to_string()+Op::to_string()+right_->to_string()+")";
-        }
-
-        filter<FeatureT>* clone() const
-        {
-            return new compare_filter<FeatureT,Op>(*this);
-        }
-        virtual ~compare_filter() 
-        {
-            delete left_;
-            delete right_;
-        }
-    private:
-        expression<FeatureT>* left_;
-        expression<FeatureT>* right_;
-    };
-}
-
-#endif //COMPARISON_HPP
diff --git a/include/mapnik/config.hpp b/include/mapnik/config.hpp
index c057d65..75a96fa 100644
--- a/include/mapnik/config.hpp
+++ b/include/mapnik/config.hpp
@@ -25,6 +25,8 @@
 
 // Windows DLL support
 
+#define MAPNIK_SUPPORTS_GRID_RENDERER
+
 #ifdef _WINDOWS
 #  define MAPNIK_EXP __declspec (dllexport)
 #  define MAPNIK_IMP __declspec (dllimport)
@@ -44,4 +46,5 @@
 #  define MAPNIK_DECL
 #endif
 
+#define PROJ_ENVELOPE_POINTS 20
 #endif // CONFIG_HPP
diff --git a/include/mapnik/config_error.hpp b/include/mapnik/config_error.hpp
index 4ad0365..933b101 100644
--- a/include/mapnik/config_error.hpp
+++ b/include/mapnik/config_error.hpp
@@ -28,30 +28,30 @@
 
 namespace mapnik {
 
-    class config_error : public std::exception
+class config_error : public std::exception
+{
+public:
+    config_error() {}
+
+    config_error( const std::string & what ) :
+        what_( what )
+    {
+    }
+    virtual ~config_error() throw() {};
+
+    virtual const char * what() const throw()
     {
-        public:
-            config_error() {}
-
-            config_error( const std::string & what ) :
-                what_( what )
-            {
-            }
-            virtual ~config_error() throw() {};
-
-            virtual const char * what() const throw()
-            {
-                return what_.c_str();    
-            }
-
-            void append_context(const std::string & ctx) const
-            {
-                what_ += " " + ctx;
-            }
-
-        protected:
-            mutable std::string what_;
-    };
+        return what_.c_str();    
+    }
+
+    void append_context(const std::string & ctx) const
+    {
+        what_ += " " + ctx;
+    }
+
+protected:
+    mutable std::string what_;
+};
 }
 
 #endif // MAPNIK_CONFIG_ERROR_INCLUDED
diff --git a/include/mapnik/coord.hpp b/include/mapnik/coord.hpp
index 4667e0d..6a5fe52 100644
--- a/include/mapnik/coord.hpp
+++ b/include/mapnik/coord.hpp
@@ -30,161 +30,161 @@
 #include <sstream>
 
 namespace mapnik {   
-    template <typename T,int dim>
-    struct coord {
-        typedef T type;
-    };
+template <typename T,int dim>
+struct coord {
+    typedef T type;
+};
     
-    template <typename T>
-    struct coord<T,2> 
-        : boost::addable<coord<T,2>,
-          boost::addable2<coord<T,2>,T,
-          boost::subtractable<coord<T,2>,
-          boost::subtractable2<coord<T,2>,T,
-          boost::dividable2<coord<T,2>, T,
-          boost::multipliable2<coord<T,2>, T > > > > > >
+template <typename T>
+struct coord<T,2> 
+    : boost::addable<coord<T,2>,
+                     boost::addable2<coord<T,2>,T,
+                                     boost::subtractable<coord<T,2>,
+                                                         boost::subtractable2<coord<T,2>,T,
+                                                                              boost::dividable2<coord<T,2>, T,
+                                                                                                boost::multipliable2<coord<T,2>, T > > > > > >
                     
-    {
-        typedef T type;
-        T x;
-        T y;
-    public:
-        coord()
-            : x(),y() {}
-        coord(T x,T y)
-            : x(x),y(y) {}
-        template <typename T2>
-        coord (const coord<T2,2>& rhs)
-            : x(type(rhs.x)),
-              y(type(rhs.y)) {}
+{
+    typedef T type;
+    T x;
+    T y;
+public:
+    coord()
+        : x(),y() {}
+    coord(T x,T y)
+        : x(x),y(y) {}
+    template <typename T2>
+    coord (const coord<T2,2>& rhs)
+        : x(type(rhs.x)),
+          y(type(rhs.y)) {}
 
-        template <typename T2>
-        coord<T,2>& operator=(const coord<T2,2>& rhs)
+    template <typename T2>
+    coord<T,2>& operator=(const coord<T2,2>& rhs)
+    {
+        if ((void*)this==(void*)&rhs)
         {
-            if ((void*)this==(void*)&rhs)
-            {
-                return *this;
-            }
-            x=type(rhs.x);
-            y=type(rhs.y);
             return *this;
         }
-        template <typename T2>
-        bool operator==(coord<T2,2> const& rhs)
-        {
-            return x == rhs.x && y == rhs.y;
-        }
+        x=type(rhs.x);
+        y=type(rhs.y);
+        return *this;
+    }
+    template <typename T2>
+    bool operator==(coord<T2,2> const& rhs)
+    {
+        return x == rhs.x && y == rhs.y;
+    }
 
-        coord<T,2>& operator+=(coord<T,2> const& rhs)
-        {
-            x+=rhs.x;
-            y+=rhs.y;
-            return *this;
-        }
+    coord<T,2>& operator+=(coord<T,2> const& rhs)
+    {
+        x+=rhs.x;
+        y+=rhs.y;
+        return *this;
+    }
         
-        coord<T,2>& operator+=(T rhs)
-        {
-            x+=rhs;
-            y+=rhs;
-            return *this;
-        }
+    coord<T,2>& operator+=(T rhs)
+    {
+        x+=rhs;
+        y+=rhs;
+        return *this;
+    }
         
-        coord<T,2>& operator-=(coord<T,2> const& rhs)
-        {
-            x-=rhs.x;
-            y-=rhs.y;
-            return *this;
-        }
+    coord<T,2>& operator-=(coord<T,2> const& rhs)
+    {
+        x-=rhs.x;
+        y-=rhs.y;
+        return *this;
+    }
         
-        coord<T,2>& operator-=(T rhs)
-        {
-            x-=rhs;
-            y-=rhs;
-            return *this;
-        }
+    coord<T,2>& operator-=(T rhs)
+    {
+        x-=rhs;
+        y-=rhs;
+        return *this;
+    }
         
-        coord<T,2>& operator*=(T t)
-        {
-            x*=t;
-            y*=t;
-            return *this;
-        }
-        coord<T,2>& operator/=(T t)
-        {
-            x/=t;
-            y/=t;
-            return *this;
-        }
-    };
-
-    template <typename T>
-    struct coord<T,3> 
+    coord<T,2>& operator*=(T t)
+    {
+        x*=t;
+        y*=t;
+        return *this;
+    }
+    coord<T,2>& operator/=(T t)
     {
-        typedef T type;
-        T x;
-        T y;
-        T z;
-    public:
-        coord()
-            : x(),y(),z() {}
-        coord(T x,T y,T z)
-            : x(x),y(y),z(z) {}
-        template <typename T2>
-        coord (const coord<T2,3>& rhs)
-            : x(type(rhs.x)),
-              y(type(rhs.y)),
-              z(type(rhs.z)) {}
+        x/=t;
+        y/=t;
+        return *this;
+    }
+};
+
+template <typename T>
+struct coord<T,3> 
+{
+    typedef T type;
+    T x;
+    T y;
+    T z;
+public:
+    coord()
+        : x(),y(),z() {}
+    coord(T x,T y,T z)
+        : x(x),y(y),z(z) {}
+    template <typename T2>
+    coord (const coord<T2,3>& rhs)
+        : x(type(rhs.x)),
+          y(type(rhs.y)),
+          z(type(rhs.z)) {}
 
-        template <typename T2>
-        coord<T,3>& operator=(const coord<T2,3>& rhs)
+    template <typename T2>
+    coord<T,3>& operator=(const coord<T2,3>& rhs)
+    {
+        if ((void*)this==(void*)&rhs)
         {
-            if ((void*)this==(void*)&rhs)
-            {
-                return *this;
-            }
-            x=type(rhs.x);
-            y=type(rhs.y);
-            z=type(rhs.z);
             return *this;
         }
-    };
+        x=type(rhs.x);
+        y=type(rhs.y);
+        z=type(rhs.z);
+        return *this;
+    }
+};
 
-    typedef coord<double,2> coord2d;
-    typedef coord<int,2> coord2i;
+typedef coord<double,2> coord2d;
+typedef coord<int,2> coord2i;
 
      
-    template <typename charT,typename traits,typename T ,int dim>
-    inline std::basic_ostream<charT,traits>&
-    operator << (std::basic_ostream<charT,traits>& out,
-                 const coord<T,dim>& c);
+template <typename charT,typename traits,typename T ,int dim>
+inline std::basic_ostream<charT,traits>&
+operator << (std::basic_ostream<charT,traits>& out,
+             const coord<T,dim>& c);
     
-    template <typename charT,typename traits,typename T>
-    inline std::basic_ostream<charT,traits>&
-    operator << (std::basic_ostream<charT,traits>& out,
-                 const coord<T,2>& c)
-    {
-        std::basic_ostringstream<charT,traits> s;
-        s.copyfmt(out);
-        s.width(0);
-        s << "coord2(" << std::setprecision(16) 
-          << c.x << "," << c.y<< ")";
-        out << s.str();
-        return out;
-    }
+template <typename charT,typename traits,typename T>
+inline std::basic_ostream<charT,traits>&
+operator << (std::basic_ostream<charT,traits>& out,
+             const coord<T,2>& c)
+{
+    std::basic_ostringstream<charT,traits> s;
+    s.copyfmt(out);
+    s.width(0);
+    s << "coord2(" << std::setprecision(16) 
+      << c.x << "," << c.y<< ")";
+    out << s.str();
+    return out;
+}
 
-    template <typename charT,typename traits,typename T>
-    inline std::basic_ostream<charT,traits>&
-    operator << (std::basic_ostream<charT,traits>& out,
-                 const coord<T,3>& c)
-    {
-        std::basic_ostringstream<charT,traits> s;
-        s.copyfmt(out);
-        s.width(0);
-        s << "coord3(" << std::setprecision(16) 
-          << c.x << "," << c.y<< "," << c.z<<")";
-        out << s.str();
-        return out;
-    } 
+template <typename charT,typename traits,typename T>
+inline std::basic_ostream<charT,traits>&
+operator << (std::basic_ostream<charT,traits>& out,
+             const coord<T,3>& c)
+{
+    std::basic_ostringstream<charT,traits> s;
+    s.copyfmt(out);
+    s.width(0);
+    s << "coord3(" << std::setprecision(16) 
+      << c.x << "," << c.y<< "," << c.z<<")";
+    out << s.str();
+    return out;
+} 
 }
 
 #endif // COORD_HPP
diff --git a/include/mapnik/coord_array.hpp b/include/mapnik/coord_array.hpp
index 742fea2..45c76ca 100644
--- a/include/mapnik/coord_array.hpp
+++ b/include/mapnik/coord_array.hpp
@@ -31,61 +31,61 @@
 #include <cassert>
 
 namespace mapnik {
-    template <typename T>
-    class coord_array 
-    {   
-        typedef T coord_type;
-        coord_type* pt_;
-        const unsigned size_;
-    public:	
-        coord_array(unsigned size=0)
-            : pt_(static_cast<coord_type*>(size==0?0: ::operator new (sizeof(coord_type)*size))),
-              size_(size) {}
-	
-        coord_array(const coord_array& rhs)
-            : pt_(static_cast<coord_type*>(rhs.size_==0?0: ::operator new (sizeof(coord_type)*rhs.size_))),
-              size_(rhs.size_) {
-            memcpy(pt_,rhs.pt_,sizeof(coord_type)*rhs.size_);
-        }
-	
-        ~coord_array() 
-        {
-            ::operator delete (pt_);
-        }
-	
-        unsigned size() const 
-        {
-            return size_;
-        }
-	
-        void set(unsigned index,double x,double y)
-        {
-            assert(index<size_);
-            pt_[index].x=x;
-            pt_[index].y=y;
-        }
-	
-        const coord_type& at(unsigned index) const 
-        {
-            assert(index<size_);
-            return pt_[index];
-        }
-	
-        const coord_type& operator[] (unsigned index) const
-        {
-            assert (index<size_);
-            return pt_[index];
-        }
-	
-        coord_type& operator[] (unsigned index)
-        {
-            assert (index<size_);
-            return pt_[index];
-        }
-	
-    private:
-        coord_array& operator=(const coord_array&);
-    };
+template <typename T>
+class coord_array 
+{   
+    typedef T coord_type;
+    coord_type* pt_;
+    const unsigned size_;
+public: 
+    coord_array(unsigned size=0)
+        : pt_(static_cast<coord_type*>(size==0?0: ::operator new (sizeof(coord_type)*size))),
+          size_(size) {}
+        
+    coord_array(const coord_array& rhs)
+        : pt_(static_cast<coord_type*>(rhs.size_==0?0: ::operator new (sizeof(coord_type)*rhs.size_))),
+          size_(rhs.size_) {
+        memcpy(pt_,rhs.pt_,sizeof(coord_type)*rhs.size_);
+    }
+        
+    ~coord_array() 
+    {
+        ::operator delete (pt_);
+    }
+        
+    unsigned size() const 
+    {
+        return size_;
+    }
+        
+    void set(unsigned index,double x,double y)
+    {
+        assert(index<size_);
+        pt_[index].x=x;
+        pt_[index].y=y;
+    }
+        
+    const coord_type& at(unsigned index) const 
+    {
+        assert(index<size_);
+        return pt_[index];
+    }
+        
+    const coord_type& operator[] (unsigned index) const
+    {
+        assert (index<size_);
+        return pt_[index];
+    }
+        
+    coord_type& operator[] (unsigned index)
+    {
+        assert (index<size_);
+        return pt_[index];
+    }
+        
+private:
+    coord_array& operator=(const coord_array&);
+};
 }
 
 
diff --git a/include/mapnik/css_color_grammar.hpp b/include/mapnik/css_color_grammar.hpp
new file mode 100644
index 0000000..8e04011
--- /dev/null
+++ b/include/mapnik/css_color_grammar.hpp
@@ -0,0 +1,390 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+#ifndef MAPNIK_CSS_COLOR_GRAMMAR_HPP
+#define MAPNIK_CSS_COLOR_GRAMMAR_HPP
+
+// mapnik
+#include <mapnik/color.hpp>
+// spirit2
+#include <boost/config/warning_disable.hpp>
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/qi_action.hpp>
+// phoenix 
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_fusion.hpp>
+#include <boost/spirit/include/phoenix_function.hpp>
+// fusion
+#include <boost/fusion/include/adapt_struct.hpp>
+#include <boost/fusion/include/adapt_adt.hpp>
+
+// stl
+#include <string>
+
+BOOST_FUSION_ADAPT_ADT(
+    mapnik::color,
+    (unsigned, unsigned, obj.red(), obj.set_red(val))
+    (unsigned, unsigned, obj.green(), obj.set_green(val))
+    (unsigned, unsigned, obj.blue(), obj.set_blue(val))
+    (unsigned, unsigned, obj.alpha(), obj.set_alpha(val))
+    )
+
+namespace mapnik
+{
+
+namespace qi = boost::spirit::qi;
+namespace ascii = boost::spirit::ascii;
+namespace phoenix = boost::phoenix;
+
+typedef boost::spirit::ascii::space_type ascii_space_type;
+
+struct named_colors_ : qi::symbols<char,color>
+{
+    named_colors_()
+    {
+        add
+            ("aliceblue", color(240, 248, 255))
+            ("antiquewhite", color(250, 235, 215))
+            ("aqua", color(0, 255, 255))
+            ("aquamarine", color(127, 255, 212))
+            ("azure", color(240, 255, 255))
+            ("beige", color(245, 245, 220))
+            ("bisque", color(255, 228, 196))
+            ("black", color(0, 0, 0))
+            ("blanchedalmond", color(255,235,205))
+            ("blue", color(0, 0, 255))
+            ("blueviolet", color(138, 43, 226))
+            ("brown", color(165, 42, 42))
+            ("burlywood", color(222, 184, 135))
+            ("cadetblue", color(95, 158, 160))
+            ("chartreuse", color(127, 255, 0))
+            ("chocolate", color(210, 105, 30))
+            ("coral", color(255, 127, 80))
+            ("cornflowerblue", color(100, 149, 237))
+            ("cornsilk", color(255, 248, 220))
+            ("crimson", color(220, 20, 60))
+            ("cyan", color(0, 255, 255))
+            ("darkblue", color(0, 0, 139))
+            ("darkcyan", color(0, 139, 139))
+            ("darkgoldenrod", color(184, 134, 11))
+            ("darkgray", color(169, 169, 169))
+            ("darkgreen", color(0, 100, 0))
+            ("darkgrey", color(169, 169, 169))
+            ("darkkhaki", color(189, 183, 107))
+            ("darkmagenta", color(139, 0, 139))
+            ("darkolivegreen", color(85, 107, 47))
+            ("darkorange", color(255, 140, 0))
+            ("darkorchid", color(153, 50, 204))
+            ("darkred", color(139, 0, 0))
+            ("darksalmon", color(233, 150, 122))
+            ("darkseagreen", color(143, 188, 143))
+            ("darkslateblue", color(72, 61, 139))
+            ("darkslategrey", color(47, 79, 79))
+            ("darkturquoise", color(0, 206, 209))
+            ("darkviolet", color(148, 0, 211))
+            ("deeppink", color(255, 20, 147))
+            ("deepskyblue", color(0, 191, 255))
+            ("dimgray", color(105, 105, 105))
+            ("dimgrey", color(105, 105, 105))
+            ("dodgerblue", color(30, 144, 255))
+            ("firebrick", color(178, 34, 34))
+            ("floralwhite", color(255, 250, 240))
+            ("forestgreen", color(34, 139, 34))
+            ("fuchsia", color(255, 0, 255))
+            ("gainsboro", color(220, 220, 220))
+            ("ghostwhite", color(248, 248, 255))
+            ("gold", color(255, 215, 0))
+            ("goldenrod", color(218, 165, 32))
+            ("gray", color(128, 128, 128))
+            ("grey", color(128, 128, 128))
+            ("green", color(0, 128, 0))
+            ("greenyellow", color(173, 255, 47))
+            ("honeydew", color(240, 255, 240))
+            ("hotpink", color(255, 105, 180))
+            ("indianred", color(205, 92, 92))
+            ("indigo", color(75, 0, 130))
+            ("ivory", color(255, 255, 240))
+            ("khaki", color(240, 230, 140))
+            ("lavender", color(230, 230, 250))
+            ("lavenderblush", color(255, 240, 245))
+            ("lawngreen", color(124, 252, 0))
+            ("lemonchiffon", color(255, 250, 205))
+            ("lightblue", color(173, 216, 230))
+            ("lightcoral", color(240, 128, 128))
+            ("lightcyan", color(224, 255, 255))
+            ("lightgoldenrodyellow", color(250, 250, 210))
+            ("lightgray", color(211, 211, 211))
+            ("lightgreen", color(144, 238, 144))
+            ("lightgrey", color(211, 211, 211))
+            ("lightpink", color(255, 182, 193))
+            ("lightsalmon", color(255, 160, 122))
+            ("lightseagreen", color(32, 178, 170))
+            ("lightskyblue", color(135, 206, 250))
+            ("lightslategray", color(119, 136, 153))
+            ("lightslategrey", color(119, 136, 153))
+            ("lightsteelblue", color(176, 196, 222))
+            ("lightyellow", color(255, 255, 224))
+            ("lime", color(0, 255, 0))
+            ("limegreen", color(50, 205, 50))
+            ("linen", color(250, 240, 230))
+            ("magenta", color(255, 0, 255))
+            ("maroon", color(128, 0, 0))
+            ("mediumaquamarine", color(102, 205, 170))
+            ("mediumblue", color(0, 0, 205))
+            ("mediumorchid", color(186, 85, 211))
+            ("mediumpurple", color(147, 112, 219))
+            ("mediumseagreen", color(60, 179, 113))
+            ("mediumslateblue", color(123, 104, 238))
+            ("mediumspringgreen", color(0, 250, 154))
+            ("mediumturquoise", color(72, 209, 204))
+            ("mediumvioletred", color(199, 21, 133))
+            ("midnightblue", color(25, 25, 112))
+            ("mintcream", color(245, 255, 250))
+            ("mistyrose", color(255, 228, 225))
+            ("moccasin", color(255, 228, 181))
+            ("navajowhite", color(255, 222, 173))
+            ("navy", color(0, 0, 128))
+            ("oldlace", color(253, 245, 230))
+            ("olive", color(128, 128, 0))
+            ("olivedrab", color(107, 142, 35))
+            ("orange", color(255, 165, 0))
+            ("orangered", color(255, 69, 0))
+            ("orchid", color(218, 112, 214))
+            ("palegoldenrod", color(238, 232, 170))
+            ("palegreen", color(152, 251, 152))
+            ("paleturquoise", color(175, 238, 238))
+            ("palevioletred", color(219, 112, 147))
+            ("papayawhip", color(255, 239, 213))
+            ("peachpuff", color(255, 218, 185))
+            ("peru", color(205, 133, 63))
+            ("pink", color(255, 192, 203))
+            ("plum", color(221, 160, 221))
+            ("powderblue", color(176, 224, 230))
+            ("purple", color(128, 0, 128))
+            ("red", color(255, 0, 0))
+            ("rosybrown", color(188, 143, 143))
+            ("royalblue", color(65, 105, 225))
+            ("saddlebrown", color(139, 69, 19))
+            ("salmon", color(250, 128, 114))
+            ("sandybrown", color(244, 164, 96))
+            ("seagreen", color(46, 139, 87))
+            ("seashell", color(255, 245, 238))
+            ("sienna", color(160, 82, 45))
+            ("silver", color(192, 192, 192))
+            ("skyblue", color(135, 206, 235))
+            ("slateblue", color(106, 90, 205))
+            ("slategray", color(112, 128, 144))
+            ("slategrey", color(112, 128, 144))
+            ("snow", color(255, 250, 250))
+            ("springgreen", color(0, 255, 127))
+            ("steelblue", color(70, 130, 180))
+            ("tan", color(210, 180, 140))
+            ("teal", color(0, 128, 128))
+            ("thistle", color(216, 191, 216))
+            ("tomato", color(255, 99, 71))
+            ("turquoise", color(64, 224, 208))
+            ("violet", color(238, 130, 238))
+            ("wheat", color(245, 222, 179))
+            ("white", color(255, 255, 255))
+            ("whitesmoke", color(245, 245, 245))
+            ("yellow", color(255, 255, 0))
+            ("yellowgreen", color(154, 205, 50))
+            ("transparent", color(0, 0, 0, 0))
+            ;
+    }
+} ;
+
+// clipper helper
+
+template <int MIN,int MAX>
+inline int clip_int(int val)
+{
+    if (val < MIN ) return MIN;
+    if (val > MAX ) return MAX;
+    return val;
+}
+
+struct percent_conv_impl
+{
+    template <typename T>
+    struct result
+    {
+        typedef unsigned type;
+    };
+    
+    unsigned operator() (double val) const
+    {
+        return clip_int<0,255>(int((255.0 * val)/100.0 + 0.5));
+    }
+};
+
+struct alpha_conv_impl
+{
+    template <typename T>
+    struct result
+    {
+        typedef unsigned type;
+    };
+    
+    unsigned operator() (double val) const
+    {
+        return clip_int<0,255>(int((255.0 * val) + 0.5));
+    }
+};
+
+// http://www.w3.org/TR/css3-color/#hsl-color
+inline double hue_to_rgb( double m1, double m2, double h)
+{
+    if (h < 0.0) h = h + 1.0;
+    else if (h > 1) h = h - 1.0;
+    
+    if (h * 6 < 1.0) 
+        return m1 + (m2 - m1) * h * 6.0;
+    if (h * 2 < 1.0)
+        return m2;
+    if (h * 3 < 2.0)
+        return m1 + (m2 - m1)* (2.0/3.0 - h) * 6.0;
+    return m1;
+}
+
+struct hsl_conv_impl
+{
+    template<typename T0,typename T1, typename T2, typename T3>
+    struct result
+    {
+        typedef void type;
+    };
+    
+    template <typename T0,typename T1, typename T2, typename T3>
+    void operator() (T0 & c, T1 h, T2 s, T3 l) const
+    {
+        double m1,m2;
+        // normalize values
+        h /= 360.0;
+        s /= 100.0;
+        l /= 100.0;
+        
+        if (l <= 0.5)
+            m2 = l * (s + 1.0);
+        else
+            m2 = l + s - l*s;        
+        m1 = l * 2 - m2;
+        
+        double r = hue_to_rgb(m1, m2, h + 1.0/3.0);
+        double g = hue_to_rgb(m1, m2, h);
+        double b = hue_to_rgb(m1, m2, h - 1.0/3.0);
+        
+        c.set_red(clip_int<0,255>(int((255.0 * r) + 0.5)));
+        c.set_green(clip_int<0,255>(int((255.0 * g) + 0.5)));
+        c.set_blue(clip_int<0,255>(int((255.0 * b) + 0.5)));
+    }
+};
+
+
+template <typename Iterator>
+struct css_color_grammar : qi::grammar<Iterator, color(), ascii_space_type>
+{
+    
+    css_color_grammar()
+        : css_color_grammar::base_type(css_color)
+          
+    {
+        using qi::lit;
+        using qi::_val;
+        using qi::double_;
+        using qi::_1;
+        using qi::_a;
+        using qi::_b;
+        using qi::_c;
+        using ascii::no_case;        
+        using phoenix::at_c;
+        
+        css_color %= rgba_color
+            | rgba_percent_color 
+            | hsl_percent_color
+            | hex_color 
+            | hex_color_small 
+            | no_case[named];
+        
+        hex_color = lit('#') 
+            >> hex2 [ at_c<0>(_val) = _1 ]
+            >> hex2 [ at_c<1>(_val) = _1 ]
+            >> hex2 [ at_c<2>(_val) = _1 ]
+            >>-hex2 [ at_c<3>(_val) = _1 ]
+            ;
+        
+        hex_color_small = lit('#')
+            >> hex1 [ at_c<0>(_val) = _1 | _1 << 4 ]
+            >> hex1 [ at_c<1>(_val) = _1 | _1 << 4 ]
+            >> hex1 [ at_c<2>(_val) = _1 | _1 << 4 ]
+            >>-hex1 [ at_c<3>(_val) = _1 | _1 << 4 ]
+            ;
+        
+        rgba_color = lit("rgb") >> -lit('a')
+                                 >> lit('(') 
+                                 >> dec3 [at_c<0>(_val) = _1] >> ','
+                                 >> dec3 [at_c<1>(_val) = _1] >> ','
+                                 >> dec3 [at_c<2>(_val) = _1] 
+                                 >> -(','>> -double_ [at_c<3>(_val) = alpha_converter(_1)])
+                                 >> lit(')')
+            ;
+        
+        rgba_percent_color = lit("rgb") >> -lit('a')
+                                        >> lit('(')
+                                        >> double_ [at_c<0>(_val) = percent_converter(_1)] >> '%' >> ','
+                                        >> double_ [at_c<1>(_val) = percent_converter(_1)] >> '%' >> ','
+                                        >> double_ [at_c<2>(_val) = percent_converter(_1)] >> '%' 
+                                        >> -(','>> -double_ [at_c<3>(_val) = alpha_converter(_1)])
+                                        >> lit(')')
+            ;
+        
+        hsl_percent_color = lit("hsl") >> -lit('a')
+                                       >> lit('(') 
+                                       >> double_ [ _a = _1] >> ','        // hue 0..360            
+                                       >> double_ [ _b = _1] >> '%' >> ',' // saturation 0..100%
+                                       >> double_ [ _c = _1] >> '%'        // lightness  0..100%
+                                       >> -(','>> -double_ [at_c<3>(_val) = alpha_converter(_1)]) // opacity 0...1
+                                       >> lit (')') [ hsl_converter(_val,_a,_b,_c)]
+            ;
+    }
+    
+    qi::uint_parser< unsigned, 16, 2, 2 > hex2 ;
+    qi::uint_parser< unsigned, 16, 1, 1 > hex1 ;
+    qi::uint_parser< unsigned, 10, 1, 3 > dec3 ;
+    qi::rule<Iterator, color(), ascii_space_type> rgba_color;
+    qi::rule<Iterator, color(), ascii_space_type> rgba_percent_color;
+    qi::rule<Iterator, qi::locals<double,double,double>,color(), ascii_space_type> hsl_percent_color;
+    qi::rule<Iterator, color(), ascii_space_type> hex_color;
+    qi::rule<Iterator, color(), ascii_space_type> hex_color_small;
+    qi::rule<Iterator, color(), ascii_space_type> css_color;
+    named_colors_ named;
+    phoenix::function<percent_conv_impl> percent_converter;
+    phoenix::function<alpha_conv_impl>   alpha_converter; 
+    phoenix::function<hsl_conv_impl>  hsl_converter; 
+};
+
+}
+
+#endif //MAPNIK_CSS_COLOR_GRAMMAR_HPP 
diff --git a/include/mapnik/css_color_grammar_deprecated.hpp b/include/mapnik/css_color_grammar_deprecated.hpp
new file mode 100644
index 0000000..1fdd44f
--- /dev/null
+++ b/include/mapnik/css_color_grammar_deprecated.hpp
@@ -0,0 +1,420 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2009 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+#ifndef MAPNIK_CSS_COLOR_GRAMMAR_HPP
+#define MAPNIK_CSS_COLOR_GRAMMAR_HPP
+
+// mapnik
+#include <mapnik/color.hpp>
+// spirit2
+#include <boost/config/warning_disable.hpp>
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/qi_action.hpp>
+// phoenix 
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_fusion.hpp>
+#include <boost/spirit/include/phoenix_function.hpp>
+// fusion
+#include <boost/fusion/include/adapt_struct.hpp>
+
+// not in boost 1.41 
+//#include <boost/fusion/include/adapt_class.hpp>
+
+// stl
+#include <string>
+
+
+//BOOST_FUSION_ADAPT_CLASS(
+//    mapnik::color,
+//   (unsigned, unsigned, obj.red(), obj.set_red(val))
+//   (unsigned, unsigned, obj.green(), obj.set_green(val))
+//   (unsigned, unsigned, obj.blue(), obj.set_blue(val))
+//   (unsigned, unsigned, obj.alpha(), obj.set_alpha(val))
+//   )
+
+namespace mapnik
+{
+// temp workaround . TODO: adapt mapnik::color
+struct css
+{
+    css () 
+        : r(255),g(255),b(255),a(255) {}
+    css(unsigned r_,unsigned g_, unsigned b_,unsigned a_ = 0xff)
+        : r(r_),g(g_),b(b_),a(a_) {}
+    
+    unsigned r;
+    unsigned g;
+    unsigned b;
+    unsigned a;
+};
+
+}
+
+BOOST_FUSION_ADAPT_STRUCT(
+    mapnik::css,
+    (unsigned, r)
+    (unsigned, g)
+    (unsigned, b)
+    (unsigned, a)
+    )
+
+namespace mapnik
+{
+
+namespace qi = boost::spirit::qi;
+namespace ascii = boost::spirit::ascii;
+namespace phoenix = boost::phoenix;
+
+typedef boost::spirit::ascii::space_type ascii_space_type;
+
+struct named_colors_ : qi::symbols<char,css>
+{
+    named_colors_()
+    {
+        add
+            ("aliceblue", css(240, 248, 255))
+            ("antiquewhite", css(250, 235, 215))
+            ("aqua", css(0, 255, 255))
+            ("aquamarine", css(127, 255, 212))
+            ("azure", css(240, 255, 255))
+            ("beige", css(245, 245, 220))
+            ("bisque", css(255, 228, 196))
+            ("black", css(0, 0, 0))
+            ("blanchedalmond", css(255,235,205))
+            ("blue", css(0, 0, 255))
+            ("blueviolet", css(138, 43, 226))
+            ("brown", css(165, 42, 42))
+            ("burlywood", css(222, 184, 135))
+            ("cadetblue", css(95, 158, 160))
+            ("chartreuse", css(127, 255, 0))
+            ("chocolate", css(210, 105, 30))
+            ("coral", css(255, 127, 80))
+            ("cornflowerblue", css(100, 149, 237))
+            ("cornsilk", css(255, 248, 220))
+            ("crimson", css(220, 20, 60))
+            ("cyan", css(0, 255, 255))
+            ("darkblue", css(0, 0, 139))
+            ("darkcyan", css(0, 139, 139))
+            ("darkgoldenrod", css(184, 134, 11))
+            ("darkgray", css(169, 169, 169))
+            ("darkgreen", css(0, 100, 0))
+            ("darkgrey", css(169, 169, 169))
+            ("darkkhaki", css(189, 183, 107))
+            ("darkmagenta", css(139, 0, 139))
+            ("darkolivegreen", css(85, 107, 47))
+            ("darkorange", css(255, 140, 0))
+            ("darkorchid", css(153, 50, 204))
+            ("darkred", css(139, 0, 0))
+            ("darksalmon", css(233, 150, 122))
+            ("darkseagreen", css(143, 188, 143))
+            ("darkslateblue", css(72, 61, 139))
+            ("darkslategrey", css(47, 79, 79))
+            ("darkturquoise", css(0, 206, 209))
+            ("darkviolet", css(148, 0, 211))
+            ("deeppink", css(255, 20, 147))
+            ("deepskyblue", css(0, 191, 255))
+            ("dimgray", css(105, 105, 105))
+            ("dimgrey", css(105, 105, 105))
+            ("dodgerblue", css(30, 144, 255))
+            ("firebrick", css(178, 34, 34))
+            ("floralwhite", css(255, 250, 240))
+            ("forestgreen", css(34, 139, 34))
+            ("fuchsia", css(255, 0, 255))
+            ("gainsboro", css(220, 220, 220))
+            ("ghostwhite", css(248, 248, 255))
+            ("gold", css(255, 215, 0))
+            ("goldenrod", css(218, 165, 32))
+            ("gray", css(128, 128, 128))
+            ("grey", css(128, 128, 128))
+            ("green", css(0, 128, 0))
+            ("greenyellow", css(173, 255, 47))
+            ("honeydew", css(240, 255, 240))
+            ("hotpink", css(255, 105, 180))
+            ("indianred", css(205, 92, 92))
+            ("indigo", css(75, 0, 130))
+            ("ivory", css(255, 255, 240))
+            ("khaki", css(240, 230, 140))
+            ("lavender", css(230, 230, 250))
+            ("lavenderblush", css(255, 240, 245))
+            ("lawngreen", css(124, 252, 0))
+            ("lemonchiffon", css(255, 250, 205))
+            ("lightblue", css(173, 216, 230))
+            ("lightcoral", css(240, 128, 128))
+            ("lightcyan", css(224, 255, 255))
+            ("lightgoldenrodyellow", css(250, 250, 210))
+            ("lightgray", css(211, 211, 211))
+            ("lightgreen", css(144, 238, 144))
+            ("lightgrey", css(211, 211, 211))
+            ("lightpink", css(255, 182, 193))
+            ("lightsalmon", css(255, 160, 122))
+            ("lightseagreen", css(32, 178, 170))
+            ("lightskyblue", css(135, 206, 250))
+            ("lightslategray", css(119, 136, 153))
+            ("lightslategrey", css(119, 136, 153))
+            ("lightsteelblue", css(176, 196, 222))
+            ("lightyellow", css(255, 255, 224))
+            ("lime", css(0, 255, 0))
+            ("limegreen", css(50, 205, 50))
+            ("linen", css(250, 240, 230))
+            ("magenta", css(255, 0, 255))
+            ("maroon", css(128, 0, 0))
+            ("mediumaquamarine", css(102, 205, 170))
+            ("mediumblue", css(0, 0, 205))
+            ("mediumorchid", css(186, 85, 211))
+            ("mediumpurple", css(147, 112, 219))
+            ("mediumseagreen", css(60, 179, 113))
+            ("mediumslateblue", css(123, 104, 238))
+            ("mediumspringgreen", css(0, 250, 154))
+            ("mediumturquoise", css(72, 209, 204))
+            ("mediumvioletred", css(199, 21, 133))
+            ("midnightblue", css(25, 25, 112))
+            ("mintcream", css(245, 255, 250))
+            ("mistyrose", css(255, 228, 225))
+            ("moccasin", css(255, 228, 181))
+            ("navajowhite", css(255, 222, 173))
+            ("navy", css(0, 0, 128))
+            ("oldlace", css(253, 245, 230))
+            ("olive", css(128, 128, 0))
+            ("olivedrab", css(107, 142, 35))
+            ("orange", css(255, 165, 0))
+            ("orangered", css(255, 69, 0))
+            ("orchid", css(218, 112, 214))
+            ("palegoldenrod", css(238, 232, 170))
+            ("palegreen", css(152, 251, 152))
+            ("paleturquoise", css(175, 238, 238))
+            ("palevioletred", css(219, 112, 147))
+            ("papayawhip", css(255, 239, 213))
+            ("peachpuff", css(255, 218, 185))
+            ("peru", css(205, 133, 63))
+            ("pink", css(255, 192, 203))
+            ("plum", css(221, 160, 221))
+            ("powderblue", css(176, 224, 230))
+            ("purple", css(128, 0, 128))
+            ("red", css(255, 0, 0))
+            ("rosybrown", css(188, 143, 143))
+            ("royalblue", css(65, 105, 225))
+            ("saddlebrown", css(139, 69, 19))
+            ("salmon", css(250, 128, 114))
+            ("sandybrown", css(244, 164, 96))
+            ("seagreen", css(46, 139, 87))
+            ("seashell", css(255, 245, 238))
+            ("sienna", css(160, 82, 45))
+            ("silver", css(192, 192, 192))
+            ("skyblue", css(135, 206, 235))
+            ("slateblue", css(106, 90, 205))
+            ("slategray", css(112, 128, 144))
+            ("slategrey", css(112, 128, 144))
+            ("snow", css(255, 250, 250))
+            ("springgreen", css(0, 255, 127))
+            ("steelblue", css(70, 130, 180))
+            ("tan", css(210, 180, 140))
+            ("teal", css(0, 128, 128))
+            ("thistle", css(216, 191, 216))
+            ("tomato", css(255, 99, 71))
+            ("turquoise", css(64, 224, 208))
+            ("violet", css(238, 130, 238))
+            ("wheat", css(245, 222, 179))
+            ("white", css(255, 255, 255))
+            ("whitesmoke", css(245, 245, 245))
+            ("yellow", css(255, 255, 0))
+            ("yellowgreen", css(154, 205, 50))
+            ("transparent", css(0, 0, 0, 0))
+            ;
+    }
+} ;
+
+// clipper helper
+
+template <int MIN,int MAX>
+inline int clip_int(int val)
+{
+    if (val < MIN ) return MIN;
+    if (val > MAX ) return MAX;
+    return val;
+}
+
+struct percent_conv_impl
+{
+    template <typename T>
+    struct result
+    {
+        typedef unsigned type;
+    };
+    
+    unsigned operator() (double val) const
+    {
+        return clip_int<0,255>(int((255.0 * val)/100.0 + 0.5));
+    }
+};
+
+struct alpha_conv_impl
+{
+    template <typename T>
+    struct result
+    {
+        typedef unsigned type;
+    };
+    
+    unsigned operator() (double val) const
+    {
+        return clip_int<0,255>(int((255.0 * val) + 0.5));
+    }
+};
+
+
+// http://www.w3.org/TR/css3-color/#hsl-color
+inline double hue_to_rgb( double m1, double m2, double h)
+{
+    if (h < 0.0) h = h + 1.0;
+    else if (h > 1) h = h - 1.0;
+    
+    if (h * 6 < 1.0) 
+        return m1 + (m2 - m1) * h * 6.0;
+    if (h * 2 < 1.0)
+        return m2;
+    if (h * 3 < 2.0)
+        return m1 + (m2 - m1)* (2.0/3.0 - h) * 6.0;
+    return m1;
+}
+
+struct hsl_conv_impl
+{
+    template<typename T0,typename T1, typename T2, typename T3>
+    struct result
+    {
+        typedef void type;
+    };
+    
+    template <typename T0,typename T1, typename T2, typename T3>
+    void operator() (T0 & c, T1 h, T2 s, T3 l) const
+    {
+        double m1,m2;
+        // normalize values
+        h /= 360.0;
+        s /= 100.0;
+        l /= 100.0;
+        
+        if (l <= 0.5)
+            m2 = l * (s + 1.0);
+        else
+            m2 = l + s - l*s;        
+        m1 = l * 2 - m2;
+        
+        double r = hue_to_rgb(m1, m2, h + 1.0/3.0);
+        double g = hue_to_rgb(m1, m2, h);
+        double b = hue_to_rgb(m1, m2, h - 1.0/3.0);
+        
+        c.r = clip_int<0,255>(int((255.0 * r) + 0.5));
+        c.g = clip_int<0,255>(int((255.0 * g) + 0.5));
+        c.b = clip_int<0,255>(int((255.0 * b) + 0.5));
+    }
+};
+
+
+template <typename Iterator>
+struct css_color_grammar : qi::grammar<Iterator, css(), ascii_space_type>
+{
+    
+    css_color_grammar()
+        : css_color_grammar::base_type(css_color)
+          
+    {
+        using qi::lit;
+        using qi::_val;
+        using qi::double_;
+        using qi::_1;
+        using qi::_a;
+        using qi::_b;
+        using qi::_c;
+        using ascii::no_case;        
+        using phoenix::at_c;
+        
+        css_color %= rgba_color
+            | rgba_percent_color
+            | hsl_percent_color  
+            | hex_color 
+            | hex_color_small 
+            | no_case[named];
+        
+        hex_color %= lit('#') 
+            >> hex2 
+            >> hex2 
+            >> hex2 
+            >> -hex2 
+            ;
+        
+        hex_color_small = lit('#')
+            >> hex1 [ at_c<0>(_val) = _1 | _1 << 4 ]
+            >> hex1 [ at_c<1>(_val) = _1 | _1 << 4 ]
+            >> hex1 [ at_c<2>(_val) = _1 | _1 << 4 ]
+            >> -hex1[ at_c<3>(_val) = _1 | _1 << 4 ]
+            ;
+        
+        rgba_color = lit("rgb") >> -lit('a')
+                                 >> lit('(') 
+                                 >> dec3 [at_c<0>(_val) = _1] >> ','
+                                 >> dec3 [at_c<1>(_val) = _1] >> ','
+                                 >> dec3 [at_c<2>(_val) = _1] 
+                                 >> -(','>> -double_ [at_c<3>(_val) = alpha_converter(_1)])
+                                 >> lit(')')
+            ;
+        
+        rgba_percent_color = lit("rgb") >> -lit('a')
+                                        >> lit('(')
+                                        >> double_ [at_c<0>(_val) = percent_converter(_1)] >> '%' >> ','
+                                        >> double_ [at_c<1>(_val) = percent_converter(_1)] >> '%' >> ','
+                                        >> double_ [at_c<2>(_val) = percent_converter(_1)] >> '%' 
+                                        >> -(','>> -double_ [at_c<3>(_val) = alpha_converter(_1)])
+                                        >> lit(')')
+            ;
+        
+        hsl_percent_color = lit("hsl") >> -lit('a')
+                                       >> lit('(') 
+                                       >> double_ [ _a = _1] >> ','        // hue 0..360            
+                                       >> double_ [ _b = _1] >> '%' >> ',' // saturation 0..100%
+                                       >> double_ [ _c = _1] >> '%'        // lightness  0..100%
+                                       >> -(','>> -double_ [at_c<3>(_val) = alpha_converter(_1)]) // opacity 0...1
+                                       >> lit (')') [ hsl_converter(_val,_a,_b,_c)]
+            ;
+    }
+    
+    qi::uint_parser< unsigned, 16, 2, 2 > hex2 ;
+    qi::uint_parser< unsigned, 16, 1, 1 > hex1 ;
+    qi::uint_parser< unsigned, 10, 1, 3 > dec3 ;
+    qi::rule<Iterator, css(), ascii_space_type> rgba_color;
+    qi::rule<Iterator, css(), ascii_space_type> rgba_percent_color;
+    qi::rule<Iterator, qi::locals<double,double,double>,css(), ascii_space_type> hsl_percent_color;
+    qi::rule<Iterator, css(), ascii_space_type> hex_color;
+    qi::rule<Iterator, css(), ascii_space_type> hex_color_small;
+    qi::rule<Iterator, css(), ascii_space_type> css_color;
+    named_colors_ named;
+    phoenix::function<percent_conv_impl> percent_converter;
+    phoenix::function<alpha_conv_impl>   alpha_converter; 
+    phoenix::function<hsl_conv_impl>  hsl_converter;
+};
+
+}
+
+#endif //MAPNIK_CSS_COLOR_GRAMMAR_HPP 
diff --git a/include/mapnik/css_color_parser.hpp b/include/mapnik/css_color_parser.hpp
deleted file mode 100644
index db954d6..0000000
--- a/include/mapnik/css_color_parser.hpp
+++ /dev/null
@@ -1,442 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-
-//$Id$
-
-#ifndef CSS_COLOR_PARSER_HPP
-#define CSS_COLOR_PARSER_HPP
-
-// boost
-#include <boost/version.hpp>
-
-#if BOOST_VERSION < 103800
-  #include <boost/spirit/core.hpp>
-  #include <boost/spirit/symbols.hpp>
-#else
-  #define BOOST_SPIRIT_USE_OLD_NAMESPACE
-  #include <boost/spirit/include/classic_core.hpp>
-  #include <boost/spirit/include/classic_symbols.hpp>
-#endif
-
-using namespace boost::spirit;
-
-namespace mapnik {
-
-   template <int MIN,int MAX>
-   inline int clip_int(int val)
-   {
-      if (val < MIN ) return MIN;
-      if (val > MAX ) return MAX;
-      return val;
-   }
-   
-    template <typename ColorT>
-    struct named_colors : public symbols<ColorT>
-    {
-        named_colors()
-        {
-            symbols<ColorT>::add
-                ("aliceblue", ColorT(240, 248, 255))
-                ("antiquewhite", ColorT(250, 235, 215))
-                ("aqua", ColorT(0, 255, 255))
-                ("aquamarine", ColorT(127, 255, 212))
-                ("azure", ColorT(240, 255, 255))
-                ("beige", ColorT(245, 245, 220))
-                ("bisque", ColorT(255, 228, 196))
-                ("black", ColorT(0, 0, 0))
-                ("blanchedalmond", ColorT(255,235,205))
-                ("blue", ColorT(0, 0, 255))
-                ("blueviolet", ColorT(138, 43, 226))
-                ("brown", ColorT(165, 42, 42))
-                ("burlywood", ColorT(222, 184, 135))
-                ("cadetblue", ColorT(95, 158, 160))
-                ("chartreuse", ColorT(127, 255, 0))
-                ("chocolate", ColorT(210, 105, 30))
-                ("coral", ColorT(255, 127, 80))
-                ("cornflowerblue", ColorT(100, 149, 237))
-                ("cornsilk", ColorT(255, 248, 220))
-                ("crimson", ColorT(220, 20, 60))
-                ("cyan", ColorT(0, 255, 255))
-                ("darkblue", ColorT(0, 0, 139))
-                ("darkcyan", ColorT(0, 139, 139))
-                ("darkgoldenrod", ColorT(184, 134, 11))
-                ("darkgray", ColorT(169, 169, 169))
-                ("darkgreen", ColorT(0, 100, 0))
-                ("darkgrey", ColorT(169, 169, 169))
-                ("darkkhaki", ColorT(189, 183, 107))
-                ("darkmagenta", ColorT(139, 0, 139))
-                ("darkolivegreen", ColorT(85, 107, 47))
-                ("darkorange", ColorT(255, 140, 0))
-                ("darkorchid", ColorT(153, 50, 204))
-                ("darkred", ColorT(139, 0, 0))
-                ("darksalmon", ColorT(233, 150, 122))
-                ("darkseagreen", ColorT(143, 188, 143))
-                ("darkslateblue", ColorT(72, 61, 139))
-                ("darkslategrey", ColorT(47, 79, 79))
-                ("darkturquoise", ColorT(0, 206, 209))
-                ("darkviolet", ColorT(148, 0, 211))
-                ("deeppink", ColorT(255, 20, 147))
-                ("deepskyblue", ColorT(0, 191, 255))
-                ("dimgray", ColorT(105, 105, 105))
-                ("dimgrey", ColorT(105, 105, 105))
-                ("dodgerblue", ColorT(30, 144, 255))
-                ("firebrick", ColorT(178, 34, 34))
-                ("floralwhite", ColorT(255, 250, 240))
-                ("forestgreen", ColorT(34, 139, 34))
-                ("fuchsia", ColorT(255, 0, 255))
-                ("gainsboro", ColorT(220, 220, 220))
-                ("ghostwhite", ColorT(248, 248, 255))
-                ("gold", ColorT(255, 215, 0))
-                ("goldenrod", ColorT(218, 165, 32))
-                ("gray", ColorT(128, 128, 128))
-                ("grey", ColorT(128, 128, 128))
-                ("green", ColorT(0, 128, 0))
-                ("greenyellow", ColorT(173, 255, 47))
-                ("honeydew", ColorT(240, 255, 240))
-                ("hotpink", ColorT(255, 105, 180))
-                ("indianred", ColorT(205, 92, 92))
-                ("indigo", ColorT(75, 0, 130))
-                ("ivory", ColorT(255, 255, 240))
-                ("khaki", ColorT(240, 230, 140))
-                ("lavender", ColorT(230, 230, 250))
-                ("lavenderblush", ColorT(255, 240, 245))
-                ("lawngreen", ColorT(124, 252, 0))
-                ("lemonchiffon", ColorT(255, 250, 205))
-                ("lightblue", ColorT(173, 216, 230))
-                ("lightcoral", ColorT(240, 128, 128))
-                ("lightcyan", ColorT(224, 255, 255))
-                ("lightgoldenrodyellow", ColorT(250, 250, 210))
-                ("lightgray", ColorT(211, 211, 211))
-                ("lightgreen", ColorT(144, 238, 144))
-                ("lightgrey", ColorT(211, 211, 211))
-                ("lightpink", ColorT(255, 182, 193))
-                ("lightsalmon", ColorT(255, 160, 122))
-                ("lightseagreen", ColorT(32, 178, 170))
-                ("lightskyblue", ColorT(135, 206, 250))
-                ("lightslategray", ColorT(119, 136, 153))
-                ("lightslategrey", ColorT(119, 136, 153))
-                ("lightsteelblue", ColorT(176, 196, 222))
-                ("lightyellow", ColorT(255, 255, 224))
-                ("lime", ColorT(0, 255, 0))
-                ("limegreen", ColorT(50, 205, 50))
-                ("linen", ColorT(250, 240, 230))
-                ("magenta", ColorT(255, 0, 255))
-                ("maroon", ColorT(128, 0, 0))
-                ("mediumaquamarine", ColorT(102, 205, 170))
-                ("mediumblue", ColorT(0, 0, 205))
-                ("mediumorchid", ColorT(186, 85, 211))
-                ("mediumpurple", ColorT(147, 112, 219))
-                ("mediumseagreen", ColorT(60, 179, 113))
-                ("mediumslateblue", ColorT(123, 104, 238))
-                ("mediumspringgreen", ColorT(0, 250, 154))
-                ("mediumturquoise", ColorT(72, 209, 204))
-                ("mediumvioletred", ColorT(199, 21, 133))
-                ("midnightblue", ColorT(25, 25, 112))
-                ("mintcream", ColorT(245, 255, 250))
-                ("mistyrose", ColorT(255, 228, 225))
-                ("moccasin", ColorT(255, 228, 181))
-                ("navajowhite", ColorT(255, 222, 173))
-                ("navy", ColorT(0, 0, 128))
-                ("oldlace", ColorT(253, 245, 230))
-                ("olive", ColorT(128, 128, 0))
-                ("olivedrab", ColorT(107, 142, 35))
-                ("orange", ColorT(255, 165, 0))
-                ("orangered", ColorT(255, 69, 0))
-                ("orchid", ColorT(218, 112, 214))
-                ("palegoldenrod", ColorT(238, 232, 170))
-                ("palegreen", ColorT(152, 251, 152))
-                ("paleturquoise", ColorT(175, 238, 238))
-                ("palevioletred", ColorT(219, 112, 147))
-                ("papayawhip", ColorT(255, 239, 213))
-                ("peachpuff", ColorT(255, 218, 185))
-                ("peru", ColorT(205, 133, 63))
-                ("pink", ColorT(255, 192, 203))
-                ("plum", ColorT(221, 160, 221))
-                ("powderblue", ColorT(176, 224, 230))
-                ("purple", ColorT(128, 0, 128))
-                ("red", ColorT(255, 0, 0))
-                ("rosybrown", ColorT(188, 143, 143))
-                ("royalblue", ColorT(65, 105, 225))
-                ("saddlebrown", ColorT(139, 69, 19))
-                ("salmon", ColorT(250, 128, 114))
-                ("sandybrown", ColorT(244, 164, 96))
-                ("seagreen", ColorT(46, 139, 87))
-                ("seashell", ColorT(255, 245, 238))
-                ("sienna", ColorT(160, 82, 45))
-                ("silver", ColorT(192, 192, 192))
-                ("skyblue", ColorT(135, 206, 235))
-                ("slateblue", ColorT(106, 90, 205))
-                ("slategray", ColorT(112, 128, 144))
-                ("slategrey", ColorT(112, 128, 144))
-                ("snow", ColorT(255, 250, 250))
-                ("springgreen", ColorT(0, 255, 127))
-                ("steelblue", ColorT(70, 130, 180))
-                ("tan", ColorT(210, 180, 140))
-                ("teal", ColorT(0, 128, 128))
-                ("thistle", ColorT(216, 191, 216))
-                ("tomato", ColorT(255, 99, 71))
-                ("turquoise", ColorT(64, 224, 208))
-                ("violet", ColorT(238, 130, 238))
-                ("wheat", ColorT(245, 222, 179))
-                ("white", ColorT(255, 255, 255))
-                ("whitesmoke", ColorT(245, 245, 245))
-                ("yellow", ColorT(255, 255, 0))
-                ("yellowgreen", ColorT(154, 205, 50))
-                ("transparent", ColorT(0, 0, 0, 0))
-                ;
-        }
-    };
-    
-    template <typename ActionsT>
-    struct css_color_grammar : public grammar<css_color_grammar<ActionsT> >
-    {
-        css_color_grammar(ActionsT& actions_)
-            : actions(actions_) {}
-    
-        template <typename ScannerT>
-        struct definition
-        {
-            definition(css_color_grammar const& self)
-            {
-                hex6 = ch_p('#') >> uint6x_p[self.actions.hex6_];
-                hex3 = ch_p('#') >> uint3x_p[self.actions.hex3_];
-                rgb = str_p("rgb") >> '(' >> int_p [self.actions.red_] 
-                                   >> ',' >> int_p [self.actions.green_] 
-                                   >> ',' >> int_p [self.actions.blue_] 
-                                   >> ')';
-                rgba = str_p("rgba") >> '(' >> int_p [self.actions.red_]
-                                   >> ',' >> int_p [self.actions.green_]
-                                   >> ',' >> int_p [self.actions.blue_]
-                                   >> ',' >> real_p[self.actions.alpha_]
-                                   >> ')';
-                rgb_percent = str_p("rgb") >> '(' >> real_p[self.actions.red_p_] >> '%' 
-                                           >> ',' >> real_p[self.actions.green_p_] >> '%'
-                                           >> ',' >> real_p[self.actions.blue_p_] >> '%'
-                                           >> ')';
-                rgba_percent = str_p("rgba") >> '(' >> real_p[self.actions.red_p_] >> '%'
-                                           >> ',' >> real_p[self.actions.green_p_] >> '%'
-                                           >> ',' >> real_p[self.actions.blue_p_] >> '%'
-                                           >> ',' >> real_p[self.actions.alpha_]
-                                           >> ')';
-                css_color = named_colors_p[self.actions.named_] | hex6 | hex3 | rgb_percent | rgba_percent | rgb | rgba; 
-            }
-            boost::spirit::rule<ScannerT> rgb;
-            boost::spirit::rule<ScannerT> rgba;
-            boost::spirit::rule<ScannerT> rgb_percent;
-            boost::spirit::rule<ScannerT> rgba_percent;
-            boost::spirit::rule<ScannerT> hex6;
-            boost::spirit::rule<ScannerT> hex3;
-            boost::spirit::rule<ScannerT> css_color;
-            boost::spirit::rule<ScannerT> const& start() const
-            {
-                return css_color;
-            }
-            int_parser<int, 10, 1, -1> int_p;
-            uint_parser<unsigned, 16, 6, 6> uint6x_p;
-            uint_parser<unsigned, 16, 3, 3> uint3x_p;
-            real_parser<double, real_parser_policies<double>  > real_p;
-            named_colors<typename ActionsT::color_type> named_colors_p;
-	    
-        };
-        ActionsT& actions;	
-    };
-    
-    template <typename ColorT>
-    struct named_color_action
-    {
-        named_color_action(ColorT& c)
-            : c_(c) {}
-	
-        void operator() (ColorT const&c) const
-        {
-            c_=c;
-        }
-        ColorT& c_;
-    };
-
-    template <typename ColorT>
-    struct hex6_action
-    {
-        hex6_action(ColorT& c)
-            : c_(c) {}
-	
-        void operator () (unsigned int hex) const
-        {
-            unsigned r = (hex >> 16) & 0xff;
-            unsigned g = (hex >> 8) & 0xff;
-            unsigned b = hex & 0xff;
-            c_.set_red(r);
-            c_.set_green(g);
-            c_.set_blue(b);
-        }
-        ColorT& c_;
-    };
-    
-    template <typename ColorT>
-    struct hex3_action
-    {
-        hex3_action(ColorT& c)
-            : c_(c) {}
-	
-        void operator () (unsigned int hex) const
-        {
-            unsigned int r = (hex >> 8) & 0xf;
-            unsigned int g = (hex >> 4) & 0xf;
-            unsigned int b = hex & 0xf;
-            c_.set_red( r | r << 4);
-            c_.set_green(g | g << 4);
-            c_.set_blue(b | b << 4);
-        }
-        ColorT& c_;
-    };
-
-    template <typename ColorT>
-    struct red_action
-    {
-        red_action(ColorT& c)
-            : c_(c) {}
-	
-        void operator () (int r) const
-        {
-           c_.set_red(clip_int<0,255>(r));
-        }
-        ColorT& c_;
-    };
-
-    template <typename ColorT>
-    struct green_action
-    {
-        green_action(ColorT& c)
-            : c_(c) {}
-	
-        void operator () (int g) const
-        {
-           c_.set_green(clip_int<0,255>(g));
-        }
-        ColorT& c_;
-    };
-	
-    template <typename ColorT>
-    struct blue_action
-    {
-        blue_action(ColorT& c)
-            : c_(c) {}
-	
-        void operator () (int b) const
-        {
-           c_.set_blue(clip_int<0,255>(b));
-        }
-        ColorT& c_;
-    };
-    
-
-    template <typename ColorT>
-    struct alpha_action
-    {
-        alpha_action(ColorT& c)
-            : c_(c) {}
-        
-        void operator () (double a) const
-        {
-           if (a < 0.0) a = 0.0;
-           if (a > 1.0) a = 1.0;
-           c_.set_alpha(unsigned(a * 255.0 + 0.5));
-        }
-         
-        ColorT& c_;
-    };
-
-
-    template <typename ColorT>
-    struct red_action_p
-    {
-        red_action_p(ColorT& c)
-            : c_(c) {}
-	
-       void operator () (double r) const
-       {
-           c_.set_red(clip_int<0,255>(int((255.0 * r)/100.0 + 0.5)));
-       }
-       ColorT& c_;
-    };
-   
-    template <typename ColorT>
-    struct green_action_p
-    {
-        green_action_p(ColorT& c)
-            : c_(c) {}
-	
-        void operator () (double g) const
-        {
-           c_.set_green(clip_int<0,255>(int((255.0 * g)/100.0 + 0.5)));
-        }
-        ColorT& c_;
-    };
-
-    template <typename ColorT>
-    struct blue_action_p
-    {
-        blue_action_p(ColorT& c)
-            : c_(c) {}
-	
-        void operator () (double b) const
-        {
-           c_.set_blue(clip_int<0,255>(int((255.0 * b)/100.0 + 0.5)));
-        }
-       ColorT& c_;
-    };
-   
-   
-    template <typename ColorT>
-    struct actions
-    {
-        typedef ColorT color_type;
-        actions(ColorT& c)
-           : 
-           named_(c),
-           hex6_(c),
-           hex3_(c),
-           red_(c),
-           green_(c),
-           blue_(c),
-           alpha_(c),
-           red_p_(c),
-           green_p_(c),
-           blue_p_(c) 
-       {
-          c.set_alpha (255);
-       }
-        
-       named_color_action<ColorT> named_;
-       hex6_action<ColorT> hex6_;
-       hex3_action<ColorT> hex3_;
-       red_action<ColorT> red_;
-       green_action<ColorT> green_;
-       blue_action<ColorT> blue_;
-       alpha_action<ColorT> alpha_;
-       red_action_p<ColorT> red_p_;
-       green_action_p<ColorT> green_p_;
-       blue_action_p<ColorT> blue_p_;
-    };
-}
-
-#endif //CSS_COLOR_PARSER_HPP
diff --git a/include/mapnik/ctrans.hpp b/include/mapnik/ctrans.hpp
index 7ec2f66..e18e80f 100644
--- a/include/mapnik/ctrans.hpp
+++ b/include/mapnik/ctrans.hpp
@@ -27,209 +27,270 @@
 
 #include <algorithm>
 
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
+#include <mapnik/vertex.hpp>
 #include <mapnik/coord_array.hpp>
 #include <mapnik/proj_transform.hpp>
 
 namespace mapnik {
-   typedef coord_array<coord2d> CoordinateArray;
+typedef coord_array<coord2d> CoordinateArray;
     
-   template <typename Transform,typename Geometry>
-   struct MAPNIK_DECL coord_transform
-   {
-      coord_transform(Transform const& t, Geometry& geom)
-         : t_(t), geom_(geom) {}
+template <typename Transform,typename Geometry>
+struct MAPNIK_DECL coord_transform
+{
+    coord_transform(Transform const& t, Geometry& geom)
+        : t_(t), geom_(geom) {}
         
-      unsigned  vertex(double *x , double *y) const
-      {
-         unsigned command = geom_.vertex(x,y);
-         t_.forward(x,y);
-         return command;
-      }
+    unsigned  vertex(double *x , double *y) const
+    {
+        unsigned command = geom_.vertex(x,y);
+        t_.forward(x,y);
+        return command;
+    }
         
-      void rewind (unsigned pos)
-      {
-         geom_.rewind(pos);
-      }
+    void rewind (unsigned pos)
+    {
+        geom_.rewind(pos);
+    }
         
-     private:
-      Transform const& t_;
-      Geometry& geom_;
-   };
-
-   template <typename Transform,typename Geometry>
-   struct MAPNIK_DECL coord_transform2
-   {
-      coord_transform2(Transform const& t, 
-                       Geometry const& geom, 
-                       proj_transform const& prj_trans)
-         : t_(t), 
-         geom_(geom), 
-         prj_trans_(prj_trans)  {}
+private:
+    Transform const& t_;
+    Geometry& geom_;
+};
+
+template <typename Transform,typename Geometry>
+struct MAPNIK_DECL coord_transform2
+{
+    typedef std::size_t size_type;
+    typedef typename Geometry::value_type value_type;
+
+    coord_transform2(Transform const& t, 
+                     Geometry const& geom, 
+                     proj_transform const& prj_trans)
+        : t_(t), 
+        geom_(geom), 
+        prj_trans_(prj_trans)  {}
         
-      unsigned  vertex(double * x , double  * y) const
-      {
-         unsigned command = geom_.vertex(x,y);
-         double z=0;
-         prj_trans_.backward(*x,*y,z);
-         t_.forward(x,y);
-         return command;
-      }
+    unsigned vertex(double * x , double  * y) const
+    {
+        unsigned command(SEG_MOVETO);
+        bool ok = false;
+        bool skipped_points = false;
+        while (!ok)
+        {
+            command = geom_.vertex(x,y);
+            double z=0;
+            ok = prj_trans_.backward(*x,*y,z);
+            if (!ok) {
+                skipped_points = true;
+            }
+            ok = ok || (command == SEG_END);
+        }
+        if (skipped_points && (command == SEG_LINETO))
+        {
+            command = SEG_MOVETO;
+        }
+        t_.forward(x,y);
+        return command;
+    }
+
+    /*unsigned  vertex(double * x , double  * y) const
+    {
+        unsigned command = geom_.vertex(x,y);
+        double z=0;
+        prj_trans_.backward(*x,*y,z);
+        t_.forward(x,y);
+        return command;
+    }*/
         
-      void rewind (unsigned pos)
-      {
-         geom_.rewind(pos);
-      }
+    void rewind (unsigned pos)
+    {
+        geom_.rewind(pos);
+    }
+
+    Geometry const& geom() const
+    {
+        return geom_;
+    }
         
-     private:
-      Transform const& t_;
-      Geometry const& geom_;
-      proj_transform const& prj_trans_;
-   };
+private:
+    Transform const& t_;
+    Geometry const& geom_;
+    proj_transform const& prj_trans_;
+};
+
     
-   template <typename Transform,typename Geometry>
-   struct MAPNIK_DECL coord_transform3
-   {
-      coord_transform3(Transform const& t, 
-                       Geometry const& geom, 
-                       proj_transform const& prj_trans,
-                       int dx, int dy)
-         : t_(t), 
-         geom_(geom), 
-         prj_trans_(prj_trans),
-         dx_(dx), dy_(dy) {}
+template <typename Transform,typename Geometry>
+struct MAPNIK_DECL coord_transform3
+{
+    coord_transform3(Transform const& t, 
+                     Geometry const& geom, 
+                     proj_transform const& prj_trans,
+                     int dx, int dy)
+        : t_(t), 
+        geom_(geom), 
+        prj_trans_(prj_trans),
+        dx_(dx), dy_(dy) {}
       
-      unsigned  vertex(double * x , double  * y) const
-      {
-         unsigned command = geom_.vertex(x,y);
-         double z=0;
-         prj_trans_.backward(*x,*y,z);
-         t_.forward(x,y);
-         *x+=dx_;
-         *y+=dy_;
-         return command;
-      }
+    unsigned  vertex(double * x , double  * y) const
+    {
+        unsigned command = geom_.vertex(x,y);
+        double z=0;
+        prj_trans_.backward(*x,*y,z);
+        t_.forward(x,y);
+        *x+=dx_;
+        *y+=dy_;
+        return command;
+    }
       
-      void rewind (unsigned pos)
-      {
-         geom_.rewind(pos);
-      }
+    void rewind (unsigned pos)
+    {
+        geom_.rewind(pos);
+    }
       
-     private:
-      Transform const& t_;
-      Geometry const& geom_;
-      proj_transform const& prj_trans_;
-      int dx_;
-      int dy_;
-   };
+private:
+    Transform const& t_;
+    Geometry const& geom_;
+    proj_transform const& prj_trans_;
+    int dx_;
+    int dy_;
+};
    
-   class CoordTransform
-   {
-      private:
-         int width_;
-         int height_;
-         double sx_;
-         double sy_;
-         Envelope<double> extent_;
-         double offset_x_;
-         double offset_y_;
-      public:
-         CoordTransform(int width,int height,const Envelope<double>& extent,
-                        double offset_x = 0, double offset_y = 0)
-            :width_(width),height_(height),extent_(extent),offset_x_(offset_x),offset_y_(offset_y)
-         {
-            sx_ = ((double)width_)/extent_.width();
-            sy_ = ((double)height_)/extent_.height();
-         }
-
-         inline int width() const
-         {
-            return width_;
-         }
+class CoordTransform
+{
+private:
+    int width_;
+    int height_;
+    double sx_;
+    double sy_;
+    box2d<double> extent_;
+    double offset_x_;
+    double offset_y_;
+public:
+    CoordTransform(int width,int height,const box2d<double>& extent,
+                   double offset_x = 0, double offset_y = 0)
+        :width_(width),height_(height),extent_(extent),offset_x_(offset_x),offset_y_(offset_y)
+    {
+        sx_ = (double(width_))/extent_.width();
+        sy_ = (double(height_))/extent_.height();
+    }
+       
+    inline int width() const
+    {
+        return width_;
+    }
       
-         inline int height() const
-         {
-            return height_;
-         }
-         	
-         inline double scale_x() const
-         {
-            return sx_;
-         }
+    inline int height() const
+    {
+        return height_;
+    }
+                
+    inline double scale_x() const
+    {
+        return sx_;
+    }
       
-         inline double scale_y() const
-         {
-            return sy_;
-         }
+    inline double scale_y() const
+    {
+        return sy_;
+    }
          
-         inline void forward(double * x, double * y) const
-         {
-            *x = (*x - extent_.minx()) * sx_ - offset_x_;
-            *y = (extent_.maxy() - *y) * sy_ - offset_y_;
-         }
+    inline void forward(double * x, double * y) const
+    {
+        *x = (*x - extent_.minx()) * sx_ - offset_x_;
+        *y = (extent_.maxy() - *y) * sy_ - offset_y_;
+    }
         
-         inline void backward(double * x, double * y) const
-         {
-            *x = extent_.minx() + (*x + offset_x_)/sx_;
-            *y = extent_.maxy() - (*y + offset_y_)/sy_;
-         }
+    inline void backward(double * x, double * y) const
+    {
+        *x = extent_.minx() + (*x + offset_x_)/sx_;
+        *y = extent_.maxy() - (*y + offset_y_)/sy_;
+    }
          
-         inline coord2d& forward(coord2d& c) const
-         {
-            forward(&c.x,&c.y);
-            return c;
-         }
+    inline coord2d& forward(coord2d& c) const
+    {
+        forward(&c.x,&c.y);
+        return c;
+    }
          
-         inline coord2d& backward(coord2d& c) const
-         {
-            backward(&c.x,&c.y);
-            return c;
-         }
-
-         inline Envelope<double> forward(const Envelope<double>& e) const
-         {
-            double x0 = e.minx();
-            double y0 = e.miny();
-            double x1 = e.maxx();
-            double y1 = e.maxy();
-            forward(&x0,&y0);
-            forward(&x1,&y1);
-            return Envelope<double>(x0,y0,x1,y1);
-         }
-
-         inline Envelope<double> backward(const Envelope<double>& e) const
-         {
-            double x0 = e.minx();
-            double y0 = e.miny();
-            double x1 = e.maxx();
-            double y1 = e.maxy();
-            backward(&x0,&y0);
-            backward(&x1,&y1);
-            return Envelope<double>(x0,y0,x1,y1);
-         }
-
-         inline CoordinateArray& forward(CoordinateArray& coords) const
-         {
-            for (unsigned i=0;i<coords.size();++i)
-            {
-               forward(coords[i]);
-            }
-            return coords;
-         }
-	
-         inline CoordinateArray& backward(CoordinateArray& coords) const
-         {
-            for (unsigned i=0;i<coords.size();++i)
-            {
-               backward(coords[i]);
-            }
-            return coords;
-         }
-         inline Envelope<double> const& extent() const
-         {
-            return extent_;
-         }
-   };
+    inline coord2d& backward(coord2d& c) const
+    {
+        backward(&c.x,&c.y);
+        return c;
+    }
+
+    inline box2d<double> forward(const box2d<double>& e,proj_transform const& prj_trans) const
+    {
+        double x0 = e.minx();
+        double y0 = e.miny();
+        double x1 = e.maxx();
+        double y1 = e.maxy();
+        double z = 0.0;
+        prj_trans.backward(x0,y0,z);
+        forward(&x0,&y0);
+        prj_trans.backward(x1,y1,z);
+        forward(&x1,&y1);
+        return box2d<double>(x0,y0,x1,y1);
+    }
+
+    inline box2d<double> forward(const box2d<double>& e) const
+    {
+        double x0 = e.minx();
+        double y0 = e.miny();
+        double x1 = e.maxx();
+        double y1 = e.maxy();
+        forward(&x0,&y0);
+        forward(&x1,&y1);
+        return box2d<double>(x0,y0,x1,y1);
+    }
+
+    inline box2d<double> backward(const box2d<double>& e,proj_transform const& prj_trans) const
+    {
+        double x0 = e.minx();
+        double y0 = e.miny();
+        double x1 = e.maxx();
+        double y1 = e.maxy();
+        double z = 0.0;
+        backward(&x0,&y0);
+        prj_trans.forward(x0,y0,z);
+        backward(&x1,&y1);
+        prj_trans.forward(x1,y1,z);
+        return box2d<double>(x0,y0,x1,y1);
+    }
+
+    inline box2d<double> backward(const box2d<double>& e) const
+    {
+        double x0 = e.minx();
+        double y0 = e.miny();
+        double x1 = e.maxx();
+        double y1 = e.maxy();
+        backward(&x0,&y0);
+        backward(&x1,&y1);
+        return box2d<double>(x0,y0,x1,y1);
+    }
+
+    inline CoordinateArray& forward(CoordinateArray& coords) const
+    {
+        for (unsigned i=0;i<coords.size();++i)
+        {
+            forward(coords[i]);
+        }
+        return coords;
+    }
+        
+    inline CoordinateArray& backward(CoordinateArray& coords) const
+    {
+        for (unsigned i=0;i<coords.size();++i)
+        {
+            backward(coords[i]);
+        }
+        return coords;
+    }
+    inline box2d<double> const& extent() const
+    {
+        return extent_;
+    }
+};
 }
 
 #endif //CTRANS_HPP
diff --git a/include/mapnik/datasource.hpp b/include/mapnik/datasource.hpp
index 2c222f8..f2d34e7 100644
--- a/include/mapnik/datasource.hpp
+++ b/include/mapnik/datasource.hpp
@@ -38,101 +38,110 @@
 #include <map>
 #include <string>
 
-namespace mapnik {    
-    typedef MAPNIK_DECL boost::shared_ptr<Feature> feature_ptr;
+namespace mapnik {
+   
+typedef MAPNIK_DECL boost::shared_ptr<Feature> feature_ptr;
     
-    struct MAPNIK_DECL Featureset
-    {
-        virtual feature_ptr next()=0;
-        virtual ~Featureset() {};
-    };
+struct MAPNIK_DECL Featureset
+{
+    virtual feature_ptr next()=0;
+    virtual ~Featureset() {};
+};
     
-    typedef MAPNIK_DECL boost::shared_ptr<Featureset> featureset_ptr;
+typedef MAPNIK_DECL boost::shared_ptr<Featureset> featureset_ptr;
     
-    class MAPNIK_DECL datasource_exception : public std::exception
-    {
-    private:
-        std::string message_;
-    public:
-        datasource_exception(const std::string& message=std::string("no reason"))
-            :message_(message) {}
+class MAPNIK_DECL datasource_exception : public std::exception
+{
+private:
+    std::string message_;
+public:
+    datasource_exception(const std::string& message=std::string("no reason"))
+        :message_(message) {}
 
-        ~datasource_exception() throw() {}
-        virtual const char* what() const throw()
-        {
-            return message_.c_str();
-        }
+    ~datasource_exception() throw() {}
+    virtual const char* what() const throw()
+    {
+        return message_.c_str();
+    }
+};
+    
+class MAPNIK_DECL datasource : private boost::noncopyable
+{
+public:        
+    enum datasource_t {
+        Vector,
+        Raster
     };
+
+    datasource (parameters const& params)
+        : params_(params),
+          is_bound_(false)
+        {}
     
-    class MAPNIK_DECL datasource : private boost::noncopyable
+    /*!
+     * @brief Get the configuration parameters of the data source.
+     *
+     * These vary depending on the type of data source.
+     *
+     * @return The configuration parameters of the data source.
+     */
+    parameters const& params() const
     {
-    public:        
-        enum datasource_t {
-            Vector,
-            Raster
-        };
+        return params_;
+    }
         
-        datasource (parameters const& params)
-            : params_(params) {}
-
-        /*!
-         * @brief Get the configuration parameters of the data source.
-         *
-         * These vary depending on the type of data source.
-         *
-         * @return The configuration parameters of the data source.
-         */
-        parameters const& params() const
-        {
-            return params_;
-        }
-        
-        /*!
-         * @brief Get the type of the datasource
-         * @return The type of the datasource (Vector or Raster)
-         */
-        virtual int type() const=0;
+    /*!
+     * @brief Get the type of the datasource
+     * @return The type of the datasource (Vector or Raster)
+     */
+    virtual int type() const=0;
         
-        virtual featureset_ptr features(const query& q) const=0;
-        virtual featureset_ptr features_at_point(coord2d const& pt) const=0;
-        virtual Envelope<double> envelope() const=0;
-        virtual layer_descriptor get_descriptor() const=0;
-        virtual ~datasource() {};
-    protected:
-        parameters params_;
-    };
+    /*!
+     * @brief Connect to the datasource
+     */
+    virtual void bind() const {};
     
-    typedef std::string datasource_name();
-    typedef datasource* create_ds(const parameters& params);
-    typedef void destroy_ds(datasource *ds);
+    virtual featureset_ptr features(const query& q) const=0;
+    virtual featureset_ptr features_at_point(coord2d const& pt) const=0;
+    virtual box2d<double> envelope() const=0;
+    virtual layer_descriptor get_descriptor() const=0;
+    virtual ~datasource() {};
+protected:
+    parameters params_;
+    mutable bool is_bound_;
+};
+    
+typedef std::string datasource_name();
+typedef datasource* create_ds(const parameters& params, bool bind);
+typedef void destroy_ds(datasource *ds);
 
     
-    class datasource_deleter
+class datasource_deleter
+{
+public:
+    void operator() (datasource* ds)
     {
-    public:
-        void operator() (datasource* ds)
-        {
-            delete ds;
-        }
-    };
+        delete ds;
+    }
+};
 
-    typedef boost::shared_ptr<datasource> datasource_ptr;
+typedef boost::shared_ptr<datasource> datasource_ptr;
     
     
-    #define DATASOURCE_PLUGIN(classname)                              \
-        extern "C" MAPNIK_EXP std::string datasource_name()            \
-        {                                                               \
-            return classname::name();                                   \
-        }                                                               \
-        extern "C"  MAPNIK_EXP datasource* create(const parameters &params) \
-        {                                                               \
-            return new classname(params);                               \
-        }                                                               \
-        extern "C" MAPNIK_EXP void destroy(datasource *ds)             \
-        {                                                               \
-            delete ds;                                                  \
-        }                                                               \
-        //
+#define DATASOURCE_PLUGIN(classname)                                    \
+    extern "C" MAPNIK_EXP std::string datasource_name()                 \
+    {                                                                   \
+        return classname::name();                                       \
+    }                                                                   \
+    extern "C"  MAPNIK_EXP datasource* create(const parameters &params, bool bind) \
+    {                                                                   \
+        return new classname(params, bind);                             \
+    }                                                                   \
+    extern "C" MAPNIK_EXP void destroy(datasource *ds)                  \
+    {                                                                   \
+        delete ds;                                                      \
+    }                                                                   \
+    //
 }
 
 #endif //DATASOURCE_HPP
diff --git a/include/mapnik/datasource_cache.hpp b/include/mapnik/datasource_cache.hpp
index afb5360..4a063c8 100644
--- a/include/mapnik/datasource_cache.hpp
+++ b/include/mapnik/datasource_cache.hpp
@@ -36,23 +36,25 @@
 #include <map>
 
 namespace mapnik {
-    class MAPNIK_DECL datasource_cache : 
+class MAPNIK_DECL datasource_cache : 
         public singleton <datasource_cache,CreateStatic>
-    {
-        friend class CreateStatic<datasource_cache>;
-    private:
-        datasource_cache();
-        ~datasource_cache();
-        datasource_cache(const datasource_cache&);
-        datasource_cache& operator=(const datasource_cache&);
-        static std::map<std::string,boost::shared_ptr<PluginInfo> > plugins_;
-        static bool registered_;
-        static bool insert(const std::string&  name,const lt_dlhandle module);
-    public:
-        static std::vector<std::string> plugin_names ();
-        static void register_datasources(const std::string& path);
-        static boost::shared_ptr<datasource> create(parameters const& params);
-    };
+{
+    friend class CreateStatic<datasource_cache>;
+private:
+    datasource_cache();
+    ~datasource_cache();
+    datasource_cache(const datasource_cache&);
+    datasource_cache& operator=(const datasource_cache&);
+    static std::map<std::string,boost::shared_ptr<PluginInfo> > plugins_;
+    static bool registered_;
+    static bool insert(const std::string&  name,const lt_dlhandle module);
+    static std::vector<std::string> plugin_directories_;
+public:
+    static std::vector<std::string> plugin_names();
+    static std::string plugin_directories();    
+    static void register_datasources(const std::string& path);
+    static boost::shared_ptr<datasource> create(parameters const& params, bool bind=true);
+};
 }
 
 #endif   //DATASOURCE_CACHE_HPP
diff --git a/include/mapnik/distance.hpp b/include/mapnik/distance.hpp
index 5485aa1..ca1b276 100644
--- a/include/mapnik/distance.hpp
+++ b/include/mapnik/distance.hpp
@@ -29,27 +29,27 @@
 
 namespace mapnik
 {
-    struct ellipsoid;
+struct ellipsoid;
     
-    // great-circle distance 
+// great-circle distance 
     
-    class great_circle_distance
-    {
-    public:
-        double operator() (coord2d const& pt0, coord2d const& pt1) const;
-    };
+class great_circle_distance
+{
+public:
+    double operator() (coord2d const& pt0, coord2d const& pt1) const;
+};
     
-    // vincenty distance 
-    /*
-    class vincenty_distance : boost::noncopyble
-    {
-    public:
-        vincenty_distance(ellipsoid const& e);
-        double operator() (coord2d const& pt0, coord2d const& pt1) const;
-    private:
-        ellipsoid & e_;
-    };
-    */
+// vincenty distance 
+/*
+  class vincenty_distance : boost::noncopyble
+  {
+  public:
+  vincenty_distance(ellipsoid const& e);
+  double operator() (coord2d const& pt0, coord2d const& pt1) const;
+  private:
+  ellipsoid & e_;
+  };
+*/
 }
 
 #endif // GEO_UTILS_HPP
diff --git a/include/mapnik/ellipsoid.hpp b/include/mapnik/ellipsoid.hpp
index 96920cd..14ea28f 100644
--- a/include/mapnik/ellipsoid.hpp
+++ b/include/mapnik/ellipsoid.hpp
@@ -22,10 +22,15 @@
 
 //$Id$
 
+#ifndef MAPNIK_ELLIPSOID_HPP
+#define MAPNIK_ELLIPSOID_HPP
+
 namespace mapnik {
-    struct ellipsoid
-    {
-        double a; // semi mayor axis  
-        double b; // semi minor axis
-    };
+struct ellipsoid
+{
+    double a; // semi mayor axis  
+    double b; // semi minor axis
+};
 }
+
+#endif // MAPNIK_ELLIPSOID_HPP
diff --git a/include/mapnik/enumeration.hpp b/include/mapnik/enumeration.hpp
index 82427e0..f93cffc 100644
--- a/include/mapnik/enumeration.hpp
+++ b/include/mapnik/enumeration.hpp
@@ -34,22 +34,22 @@ namespace mapnik {
 
 class illegal_enum_value : public std::exception
 {
-    public:
-        illegal_enum_value() {}
+public:
+    illegal_enum_value() {}
 
-        illegal_enum_value( const std::string & what ) :
-            what_( what )
-        {
-        }
-        virtual ~illegal_enum_value() throw() {};
+    illegal_enum_value( const std::string & what ) :
+        what_( what )
+    {
+    }
+    virtual ~illegal_enum_value() throw() {};
 
-        virtual const char * what() const throw()
-        {
-            return what_.c_str();    
-        }
+    virtual const char * what() const throw()
+    {
+        return what_.c_str();    
+    }
 
-    protected:
-        std::string what_;
+protected:
+    std::string what_;
 };
 
 
@@ -134,156 +134,156 @@ class illegal_enum_value : public std::exception
 
 template <class ENUM, int THE_MAX>
 class MAPNIK_DECL enumeration {
-    public:
-        typedef ENUM native_type;
-        enumeration() {};
-        enumeration( ENUM v ) : value_(v) {} 
-        enumeration( const enumeration & other ) : value_(other.value_) {} 
+public:
+    typedef ENUM native_type;
+    enumeration() {};
+    enumeration( ENUM v ) : value_(v) {} 
+    enumeration( const enumeration & other ) : value_(other.value_) {} 
         
-        /** Assignment operator for native enum values. */
-        void operator=(ENUM v)
+    /** Assignment operator for native enum values. */
+    void operator=(ENUM v)
         {
             value_ = v;
         }
 
-        /** Assignment operator. */
-        void operator=(const enumeration & other)
+    /** Assignment operator. */
+    void operator=(const enumeration & other)
         {
             value_ = other.value_;
         }
 
-        /** Conversion operator for native enum values. */
-        operator ENUM() const
-        {
-            return value_;
-        }
+    /** Conversion operator for native enum values. */
+    operator ENUM() const
+    {
+        return value_;
+    }
 
-        enum Max 
-        {
-            MAX = THE_MAX
-        };
-        ENUM max() const
+    enum Max 
+    {
+        MAX = THE_MAX
+    };
+    ENUM max() const
+    {
+        return THE_MAX;
+    }
+    /** Converts @p str to an enum. 
+     * @throw illegal_enum_value @p str is not a legal identifier.
+     * */
+    void from_string(const std::string & str)
+    {
+        for (unsigned i = 0; i < THE_MAX; ++i)
         {
-            return THE_MAX;
-        }
-        /** Converts @p str to an enum. 
-         * @throw illegal_enum_value @p str is not a legal identifier.
-         * */
-        void from_string(const std::string & str)
-        {
-            for (unsigned i = 0; i < THE_MAX; ++i)
+            if (str == our_strings_[i])
             {
-                if (str == our_strings_[i])
-                {
-                    value_ = static_cast<ENUM>(i);
-                    return;
-                }
+                value_ = static_cast<ENUM>(i);
+                return;
             }
-            throw illegal_enum_value(std::string("Illegal enumeration value '") + 
-                    str + "' for enum " + our_name_);
         }
+        throw illegal_enum_value(std::string("Illegal enumeration value '") + 
+                                 str + "' for enum " + our_name_);
+    }
 
-        /** Parses the input stream @p is for a word consisting of characters and
-         * digits (<i>a-z, A-Z, 0-9</i>) and underscores (<i>_</i>).
-         * The failbit of the stream is set if the word is not a valid identifier.
-         */
-        std::istream & parse(std::istream & is)
-        {
-            std::string word;
-            char c;
+    /** Parses the input stream @p is for a word consisting of characters and
+     * digits (<i>a-z, A-Z, 0-9</i>) and underscores (<i>_</i>).
+     * The failbit of the stream is set if the word is not a valid identifier.
+     */
+    std::istream & parse(std::istream & is)
+    {
+        std::string word;
+        char c;
 
-            while ( is.peek() != std::char_traits< char >::eof())
+        while ( is.peek() != std::char_traits< char >::eof())
+        {
+            is >> c;
+            if ( isspace(c) && word.empty() )
             {
-                is >> c;
-                if ( isspace(c) && word.empty() )
-                {
-                    continue;
-                }
-                if ( isalnum(c) || (c == '_') || c == '-' )
-                {
-                    word += c;
-                }
-                else
-                {
-                    is.unget();
-                    break;
-                }
-            } 
-
-            try
+                continue;
+            }
+            if ( isalnum(c) || (c == '_') || c == '-' )
             {
-                from_string( word );
+                word += c;
             }
-            catch (const illegal_enum_value &)
+            else
             {
-                is.setstate(std::ios::failbit);
+                is.unget();
+                break;
             }
+        } 
 
-            return is;
-        }
-
-        /** Returns the current value as a string identifier. */
-        std::string as_string() const
+        try
         {
-            return our_strings_[value_];
+            from_string( word );
         }
-
-        /** Prints the string identifier to the output stream @p os. */
-        std::ostream & print(std::ostream & os = std::cerr) const 
+        catch (const illegal_enum_value &)
         {
-            return os << our_strings_[value_];
+            is.setstate(std::ios::failbit);
         }
+
+        return is;
+    }
+
+    /** Returns the current value as a string identifier. */
+    std::string as_string() const
+    {
+        return our_strings_[value_];
+    }
+
+    /** Prints the string identifier to the output stream @p os. */
+    std::ostream & print(std::ostream & os = std::cerr) const 
+    {
+        return os << our_strings_[value_];
+    }
         
-        /** Static helper function to iterate over valid identifiers. */
-        static const char * get_string(unsigned i)
-        {
-            return our_strings_[i];
-        }
+    /** Static helper function to iterate over valid identifiers. */
+    static const char * get_string(unsigned i)
+    {
+        return our_strings_[i];
+    }
 
-        /** Performs some simple checks and quits the application if
-         * any error is detected. Tries to print helpful error messages.
-         */
-        static bool verify(const char * filename, unsigned line_no)
+    /** Performs some simple checks and quits the application if
+     * any error is detected. Tries to print helpful error messages.
+     */
+    static bool verify(const char * filename, unsigned line_no)
+    {
+        for (unsigned i = 0; i < THE_MAX; ++i)
         {
-            for (unsigned i = 0; i < THE_MAX; ++i)
+            if (our_strings_[i] == 0 )
             {
-                if (our_strings_[i] == 0 )
-                {
-                    std::cerr << "### FATAL: Not enough strings for enum "
-                              << our_name_ << " defined in file '" << filename 
-                              << "' at line " << line_no << std::endl;
-		    std::exit(1);
-                }
+                std::cerr << "### FATAL: Not enough strings for enum "
+                          << our_name_ << " defined in file '" << filename 
+                          << "' at line " << line_no << std::endl;
+                //std::exit(1);
             }
-            if ( std::string("") != our_strings_[THE_MAX])
-            {
-                std::cerr << "### FATAL: The string array for enum " << our_name_ 
-                          << " defined in file '" << filename << "' at line " << line_no
-                          << " has too many items or is not terminated with an "
-                          << "empty string." << std::endl;
-		std::exit(1);
-            }
-            return true;
         }
-        static const std::string & get_full_qualified_name()
+        if ( std::string("") != our_strings_[THE_MAX])
         {
-            return our_name_;
+            std::cerr << "### FATAL: The string array for enum " << our_name_ 
+                      << " defined in file '" << filename << "' at line " << line_no
+                      << " has too many items or is not terminated with an "
+                      << "empty string." << std::endl;
+            //std::exit(1);
         }
-        static std::string get_name()
+        return true;
+    }
+    static const std::string & get_full_qualified_name()
+    {
+        return our_name_;
+    }
+    static std::string get_name()
+    {
+        std::string::size_type idx = our_name_.find_last_of(":");
+        if ( idx == std::string::npos )
         {
-            std::string::size_type idx = our_name_.find_last_of(":");
-            if ( idx == std::string::npos )
-            {
-                return our_name_;
-            } else {
-                return our_name_.substr( idx + 1 );
-            }
+            return our_name_;
+        } else {
+            return our_name_.substr( idx + 1 );
         }
-    private:
-        ENUM value_;
-        static const char ** our_strings_ ;
-        static std::string our_name_ ;
-        static bool  our_verified_flag_; 
+    }
+private:
+    ENUM value_;
+    static const char ** our_strings_ ;
+    static std::string our_name_ ;
+    static bool  our_verified_flag_; 
 };
 
 /** ostream operator for enumeration 
@@ -313,15 +313,16 @@ operator>>(std::istream & is, mapnik::enumeration<ENUM, THE_MAX> & e)
 /** Helper macro. Creates a typedef.
  * @relates mapnik::enumeration
  */
-#define DEFINE_ENUM( name, e) \
-    typedef mapnik::enumeration<e, e ## _MAX> name
+#define DEFINE_ENUM( name, e)                           \
+    typedef enumeration<e, e ## _MAX> name
 
 /** Helper macro. Runs the verify() method during static initialization.
  * @relates mapnik::enumeration
  */
-#define IMPLEMENT_ENUM( name, strings ) \
-    template <> const char ** name ::our_strings_ = strings; \
-    template <> std::string name ::our_name_ = #name; \
+
+#define IMPLEMENT_ENUM( name, strings )                                 \
+    template <> const char ** name ::our_strings_ = strings;            \
+    template <> std::string name ::our_name_ = #name;                   \
     template <> bool name ::our_verified_flag_( name ::verify(__FILE__, __LINE__));
 
 #endif // MAPNIK_ENUMERATION_INCLUDED
diff --git a/include/mapnik/envelope.hpp b/include/mapnik/envelope.hpp
deleted file mode 100644
index a25bb2b..0000000
--- a/include/mapnik/envelope.hpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-
-//$Id: envelope.hpp 39 2005-04-10 20:39:53Z pavlenko $
-
-#ifndef ENVELOPE_HPP
-#define ENVELOPE_HPP
-
-// mapnik
-#include <mapnik/config.hpp>
-#include <mapnik/coord.hpp>
-// boost
-#include <boost/operators.hpp>
-// stl
-#include <iomanip>
-
-namespace mapnik {
-  
-   /*!
-    * A spatial envelope (i.e. bounding box) which also defines some basic operators.
-    */
-   template <typename T> class MAPNIK_DECL Envelope 
-    : boost::addable<Envelope<T>, 
-      boost::subtractable<Envelope<T>, 
-      boost::dividable2<Envelope<T>, T,
-      boost::multipliable2<Envelope<T>, T > > > >
-    {
-    public:
-        typedef Envelope<T> EnvelopeType;
-    private:
-        T minx_;
-        T miny_;
-        T maxx_;
-        T maxy_;
-    public:
-        Envelope();
-        Envelope(T minx,T miny,T maxx,T maxy);
-        Envelope(const coord<T,2>& c0,const coord<T,2>& c1);
-        Envelope(const EnvelopeType& rhs);
-        T minx() const;
-        T miny() const;
-        T maxx() const;
-        T maxy() const;
-        T width() const;
-        T height() const;
-        void width(T w);
-        void height(T h);
-        coord<T,2> center() const;
-        void expand_to_include(T x,T y);
-        void expand_to_include(const coord<T,2>& c);
-        void expand_to_include(const EnvelopeType& other);
-        bool contains(const coord<T,2> &c) const;
-        bool contains(T x,T y) const;
-        bool contains(const EnvelopeType &other) const;
-        bool intersects(const coord<T,2> &c) const;
-        bool intersects(T x,T y) const;
-        bool intersects(const EnvelopeType &other) const;
-        EnvelopeType intersect(const EnvelopeType& other) const;
-        bool operator==(const EnvelopeType &other) const;
-        void re_center(T cx,T cy);
-        void init(T x0,T y0,T x1,T y1);
-        
-        // define some operators 
-        EnvelopeType& operator+=(EnvelopeType const& other);
-        EnvelopeType& operator-=(EnvelopeType const& other);
-        EnvelopeType& operator*=(T);
-        EnvelopeType& operator/=(T);    
-    };
-    
-    template <class charT,class traits,class T>
-    inline std::basic_ostream<charT,traits>&
-    operator << (std::basic_ostream<charT,traits>& out,
-                 const Envelope<T>& e)
-    {
-        std::basic_ostringstream<charT,traits> s;
-        s.copyfmt(out);
-        s.width(0);
-        s <<"Envelope(" << std::setprecision(16) 
-          << e.minx() << "," << e.miny() <<"," 
-          << e.maxx() << "," << e.maxy() <<")";
-        out << s.str();
-        return out;
-    }
-}
-
-#endif // ENVELOPE_HPP
diff --git a/include/mapnik/expression.hpp b/include/mapnik/expression.hpp
deleted file mode 100644
index d440685..0000000
--- a/include/mapnik/expression.hpp
+++ /dev/null
@@ -1,132 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-
-//$Id$
-
-#ifndef EXPRESSION_HPP
-#define EXPRESSION_HPP
-
-#include <mapnik/value.hpp>
-#include <mapnik/filter_visitor.hpp>
-
-namespace mapnik {
-    template <typename FeatureT> class filter_visitor;
-    template <typename FeatureT>
-    class expression
-    {
-    public:
-        virtual value get_value(FeatureT const& feature) const=0;
-        virtual void accept(filter_visitor<FeatureT>& v)=0;
-        virtual expression<FeatureT>* clone() const=0;
-        virtual std::string to_string() const=0;
-        virtual ~expression() {}
-    };
-
-    template <typename FeatureT> 
-    class literal : public expression<FeatureT>
-    {
-    public:
-        literal(bool val)
-            : expression<FeatureT>(),
-              value_(val) {}
-        literal(int val)
-            : expression<FeatureT>(),
-              value_(val) {}
-        literal(double val)
-            : expression<FeatureT>(),
-              value_(val) {}
-        literal(UnicodeString const& val)
-            : expression<FeatureT>(),
-              value_(val) {}
-        literal(literal const& other)
-            : expression<FeatureT>(),
-              value_(other.value_) {}
-	
-        value get_value(FeatureT const& /*feature*/) const
-        {
-            return value_;
-        }
-          
-        void accept(filter_visitor<FeatureT>& v)
-        {
-            v.visit(*this);
-        }
-          
-        expression<FeatureT>* clone() const
-        {
-            return new literal(*this); 
-        }
-          
-        std::string to_string() const
-        {
-            return value_.to_expression_string();
-        }
-        ~literal() {}
-    private:
-        value value_;
-    };
-  
-
-    template <typename FeatureT> 
-    class property : public expression<FeatureT>
-    {
-    public:
-        property(std::string const& name)
-            : expression<FeatureT>(),
-              name_(name)
-	    {}
-	
-        property(property const& other)
-            : expression<FeatureT>(),
-              name_(other.name_)
-	    {}
-
-        value get_value(FeatureT const& feature) const
-        {
-            return feature[name_];
-        }
-        void accept(filter_visitor<FeatureT>& v)
-        {
-            v.visit(*this);
-        }
-        expression<FeatureT>* clone() const
-        {
-            return new property(*this); 
-        }
-        std::string const& name() const
-        {
-            return name_;
-        }
-
-        std::string to_string() const
-        {
-            return "["+name_+"]";
-        }
-
-        ~property() {}
-
-    private:
-	    std::string name_;
-    };
-}
-
-#endif //EXPRESSION_HPP
diff --git a/include/mapnik/expression_evaluator.hpp b/include/mapnik/expression_evaluator.hpp
new file mode 100644
index 0000000..ad8cfad
--- /dev/null
+++ b/include/mapnik/expression_evaluator.hpp
@@ -0,0 +1,107 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2009 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+#ifndef MAPNIK_EXPRESSION_EVALUATOR_HPP
+#define MAPNIK_EXPRESSION_EVALUATOR_HPP
+
+// boost
+#include <boost/regex.hpp>
+//#include <boost/regex/config.hpp>
+#if defined(BOOST_REGEX_HAS_ICU)
+#include <boost/regex/icu.hpp>
+#endif
+
+namespace mapnik
+{
+template <typename T0, typename T1>
+struct evaluate : boost::static_visitor<T1>
+{
+    typedef T0 feature_type;
+    typedef T1 value_type;
+    
+    explicit evaluate(feature_type const& f)
+        : feature_(f) {}
+    
+    value_type operator() (value_type x) const { return x; }
+    value_type operator() (attribute const& attr) const
+    {
+        return attr.value<value_type,feature_type>(feature_);
+    }
+    
+   
+    value_type operator() (binary_node<tags::logical_and> const & x) const
+    {
+        return (boost::apply_visitor(evaluate<feature_type,value_type>(feature_),x.left).to_bool())
+            && (boost::apply_visitor(evaluate<feature_type,value_type>(feature_),x.right).to_bool());
+    }
+    
+    value_type operator() (binary_node<tags::logical_or> const & x) const
+    {
+        return (boost::apply_visitor(evaluate<feature_type,value_type>(feature_),x.left).to_bool()) 
+            || (boost::apply_visitor(evaluate<feature_type,value_type>(feature_),x.right).to_bool());
+    }
+
+    template <typename Tag> 
+    value_type operator() (binary_node<Tag> const& x) const
+    {
+        typename make_op<Tag>::type operation;
+        return operation(boost::apply_visitor(evaluate<feature_type,value_type>(feature_),x.left), 
+                         boost::apply_visitor(evaluate<feature_type,value_type>(feature_),x.right));
+    }
+
+    template <typename Tag>
+    value_type operator() (unary_node<Tag> const& x) const
+    {
+        return ! (boost::apply_visitor(evaluate<feature_type,value_type>(feature_),x.expr).to_bool());  
+    }
+    
+    value_type operator() (regex_match_node const& x) const
+    {
+        value_type v = boost::apply_visitor(evaluate<feature_type,value_type>(feature_),x.expr);
+#if defined(BOOST_REGEX_HAS_ICU)
+        return boost::u32regex_match(v.to_unicode(),x.pattern);
+#else
+        return boost::regex_match(v.to_string(),x.pattern);
+#endif 
+
+    }
+    
+    value_type operator() (regex_replace_node const& x) const
+    {
+        value_type v = boost::apply_visitor(evaluate<feature_type,value_type>(feature_),x.expr);
+#if defined(BOOST_REGEX_HAS_ICU)
+        return boost::u32regex_replace(v.to_unicode(),x.pattern,x.format);
+#else
+        std::string repl = boost::regex_replace(v.to_string(),x.pattern,x.format);
+        mapnik::transcoder tr_("utf8");
+        return tr_.transcode(repl.c_str());
+#endif 
+    }
+    
+    feature_type const& feature_;
+};
+
+}
+
+#endif //MAPNIK_EXPRESSION_EVALUATOR_HPP
diff --git a/include/mapnik/expression_grammar.hpp b/include/mapnik/expression_grammar.hpp
new file mode 100644
index 0000000..bfb8a22
--- /dev/null
+++ b/include/mapnik/expression_grammar.hpp
@@ -0,0 +1,254 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2009 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+#ifndef MAPNIK_EXPRESSIONS_GRAMMAR_HPP
+#define MAPNIK_EXPRESSIONS_GRAMMAR_HPP
+
+// mapnik
+#include <mapnik/value.hpp>
+#include <mapnik/expression_node.hpp>
+
+// boost
+#include <boost/version.hpp>
+#include <boost/variant.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/concept_check.hpp>
+//spirit2
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/qi_action.hpp>
+//fusion
+#include <boost/fusion/include/adapt_struct.hpp>
+//phoenix
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_object.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_function.hpp>
+#include <boost/spirit/include/phoenix_stl.hpp>
+#include <boost/spirit/home/phoenix/object/construct.hpp>
+
+namespace mapnik
+{
+
+namespace qi = boost::spirit::qi;
+namespace standard_wide =  boost::spirit::standard_wide;
+using standard_wide::space_type;
+
+struct unicode_impl
+{
+    template <typename T>
+    struct result
+    {
+        typedef UnicodeString type;
+    };
+    
+    explicit unicode_impl(mapnik::transcoder const& tr)
+        : tr_(tr) {}
+    
+    UnicodeString operator()(std::string const& str) const
+    {
+        return tr_.transcode(str.c_str());
+    }
+    
+    mapnik::transcoder const& tr_;
+};
+
+struct regex_match_impl
+{
+    template <typename T0, typename T1>
+    struct result
+    {
+        typedef expr_node type;
+    };
+    
+    explicit regex_match_impl(mapnik::transcoder const& tr)
+        : tr_(tr) {}
+    
+    template <typename T0,typename T1>
+    expr_node operator() (T0 & node, T1 const& pattern) const
+    {
+#if defined(BOOST_REGEX_HAS_ICU)
+        return regex_match_node(node,tr_.transcode(pattern.c_str()));
+#else
+        return regex_match_node(node,pattern);
+#endif
+    }
+    
+    mapnik::transcoder const& tr_;
+};
+
+struct regex_replace_impl
+{
+    template <typename T0, typename T1, typename T2>
+    struct result
+    {
+        typedef expr_node type;
+    };
+    
+    explicit regex_replace_impl(mapnik::transcoder const& tr)
+        : tr_(tr) {}
+    
+    template <typename T0,typename T1,typename T2>
+    expr_node operator() (T0 & node, T1 const& pattern, T2 const& format) const
+    {
+#if defined(BOOST_REGEX_HAS_ICU)
+        return regex_replace_node(node,tr_.transcode(pattern.c_str()),tr_.transcode(format.c_str()));
+#else
+        return regex_replace_node(node,pattern,format);
+#endif
+    }
+    
+    mapnik::transcoder const& tr_;
+};
+
+template <typename Iterator>
+struct expression_grammar : qi::grammar<Iterator, expr_node(), space_type>
+{    
+    typedef qi::rule<Iterator, expr_node(), space_type> rule_type;
+    
+    explicit expression_grammar(mapnik::transcoder const& tr)
+        : expression_grammar::base_type(expr),
+          unicode_(unicode_impl(tr)),
+          regex_match_(regex_match_impl(tr)),
+          regex_replace_(regex_replace_impl(tr))
+    {
+        using boost::phoenix::construct;
+        using qi::_1;
+        using qi::_a;
+        using qi::_b;
+        using qi::_r1;
+#if BOOST_VERSION > 104200
+        using qi::no_skip;
+#else
+        using qi::lexeme;
+#endif
+        using qi::_val;
+        using qi::lit;
+        using qi::int_;
+        using qi::double_;
+        using standard_wide::char_;
+        
+        expr = logical_expr.alias();
+        
+        logical_expr = not_expr [_val = _1] 
+            >>
+            *(  (  ( lit("and") | lit("&&")) >> not_expr [_val && _1] )
+                | (( lit("or") | lit("||")) >> not_expr [_val || _1])
+                )
+            ;
+        
+        not_expr = 
+            cond_expr [_val = _1 ]
+            | ((lit("not") | lit('!')) >> cond_expr [ _val = !_1 ])
+            ;
+        
+        cond_expr = equality_expr [_val = _1] | additive_expr [_val = _1] 
+            ;
+
+        equality_expr =
+            relational_expr [_val = _1]
+            >> *(  ( (lit("=") | lit("eq") | lit("is")) >> relational_expr [_val == _1])
+                   | (( lit("!=") | lit("<>") | lit("neq") ) >> relational_expr [_val != _1])
+                )
+            ;
+        
+        regex_match_expr = lit(".match")
+            >> lit('(') 
+            >> ustring [_val = _1] 
+            >> lit(')')
+            ;
+        
+        regex_replace_expr = 
+            lit(".replace")
+            >> lit('(') 
+            >> ustring           [_a = _1]
+            >> lit(',') 
+            >> ustring           [_b = _1]
+            >> lit(')')          [_val = regex_replace_(_r1,_a,_b)]
+            ;
+        
+        relational_expr = additive_expr[_val = _1] 
+            >> 
+            *(  (   (lit("<=") | lit("le") ) >> additive_expr [ _val <= _1 ])
+                | ( (lit('<')  | lit("lt") ) >> additive_expr [ _val <  _1 ])
+                | ( (lit(">=") | lit("ge") ) >> additive_expr [ _val >= _1 ])
+                | ( (lit('>')  | lit("gt") ) >> additive_expr [ _val >  _1 ])
+                )
+            ;
+        additive_expr = multiplicative_expr [_val = _1]
+            >> * (   '+' >> multiplicative_expr[_val += _1]
+                     | '-' >> multiplicative_expr[_val -= _1]
+                )
+            ;
+        
+        multiplicative_expr = primary_expr [_val = _1]
+            >> *(     '*' >> primary_expr [_val *= _1]
+                      | '/' >> primary_expr [_val /= _1]
+                      | '%' >> primary_expr [_val %= _1]
+                      |  regex_match_expr[_val = regex_match_(_val, _1)]
+                      |  regex_replace_expr(_val) [_val = _1]
+                )
+            ;
+        
+ 
+        primary_expr = strict_double [_val = _1]
+            | int_ [_val = _1]
+            | lit("true") [_val = true]
+            | lit("false") [_val = false]
+            | lit("null") [_val = value_null() ]
+            | ustring [_val = unicode_(_1) ]
+            | attr [_val = construct<attribute>( _1 ) ]
+            | '(' >> expr [_val = _1 ] >> ')'
+            ;
+        
+        attr %= '[' >> +(char_ - ']') >> ']';
+#if BOOST_VERSION > 104200
+        ustring %= '\'' >> no_skip[*~char_('\'')] >> '\'';
+#else
+        ustring %= '\'' >> lexeme[*(char_-'\'')] >> '\'';
+#endif
+    }
+    
+    qi::real_parser<double, qi::strict_real_policies<double> > strict_double;
+    boost::phoenix::function<unicode_impl> unicode_;
+    boost::phoenix::function<regex_match_impl> regex_match_;
+    boost::phoenix::function<regex_replace_impl> regex_replace_;
+    //
+    rule_type expr;
+    rule_type equality_expr;
+    rule_type cond_expr;
+    rule_type relational_expr;
+    rule_type logical_expr;
+    rule_type additive_expr;
+    rule_type multiplicative_expr;
+    rule_type not_expr;
+    rule_type primary_expr;
+    qi::rule<Iterator, std::string() > regex_match_expr;
+    qi::rule<Iterator, expr_node(expr_node), qi::locals<std::string,std::string>, space_type> regex_replace_expr;
+    qi::rule<Iterator, std::string() , space_type> attr;
+    qi::rule<Iterator, std::string() > ustring;
+};
+
+} // namespace
+
+#endif  // MAPNIK_EXPRESSIONS_GRAMMAR_HPP
diff --git a/include/mapnik/expression_node.hpp b/include/mapnik/expression_node.hpp
new file mode 100644
index 0000000..e8bbda6
--- /dev/null
+++ b/include/mapnik/expression_node.hpp
@@ -0,0 +1,364 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2009 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef  MAPNIK_EXPRESSION_NODE_HPP
+#define  MAPNIK_EXPRESSION_NODE_HPP
+
+// mapnik
+#include <mapnik/value.hpp>
+#include <mapnik/attribute.hpp>
+// boost
+#include <boost/variant.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/regex.hpp>
+#if defined(BOOST_REGEX_HAS_ICU)
+#include <boost/regex/icu.hpp>
+#endif
+#include <boost/function.hpp>
+
+namespace mapnik
+{
+
+namespace tags  { 
+struct plus
+{
+    static const char* str()
+    {
+        return "+";
+    }
+};
+
+struct minus
+{
+    static const char* str()
+    {
+        return "-";
+    }
+};
+
+struct mult
+{
+    static const char* str()
+    {
+        return "*";
+    }
+};
+
+struct div
+{
+    static const char* str()
+    {
+        return "/";
+    }
+};
+
+
+struct  mod
+{
+    static const char* str()
+    {
+        return "%";
+    }
+};
+
+struct less
+{
+    static const char* str()
+    {
+        return "<";
+    }
+};
+
+struct  less_equal
+{
+    static const char* str()
+    {
+        return "<=";
+    }
+};
+
+struct greater
+{
+    static const char* str()
+    {
+        return ">";
+    }
+};
+
+struct greater_equal
+{
+    static const char* str()
+    {
+        return ">=";
+    }
+};
+
+struct equal_to
+{
+    static const char* str()
+    {
+        return "=";
+    }
+};
+
+struct not_equal_to
+{
+    static const char* str()
+    {
+        return "!=";
+    }
+};
+
+struct logical_not
+{
+    static const char* str()
+    {
+        return "not ";
+    }
+};
+
+struct logical_and
+{
+    static const char* str()
+    {
+        return " and ";
+    }
+};
+
+struct logical_or
+{
+    static const char* str()
+    {
+        return " or ";
+    }
+};
+
+} // end operation tags
+
+
+template <typename Tag> struct binary_node;
+template <typename Tag> struct unary_node;
+struct regex_match_node;
+struct regex_replace_node;
+
+typedef mapnik::value value_type;
+
+typedef boost::variant <  
+value_type,
+attribute,
+boost::recursive_wrapper<binary_node<tags::plus> >,    
+boost::recursive_wrapper<binary_node<tags::minus> >,
+boost::recursive_wrapper<binary_node<tags::mult> >,    
+boost::recursive_wrapper<binary_node<tags::div> >,
+boost::recursive_wrapper<binary_node<tags::mod> >, 
+boost::recursive_wrapper<binary_node<tags::less> >,
+boost::recursive_wrapper<binary_node<tags::less_equal> >,
+boost::recursive_wrapper<binary_node<tags::greater> >,
+boost::recursive_wrapper<binary_node<tags::greater_equal> >,
+boost::recursive_wrapper<binary_node<tags::equal_to> >,
+boost::recursive_wrapper<binary_node<tags::not_equal_to> >,
+boost::recursive_wrapper<unary_node<tags::logical_not> >,
+boost::recursive_wrapper<binary_node<tags::logical_and> >,
+boost::recursive_wrapper<binary_node<tags::logical_or> >,
+boost::recursive_wrapper<regex_match_node>,
+boost::recursive_wrapper<regex_replace_node>
+> expr_node;
+
+template <typename Tag> struct make_op;
+template <> struct make_op<tags::plus> { typedef std::plus<value_type> type;};
+template <> struct make_op<tags::minus> { typedef std::minus<value_type> type;};
+template <> struct make_op<tags::mult> { typedef std::multiplies<value_type> type;};
+template <> struct make_op<tags::div> { typedef std::divides<value_type> type;};
+template <> struct make_op<tags::mod> { typedef std::modulus<value_type> type;};
+template <> struct make_op<tags::less> { typedef std::less<value_type> type;};
+template <> struct make_op<tags::less_equal> { typedef std::less_equal<value_type> type;};
+template <> struct make_op<tags::greater> { typedef std::greater<value_type> type;};
+template <> struct make_op<tags::greater_equal> { typedef std::greater_equal<value_type> type;};
+template <> struct make_op<tags::equal_to> { typedef std::equal_to<value_type> type;};
+template <> struct make_op<tags::not_equal_to> { typedef std::not_equal_to<value_type> type;};
+template <> struct make_op<tags::logical_not> { typedef std::logical_not<value_type> type;};
+template <> struct make_op<tags::logical_and> { typedef std::logical_and<value_type> type;};
+template <> struct make_op<tags::logical_or> { typedef std::logical_or<value_type> type;};
+
+template <typename Tag>
+struct unary_node
+{
+    unary_node (expr_node const& a)
+        : expr(a) {}
+
+    static const char* type()
+    {
+        return Tag::str();
+    }
+    
+    expr_node expr;
+};
+
+template <typename Tag>
+struct binary_node
+{
+    binary_node(expr_node const& a, expr_node const& b)
+        : left(a),
+          right(b) {}
+    
+    static const char* type()
+    {
+        return Tag::str();
+    }
+    expr_node left,right;
+};
+
+#if defined(BOOST_REGEX_HAS_ICU)
+struct regex_match_node
+{
+    regex_match_node (expr_node const& a, UnicodeString const& ustr)
+        : expr(a),
+          pattern(boost::make_u32regex(ustr)) {}
+    
+    expr_node expr;
+    boost::u32regex pattern;
+};
+
+
+struct regex_replace_node
+{
+    regex_replace_node (expr_node const& a, UnicodeString const& ustr, UnicodeString const& f)
+        : expr(a),
+          pattern(boost::make_u32regex(ustr)),
+          format(f) {}
+    
+    expr_node expr;
+    boost::u32regex pattern;
+    UnicodeString format;
+};
+#else
+struct regex_match_node
+{
+    regex_match_node (expr_node const& a, std::string const& str)
+        : expr(a),
+          pattern(str) {}
+    
+    expr_node expr;
+    boost::regex pattern;
+};
+
+
+struct regex_replace_node
+{
+    regex_replace_node (expr_node const& a, std::string const& str, std::string const& f)
+        : expr(a),
+          pattern(str),
+          format(f) {}
+    
+    expr_node expr;
+    boost::regex pattern;
+    std::string format;
+};
+#endif
+
+struct function_call
+{
+    template<typename Fun>
+    explicit function_call (expr_node const a, Fun f)
+        : expr(a),
+          call_(f) {}
+
+    expr_node expr;
+    boost::function<value_type(value_type)> call_;
+};
+
+// ops
+
+inline expr_node & operator += ( expr_node &left ,const expr_node &right) 
+{ 
+    return left =  binary_node<tags::plus>(left,right); 
+} 
+
+inline expr_node & operator -= ( expr_node &left ,const expr_node &right) 
+{ 
+    return left =  binary_node<tags::minus>(left,right); 
+}
+
+inline expr_node & operator *= ( expr_node &left ,const expr_node &right) 
+{ 
+    return left =  binary_node<tags::mult>(left,right); 
+}
+
+inline expr_node & operator /= ( expr_node &left ,const expr_node &right) 
+{ 
+    return left =  binary_node<tags::div>(left,right); 
+}
+
+inline expr_node & operator %= ( expr_node &left ,const expr_node &right) 
+{ 
+    return left = binary_node<tags::mod>(left,right); 
+}
+
+inline expr_node & operator < ( expr_node &left, expr_node const& right)
+{
+    return left = binary_node<tags::less>(left,right);
+} 
+
+inline expr_node & operator <= ( expr_node &left, expr_node const& right)
+{
+    return left = binary_node<tags::less_equal>(left,right);
+} 
+
+inline expr_node & operator > ( expr_node &left, expr_node const& right)
+{
+    return left = binary_node<tags::greater>(left,right);
+} 
+
+inline expr_node & operator >= ( expr_node &left, expr_node const& right)
+{
+    return left = binary_node<tags::greater_equal>(left,right);
+} 
+
+inline expr_node & operator == ( expr_node &left, expr_node const& right)
+{
+    return left = binary_node<tags::equal_to>(left,right);
+}
+
+inline expr_node & operator != ( expr_node &left, expr_node const& right)
+{
+    return left = binary_node<tags::not_equal_to>(left,right);
+}
+
+inline expr_node & operator ! (expr_node & expr)
+{
+    return expr = unary_node<tags::logical_not>(expr);
+}
+
+inline expr_node & operator && ( expr_node &left, expr_node const& right)
+{
+    return left = binary_node<tags::logical_and>(left,right);
+}
+
+inline expr_node & operator || ( expr_node &left, expr_node const& right)
+{
+    return left = binary_node<tags::logical_or>(left,right);
+}
+
+}
+
+
+#endif //MAPNIK_EXPRESSION_NODE_HPP
diff --git a/include/mapnik/expression_string.hpp b/include/mapnik/expression_string.hpp
new file mode 100644
index 0000000..e55ebbf
--- /dev/null
+++ b/include/mapnik/expression_string.hpp
@@ -0,0 +1,39 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2009 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+#ifndef MAPNIK_EXPRESSION_STRING_HPP
+#define MAPNIK_EXPRESSION_STRING_HPP
+
+// mapnik
+#include <mapnik/config.hpp>
+#include <mapnik/expression_node.hpp>
+// stl
+#include <string>
+
+namespace mapnik
+{
+MAPNIK_DECL std::string to_expression_string(expr_node const& );
+}
+
+#endif // MAPNIK_EXPRESSION_STRING_HPP
diff --git a/include/mapnik/factory.hpp b/include/mapnik/factory.hpp
index f4727c1..28baa93 100644
--- a/include/mapnik/factory.hpp
+++ b/include/mapnik/factory.hpp
@@ -32,61 +32,61 @@
 #include <map>
 
 namespace mapnik {
-    template <typename key_type,
-              typename product_type>
-    class default_factory_error
+template <typename key_type,
+          typename product_type>
+class default_factory_error
+{
+public:
+    struct factory_exception : public std::exception
     {
-    public:
-        struct factory_exception : public std::exception
+        const char* what() const throw()
         {
-            const char* what() const throw()
-            {
-                return "uknown object type";
-            }
-        };
-        static product_type* on_unknown_type(const key_type&)
-        {
-            return 0;
+            return "uknown object type";
         }
     };
-
-    template
-    <
-        typename product_type,
-        typename key_type,
-        typename product_creator=product_type* (*)(),
-        template <typename,typename> class factory_error_policy=default_factory_error
-        >
-    class factory : public singleton<factory <product_type,
-                                              key_type,
-                                              product_creator,factory_error_policy> >,
-        factory_error_policy <key_type,product_type>
+    static product_type* on_unknown_type(const key_type&)
     {
-    private:
-        typedef std::map<key_type,product_creator> product_map;
-        product_map map_;
-    public:
+        return 0;
+    }
+};
 
-        bool register_product(const key_type& key,product_creator creator)
-        {
-            return map_.insert(typename product_map::value_type(key,creator)).second;
-        }
+template
+<
+typename product_type,
+typename key_type,
+typename product_creator=product_type* (*)(),
+template <typename,typename> class factory_error_policy=default_factory_error
+>
+class factory : public singleton<factory <product_type,
+                                          key_type,
+                                          product_creator,factory_error_policy> >,
+                factory_error_policy <key_type,product_type>
+{
+private:
+    typedef std::map<key_type,product_creator> product_map;
+    product_map map_;
+public:
 
-        bool unregister_product(const key_type& key)
-        {
-            return map_.erase(key)==1;
-        }
+    bool register_product(const key_type& key,product_creator creator)
+    {
+        return map_.insert(typename product_map::value_type(key,creator)).second;
+    }
+
+    bool unregister_product(const key_type& key)
+    {
+        return map_.erase(key)==1;
+    }
 
-        product_type* create_object(const key_type& key,const std::string& file)
+    product_type* create_object(const key_type& key,const std::string& file)
+    {
+        typename product_map::const_iterator pos=map_.find(key);
+        if (pos!=map_.end())
         {
-            typename product_map::const_iterator pos=map_.find(key);
-            if (pos!=map_.end())
-            {
-                return (pos->second)(file);
-            }
-            return on_unknown_type(key);
+            return (pos->second)(file);
         }
-    };
+        return factory_error_policy<key_type,product_type>::on_unknown_type(key);
+    }
+};
 }
 
 #endif //FACTORY_HPP
diff --git a/include/mapnik/fastmath.hpp b/include/mapnik/fastmath.hpp
new file mode 100644
index 0000000..78259e5
--- /dev/null
+++ b/include/mapnik/fastmath.hpp
@@ -0,0 +1,112 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef FASTMATH_HPP
+#define FASTMATH_HPP
+
+/* Timings:
+ * fast_sin(not inlined) 8.95s
+ * fast_sin(inlined) 6.64s
+ * sin 28.7s
+ * => 4.3x speedup
+ * worst case accuracy abs(fast_sin(x)/sin(x) - 1) = 0.000018 (at 0.664, M_PI-0.664, M_PI+0.664; 2*M_PI-0.664)
+ */
+static inline double fast_sin(double x)
+{
+    bool negative = false;
+    double result;
+    while (x > 2*M_PI) x -= 2*M_PI;
+    while (x < 0) x += 2*M_PI;
+    if (x > M_PI) {
+        x -= M_PI;
+        negative = true;
+    }
+
+    if (x < 0.664 || x > M_PI-0.664) {
+        //series expansion at x=0:  x-x^3/6+x^5/120-x^7/5040+...
+        if (x > M_PI-0.664) x = M_PI - x;
+        result = x*(1. + x*x*(-1/6. + x*x/120.));
+    } else {
+        //series expansion at x=pi/2
+        //1-x^2/2+x^4/24-x^6/720+x^8/40320+...
+        x -= M_PI/2;
+        result =  1. + x*x*(-1/2.+x*x*(1/24. + x*x*(-1/720.)));
+    }
+    return negative?-result:result;
+}
+
+static inline double fast_cos(double x)
+{
+    return fast_sin(x + M_PI/2);
+}
+
+static inline  double atan_helper(double x)
+{
+    //Series expansion at x=0:
+    // x-x^3/3+x^5/5-x^7/7+...
+    if (x < 0.30) {
+        return x * (1 + x*x*(-1/3. + x*x*(1/5.) + x*x*(-1/7. + x*x*(1/9.))));
+    }
+    else if (x < 0.71) {
+        //Series expansion at x=0.5
+        //atan(1/2)+(4 x)/5-(8 x^2)/25-(16 x^3)/375+(96 x^4)/625 +...
+        x -= 0.5;
+        return 0.463647609000806116 /*atan(0.5) */ + x *(4./5. + x *(-8./25. + (-16./375.*x)));
+    } else {
+        //series expansion at x=1:
+        //pi/4+x/2-x^2/4+x^3/12-x^5/40+...
+        x -= 1;
+        return (M_PI/4.) + x * (1/2. + x*(-1/4. +x*(1/12. + x * (-1/40.))));
+    }
+}
+
+/*
+ * fast_atan(not inlined) 6.74s
+ * fast_atan(everything inlined) 6.78s
+ * fast_atan(only helper inlined) 6.75
+ * atan 27.5s
+ * => 4x speedup
+ * worst case accuracy abs(fast_atan(x)/atan(x) - 1) = 0.000271 (at 1.411)
+ */
+double inline fast_atan(double x)
+{
+    double negative = false;
+    double result;
+    if (x < 0) {
+        x = -x;
+        negative = true;
+    }
+    if (x <= 1) result = atan_helper(x); else result = M_PI/2 - atan_helper(1/x);
+    return negative?-result:result;
+}
+
+static inline double fast_atan2(double y, double x)
+{
+    double result = M_PI/2;
+    if (x == 0 && y == 0) return 0;
+    if (x != 0) result = fast_atan(y/x);
+    if (x < 0 && y >= 0) return result + M_PI;
+    if (x <= 0 && y < 0) return -M_PI + result;
+    return result;
+}
+
+#endif // FASTMATH_HPP
diff --git a/include/mapnik/feature.hpp b/include/mapnik/feature.hpp
index ea37824..462733e 100644
--- a/include/mapnik/feature.hpp
+++ b/include/mapnik/feature.hpp
@@ -43,130 +43,142 @@
 #include <map>
 
 namespace mapnik {
-   typedef boost::shared_ptr<raster> raster_ptr;    
-   typedef boost::associative_property_map<
-      std::map<std::string,value
-               > > properties;
+typedef boost::shared_ptr<raster> raster_ptr;    
+typedef boost::associative_property_map<
+std::map<std::string,value
+         > > properties;
    
-   template <typename T1,typename T2>
-   struct feature : public properties,
-                    private boost::noncopyable
-   {
-      public:
-         typedef T1 geometry_type;
-         typedef T2 raster_type;
-         typedef std::map<std::string,value>::value_type value_type;
-         typedef std::map<std::string,value>::size_type size_type;
-         
-      private:
-         int id_;
-         boost::ptr_vector<geometry_type> geom_cont_;
-         raster_type   raster_;
-         std::map<std::string,value> props_;
-      public:
-         typedef std::map<std::string,value>::iterator iterator;
-         explicit feature(int id)
-            : properties(props_),
-              id_(id),
-              geom_cont_(),
-              raster_() {}
-         
-         //feature(int id,const geometry_type& geom)
-         //  : properties(props_),
-         //   id_(id),
-         //   geom_(geom),
-         //   raster_() {}
-         
-         int id() const 
-         {
-            return id_;
-         }
-          
-         void add_geometry(geometry_type * geom)
-         {
-            geom_cont_.push_back(geom);
-         }
-         
-         unsigned num_geometries() const
-         {
-            return geom_cont_.size();
-         }
-         
-         geometry_type const& get_geometry(unsigned index) const
-         {
-            return geom_cont_[index];
-         }
-         
-         geometry_type& get_geometry(unsigned index)
-         {
-            return geom_cont_[index];
-         }
+template <typename T1,typename T2>
+struct feature : public properties,
+                 private boost::noncopyable
+{
+public:
+    typedef T1 geometry_type;
+    typedef T2 raster_type;
+    typedef std::map<std::string,value>::value_type value_type;
+    typedef std::map<std::string,value>::size_type size_type;
+    typedef std::map<std::string,value>::difference_type difference_type;
+       
+private:
+    int id_;
+    boost::ptr_vector<geometry_type> geom_cont_;
+    raster_type   raster_;
+    std::map<std::string,value> props_;
+public:
+    typedef std::map<std::string,value>::iterator iterator;
+    explicit feature(int id)
+        : properties(props_),
+          id_(id),
+          geom_cont_(),
+          raster_() {}
+       
+    int id() const 
+    {
+        return id_;
+    }
 
-         Envelope<double> envelope() const
-         {
-             Envelope<double> result;
-             for (unsigned i=0;i<num_geometries();++i)
-             {
-                geometry2d const& geom = get_geometry(i);
-                if (i==0)
-                {
-                    Envelope<double> box = geom.envelope();
-                    result.init(box.minx(),box.miny(),box.maxx(),box.maxy());
-                }
-                else
-                {
-                    result.expand_to_include(geom.envelope());
-                }
-             }
-             return result;
-         }
-
-         const raster_type& get_raster() const
-         {
-            return raster_;
-         }
-          
-         void set_raster(raster_type const& raster)
-         {
-            raster_=raster;
-         }
-          
-         std::map<std::string,value> const& props() const 
-         {
-            return props_;
-         }
-          
-         iterator begin() const
-         {
-            return props_.begin();
-         }
-          
-         iterator end() const
-         {
-            return props_.end();
-         }
-          
-         std::string to_string() const
-         {
-            std::stringstream ss;
-            ss << "feature (" << std::endl;
-            for (std::map<std::string,value>::const_iterator itr=props_.begin();
-                 itr != props_.end();++itr)
+    void set_id(int id)
+    {
+        id_ = id;
+    }
+    
+    boost::ptr_vector<geometry_type> & paths() 
+    {
+        return geom_cont_;
+    }
+    
+    
+    void add_geometry(geometry_type * geom)
+    {
+       geom_cont_.push_back(geom);
+    }
+       
+    unsigned num_geometries() const
+    {
+        return geom_cont_.size();
+    }
+    
+    geometry_type const& get_geometry(unsigned index) const
+    {
+        return geom_cont_[index];
+    }
+       
+    geometry_type& get_geometry(unsigned index)
+    {
+        return geom_cont_[index];
+    }
+       
+    box2d<double> envelope() const
+    {
+        box2d<double> result;
+        for (unsigned i=0;i<num_geometries();++i)
+        {
+            geometry_type const& geom = get_geometry(i);
+            if (i==0)
+            {
+                box2d<double> box = geom.envelope();
+                result.init(box.minx(),box.miny(),box.maxx(),box.maxy());
+            }
+            else
             {
-               ss << "  " << itr->first  << ":" <<  itr->second << std::endl;
+                result.expand_to_include(geom.envelope());
             }
-            ss << ")" << std::endl;
-            return ss.str();
-         }
-   };
+        }
+        return result;
+    }
+       
+    const raster_type& get_raster() const
+    {
+        return raster_;
+    }
+       
+    void set_raster(raster_type const& raster)
+    {
+        raster_=raster;
+    }
+       
+    std::map<std::string,value> const& props() const 
+    {
+        return props_;
+    }
+       
+    std::map<std::string,value>& props() 
+    {
+        return props_;
+    }
+    
+    iterator begin()
+    {
+        return props_.begin();
+    }
+       
+    iterator end()
+    {
+        return props_.end();
+    }
+       
+    std::string to_string() const
+    {
+        std::stringstream ss;
+        ss << "feature (" << std::endl;
+        ss << "  id:" << id_ << std::endl;
+        for (std::map<std::string,value>::const_iterator itr=props_.begin();
+             itr != props_.end();++itr)
+        {
+            ss << "  " << itr->first  << ":" <<  itr->second << std::endl;
+        }
+        ss << ")" << std::endl;
+        return ss.str();
+    }
+};
    
-   typedef feature<geometry2d,raster_ptr> Feature;
+typedef feature<geometry_type,raster_ptr> Feature;
    
-   inline std::ostream& operator<< (std::ostream & out,Feature const& f)
-   {
-      out << f.to_string();
-      return out;
-   }
+inline std::ostream& operator<< (std::ostream & out,Feature const& f)
+{
+    out << f.to_string();
+    return out;
+}
 }
 
 #endif //FEATURE_HPP
diff --git a/include/mapnik/feature_factory.hpp b/include/mapnik/feature_factory.hpp
index 0df52be..2383e3b 100644
--- a/include/mapnik/feature_factory.hpp
+++ b/include/mapnik/feature_factory.hpp
@@ -26,16 +26,21 @@
 #define FEATURE_FACTORY_HPP
 
 #include <mapnik/feature.hpp>
+#include <boost/make_shared.hpp>
+//#include <boost/pool/pool_alloc.hpp>
 
 namespace mapnik
 {
-    struct feature_factory
+struct feature_factory
+{
+    static boost::shared_ptr<Feature> create (int fid)
     {
-        static Feature* create (int fid)
-        {
-            return new Feature(fid);
-        }
-    }; 
+        //return boost::allocate_shared<Feature>(boost::pool_allocator<Feature>(),fid);
+        //return boost::allocate_shared<Feature>(boost::fast_pool_allocator<Feature>(),fid);
+        return boost::make_shared<Feature>(fid);
+    }
+
+}; 
 }
 
 #endif //FEATURE_FACTORY_HPP
diff --git a/include/mapnik/feature_layer_desc.hpp b/include/mapnik/feature_layer_desc.hpp
index 9ffa72a..8ae1363 100644
--- a/include/mapnik/feature_layer_desc.hpp
+++ b/include/mapnik/feature_layer_desc.hpp
@@ -25,164 +25,85 @@
 #ifndef FEATURE_LAYER_DESC_HPP
 #define FEATURE_LAYER_DESC_HPP
 
+// mapnik
+#include <mapnik/attribute_descriptor.hpp>
+
 #include <string>
 #include <vector>
 #include <iostream>
 
 namespace mapnik
 {
-    
-   using std::string;
-   using std::vector;
-   using std::clog;
-    
-   enum eAttributeType {
-      Integer=1,
-      Float  =2,
-      Double =3,
-      String =4,
-      Geometry=5,
-      Object=6 
-   };
-    
-   class attribute_descriptor
-   {
-      public:
-         attribute_descriptor(string const& name,unsigned type,
-                              bool primary_key=false,
-                              int size=-1,
-                              int precision=-1)
-            : name_(name),
-              type_(type),
-              primary_key_(primary_key),
-              size_(size),
-              precision_(precision) {}
-	      
-         attribute_descriptor(attribute_descriptor const& other)
-            : name_(other.name_),
-              type_(other.type_),
-              primary_key_(other.primary_key_),
-              size_(other.size_),
-              precision_(other.precision_) {}
-
-         attribute_descriptor& operator=(attribute_descriptor const& other)
-         {
-            if (this == &other)
-               return *this;	    
-            name_=other.name_;
-            type_=other.type_;
-            primary_key_=other.primary_key_;
-            size_=other.size_;
-            precision_=other.precision_;
-            return *this;
-         }
-         string const& get_name() const
-         {
-            return name_;
-         }
-         unsigned  get_type() const
-         {
-            return type_;
-         }
-         bool is_primary_key() const
-         {
-            return primary_key_;
-         }
-         int get_size() const
-         {
-            return size_;
-         } 
-	
-         int get_precision() const
-         {
-            return precision_;
-         }
-      private:
-         string name_;
-         int type_;
-         bool primary_key_;
-         int size_;
-         int precision_;
-   };
-     
-   template <typename charT,typename traits>
-   inline std::basic_ostream<charT,traits>&
-   operator << (std::basic_ostream<charT,traits>& out,
-                attribute_descriptor const& ad)
-   {
-      out << "name=" << ad.get_name() << "\n";
-      out << "type=" << ad.get_type() << "\n";
-      out << "size=" << ad.get_size() << "\n";
-      return out;
-   }
 
-   class layer_descriptor 
-   {
-      public:
-         layer_descriptor(string const& name,string const& encoding)
-            : name_(name),
-              encoding_(encoding) {}
+class layer_descriptor
+{
+public:
+    layer_descriptor(std::string const& name, std::string const& encoding)
+        : name_(name),
+          encoding_(encoding) {}
 
-         layer_descriptor(layer_descriptor const& other)
-            : name_(other.name_),
-              encoding_(other.encoding_),
-              desc_ar_(other.desc_ar_) {}
-	
-         void set_name(string const& name)
-         {
-            name_=name;
-         }
+    layer_descriptor(layer_descriptor const& other)
+        : name_(other.name_),
+          encoding_(other.encoding_),
+          desc_ar_(other.desc_ar_) {}
+        
+    void set_name(std::string const& name)
+    {
+        name_=name;
+    }
          
-         string const& get_name() const
-         {
-            return name_;
-         }
-	
-         void set_encoding(std::string const& encoding) 
-         {
-            encoding_=encoding;
-         }
-	
-         std::string const& get_encoding() const
-         {
-            return encoding_;
-         }
+    std::string const& get_name() const
+    {
+        return name_;
+    }
+        
+    void set_encoding(std::string const& encoding) 
+    {
+        encoding_=encoding;
+    }
+        
+    std::string const& get_encoding() const
+    {
+        return encoding_;
+    }
+
+    void add_descriptor(attribute_descriptor const& desc)
+    {
+        desc_ar_.push_back(desc);
+    }
+        
+    std::vector<attribute_descriptor> const& get_descriptors() const
+    {
+        return desc_ar_;
+    }   
+    
+    std::vector<attribute_descriptor>& get_descriptors()
+    {
+        return desc_ar_;
+    }
 
-         void add_descriptor(attribute_descriptor const& desc)
-         {
-            desc_ar_.push_back(desc);
-         }
-	
-         vector<attribute_descriptor> const& get_descriptors() const
-         {
-            return desc_ar_;
-         }	
-         vector<attribute_descriptor>& get_descriptors()
-         {
-            return desc_ar_;
-         }
-      private:
-         string name_;
-         string encoding_;
-         vector<attribute_descriptor> desc_ar_;
-   };
+private:
+    std::string name_;
+    std::string encoding_;
+    std::vector<attribute_descriptor> desc_ar_;
+};
     
-   template <typename charT,typename traits>
-   inline std::basic_ostream<charT,traits>&
-   operator << (std::basic_ostream<charT,traits>& out,
-                layer_descriptor const& ld)
-   {
-      out << "name=" << ld.get_name() << "\n";
-      out << "encoding=" << ld.get_encoding() << "\n";
-      vector<attribute_descriptor> const& desc_ar=ld.get_descriptors();
-      vector<attribute_descriptor>::const_iterator pos=desc_ar.begin();
-      while (pos != desc_ar.end())
-      {
-         out << *pos++ << "\n";
-	    
-      }
-      return out;
-   }
+template <typename charT,typename traits>
+inline std::basic_ostream<charT,traits>&
+operator << (std::basic_ostream<charT,traits>& out,
+             layer_descriptor const& ld)
+{
+    out << "name=" << ld.get_name() << "\n";
+    out << "encoding=" << ld.get_encoding() << "\n";
+    std::vector<attribute_descriptor> const& desc_ar=ld.get_descriptors();
+    std::vector<attribute_descriptor>::const_iterator pos=desc_ar.begin();
+    while (pos != desc_ar.end())
+    {
+        out << *pos++ << "\n";
+            
+    }
+    return out;
+}
 }
 
 #endif //FEATURE_LAYER_DESC_HPP
diff --git a/include/mapnik/feature_style_processor.hpp b/include/mapnik/feature_style_processor.hpp
index 8508812..6c944d9 100644
--- a/include/mapnik/feature_style_processor.hpp
+++ b/include/mapnik/feature_style_processor.hpp
@@ -25,236 +25,53 @@
 #ifndef FEATURE_STYLE_PROCESSOR_HPP
 #define FEATURE_STYLE_PROCESSOR_HPP
 
-// mapnik
-#include <mapnik/envelope.hpp>
-#include <mapnik/datasource.hpp>
-#include <mapnik/layer.hpp>
-#include <mapnik/map.hpp>
-#include <mapnik/attribute_collector.hpp>
-#include <mapnik/utils.hpp>
-#include <mapnik/projection.hpp>
-#include <mapnik/scale_denominator.hpp>
+#include <set>
+#include <string>
 
-/*
-#ifdef MAPNIK_DEBUG
-#include <mapnik/wall_clock_timer.hpp>
-#endif
-*/
+namespace mapnik
+{
 
-//stl
-#include <vector>
+class Map;
+class layer;
+class projection;
+  
+template <typename Processor>
+class feature_style_processor 
+{
+    struct symbol_dispatch;
+public:
+    explicit feature_style_processor(Map const& m, double scale_factor = 1.0);
 
-namespace mapnik
-{       
-   template <typename Processor>
-   class feature_style_processor 
-   {
-         struct symbol_dispatch : public boost::static_visitor<>
-         {
-               symbol_dispatch (Processor & output,
-                                Feature const& f, 
-                                proj_transform const& prj_trans)
-                  : output_(output),
-                    f_(f),
-                    prj_trans_(prj_trans)  {}
-            
-               template <typename T>
-               void operator () (T const& sym) const
-               {
-                  output_.process(sym,f_,prj_trans_);
-               }
-               
-               Processor & output_;
-               Feature const& f_;
-               proj_transform const& prj_trans_;
-         };
-      public:
-         feature_style_processor(Map const& m)
-            : m_(m) {}
-	 
-         void apply()
-         {
-/*
-#ifdef MAPNIK_DEBUG           
-            mapnik::wall_clock_progress_timer t(std::clog, "map rendering took: ");
-#endif          
-*/
-            Processor & p = static_cast<Processor&>(*this);
-            p.start_map_processing(m_);
-                       
-            try
-            {
-               projection proj(m_.srs()); // map projection
-               double scale_denom = mapnik::scale_denominator(m_,proj.is_geographic());
-#ifdef MAPNIK_DEBUG
-               std::clog << "scale denominator = " << scale_denom << "\n";
-#endif
-               std::vector<Layer>::const_iterator itr = m_.layers().begin();
-               std::vector<Layer>::const_iterator end = m_.layers().end();
-            
-               while (itr != end)
-               {
-                  if (itr->isVisible(scale_denom))
-                  {
-                     apply_to_layer(*itr, p, proj, scale_denom);
-                  }
-                  ++itr;
-               }
-            }
-            catch (proj_init_error& ex)
-            {
-               std::clog << "proj_init_error:" << ex.what() << "\n"; 
-            }
-            
-            p.end_map_processing(m_);
-         }	
-      private:
-         void apply_to_layer(Layer const& lay, Processor & p, 
-                             projection const& proj0,double scale_denom)
-         {
-/*
-#ifdef MAPNIK_DEBUG
-            wall_clock_progress_timer timer(clog, "end layer rendering: ");
-#endif
-*/
-            p.start_layer_processing(lay);
-            boost::shared_ptr<datasource> ds=lay.datasource();
-            if (ds)
-            {
-               Envelope<double> ext = m_.get_buffered_extent();
-               projection proj1(lay.srs());
-               proj_transform prj_trans(proj0,proj1);
+    /*!
+     * @return apply renderer to all map layers.
+     */
+    void apply();
+
+    /*!
+     * @return apply renderer to a single layer, providing pre-populated set of query attribute names.
+     */
+    void apply(mapnik::layer const& lyr, std::set<std::string>& names);
+private:
+    /*!
+     * @return initialize metawriters for a given map and projection.
+     */
+    void start_metawriters(Map const& m_, projection const& proj);
+    /*!
+     * @return stop metawriters that were previously initialized.
+     */
+    void stop_metawriters(Map const& m_);
 
-               Envelope<double> layer_ext = lay.envelope();
-               double lx0 = layer_ext.minx();
-               double ly0 = layer_ext.miny();
-               double lz0 = 0.0;
-               double lx1 = layer_ext.maxx();
-               double ly1 = layer_ext.maxy();
-               double lz1 = 0.0;
-               // back project layers extent into main map projection
-               prj_trans.backward(lx0,ly0,lz0);
-               prj_trans.backward(lx1,ly1,lz1);
-               
-               // if no intersection then nothing to do for layer
-               if ( lx0 > ext.maxx() || lx1 < ext.minx() || ly0 > ext.maxy() || ly1 < ext.miny() )
-               {
-                  return;
-               }
-               
-               // clip query bbox
-               lx0 = std::max(ext.minx(),lx0);
-               ly0 = std::max(ext.miny(),ly0);
-               lx1 = std::min(ext.maxx(),lx1);
-               ly1 = std::min(ext.maxy(),ly1);
-               
-               prj_trans.forward(lx0,ly0,lz0);
-               prj_trans.forward(lx1,ly1,lz1);
-               Envelope<double> bbox(lx0,ly0,lx1,ly1);
-               
-               double resolution = m_.getWidth()/m_.getCurrentExtent().width();
-               query q(bbox,resolution,scale_denom); //BBOX query
-               
-               std::vector<std::string> const& style_names = lay.styles();
-               std::vector<std::string>::const_iterator stylesIter = style_names.begin();
-               std::vector<std::string>::const_iterator stylesEnd = style_names.end(); 
-               for (;stylesIter != stylesEnd; ++stylesIter)
-               {
-                  std::set<std::string> names;
-                  attribute_collector<Feature> collector(names);
-                  std::vector<rule_type*> if_rules;
-                  std::vector<rule_type*> else_rules;
-                    
-                  bool active_rules=false;
-                  
-                  boost::optional<feature_type_style const&> style=m_.find_style(*stylesIter);
-                  if (!style) continue;
-                  
-                  const std::vector<rule_type>& rules=(*style).get_rules();
-                  std::vector<rule_type>::const_iterator ruleIter=rules.begin();
-                  std::vector<rule_type>::const_iterator ruleEnd=rules.end();
-                                        
-                  for (;ruleIter!=ruleEnd;++ruleIter)
-                  {
-                     if (ruleIter->active(scale_denom))
-                     {
-                        active_rules=true;
-                        ruleIter->accept(collector);
+    /*!
+     * @return render a layer given a projection and scale.
+     */
+    void apply_to_layer(layer const& lay, Processor & p, 
+                        projection const& proj0,
+                        double scale_denom,
+                        std::set<std::string>& names);
 
-                        if (ruleIter->has_else_filter())
-                        {
-                           else_rules.push_back(const_cast<rule_type*>(&(*ruleIter)));
-                        }
-                        else
-                        {
-                           if_rules.push_back(const_cast<rule_type*>(&(*ruleIter))); 		    
-                        }
-                     }
-                  }
-                  std::set<std::string>::const_iterator namesIter=names.begin();
-                  std::set<std::string>::const_iterator namesEnd =names.end();
-                    
-                  // push all property names
-                  for (;namesIter!=namesEnd;++namesIter)
-                  {
-                     q.add_property_name(*namesIter);
-                  }
-                  if (active_rules)
-                  {
-                     featureset_ptr fs=ds->features(q);
-                     if (fs)
-                     {   	    
-                        feature_ptr feature;
-                        while ((feature = fs->next()))
-                        {		   
-                           bool do_else=true;		    
-                           std::vector<rule_type*>::const_iterator itr=if_rules.begin();
-                           std::vector<rule_type*>::const_iterator end=if_rules.end();
-                           for (;itr != end;++itr)
-                           {
-                              filter_ptr const& filter=(*itr)->get_filter();    
-                              if (filter->pass(*feature))
-                              {   
-                                 do_else=false;
-                                 const symbolizers& symbols = (*itr)->get_symbolizers();
-                                 symbolizers::const_iterator symIter=symbols.begin();
-                                 symbolizers::const_iterator symEnd =symbols.end();
-                                 for (;symIter != symEnd;++symIter)
-                                 {   
-                                    boost::apply_visitor
-                                       (symbol_dispatch(p,*feature,prj_trans),*symIter);
-                                 }
-                              }			    
-                           }
-                           if (do_else)
-                           {
-                              //else filter
-                              std::vector<rule_type*>::const_iterator itr=
-                                 else_rules.begin();
-                              std::vector<rule_type*>::const_iterator end=
-                                 else_rules.end();
-                              for (;itr != end;++itr)
-                              {
-                                 const symbolizers& symbols = (*itr)->get_symbolizers();
-                                 symbolizers::const_iterator symIter= symbols.begin();
-                                 symbolizers::const_iterator symEnd = symbols.end();
-                                        
-                                 for (;symIter!=symEnd;++symIter)
-                                 {
-                                    boost::apply_visitor
-                                       (symbol_dispatch(p,*feature,prj_trans),*symIter);
-                                 }
-                              }
-                           }	  
-                        }
-                     }
-                  }
-               }               
-            }
-            p.end_layer_processing(lay);
-         }	
-         Map const& m_;
-   };
+    Map const& m_;
+    double scale_factor_;
+};
 }
 
 #endif //FEATURE_STYLE_PROCESSOR_HPP
diff --git a/include/mapnik/feature_type_style.hpp b/include/mapnik/feature_type_style.hpp
index 15a51f4..d4a4287 100644
--- a/include/mapnik/feature_type_style.hpp
+++ b/include/mapnik/feature_type_style.hpp
@@ -27,41 +27,46 @@
 // mapnik 
 #include <mapnik/rule.hpp>
 #include <mapnik/feature.hpp>
+#include <mapnik/enumeration.hpp>
 // stl
 #include <vector>
 
 namespace mapnik
 {
-    typedef std::vector<rule_type> rules;
-    class feature_type_style
-    {
-    private:
-        rules  rules_;
-    public:
-        feature_type_style() {}
 
-        feature_type_style(feature_type_style const& rhs)
-            : rules_(rhs.rules_) {}
-	
-        feature_type_style& operator=(feature_type_style const& rhs)
-        {
-            if (this == &rhs) return *this;
-            rules_=rhs.rules_;
-            return *this;
-        }
-	
-        void add_rule(rule_type const& rule)
-        {
-            rules_.push_back(rule);
-        } 
-	
-        rules const& get_rules() const
-        {
-            return rules_;
-        }
+enum filter_mode_enum {
+    FILTER_ALL,
+    FILTER_FIRST,
+    filter_mode_enum_MAX
+};
+
+DEFINE_ENUM( filter_mode_e, filter_mode_enum );
+
+typedef std::vector<rule> rules;
+class feature_type_style
+{
+private:
+    rules  rules_;
+    filter_mode_e filter_mode_;
+public:
+    feature_type_style();
+
+    feature_type_style(feature_type_style const& rhs);
+        
+    feature_type_style& operator=(feature_type_style const& rhs);
         
-        ~feature_type_style() {}
-    };
+    void add_rule(rule const& rule);
+        
+    rules const& get_rules() const;
+
+    rules &get_rules_nonconst();
+        
+    void set_filter_mode(filter_mode_e mode);
+
+    filter_mode_e get_filter_mode() const;
+    
+    ~feature_type_style() {}
+};
 }
 
 #endif //FEATURE_TYPE_STYLE_HPP
diff --git a/include/mapnik/fill.hpp b/include/mapnik/fill.hpp
index b37e502..2762e88 100644
--- a/include/mapnik/fill.hpp
+++ b/include/mapnik/fill.hpp
@@ -27,10 +27,10 @@
 
 namespace mapnik
 {
-    class fill 
-    {
+class fill 
+{
         
-    };
+};
 }
 
 #endif //FILL_HPP
diff --git a/include/mapnik/filter.hpp b/include/mapnik/filter.hpp
deleted file mode 100644
index 8005ac2..0000000
--- a/include/mapnik/filter.hpp
+++ /dev/null
@@ -1,90 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-
-//$Id$
-
-#ifndef FILTER_HPP
-#define FILTER_HPP
-
-#include <mapnik/config.hpp>
-#include <mapnik/feature.hpp>
-
-namespace mapnik
-{
-    template <typename FeatureT> class filter_visitor;
-    template <typename FeatureT>
-    class MAPNIK_DECL filter
-    {
-      public:
-       virtual bool pass(const FeatureT& feature) const=0; 
-       virtual filter<FeatureT>* clone() const=0;
-       virtual void accept(filter_visitor<FeatureT>& v) = 0;
-       virtual std::string to_string() const=0;
-       virtual ~filter() {}
-    };
-    
-    typedef boost::shared_ptr<filter<Feature> > filter_ptr;
-    
-    template <typename FeatureT>
-    class all_filter : public filter<FeatureT>
-    {
-       public:
-          bool pass (const FeatureT&) const
-          {
-             return true;
-          }
-          
-          filter<FeatureT>* clone() const
-          {
-             return new all_filter<FeatureT>;
-          }
-          std::string to_string() const
-          {
-             return "true";
-          }  
-          void accept(filter_visitor<FeatureT>&) {}
-          virtual ~all_filter() {}
-    };
-   
-   template <typename FeatureT>
-   class none_filter : public filter<FeatureT>
-   {
-      public:
-         bool pass (const FeatureT&) const
-         {
-            return false;
-         }
-         
-         filter<FeatureT>* clone() const
-         {
-            return new none_filter<FeatureT>;
-         }
-         std::string to_string() const
-         {
-            return "false";
-         }  
-         void accept(filter_visitor<FeatureT>&) {}
-         virtual ~none_filter() {}
-	};
-}
-
-#endif //FILTER_HPP
diff --git a/include/mapnik/filter_expression.hpp b/include/mapnik/filter_expression.hpp
deleted file mode 100644
index 9d4a8a5..0000000
--- a/include/mapnik/filter_expression.hpp
+++ /dev/null
@@ -1,67 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-
-//$Id$
-
-#ifndef FILTER_TO_STRING_HPP
-#define FILTER_TO_STRING_HPP
-
-// mapnik
-#include <mapnik/filter.hpp>
-#include <mapnik/expression.hpp>
-// stl
-#include <set>
-
-namespace mapnik
-{
-    template <typename FeatureT>
-    class filter_to_string : public filter_visitor<FeatureT>
-    {
-    private:
-        std::string text_;
-    public:
-        filter_to_string() {}
-        void visit(filter<FeatureT>& /*filter*/) 
-        { 
-            //not interested
-        }
-        void visit(expression<FeatureT>& exp)
-        {
-            property<FeatureT>* pf;
-            if ((pf = dynamic_cast<property<FeatureT>*>(&exp)))
-            {
-                names_.insert(pf->name());
-            }
-        }
-        std::string const& text() const
-        {
-            return text_;
-        }
-	
-        virtual ~filter_to_string() {}
-    private:
-        filter_to_string(filter_to_string const&);
-        filter_to_string& operator=(filter_to_string const&);
-    };
-}
-
-#endif //FILTER_TO_STRING
diff --git a/include/mapnik/filter_factory.hpp b/include/mapnik/filter_factory.hpp
index c35534c..79709c4 100644
--- a/include/mapnik/filter_factory.hpp
+++ b/include/mapnik/filter_factory.hpp
@@ -2,7 +2,7 @@
  * 
  * This file is part of Mapnik (c++ mapping toolkit)
  *
- * Copyright (C) 2006 Artem Pavlenko
+ * Copyright (C) 2006-2009 Artem Pavlenko
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -22,51 +22,23 @@
 
 //$Id$
 
-#ifndef FILTER_FACTORY_HPP
-#define FILTER_FACTORY_HPP
+#ifndef MAPNIK_FILTER_FACTORY_HPP
+#define MAPNIK_FILTER_FACTORY_HPP
 
-#include <mapnik/config_error.hpp>
-#include <mapnik/filter_parser.hpp>
-#include <mapnik/unicode.hpp>
+// mapnik
+#include <mapnik/config.hpp>
+#include <mapnik/expression_node.hpp>
+// stl
+#include <string>
 
 namespace mapnik
 {
-    using std::string;
-    
-    template<typename FeatureT>
-    class MAPNIK_DECL filter_factory
-    {
-    public:
-       static filter_ptr compile(string const& str,transcoder const& tr)
-       {
-          stack<shared_ptr<filter<FeatureT> > > filters;
-          stack<shared_ptr<expression<FeatureT> > > exps;
-          filter_grammar<FeatureT> grammar(filters,exps,tr);
-          parse_info<std::string::const_iterator> info = parse(str.begin(), str.end(), grammar, space_p);
-          if ( !info.full) 
-          {
-             std::ostringstream os;
-             os << "Failed to parse filter expression:\n"
-                << str <<  "\nParsing aborted at '" << *info.stop << "'";
-             
-             throw config_error( os.str() );
-          }
-          
-          if ( ! filters.empty())
-          {
-             return filters.top();	
-          }
-          else 
-          {
-             // XXX: do we ever get here? [DS]
-             return filter_ptr(new none_filter<FeatureT>());
-          }  
-       }
-    };
-   
-   MAPNIK_DECL filter_ptr create_filter (std::string const& wkt, std::string const& encoding);
-   MAPNIK_DECL filter_ptr create_filter (std::string const& wkt);
+
+typedef boost::shared_ptr<expr_node> expression_ptr;
+
+MAPNIK_DECL expression_ptr parse_expression (std::string const& wkt, std::string const& encoding);
+MAPNIK_DECL expression_ptr parse_expression (std::string const& wkt);
    
 }
 
-#endif //FILTER_FACTORY_HPP
+#endif //MAPNIK_FILTER_FACTORY_HPP
diff --git a/include/mapnik/filter_featureset.hpp b/include/mapnik/filter_featureset.hpp
index 8531eda..866f335 100644
--- a/include/mapnik/filter_featureset.hpp
+++ b/include/mapnik/filter_featureset.hpp
@@ -22,31 +22,36 @@
 
 //$Id$
 
+#ifndef MAPNIK_FILTER_FEATURESET_HPP
+#define MAPNIK_FILTER_FEATURESET_HPP
+
 #include <mapnik/datasource.hpp>
 
 namespace mapnik {
     
-    template <typename T> 
-    class filter_featureset : public Featureset 
-    {
-        typedef T filter_type;
+template <typename T> 
+class filter_featureset : public Featureset 
+{
+    typedef T filter_type;
         
-    public:
-        filter_featureset(featureset_ptr fs, filter_type const& filter)
-            : fs_(fs), filter_(filter) {}
+public:
+    filter_featureset(featureset_ptr fs, filter_type const& filter)
+        : fs_(fs), filter_(filter) {}
         
-        feature_ptr next()
+    feature_ptr next()
+    {
+        feature_ptr feature = fs_->next();
+        while (feature && !filter_.pass(*feature))
         {
-            feature_ptr feature = fs_->next();
-            while (feature && !filter_.pass(*feature))
-            {
-                feature = fs_->next();
-            }
-            return feature;
+            feature = fs_->next();
         }
+        return feature;
+    }
         
-    private:
-        featureset_ptr fs_;
-        filter_type filter_;
-    };
+private:
+    featureset_ptr fs_;
+    filter_type filter_;
+};
 }
+
+#endif //MAPNIK_FILTER_FEATURESET_HPP
diff --git a/include/mapnik/filter_parser.hpp b/include/mapnik/filter_parser.hpp
deleted file mode 100644
index f74f9de..0000000
--- a/include/mapnik/filter_parser.hpp
+++ /dev/null
@@ -1,548 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-
-
-//$Id$
-
-#ifndef FILTER_PARSER_HPP
-#define FILTER_PARSER_HPP
-// mapnik
-#include <mapnik/value.hpp>
-#include <mapnik/unicode.hpp>
-#include <mapnik/comparison.hpp>
-#include <mapnik/math_expr.hpp>
-#include <mapnik/expression.hpp>
-#include <mapnik/filter.hpp>
-#include <mapnik/regex_filter.hpp>
-#include <mapnik/boolean_filter.hpp>
-#include <mapnik/logical.hpp>
-
-// boost
-
-// XML Debugging output
-#ifdef MAPNIK_XML_DEBUG
-#define BOOST_SPIRIT_DEBUG
-#endif
-
-#include <boost/version.hpp>
-#include <boost/shared_ptr.hpp>
-
-#if BOOST_VERSION < 103800
-  #include <boost/spirit/core.hpp>
-  #include <boost/spirit/symbols.hpp>
-  #include <boost/spirit/utility/confix.hpp>
-  #include <boost/spirit/utility/escape_char.hpp>
-  #include <boost/spirit/utility/chset.hpp> 
-#else
-  #define BOOST_SPIRIT_USE_OLD_NAMESPACE
-  #include <boost/spirit/include/classic_core.hpp>
-  #include <boost/spirit/include/classic_symbols.hpp>
-  #include <boost/spirit/include/classic_confix.hpp>
-  #include <boost/spirit/include/classic_escape_char.hpp>
-  #include <boost/spirit/include/classic_chset.hpp> 
-#endif
-
-// stl
-#include <stack>
-#include <iostream>
-
-using namespace boost::spirit;
-using boost::shared_ptr;
-
-namespace mapnik
-{    
-   using std::string;
-   using std::clog;
-   using std::stack;
-
-    template <typename FeatureT>
-    struct push_boolean
-    {
-        push_boolean(stack<shared_ptr<expression<FeatureT> > >& exprs)
-            : exprs_(exprs) {}
-	
-        void operator() (std::string const& val) const
-        {
-            if (val == "true")
-                exprs_.push(shared_ptr<expression<FeatureT> >
-                            ( new literal<FeatureT>(true)));
-            else if (val == "false")
-                exprs_.push(shared_ptr<expression<FeatureT> >
-                            ( new literal<FeatureT>(false)));
-        }
-        stack<shared_ptr<expression<FeatureT> > >& exprs_;
-    };
-
-   template <typename FeatureT>
-   struct push_integer
-   {
-         push_integer(stack<shared_ptr<expression<FeatureT> > >& exprs)
-            : exprs_(exprs) {}
-	
-         void operator() (int val) const
-         {
-            exprs_.push(shared_ptr<expression<FeatureT> >
-                        ( new literal<FeatureT>(val)));
-         }
-         stack<shared_ptr<expression<FeatureT> > >& exprs_;
-   };
-   
-   template <typename FeatureT>
-   struct push_real
-   {
-         push_real(stack<shared_ptr<expression<FeatureT> > >& exprs)
-            : exprs_(exprs) {}
-         void operator() (double val) const
-         {
-            exprs_.push(shared_ptr<expression<FeatureT> >(new literal<FeatureT>(val)));
-         }
-         stack<shared_ptr<expression<FeatureT> > >& exprs_;
-   };
-    
-   template <typename FeatureT>
-   struct push_string
-   {
-         push_string(stack<shared_ptr<expression<FeatureT> > >& exprs, transcoder const& tr)
-            : exprs_(exprs),
-              tr_(tr) {}
-         
-         template <typename Iter>
-         void operator() (Iter start,Iter end) const
-         {
-            UnicodeString unicode = tr_.transcode(std::string(start,end).c_str());
-            exprs_.push(shared_ptr<expression<FeatureT> >(new literal<FeatureT>(unicode)));
-         }
-         stack<shared_ptr<expression<FeatureT> > >& exprs_;
-         transcoder const& tr_;
-   };
-    
-   template <typename FeatureT>
-   struct push_property
-   {
-         push_property(stack<shared_ptr<expression<FeatureT> > >& exprs)
-            : exprs_(exprs) {}
-	
-         template <typename Iter>
-         void operator() (Iter start,Iter end) const
-         {
-            string str(start,end);
-            exprs_.push(shared_ptr<expression<FeatureT> >(new property<FeatureT>(str)));
-         }
-         stack<shared_ptr<expression<FeatureT> > >& exprs_;
-   };
-
-   template <typename FeatureT,typename Op>
-   struct compose_expression
-   {
-         compose_expression(stack<shared_ptr<expression<FeatureT> > >& exprs)
-            : exprs_(exprs) {}
-
-         template <typename Iter>
-         void operator() (Iter,Iter) const
-         {
-            if (exprs_.size()>=2)
-            {
-               shared_ptr<expression<FeatureT> > right = exprs_.top();
-               exprs_.pop();
-               shared_ptr<expression<FeatureT> > left = exprs_.top();
-               exprs_.pop();
-               if (left && right)
-               {
-                  exprs_.push(shared_ptr<expression<FeatureT> >
-                              (new mapnik::math_expr_b<FeatureT,Op>(*left,*right)));
-               }
-            }
-         }
-         stack<shared_ptr<expression<FeatureT> > >& exprs_;
-   };
-    
-   template <typename FeatureT>
-   struct compose_regex
-   {
-         compose_regex(stack<shared_ptr<filter<FeatureT> > >& filters,
-                       stack<shared_ptr<expression<FeatureT> > >& exprs)
-            : filters_(filters),exprs_(exprs) {}
-
-         template <typename Iter>
-         void operator() (Iter start,Iter end) const
-         {
-            if (exprs_.size()>=1)
-            {
-               shared_ptr<expression<FeatureT> > exp = exprs_.top();
-               exprs_.pop();
-               if (exp)
-               {		    
-                  std::string pattern(start,end);
-                  try 
-                  {
-                     filters_.push(shared_ptr<filter<FeatureT> >
-                                   (new regex_filter<FeatureT>(*exp,pattern)));
-                  }
-                  catch (...)//boost::regex_error& ex)
-                  {
-                     clog<<"error\n";//ex.what()<<"\n";
-                  }
-		    
-               }
-            }
-         }
-         stack<shared_ptr<filter<FeatureT> > >& filters_;
-         stack<shared_ptr<expression<FeatureT> > >& exprs_;
-   };
-
-  
-   template <typename FeatureT,typename Op>
-   struct compose_filter
-   {
-         compose_filter(stack<shared_ptr<filter<FeatureT> > >& filters,
-                        stack<shared_ptr<expression<FeatureT> > >& exprs)
-            : filters_(filters),exprs_(exprs) {}
-
-         template <typename Iter>
-         void operator() (Iter,Iter) const
-         {
-            if (exprs_.size()>=2)
-            {
-               shared_ptr<expression<FeatureT> > right = exprs_.top();
-               exprs_.pop();
-               shared_ptr<expression<FeatureT> > left = exprs_.top();
-               exprs_.pop();
-               if (left && right)
-               {
-                  filters_.push(shared_ptr<filter<FeatureT> >(new compare_filter<FeatureT,Op>(*left,*right)));
-               }
-            }
-         }
-         stack<shared_ptr<filter<FeatureT> > >& filters_;
-         stack<shared_ptr<expression<FeatureT> > >& exprs_;
-   };
-      
-   template <typename FeatureT>
-   struct compose_boolean_filter
-   {
-         compose_boolean_filter(stack<shared_ptr<filter<FeatureT> > >& filters,
-                                stack<shared_ptr<expression<FeatureT> > >& exprs)
-            : filters_(filters),exprs_(exprs) {}
-
-         template <typename Iter>
-         void operator() (Iter,Iter) const
-         {
-            if (exprs_.size()>=1)
-            {
-               shared_ptr<expression<FeatureT> > exp = exprs_.top();
-               exprs_.pop();
-               if (exp)
-               {
-                  filters_.push(shared_ptr<filter<FeatureT> >(new boolean_filter<FeatureT>(*exp)));
-               }
-            }
-         }
-         stack<shared_ptr<filter<FeatureT> > >& filters_;
-         stack<shared_ptr<expression<FeatureT> > >& exprs_;
-   };
-
-   template <typename FeatureT>
-   struct compose_and_filter
-   {
-         compose_and_filter(stack<shared_ptr<filter<FeatureT> > >& filters)
-            : filters_(filters) {}
-
-         template <typename Iter>
-         void operator() (Iter,Iter) const
-         {
-            if (filters_.size()>=2)
-            {
-               shared_ptr<filter<FeatureT> > right = filters_.top();
-               filters_.pop();
-               shared_ptr<filter<FeatureT> > left = filters_.top();
-               filters_.pop();
-               if (left && right)
-               {
-                  filters_.push(shared_ptr<filter<FeatureT> >
-                                (new logical_and<FeatureT>(*left,*right)));
-               }
-            }
-         }
-         stack<shared_ptr<filter<FeatureT> > >& filters_;
-   };
-    
-   template <typename FeatureT>
-   struct compose_or_filter
-   {
-         compose_or_filter(stack<shared_ptr<filter<FeatureT> > >& filters)
-            : filters_(filters) {}
-
-         template <typename Iter>
-         void operator() (Iter,Iter) const
-         {
-            if (filters_.size()>=2)
-            {
-               shared_ptr<filter<FeatureT> > right = filters_.top();
-               filters_.pop();
-               shared_ptr<filter<FeatureT> > left = filters_.top();
-               filters_.pop();
-               if (left && right)
-               {
-                  filters_.push(shared_ptr<filter<FeatureT> >
-                                (new logical_or<FeatureT>(*left,*right)));
-               }
-            }
-         }
-         stack<shared_ptr<filter<FeatureT> > >& filters_;
-   };
-    
-   template <typename FeatureT>
-   struct compose_not_filter
-   {
-         compose_not_filter(stack<shared_ptr<filter<FeatureT> > >& filters)
-            : filters_(filters) {}
-
-         template <typename Iter>
-         void operator() (Iter,Iter) const
-         {
-            if (filters_.size()>=1)
-            {
-               shared_ptr<filter<FeatureT> > filter_ = filters_.top();
-               filters_.pop();
-               if (filter_)
-               {
-                  filters_.push(shared_ptr<filter<FeatureT> >(new logical_not<FeatureT>(*filter_)));
-               }
-            }
-         }
-         stack<shared_ptr<filter<FeatureT> > >& filters_;
-   };
-    
-   template <typename FeatureT>
-   struct filter_grammar : public grammar<filter_grammar<FeatureT> >
-   {
-         filter_grammar(stack<shared_ptr<filter<FeatureT> > >& filters_,
-                        stack<shared_ptr<expression<FeatureT> > >& exprs_,
-                        transcoder const& tr_)
-            : filters(filters_),
-              exprs(exprs_),
-              tr(tr_) {}
-         
-         template <typename ScannerT>
-         struct definition
-         {
-               definition(filter_grammar const& self)
-               {	
-                  typedef boost::spirit::chset<wchar_t> chset_t;
-
-                  func1_op = "sqrt","sin","cos";
-                  func2_op = "min","max";
-                  spatial_op = "Equals","Disjoint","Touches","Within","Overlaps",
-                     "Crosses","Intersects","Contains","DWithin","Beyond","BBOX";
-                  boolean_const = "true","false";
-
-                  chset_t BaseChar (L"\x41-\x5A\x61-\x7A\xC0-\xD6\xD8-\xF6\xF8-\xFF\x100-\x131\x134-\x13E"
-                                    L"\x141-\x148\x14A-\x17E\x180-\x1C3\x1CD-\x1F0\x1F4-\x1F5\x1FA-\x217"
-                                    L"\x250-\x2A8\x2BB-\x2C1\x386\x388-\x38A\x38C\x38E-\x3A1\x3A3-\x3CE"
-                                    L"\x3D0-\x3D6\x3DA\x3DC\x3DE\x3E0\x3E2-\x3F3\x401-\x40C\x40E-\x44F"
-                                    L"\x451-\x45C\x45E-\x481\x490-\x4C4\x4C7-\x4C8\x4CB-\x4CC\x4D0-\x4EB"
-                                    L"\x4EE-\x4F5\x4F8-\x4F9\x531-\x556\x559\x561-\x586\x5D0-\x5EA"
-                                    L"\x5F0-\x5F2\x621-\x63A\x641-\x64A\x671-\x6B7\x6BA-\x6BE\x6C0-\x6CE"
-                                    L"\x6D0-\x6D3\x6D5\x6E5-\x6E6\x905-\x939\x93D\x958-\x961\x985-\x98C"
-                                    L"\x98F-\x990\x993-\x9A8\x9AA-\x9B0\x9B2\x9B6-\x9B9\x9DC-\x9DD"
-                                    L"\x9DF-\x9E1\x9F0-\x9F1\xA05-\xA0A\xA0F-\xA10\xA13-\xA28\xA2A-\xA30"
-                                    L"\xA32-\xA33\xA35-\xA36\xA38-\xA39\xA59-\xA5C\xA5E\xA72-\xA74"
-                                    L"\xA85-\xA8B\xA8D\xA8F-\xA91\xA93-\xAA8\xAAA-\xAB0\xAB2-\xAB3"
-                                    L"\xAB5-\xAB9\xABD\xAE0\xB05-\xB0C\xB0F-\xB10\xB13-\xB28\xB2A-\xB30"
-                                    L"\xB32-\xB33\xB36-\xB39\xB3D\xB5C-\xB5D\xB5F-\xB61\xB85-\xB8A"
-                                    L"\xB8E-\xB90\xB92-\xB95\xB99-\xB9A\xB9C\xB9E-\xB9F\xBA3-\xBA4"
-                                    L"\xBA8-\xBAA\xBAE-\xBB5\xBB7-\xBB9\xC05-\xC0C\xC0E-\xC10\xC12-\xC28"
-                                    L"\xC2A-\xC33\xC35-\xC39\xC60-\xC61\xC85-\xC8C\xC8E-\xC90\xC92-\xCA8"
-                                    L"\xCAA-\xCB3\xCB5-\xCB9\xCDE\xCE0-\xCE1\xD05-\xD0C\xD0E-\xD10"
-                                    L"\xD12-\xD28\xD2A-\xD39\xD60-\xD61\xE01-\xE2E\xE30\xE32-\xE33"
-                                    L"\xE40-\xE45\xE81-\xE82\xE84\xE87-\xE88\xE8A\xE8D\xE94-\xE97"
-                                    L"\xE99-\xE9F\xEA1-\xEA3\xEA5\xEA7\xEAA-\xEAB\xEAD-\xEAE\xEB0"
-                                    L"\xEB2-\xEB3\xEBD\xEC0-\xEC4\xF40-\xF47\xF49-\xF69\x10A0-\x10C5"
-                                    L"\x10D0-\x10F6\x1100\x1102-\x1103\x1105-\x1107\x1109\x110B-\x110C"
-                                    L"\x110E-\x1112\x113C\x113E\x1140\x114C\x114E\x1150\x1154-\x1155"
-                                    L"\x1159\x115F-\x1161\x1163\x1165\x1167\x1169\x116D-\x116E"
-                                    L"\x1172-\x1173\x1175\x119E\x11A8\x11AB\x11AE-\x11AF\x11B7-\x11B8"
-                                    L"\x11BA\x11BC-\x11C2\x11EB\x11F0\x11F9\x1E00-\x1E9B\x1EA0-\x1EF9"
-                                    L"\x1F00-\x1F15\x1F18-\x1F1D\x1F20-\x1F45\x1F48-\x1F4D\x1F50-\x1F57"
-                                    L"\x1F59\x1F5B\x1F5D\x1F5F-\x1F7D\x1F80-\x1FB4\x1FB6-\x1FBC\x1FBE"
-                                    L"\x1FC2-\x1FC4\x1FC6-\x1FCC\x1FD0-\x1FD3\x1FD6-\x1FDB\x1FE0-\x1FEC"
-                                    L"\x1FF2-\x1FF4\x1FF6-\x1FFC\x2126\x212A-\x212B\x212E\x2180-\x2182"
-                                    L"\x3041-\x3094\x30A1-\x30FA\x3105-\x312C\xAC00-\xD7A3");
-            
-                  chset_t Ideographic(L"\x4E00-\x9FA5\x3007\x3021-\x3029");
-                  chset_t Letter = BaseChar | Ideographic;
-	    
-                  chset_t CombiningChar(L"\x0300-\x0345\x0360-\x0361\x0483-\x0486\x0591-\x05A1\x05A3-\x05B9"
-                                        L"\x05BB-\x05BD\x05BF\x05C1-\x05C2\x05C4\x064B-\x0652\x0670"
-                                        L"\x06D6-\x06DC\x06DD-\x06DF\x06E0-\x06E4\x06E7-\x06E8\x06EA-\x06ED"
-                                        L"\x0901-\x0903\x093C\x093E-\x094C\x094D\x0951-\x0954\x0962-\x0963"
-                                        L"\x0981-\x0983\x09BC\x09BE\x09BF\x09C0-\x09C4\x09C7-\x09C8"
-                                        L"\x09CB-\x09CD\x09D7\x09E2-\x09E3\x0A02\x0A3C\x0A3E\x0A3F"
-                                        L"\x0A40-\x0A42\x0A47-\x0A48\x0A4B-\x0A4D\x0A70-\x0A71\x0A81-\x0A83"
-                                        L"\x0ABC\x0ABE-\x0AC5\x0AC7-\x0AC9\x0ACB-\x0ACD\x0B01-\x0B03\x0B3C"
-                                        L"\x0B3E-\x0B43\x0B47-\x0B48\x0B4B-\x0B4D\x0B56-\x0B57\x0B82-\x0B83"
-                                        L"\x0BBE-\x0BC2\x0BC6-\x0BC8\x0BCA-\x0BCD\x0BD7\x0C01-\x0C03"
-                                        L"\x0C3E-\x0C44\x0C46-\x0C48\x0C4A-\x0C4D\x0C55-\x0C56\x0C82-\x0C83"
-                                        L"\x0CBE-\x0CC4\x0CC6-\x0CC8\x0CCA-\x0CCD\x0CD5-\x0CD6\x0D02-\x0D03"
-                                        L"\x0D3E-\x0D43\x0D46-\x0D48\x0D4A-\x0D4D\x0D57\x0E31\x0E34-\x0E3A"
-                                        L"\x0E47-\x0E4E\x0EB1\x0EB4-\x0EB9\x0EBB-\x0EBC\x0EC8-\x0ECD"
-                                        L"\x0F18-\x0F19\x0F35\x0F37\x0F39\x0F3E\x0F3F\x0F71-\x0F84"
-                                        L"\x0F86-\x0F8B\x0F90-\x0F95\x0F97\x0F99-\x0FAD\x0FB1-\x0FB7\x0FB9"
-                                        L"\x20D0-\x20DC\x20E1\x302A-\x302F\x3099\x309A");
-	    
-                  chset_t Digit(L"\x0030-\x0039\x0660-\x0669\x06F0-\x06F9\x0966-\x096F\x09E6-\x09EF"
-                                L"\x0A66-\x0A6F\x0AE6-\x0AEF\x0B66-\x0B6F\x0BE7-\x0BEF\x0C66-\x0C6F"
-                                L"\x0CE6-\x0CEF\x0D66-\x0D6F\x0E50-\x0E59\x0ED0-\x0ED9\x0F20-\x0F29");
-		
-                  chset_t Extender(L"\x00B7\x02D0\x02D1\x0387\x0640\x0E46\x0EC6\x3005\x3031-\x3035"
-                                   L"\x309D-\x309E\x30FC-\x30FE");
-		
-                  chset_t NameChar =
-                     Letter 
-                     | Digit 
-                     | L'.'
-                     | L'-'
-                     | L'_'
-                     | L':'
-                     | CombiningChar 
-                     | Extender;
-			
-                  boolean = boolean_const [push_boolean<FeatureT>(self.exprs)];
-	
-                  number = strict_real_p [push_real<FeatureT>(self.exprs)] 
-                     | int_p [push_integer<FeatureT>(self.exprs)];
-		
-                  string_ = confix_p(L'\'',(*lex_escape_ch_p)
-                                     [push_string<FeatureT>(self.exprs,self.tr)],
-                                     L'\'');
-
-                  property = L'[' >> ( (Letter | Digit | L'_' | L':') 
-                                       >> *NameChar )[push_property<FeatureT>(self.exprs)] >> L']';
-		
-                  literal = boolean | number | string_ | property;
-		
-                  function = literal | ( func1_op >> L'('>> literal >> L')') | 
-                     (func2_op >> L'(' >> literal >> L','>> literal >> L')');
-		
-                  factor = function 
-                     | L'(' >> or_expr >> L')'
-                     | ( L'-' >> factor) 
-                     ;
-                  term = factor
-                     >> *((L'*' >> factor) [compose_expression<FeatureT,mapnik::mult<value> >(self.exprs)] 
-                          | (L'/' >> factor) [compose_expression<FeatureT,mapnik::div<value> >(self.exprs)]
-                          | (L'%' >> factor) [compose_expression<FeatureT,mapnik::mod<value> >(self.exprs)]);
-		
-                  expression = term >> *((L'+' >> term) [compose_expression<FeatureT,mapnik::add<value> >(self.exprs)] 
-                                         | (L'-' >> term) [compose_expression<FeatureT,mapnik::sub<value> >(self.exprs)]);
-
-                  regex = str_p(L".match")>>L'('>>confix_p(L'\'',(*lex_escape_ch_p)
-                                                           [compose_regex<FeatureT>(self.filters,self.exprs)],
-                                                           L'\'') >>L')';
-
-                  relation   = expression 
-                     >> *((L">=" >> expression) 
-                          [compose_filter<FeatureT,greater_than_or_equal<value> >(self.filters,self.exprs)]
-                          | (L'>' >> expression)
-                          [compose_filter<FeatureT,mapnik::greater_than<value> >(self.filters,self.exprs)]
-                          | (L'<' >> expression)
-                          [compose_filter<FeatureT,mapnik::less_than<value> >(self.filters,self.exprs)]
-                          | (L"<=" >> expression)
-                          [compose_filter<FeatureT,less_than_or_equal<value> >(self.filters,self.exprs)]
-                          | regex );
-
-                  equation = relation >> *( ( L'=' >> relation)
-                                            [compose_filter<FeatureT,mapnik::equals<value> >(self.filters,self.exprs)]
-                                            | ( L"<>" >> relation)
-                                            [compose_filter<FeatureT,not_equals<value> >(self.filters,self.exprs)]
-                                            | ( L"!=" >> relation)
-                                            [compose_filter<FeatureT,not_equals<value> >(self.filters,self.exprs)]);
-
-                  cond_expr = equation | (expression)[compose_boolean_filter<FeatureT>(self.filters,self.exprs)];
-
-                  not_expr = cond_expr | *(str_p(L"not") >> cond_expr)[compose_not_filter<FeatureT>(self.filters)];
-
-                  and_expr = not_expr >> *(L"and" >> not_expr)[compose_and_filter<FeatureT>(self.filters)];
-
-                  or_expr  = and_expr >> *(L"or" >> and_expr)[compose_or_filter<FeatureT>(self.filters)];
-
-                  filter_statement = or_expr >> *(space_p) >> end_p;	
-
-#ifdef BOOST_SPIRIT_DEBUG
-                  BOOST_SPIRIT_DEBUG_RULE( factor ); 
-                  BOOST_SPIRIT_DEBUG_RULE( term );
-                  BOOST_SPIRIT_DEBUG_RULE( expression );
-                  BOOST_SPIRIT_DEBUG_RULE( relation );
-                  BOOST_SPIRIT_DEBUG_RULE( equation );
-                  BOOST_SPIRIT_DEBUG_RULE( cond_expr );
-                  BOOST_SPIRIT_DEBUG_RULE( not_expr );
-                  BOOST_SPIRIT_DEBUG_RULE( and_expr );
-                  BOOST_SPIRIT_DEBUG_RULE( or_expr );
-
-                  BOOST_SPIRIT_DEBUG_RULE( filter_statement );   
-                  BOOST_SPIRIT_DEBUG_RULE( literal );
-                  BOOST_SPIRIT_DEBUG_RULE( boolean );
-                  BOOST_SPIRIT_DEBUG_RULE( number );
-                  BOOST_SPIRIT_DEBUG_RULE( string_ );
-                  BOOST_SPIRIT_DEBUG_RULE( property );
-                  BOOST_SPIRIT_DEBUG_RULE( function );
-                  BOOST_SPIRIT_DEBUG_RULE( regex );
-#endif
-               }
-	    
-               boost::spirit::rule<ScannerT> const& start() const
-               {
-                  return filter_statement;
-               }
-	    	    
-               boost::spirit::rule<ScannerT> factor; 
-               boost::spirit::rule<ScannerT> term;
-               boost::spirit::rule<ScannerT> expression;
-               boost::spirit::rule<ScannerT> relation;
-               boost::spirit::rule<ScannerT> equation;
-               boost::spirit::rule<ScannerT> cond_expr;
-               boost::spirit::rule<ScannerT> not_expr;
-               boost::spirit::rule<ScannerT> and_expr;
-               boost::spirit::rule<ScannerT> or_expr;
-              
-               boost::spirit::rule<ScannerT> filter_statement;   
-               boost::spirit::rule<ScannerT> literal;
-               boost::spirit::rule<ScannerT> boolean;
-               boost::spirit::rule<ScannerT> number;
-               boost::spirit::rule<ScannerT> string_;
-               boost::spirit::rule<ScannerT> property;
-               boost::spirit::rule<ScannerT> function;
-               boost::spirit::rule<ScannerT> regex;
-               symbols<string> func1_op;
-               symbols<string> func2_op;
-               symbols<string> spatial_op;
-               symbols<string> boolean_const;
-
-
-         };
-         stack<shared_ptr<filter<FeatureT> > >& filters;
-         stack<shared_ptr<expression<FeatureT> > >& exprs;
-         transcoder const& tr;
-   };    
-}
-
-#endif //FILTER_PARSER_HPP 
diff --git a/include/mapnik/filter_visitor.hpp b/include/mapnik/filter_visitor.hpp
deleted file mode 100644
index 015cf0e..0000000
--- a/include/mapnik/filter_visitor.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-
-//$Id$
-
-#ifndef FILTER_VISITOR_HPP
-#define FILTER_VISITOR_HPP
-
-#include <mapnik/filter.hpp>
-#include <mapnik/expression.hpp>
-
-namespace mapnik
-{
-    template <typename FeatureT> class filter;
-    template <typename FeatureT> class expression;
-    template <typename FeatureT> class expression;
-    template <typename Feature,template <typename> class Filter> class rule;
-    template <typename FeatureT>
-    class filter_visitor
-    {
-	public:
-		virtual void visit(filter<FeatureT>& filter)=0;
-		virtual void visit(expression<FeatureT>&)=0;
-		virtual void visit(rule<FeatureT,filter> const& r)=0;
-		virtual ~filter_visitor() {}
-    };    
-}
-
-#endif //FILTER_VISITOR_HPP
diff --git a/include/mapnik/font_engine_freetype.hpp b/include/mapnik/font_engine_freetype.hpp
index 7b2b4aa..efaadf7 100644
--- a/include/mapnik/font_engine_freetype.hpp
+++ b/include/mapnik/font_engine_freetype.hpp
@@ -38,567 +38,568 @@ extern "C"
 #include <ft2build.h>
 #include FT_FREETYPE_H
 #include FT_GLYPH_H
+#include FT_STROKER_H
 }
 
 // boost
 #include <boost/shared_ptr.hpp>
+#include <boost/make_shared.hpp>
 #include <boost/utility.hpp>
 #include <boost/ptr_container/ptr_vector.hpp>
+#ifdef MAPNIK_THREADSAFE
 #include <boost/thread/mutex.hpp>
+#endif
+
 
 // stl
 #include <string>
 #include <vector>
 #include <map>
 #include <iostream>
-
-// icu
-#include <unicode/ubidi.h>
-#include <unicode/ushape.h>
+#include <algorithm>
 
 namespace mapnik
 {
-    class font_face;
+class font_face;
 
-    typedef boost::shared_ptr<font_face> face_ptr;
+typedef boost::shared_ptr<font_face> face_ptr;
 
-    class MAPNIK_DECL font_glyph : private boost::noncopyable
+class MAPNIK_DECL font_glyph : private boost::noncopyable
+{
+public:
+    font_glyph(face_ptr face, unsigned index)
+        : face_(face), index_(index) {}
+
+    face_ptr get_face() const
     {
-    public:
-        font_glyph(face_ptr face, unsigned index)
-           : face_(face), index_(index) {}
+        return face_;
+    }
 
-        face_ptr get_face() const
-        {
-            return face_;
-        }
+    unsigned get_index() const
+    {
+        return index_;
+    }
+private:
+    face_ptr face_;
+    unsigned index_;
+};
 
-        unsigned get_index() const
-        {
-            return index_;
-        }
-    private:
-        face_ptr face_;
-        unsigned index_;
-    };
+typedef boost::shared_ptr<font_glyph> glyph_ptr;
 
-    typedef boost::shared_ptr<font_glyph> glyph_ptr;
+class font_face : boost::noncopyable
+{
+public:
+    font_face(FT_Face face)
+        : face_(face) {}
 
-    class font_face : boost::noncopyable
+    std::string  family_name() const
     {
-    public:
-        font_face(FT_Face face)
-           : face_(face) {}
-
-        std::string  family_name() const
-        {
-            return std::string(face_->family_name);
-        }
+        return std::string(face_->family_name);
+    }
 
-        std::string  style_name() const
-        {
-            return std::string(face_->style_name);
-        }
+    std::string  style_name() const
+    {
+        return std::string(face_->style_name);
+    }
 
-        FT_GlyphSlot glyph() const
-        {
-            return face_->glyph;
-        }
+    FT_GlyphSlot glyph() const
+    {
+        return face_->glyph;
+    }
 
-        FT_Face get_face() const
-        {
-            return face_;
-        }
+    FT_Face get_face() const
+    {
+        return face_;
+    }
 
-        unsigned get_char(unsigned c) const
-        {
-            return FT_Get_Char_Index(face_, c);
-        }
+    unsigned get_char(unsigned c) const
+    {
+        return FT_Get_Char_Index(face_, c);
+    }
 
-        bool set_pixel_sizes(unsigned size)
-        {
-            if (! FT_Set_Pixel_Sizes( face_, 0, size ))
-                return true;
+    bool set_pixel_sizes(unsigned size)
+    {
+        if (! FT_Set_Pixel_Sizes( face_, 0, size ))
+            return true;
 
-            return false;
-        }
+        return false;
+    }
 
-        ~font_face()
-        {
+    ~font_face()
+    {
 #ifdef MAPNIK_DEBUG
         std::clog << "~font_face: Clean up face \"" << family_name()
-            << " " << style_name() << "\"" << std::endl;
+                  << " " << style_name() << "\"" << std::endl;
 #endif
         FT_Done_Face(face_);
-        }
+    }
 
-    private:
+private:
     FT_Face face_;
-    };
+};
 
-    class MAPNIK_DECL font_face_set : private boost::noncopyable
-    {
+class MAPNIK_DECL font_face_set : private boost::noncopyable
+{
+public:
+    class dimension_t {
     public:
-        typedef std::pair<unsigned,unsigned> dimension_t;
+        dimension_t(unsigned width_, int ymax_, int ymin_) :  width(width_), height(ymax_-ymin_), ymin(ymin_) {}
+        unsigned width, height;
+        int ymin;
+    };
 
-        font_face_set(void)
-           : faces_() {}
+    font_face_set(void)
+        : faces_() {}
 
-        void add(face_ptr face)
-        {
-            faces_.push_back(face);
-        }
+    void add(face_ptr face)
+    {
+        faces_.push_back(face);
+        dimension_cache_.clear(); //Make sure we don't use old cached data
+    }
 
-        unsigned size() const
-        {
-            return faces_.size();
-        }
+    unsigned size() const
+    {
+        return faces_.size();
+    }
 
-        glyph_ptr get_glyph(unsigned c) const
+    glyph_ptr get_glyph(unsigned c) const
+    {
+        for (std::vector<face_ptr>::const_iterator face = faces_.begin(); face != faces_.end(); ++face)
         {
-            for (std::vector<face_ptr>::const_iterator face = faces_.begin(); face != faces_.end(); ++face)
-            {
-               FT_UInt g = (*face)->get_char(c);
-
-               if (g) return glyph_ptr(new font_glyph(*face, g));
-            }
+            FT_UInt g = (*face)->get_char(c);
 
-            // Final fallback to empty square if nothing better in any font
-            return glyph_ptr(new font_glyph(*faces_.begin(), 0));
+            if (g) return boost::make_shared<font_glyph>(*face, g);
         }
 
-        dimension_t character_dimensions(const unsigned c)
-        {
-            FT_Matrix matrix;
-            FT_Vector pen;
-            FT_Error  error;
+        // Final fallback to empty square if nothing better in any font
+        return boost::make_shared<font_glyph>(*faces_.begin(), 0);
+    }
 
-            pen.x = 0;
-            pen.y = 0;
+    dimension_t character_dimensions(const unsigned c);
 
-            FT_BBox glyph_bbox;
-            FT_Glyph image;
-
-            glyph_ptr glyph = get_glyph(c);
-            FT_Face face = glyph->get_face()->get_face();
+    void get_string_info(string_info & info);
 
-            matrix.xx = (FT_Fixed)( 1 * 0x10000L );
-            matrix.xy = (FT_Fixed)( 0 * 0x10000L );
-            matrix.yx = (FT_Fixed)( 0 * 0x10000L );
-            matrix.yy = (FT_Fixed)( 1 * 0x10000L );
-
-            FT_Set_Transform(face, &matrix, &pen);
+    void set_pixel_sizes(unsigned size)
+    {
+        for (std::vector<face_ptr>::iterator face = faces_.begin(); face != faces_.end(); ++face)
+        {
+            (*face)->set_pixel_sizes(size);
+        }
+    }
+private:
+    std::vector<face_ptr> faces_;
+    std::map<unsigned, dimension_t> dimension_cache_;
+};
+
+// FT_Stroker wrapper
+class stroker : boost::noncopyable
+{
+public:
+    explicit stroker(FT_Stroker s)
+        : s_(s) {}
+    
+    void init(double radius)
+    {
+        FT_Stroker_Set(s_,radius * (1<<6), 
+                       FT_STROKER_LINECAP_ROUND, 
+                       FT_STROKER_LINEJOIN_ROUND, 
+                       0);    
+    }
+    
+    FT_Stroker const& get() const
+    {
+        return s_;
+    }
+    
+    ~stroker()
+    {
+#ifdef MAPNIK_DEBUG
+        std::clog << "~stroker: destroy stroker:" << s_ << std::endl;
+#endif        
+        FT_Stroker_Done(s_);
+    }
+private:
+    FT_Stroker s_;
+};
 
-            error = FT_Load_Glyph (face, glyph->get_index(), FT_LOAD_NO_HINTING);
-            if ( error )
-                return dimension_t(0, 0);
 
-            error = FT_Get_Glyph(face->glyph, &image);
-            if ( error )
-                return dimension_t(0, 0);
 
-            FT_Glyph_Get_CBox(image, ft_glyph_bbox_pixels, &glyph_bbox);
-            FT_Done_Glyph(image);
+typedef boost::shared_ptr<font_face_set> face_set_ptr;
+typedef boost::shared_ptr<stroker> stroker_ptr;
 
-            unsigned tempx = face->glyph->advance.x >> 6;
-            unsigned tempy = glyph_bbox.yMax - glyph_bbox.yMin;
+class MAPNIK_DECL freetype_engine
+{
+public:
+    static bool is_font_file(std::string const& file_name);
+    static bool register_font(std::string const& file_name);
+    static bool register_fonts(std::string const& dir, bool recurse = false);
+    static std::vector<std::string> face_names();
+    static std::map<std::string,std::string> const& get_mapping();
+    face_ptr create_face(std::string const& family_name);
+    stroker_ptr create_stroker();
+    virtual ~freetype_engine();
+    freetype_engine();
+private:
+    FT_Library library_;
+#ifdef MAPNIK_THREADSAFE
+    static boost::mutex mutex_;
+#endif
+    static std::map<std::string,std::string> name2file_;
+};
 
-            //std::clog << "glyph: " << glyph_index << " x: " << tempx << " y: " << tempy << std::endl;
+template <typename T>
+class MAPNIK_DECL face_manager : private boost::noncopyable
+{
+    typedef T font_engine_type;
+    typedef std::map<std::string,face_ptr> faces;
 
-            return dimension_t(tempx, tempy);
-        }
+public:
+    face_manager(T & engine)
+        : engine_(engine),
+        stroker_(engine_.create_stroker())  {}
 
-        void get_string_info(string_info & info)
+    face_ptr get_face(std::string const& name)
+    {
+        typename faces::iterator itr;
+        itr = faces_.find(name);
+        if (itr != faces_.end())
         {
-            unsigned width = 0;
-            unsigned height = 0;
-            UErrorCode err = U_ZERO_ERROR;
-            UnicodeString const& ustr = info.get_string();
-            const UChar * text = ustr.getBuffer();
-            UBiDi * bidi = ubidi_openSized(ustr.length(),0,&err);
-
-            if (U_SUCCESS(err))
-            {
-               ubidi_setPara(bidi,text,ustr.length(), UBIDI_DEFAULT_LTR,0,&err);
-
-               if (U_SUCCESS(err))
-               {
-                  int32_t count = ubidi_countRuns(bidi,&err);
-                  int32_t logicalStart;
-                  int32_t length;
-
-                  for (int32_t i=0; i< count;++i)
-                  {
-                     if (UBIDI_LTR == ubidi_getVisualRun(bidi,i,&logicalStart,&length))
-                     {
-                        do {
-                           UChar ch = text[logicalStart++];
-                           dimension_t char_dim = character_dimensions(ch);
-                           info.add_info(ch, char_dim.first, char_dim.second);
-                           width += char_dim.first;
-                           height = char_dim.second > height ? char_dim.second : height;
-
-                        } while (--length > 0);
-                     }
-                     else
-                     {
-                        logicalStart += length;
-
-                        int32_t j=0,i=length;
-                        UnicodeString arabic;
-                        UChar * buf = arabic.getBuffer(length);
-                        do {
-                           UChar ch = text[--logicalStart];
-                           buf[j++] = ch;
-                        } while (--i > 0);
-
-                        arabic.releaseBuffer(length);
-                        if ( *arabic.getBuffer() >= 0x0600 && *arabic.getBuffer() <= 0x06ff)
-                        {
-                           UnicodeString shaped;
-                           u_shapeArabic(arabic.getBuffer(),arabic.length(),shaped.getBuffer(arabic.length()),arabic.length(),
-                                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_FIXED_SPACES_NEAR|
-                                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR
-                                         ,&err);
-
-                           shaped.releaseBuffer(arabic.length());
-
-                           if (U_SUCCESS(err))
-                           {
-                              for (int j=0;j<shaped.length();++j)
-                              {
-                                 dimension_t char_dim = character_dimensions(shaped[j]);
-                                 info.add_info(shaped[j], char_dim.first, char_dim.second);
-                                 width += char_dim.first;
-                                 height = char_dim.second > height ? char_dim.second : height;
-                              }
-                           }
-                        } else {
-                           // Non-Arabic RTL
-                           for (int j=0;j<arabic.length();++j)
-                           {
-                              dimension_t char_dim = character_dimensions(arabic[j]);
-                              info.add_info(arabic[j], char_dim.first, char_dim.second);
-                              width += char_dim.first;
-                              height = char_dim.second > height ? char_dim.second : height;
-                           }
-                        }
-                     }
-                  }
-               }
-               ubidi_close(bidi);
-            }
-
-            info.set_dimensions(width, height);
+            return itr->second;
         }
-
-        void set_pixel_sizes(unsigned size)
+        else
         {
-            for (std::vector<face_ptr>::iterator face = faces_.begin(); face != faces_.end(); ++face)
+            face_ptr face = engine_.create_face(name);
+            if (face)
             {
-                (*face)->set_pixel_sizes(size);
+                faces_.insert(make_pair(name,face));
             }
+            return face;
         }
-    private:
-        std::vector<face_ptr> faces_;
-    };
-
-    typedef boost::shared_ptr<font_face_set> face_set_ptr;
+    }
 
-    class MAPNIK_DECL freetype_engine
+    face_set_ptr get_face_set(std::string const& name)
     {
-      public:
-        static bool register_font(std::string const& file_name);
-        static std::vector<std::string> face_names ();
-        face_ptr create_face(std::string const& family_name);
-        virtual ~freetype_engine();
-        freetype_engine();
-      private:
-        FT_Library library_;
-        static boost::mutex mutex_;
-        static std::map<std::string,std::string> name2file_;
-    };
-
-    template <typename T>
-    class MAPNIK_DECL face_manager : private boost::noncopyable
-    {
-        typedef T font_engine_type;
-        typedef std::map<std::string,face_ptr> faces;
-
-    public:
-        face_manager(T & engine)
-           : engine_(engine) {}
-
-        face_ptr get_face(std::string const& name)
+        face_set_ptr face_set = boost::make_shared<font_face_set>();
+        if (face_ptr face = get_face(name))
         {
-            typename faces::iterator itr;
-            itr = faces_.find(name);
-            if (itr != faces_.end())
-            {
-                return itr->second;
-            }
-            else
-            {
-                face_ptr face = engine_.create_face(name);
-                if (face)
-                {
-                    faces_.insert(make_pair(name,face));
-                }
-                return face;
-            }
+            face_set->add(face);
         }
+        return face_set;
+    }
 
-        face_set_ptr get_face_set(std::string const& name)
+    face_set_ptr get_face_set(font_set const& fset)
+    {
+        std::vector<std::string> const& names = fset.get_face_names();
+        face_set_ptr face_set = boost::make_shared<font_face_set>();
+        for (std::vector<std::string>::const_iterator name = names.begin(); name != names.end(); ++name)
         {
-            face_set_ptr face_set(new font_face_set);
-            if (face_ptr face = get_face(name))
+            if (face_ptr face = get_face(*name))
             {
                 face_set->add(face);
             }
-            return face_set;
         }
+        return face_set;
+    }
 
-        face_set_ptr get_face_set(FontSet const& fontset)
-        {
-            std::vector<std::string> const& names = fontset.get_face_names();
-            face_set_ptr face_set(new font_face_set);
-            for (std::vector<std::string>::const_iterator name = names.begin(); name != names.end(); ++name)
-            {
-                if (face_ptr face = get_face(*name))
-                {
-                    face_set->add(face);
-                }
-            }
-            return face_set;
-        }
-    private:
-        faces faces_;
-        font_engine_type & engine_;
-    };
+    stroker_ptr get_stroker()
+    {
+        return stroker_;
+    }
+
+private:
+    faces faces_;
+    font_engine_type & engine_;
+    stroker_ptr stroker_;
+};
 
-    template <typename T>
-    struct text_renderer : private boost::noncopyable
+template <typename T>
+struct text_renderer : private boost::noncopyable
+{
+    struct glyph_t : boost::noncopyable
     {
-        struct glyph_t : boost::noncopyable
-        {
-            FT_Glyph image;
-            glyph_t(FT_Glyph image_) : image(image_) {}
-            ~glyph_t () { FT_Done_Glyph(image);}
-        };
-
-        typedef boost::ptr_vector<glyph_t> glyphs_t;
-        typedef T pixmap_type;
-
-        text_renderer (pixmap_type & pixmap, face_set_ptr faces)
-            : pixmap_(pixmap),
-              faces_(faces),
-              fill_(0,0,0),
-              halo_fill_(255,255,255),
-              halo_radius_(0),
-              opacity_(1.0) {}
-
-        void set_pixel_size(unsigned size)
-        {
-            faces_->set_pixel_sizes(size);
-        }
+        FT_Glyph image;
+        glyph_t(FT_Glyph image_) : image(image_) {}
+        ~glyph_t () { FT_Done_Glyph(image);}
+    };
 
-        void set_fill(mapnik::color const& fill)
-        {
-            fill_=fill;
-        }
+    typedef boost::ptr_vector<glyph_t> glyphs_t;
+    typedef T pixmap_type;
 
-        void set_halo_fill(mapnik::color const& halo)
-        {
-            halo_fill_=halo;
-        }
+    text_renderer (pixmap_type & pixmap, face_set_ptr faces, stroker & s)
+        : pixmap_(pixmap),
+          faces_(faces),
+          stroker_(s),
+          fill_(0,0,0),
+          halo_fill_(255,255,255),
+          halo_radius_(0.0),
+          opacity_(1.0) {}
 
-        void set_halo_radius( int radius=1)
-        {
-            halo_radius_=radius;
-        }
+    void set_pixel_size(unsigned size)
+    {
+        faces_->set_pixel_sizes(size);
+    }
 
-        void set_opacity( double opacity=1.0)
-        {
-            opacity_=opacity;
-        }
+    void set_fill(mapnik::color const& fill)
+    {
+        fill_=fill;
+    }
 
-        Envelope<double> prepare_glyphs(text_path *path)
-        {
-            //clear glyphs
-            glyphs_.clear();
+    void set_halo_fill(mapnik::color const& halo)
+    {
+        halo_fill_=halo;
+    }
 
-            FT_Matrix matrix;
-            FT_Vector pen;
-            FT_Error  error;
+    void set_halo_radius( double radius=1.0)
+    {
+        halo_radius_=radius;
+    }
 
-            FT_BBox bbox;
-            bbox.xMin = bbox.yMin = 32000;  // Initialize these so we can tell if we
-            bbox.xMax = bbox.yMax = -32000; // properly grew the bbox later
+    void set_opacity( double opacity=1.0)
+    {
+        opacity_=opacity;
+    }
 
-            for (int i = 0; i < path->num_nodes(); i++)
-            {
-                int c;
-                double x, y, angle;
+    box2d<double> prepare_glyphs(text_path *path)
+    {
+        //clear glyphs
+        glyphs_.clear();
 
-                path->vertex(&c, &x, &y, &angle);
+        FT_Matrix matrix;
+        FT_Vector pen;
+        FT_Error  error;
 
-#ifdef MAPNIK_DEBUG
-                // TODO Enable when we have support for setting verbosity
-                //std::clog << "prepare_glyphs: " << c << "," << x <<
-                //    "," << y << "," << angle << std::endl;
-#endif
+        FT_BBox bbox;
+        bbox.xMin = bbox.yMin = 32000;  // Initialize these so we can tell if we
+        bbox.xMax = bbox.yMax = -32000; // properly grew the bbox later
 
-                FT_BBox glyph_bbox;
-                FT_Glyph image;
+        for (int i = 0; i < path->num_nodes(); i++)
+        {
+            int c;
+            double x, y, angle;
 
-                pen.x = int(x * 64);
-                pen.y = int(y * 64);
+            path->vertex(&c, &x, &y, &angle);
 
-                glyph_ptr glyph = faces_->get_glyph(unsigned(c));
-                FT_Face face = glyph->get_face()->get_face();
+#ifdef MAPNIK_DEBUG
+            // TODO Enable when we have support for setting verbosity
+            //std::clog << "prepare_glyphs: " << c << "," << x <<
+            //    "," << y << "," << angle << std::endl;
+#endif
 
-                matrix.xx = (FT_Fixed)( cos( angle ) * 0x10000L );
-                matrix.xy = (FT_Fixed)(-sin( angle ) * 0x10000L );
-                matrix.yx = (FT_Fixed)( sin( angle ) * 0x10000L );
-                matrix.yy = (FT_Fixed)( cos( angle ) * 0x10000L );
+            FT_BBox glyph_bbox;
+            FT_Glyph image;
 
-                FT_Set_Transform(face, &matrix, &pen);
+            pen.x = int(x * 64);
+            pen.y = int(y * 64);
 
-                error = FT_Load_Glyph(face, glyph->get_index(), FT_LOAD_NO_HINTING);
-                if ( error )
-                    continue;
+            glyph_ptr glyph = faces_->get_glyph(unsigned(c));
+            FT_Face face = glyph->get_face()->get_face();
 
-                error = FT_Get_Glyph(face->glyph, &image);
-                if ( error )
-                    continue;
+            matrix.xx = (FT_Fixed)( cos( angle ) * 0x10000L );
+            matrix.xy = (FT_Fixed)(-sin( angle ) * 0x10000L );
+            matrix.yx = (FT_Fixed)( sin( angle ) * 0x10000L );
+            matrix.yy = (FT_Fixed)( cos( angle ) * 0x10000L );
 
-                FT_Glyph_Get_CBox(image,ft_glyph_bbox_pixels, &glyph_bbox);
-                if (glyph_bbox.xMin < bbox.xMin)
-                    bbox.xMin = glyph_bbox.xMin;
-                if (glyph_bbox.yMin < bbox.yMin)
-                    bbox.yMin = glyph_bbox.yMin;
-                if (glyph_bbox.xMax > bbox.xMax)
-                    bbox.xMax = glyph_bbox.xMax;
-                if (glyph_bbox.yMax > bbox.yMax)
-                    bbox.yMax = glyph_bbox.yMax;
+            FT_Set_Transform(face, &matrix, &pen);
 
-                // Check if we properly grew the bbox
-                if ( bbox.xMin > bbox.xMax )
-                {
-                    bbox.xMin = 0;
-                    bbox.yMin = 0;
-                    bbox.xMax = 0;
-                    bbox.yMax = 0;
-                }
+            error = FT_Load_Glyph(face, glyph->get_index(), FT_LOAD_NO_HINTING);
+            if ( error )
+                continue;
 
-                // take ownership of the glyph
-                glyphs_.push_back(new glyph_t(image));
+            error = FT_Get_Glyph(face->glyph, &image);
+            if ( error )
+                continue;
+
+            FT_Glyph_Get_CBox(image,ft_glyph_bbox_pixels, &glyph_bbox);
+            if (glyph_bbox.xMin < bbox.xMin)
+                bbox.xMin = glyph_bbox.xMin;
+            if (glyph_bbox.yMin < bbox.yMin)
+                bbox.yMin = glyph_bbox.yMin;
+            if (glyph_bbox.xMax > bbox.xMax)
+                bbox.xMax = glyph_bbox.xMax;
+            if (glyph_bbox.yMax > bbox.yMax)
+                bbox.yMax = glyph_bbox.yMax;
+
+            // Check if we properly grew the bbox
+            if ( bbox.xMin > bbox.xMax )
+            {
+                bbox.xMin = 0;
+                bbox.yMin = 0;
+                bbox.xMax = 0;
+                bbox.yMax = 0;
             }
 
-            return Envelope<double>(bbox.xMin, bbox.yMin, bbox.xMax, bbox.yMax);
+            // take ownership of the glyph
+            glyphs_.push_back(new glyph_t(image));
         }
 
-        void render(double x0, double y0)
-        {
-            FT_Error  error;
-            FT_Vector start;
-            unsigned height = pixmap_.height();
+        return box2d<double>(bbox.xMin, bbox.yMin, bbox.xMax, bbox.yMax);
+    }
 
-            start.x =  static_cast<FT_Pos>(x0 * (1 << 6));
-            start.y =  static_cast<FT_Pos>((height - y0) * (1 << 6));
+    void render(double x0, double y0)
+    {
+        FT_Error  error;
+        FT_Vector start;
+        unsigned height = pixmap_.height();
 
-            // now render transformed glyphs
-            typename glyphs_t::iterator pos;
+        start.x =  static_cast<FT_Pos>(x0 * (1 << 6));
+        start.y =  static_cast<FT_Pos>((height - y0) * (1 << 6));
 
-            //make sure we've got reasonable values.
-            if (halo_radius_ > 0 && halo_radius_ < 256)
+        // now render transformed glyphs
+        typename glyphs_t::iterator pos;
+
+        //make sure we've got reasonable values.
+        if (halo_radius_ > 0.0 && halo_radius_ < 1024.0)
+        {
+            stroker_.init(halo_radius_);   
+            for ( pos = glyphs_.begin(); pos != glyphs_.end();++pos)
             {
-                //render halo
-                for ( pos = glyphs_.begin(); pos != glyphs_.end();++pos)
+                FT_Glyph g;
+                error = FT_Glyph_Copy(pos->image, &g);
+                if (!error)
                 {
-                    FT_Glyph_Transform(pos->image,0,&start);
-
-                    error = FT_Glyph_To_Bitmap( &(pos->image),FT_RENDER_MODE_NORMAL,0,1);
+                    FT_Glyph_Transform(g,0,&start);
+                    FT_Glyph_Stroke(&g,stroker_.get(),1);
+                    error = FT_Glyph_To_Bitmap( &g,FT_RENDER_MODE_NORMAL,0,1);
                     if ( ! error )
                     {
-
-                        FT_BitmapGlyph bit = (FT_BitmapGlyph)pos->image;
-                        render_halo(&bit->bitmap, halo_fill_.rgba(),
-                                    bit->left,
-                                    height - bit->top,halo_radius_);
+                        
+                        FT_BitmapGlyph bit = (FT_BitmapGlyph)g;
+                        render_bitmap(&bit->bitmap, halo_fill_.rgba(),
+                                      bit->left,
+                                      height - bit->top);
                     }
                 }
-            }
-            //render actual text
-            for ( pos = glyphs_.begin(); pos != glyphs_.end();++pos)
+                FT_Done_Glyph(g);
+            }    
+        }
+        //render actual text
+        for ( pos = glyphs_.begin(); pos != glyphs_.end();++pos)
+        {
+
+            FT_Glyph_Transform(pos->image,0,&start);
+
+            error = FT_Glyph_To_Bitmap( &(pos->image),FT_RENDER_MODE_NORMAL,0,1);
+            if ( ! error )
             {
 
-                FT_Glyph_Transform(pos->image,0,&start);
+                FT_BitmapGlyph bit = (FT_BitmapGlyph)pos->image;
+                render_bitmap(&bit->bitmap, fill_.rgba(),
+                              bit->left,
+                              height - bit->top);
+            }
+        }
+    }
+
+    void render_id(int feature_id,double x0, double y0, double min_radius=1.0)
+    {
+        FT_Error  error;
+        FT_Vector start;
+        unsigned height = pixmap_.height();
+
+        start.x =  static_cast<FT_Pos>(x0 * (1 << 6));
+        start.y =  static_cast<FT_Pos>((height - y0) * (1 << 6));
 
-                error = FT_Glyph_To_Bitmap( &(pos->image),FT_RENDER_MODE_NORMAL,0,1);
+        // now render transformed glyphs
+        typename glyphs_t::iterator pos;
+
+        stroker_.init(std::max(halo_radius_,min_radius));   
+        for ( pos = glyphs_.begin(); pos != glyphs_.end();++pos)
+        {
+            FT_Glyph g;
+            error = FT_Glyph_Copy(pos->image, &g);
+            if (!error)
+            {
+                FT_Glyph_Transform(g,0,&start);
+                FT_Glyph_Stroke(&g,stroker_.get(),1);
+                error = FT_Glyph_To_Bitmap( &g,FT_RENDER_MODE_NORMAL,0,1);
+                //error = FT_Glyph_To_Bitmap( &g,FT_RENDER_MODE_MONO,0,1);
                 if ( ! error )
                 {
-
-                    FT_BitmapGlyph bit = (FT_BitmapGlyph)pos->image;
-                    render_bitmap(&bit->bitmap, fill_.rgba(),
+                    
+                    FT_BitmapGlyph bit = (FT_BitmapGlyph)g;
+                    render_bitmap_id(&bit->bitmap, feature_id,
                                   bit->left,
                                   height - bit->top);
                 }
             }
+            FT_Done_Glyph(g);
+        }    
+    }
+    
+private:
+
+    // unused currently, stroker is the new method for drawing halos
+    /*
+    void render_halo(FT_Bitmap *bitmap,unsigned rgba,int x,int y,int radius)
+    {
+        int x_max=x+bitmap->width;
+        int y_max=y+bitmap->rows;
+        int i,p,j,q;
+
+        for (i=x,p=0;i<x_max;++i,++p)
+        {
+            for (j=y,q=0;j<y_max;++j,++q)
+            {
+                int gray = bitmap->buffer[q*bitmap->width+p];
+                if (gray)
+                {
+                    for (int n=-halo_radius_; n <=halo_radius_; ++n)
+                        for (int m=-halo_radius_;m <= halo_radius_; ++m)
+                            pixmap_.blendPixel2(i+m,j+n,rgba,gray,opacity_);
+                }
+            }
         }
+    }
+    */
 
-    private:
+    void render_bitmap(FT_Bitmap *bitmap,unsigned rgba,int x,int y)
+    {
+        int x_max=x+bitmap->width;
+        int y_max=y+bitmap->rows;
+        int i,p,j,q;
 
-        void render_halo(FT_Bitmap *bitmap,unsigned rgba,int x,int y,int radius)
+        for (i=x,p=0;i<x_max;++i,++p)
         {
-            int x_max=x+bitmap->width;
-            int y_max=y+bitmap->rows;
-            int i,p,j,q;
-
-            for (i=x,p=0;i<x_max;++i,++p)
+            for (j=y,q=0;j<y_max;++j,++q)
             {
-                for (j=y,q=0;j<y_max;++j,++q)
+                int gray=bitmap->buffer[q*bitmap->width+p];
+                if (gray)
                 {
-                    int gray = bitmap->buffer[q*bitmap->width+p];
-                    if (gray)
-                    {
-                        for (int n=-halo_radius_; n <=halo_radius_; ++n)
-                            for (int m=-halo_radius_;m <= halo_radius_; ++m)
-                                pixmap_.blendPixel2(i+m,j+n,rgba,gray,opacity_);
-                    }
+                    pixmap_.blendPixel2(i,j,rgba,gray,opacity_);
                 }
             }
         }
+    }
 
-        void render_bitmap(FT_Bitmap *bitmap,unsigned rgba,int x,int y)
-        {
-            int x_max=x+bitmap->width;
-            int y_max=y+bitmap->rows;
-            int i,p,j,q;
+    void render_bitmap_id(FT_Bitmap *bitmap,int feature_id,int x,int y)
+    {
+        int x_max=x+bitmap->width;
+        int y_max=y+bitmap->rows;
+        int i,p,j,q;
 
-            for (i=x,p=0;i<x_max;++i,++p)
+        for (i=x,p=0;i<x_max;++i,++p)
+        {
+            for (j=y,q=0;j<y_max;++j,++q)
             {
-                for (j=y,q=0;j<y_max;++j,++q)
+                int gray=bitmap->buffer[q*bitmap->width+p];
+                if (gray)
                 {
-                    int gray=bitmap->buffer[q*bitmap->width+p];
-                    if (gray)
-                    {
-                        pixmap_.blendPixel2(i,j,rgba,gray,opacity_);
-                    }
+                    pixmap_.setPixel(i,j,feature_id);
+                    //pixmap_.blendPixel2(i,j,rgba,gray,opacity_);
                 }
             }
         }
-
-        pixmap_type & pixmap_;
-        face_set_ptr faces_;
-        mapnik::color fill_;
-        mapnik::color halo_fill_;
-        int halo_radius_;
-        unsigned text_ratio_;
-        unsigned wrap_width_;
-        glyphs_t glyphs_;
-        double opacity_;
-    };
+    }
+
+    pixmap_type & pixmap_;
+    face_set_ptr faces_;
+    stroker & stroker_;
+    color fill_;
+    color halo_fill_;
+    double halo_radius_;
+    glyphs_t glyphs_;
+    double opacity_;
+};
 }
 
 #endif // FONT_ENGINE_FREETYPE_HPP
diff --git a/include/mapnik/font_set.hpp b/include/mapnik/font_set.hpp
index 90b56a5..7ce08db 100644
--- a/include/mapnik/font_set.hpp
+++ b/include/mapnik/font_set.hpp
@@ -24,32 +24,32 @@
 
 #ifndef FONT_SET_HPP
 #define FONT_SET_HPP
+
 // mapnik
 #include <mapnik/config.hpp>
-// boost
-#include <boost/shared_ptr.hpp>
+
 // stl
 #include <string>
 #include <vector>
 
 namespace mapnik
 {
-    class MAPNIK_DECL FontSet
-    {
-        public:
-            FontSet(); 
-            FontSet(std::string const& name); 
-            FontSet(FontSet const& rhs);
-            FontSet& operator=(FontSet const& rhs);
-            unsigned size() const;
-            std::string const& get_name() const;
-            void add_face_name(std::string);
-            std::vector<std::string> const& get_face_names() const;
-            ~FontSet();
-        private:
-            std::string name_;
-            std::vector<std::string> face_names_;
-    };
+class MAPNIK_DECL font_set
+{
+public:
+    font_set(); 
+    font_set(std::string const& name); 
+    font_set(font_set const& rhs);
+    font_set& operator=(font_set const& rhs);
+    unsigned size() const;
+    std::string const& get_name() const;
+    void add_face_name(std::string);
+    std::vector<std::string> const& get_face_names() const;
+    ~font_set();
+private:
+    std::string name_;
+    std::vector<std::string> face_names_;
+};
 }
 
 #endif //FONT_SET_HPP
diff --git a/include/mapnik/gamma.hpp b/include/mapnik/gamma.hpp
index 01cf72c..c24dfa4 100644
--- a/include/mapnik/gamma.hpp
+++ b/include/mapnik/gamma.hpp
@@ -29,25 +29,25 @@
 
 namespace mapnik 
 {
-    struct MAPNIK_DECL gamma
+struct MAPNIK_DECL gamma
+{
+    unsigned char g2l[256];
+    unsigned char l2g[256];
+    gamma(double gamma=2.0)
     {
-        unsigned char g2l[256];
-        unsigned char l2g[256];
-        gamma(double gamma=2.0)
+        int result;
+        for (int i=0;i< 256;i++)
+        {
+            result=(int)(std::pow(i/255.0,gamma) * 255.0 + 0.5);
+            g2l[i]=(unsigned char)result;
+        }
+        for (int i = 0; i < 256; i++)
         {
-            int result;
-            for (int i=0;i< 256;i++)
-            {
-               result=(int)(std::pow(i/255.0,gamma) * 255.0 + 0.5);
-               g2l[i]=(unsigned char)result;
-            }
-            for (int i = 0; i < 256; i++)
-            {
-               result = (int)(std::pow(i/255.0, 1/gamma) * 255.0 + 0.5);
-               l2g[i] = (unsigned char)result;
-            }
+            result = (int)(std::pow(i/255.0, 1/gamma) * 255.0 + 0.5);
+            l2g[i] = (unsigned char)result;
         }
-    };
+    }
+};
 }
 
 #endif  //GAMMA_HPP
diff --git a/include/mapnik/geom_util.hpp b/include/mapnik/geom_util.hpp
index 2a7330f..f01b678 100644
--- a/include/mapnik/geom_util.hpp
+++ b/include/mapnik/geom_util.hpp
@@ -25,7 +25,7 @@
 #ifndef GEOM_UTIL_HPP
 #define GEOM_UTIL_HPP
 // mapnik
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 #include <mapnik/vertex.hpp>
 // boost
 #include <boost/tuple/tuple.hpp>
@@ -34,187 +34,187 @@
 
 namespace mapnik
 {
-    template <typename T>
-    bool clip_test(T p,T q,double& tmin,double& tmax)
+template <typename T>
+bool clip_test(T p,T q,double& tmin,double& tmax)
+{
+    double r;
+    bool result=true;
+    if (p<0.0)
     {
-        double r;
-        bool result=true;
-        if (p<0.0)
-        {
-            r=q/p;
-            if (r>tmax) result=false;
-            else if (r>tmin) tmin=r;
-        }
-        else if (p>0.0)
-        {
-            r=q/p;
-            if (r<tmin) result=false;
-            else if (r<tmax) tmax=r;
-        } else if (q<0.0) result=false;
-        return result;
+        r=q/p;
+        if (r>tmax) result=false;
+        else if (r>tmin) tmin=r;
     }
+    else if (p>0.0)
+    {
+        r=q/p;
+        if (r<tmin) result=false;
+        else if (r<tmax) tmax=r;
+    } else if (q<0.0) result=false;
+    return result;
+}
     
-    template <typename T,typename Image>
-    bool clip_line(T& x0,T& y0,T& x1,T& y1,Envelope<T> const& box)
+template <typename T,typename Image>
+bool clip_line(T& x0,T& y0,T& x1,T& y1,box2d<T> const& box)
+{
+    double tmin=0.0;
+    double tmax=1.0;
+    double dx=x1-x0;
+    if (clip_test<double>(-dx,x0,tmin,tmax))
     {
-        double tmin=0.0;
-        double tmax=1.0;
-        double dx=x1-x0;
-        if (clip_test<double>(-dx,x0,tmin,tmax))
+        if (clip_test<double>(dx,box.width()-x0,tmin,tmax))
         {
-            if (clip_test<double>(dx,box.width()-x0,tmin,tmax))
+            double dy=y1-y0;
+            if (clip_test<double>(-dy,y0,tmin,tmax))
             {
-                double dy=y1-y0;
-                if (clip_test<double>(-dy,y0,tmin,tmax))
+                if (clip_test<double>(dy,box.height()-y0,tmin,tmax))
                 {
-                    if (clip_test<double>(dy,box.height()-y0,tmin,tmax))
+                    if (tmax<1.0)
                     {
-                        if (tmax<1.0)
-                        {
-                            x1=static_cast<T>(x0+tmax*dx);
-                            y1=static_cast<T>(y0+tmax*dy);
-                        }
-                        if (tmin>0.0)
-                        {
-                            x0+=static_cast<T>(tmin*dx);
-                            y0+=static_cast<T>(tmin*dy);
-                        }
-                        return true;
+                        x1=static_cast<T>(x0+tmax*dx);
+                        y1=static_cast<T>(y0+tmax*dy);
                     }
+                    if (tmin>0.0)
+                    {
+                        x0+=static_cast<T>(tmin*dx);
+                        y0+=static_cast<T>(tmin*dy);
+                    }
+                    return true;
                 }
             }
         }
-        return false;
     }
+    return false;
+}
     
-    template <typename Iter> 
-    inline bool point_inside_path(double x,double y,Iter start,Iter end)
-    {
-        bool inside=false;
-        double x0=boost::get<0>(*start);
-        double y0=boost::get<1>(*start);
+template <typename Iter> 
+inline bool point_inside_path(double x,double y,Iter start,Iter end)
+{
+    bool inside=false;
+    double x0=boost::get<0>(*start);
+    double y0=boost::get<1>(*start);
         
-        double x1,y1;
-        while (++start!=end) 
+    double x1,y1;
+    while (++start!=end) 
+    {
+        if ( boost::get<2>(*start) == SEG_MOVETO)
         {
-            if ( boost::get<2>(*start) == SEG_MOVETO)
-            {
-                x0 = boost::get<0>(*start);
-                y0 = boost::get<1>(*start);
-                continue;
-            }		
-            x1=boost::get<0>(*start);
-            y1=boost::get<1>(*start);
+            x0 = boost::get<0>(*start);
+            y0 = boost::get<1>(*start);
+            continue;
+        }               
+        x1=boost::get<0>(*start);
+        y1=boost::get<1>(*start);
             
-            if ((((y1 <= y) && (y < y0)) ||
-                 ((y0 <= y) && (y < y1))) &&
-                ( x < (x0 - x1) * (y - y1)/ (y0 - y1) + x1))
-                inside=!inside;
-            x0=x1;
-            y0=y1;
-        }
-    	return inside;
+        if ((((y1 <= y) && (y < y0)) ||
+             ((y0 <= y) && (y < y1))) &&
+            ( x < (x0 - x1) * (y - y1)/ (y0 - y1) + x1))
+            inside=!inside;
+        x0=x1;
+        y0=y1;
     }
+    return inside;
+}
 
-    inline bool point_in_circle(double x,double y,double cx,double cy,double r)
-    {
-        double dx = x - cx;
-        double dy = y - cy;
-        double d2 = dx * dx + dy * dy;
-        return (d2 <= r * r);
-    }
+inline bool point_in_circle(double x,double y,double cx,double cy,double r)
+{
+    double dx = x - cx;
+    double dy = y - cy;
+    double d2 = dx * dx + dy * dy;
+    return (d2 <= r * r);
+}
     
-    template <typename T>
-    inline T sqr(T x)
-    {
-        return x * x;
-    }
+template <typename T>
+inline T sqr(T x)
+{
+    return x * x;
+}
 
-    inline double distance2(double x0,double y0,double x1,double y1)
+inline double distance2(double x0,double y0,double x1,double y1)
+{
+    double dx = x1 - x0;
+    double dy = y1 - y0;
+    return sqr(dx) + sqr(dy);
+}
+    
+inline double distance(double x0,double y0, double x1,double y1)
+{
+    return std::sqrt(distance2(x0,y0,x1,y1));
+}
+    
+inline double point_to_segment_distance(double x, double y, 
+                                        double ax, double ay, 
+                                        double bx, double by)
+{
+    double len2 = distance2(ax,ay,bx,by);
+        
+    if (len2 < 1e-14) 
     {
-        double dx = x1 - x0;
-        double dy = y1 - y0;
-        return sqr(dx) + sqr(dy);
+        return distance(x,y,ax,ay);
     }
-    
-    inline double distance(double x0,double y0, double x1,double y1)
+        
+    double r = ((x - ax)*(bx - ax) + (y - ay)*(by -ay))/len2;
+    if ( r < 0 )
     {
-       return std::sqrt(distance2(x0,y0,x1,y1));
+        return distance(x,y,ax,ay);
     }
-    
-    inline double point_to_segment_distance(double x, double y, 
-                                            double ax, double ay, 
-                                            double bx, double by)
+    else if (r > 1)
     {
-        double len2 = distance2(ax,ay,bx,by);
-        
-        if (len2 < 1e-14) 
-        {
-            return distance(x,y,ax,ay);
-        }
-        
-        double r = ((x - ax)*(bx - ax) + (y - ay)*(by -ay))/len2;
-        if ( r < 0 )
-        {
-            return distance(x,y,ax,ay);
-        }
-        else if (r > 1)
-        {
-            return distance(x,y,bx,by);
-        }
-        double s = ((ay - y)*(bx - ax) - (ax - x)*(by - ay))/len2;
-        return std::fabs(s) * std::sqrt(len2);
+        return distance(x,y,bx,by);
     }
+    double s = ((ay - y)*(bx - ax) - (ax - x)*(by - ay))/len2;
+    return std::fabs(s) * std::sqrt(len2);
+}
         
-    template <typename Iter> 
-    inline bool point_on_path(double x,double y,Iter start,Iter end, double tol)
+template <typename Iter> 
+inline bool point_on_path(double x,double y,Iter start,Iter end, double tol)
+{
+    double x0=boost::get<0>(*start);
+    double y0=boost::get<1>(*start);
+    double x1,y1;
+    while (++start != end) 
     {
-        double x0=boost::get<0>(*start);
-        double y0=boost::get<1>(*start);
-        double x1,y1;
-        while (++start != end) 
+        if ( boost::get<2>(*start) == SEG_MOVETO)
         {
-            if ( boost::get<2>(*start) == SEG_MOVETO)
-            {
-                x0 = boost::get<0>(*start);
-                y0 = boost::get<1>(*start);
-                continue;
-            }		
-            x1=boost::get<0>(*start);
-            y1=boost::get<1>(*start);
+            x0 = boost::get<0>(*start);
+            y0 = boost::get<1>(*start);
+            continue;
+        }               
+        x1=boost::get<0>(*start);
+        y1=boost::get<1>(*start);
             
-            double distance = point_to_segment_distance(x,y,x0,y0,x1,y1);
-	    if (distance < tol)
-                return true;
-            x0=x1;
-            y0=y1;
-        }
-    	return false;
+        double distance = point_to_segment_distance(x,y,x0,y0,x1,y1);
+        if (distance < tol)
+            return true;
+        x0=x1;
+        y0=y1;
     }
+    return false;
+}
     
-    // filters
-    struct filter_in_box
-    {
-        Envelope<double> box_;
-        explicit filter_in_box(const Envelope<double>& box)
-            : box_(box) {}
+// filters
+struct filter_in_box
+{
+    box2d<double> box_;
+    explicit filter_in_box(const box2d<double>& box)
+        : box_(box) {}
 
-        bool pass(const Envelope<double>& extent) const
-        {
-            return extent.intersects(box_);
-        }
-    };
+    bool pass(const box2d<double>& extent) const
+    {
+        return extent.intersects(box_);
+    }
+};
 
-    struct filter_at_point
+struct filter_at_point
+{
+    coord2d pt_;
+    explicit filter_at_point(const coord2d& pt)
+        : pt_(pt) {}
+    bool pass(const box2d<double>& extent) const
     {
-        coord2d pt_;
-        explicit filter_at_point(const coord2d& pt)
-            : pt_(pt) {}
-        bool pass(const Envelope<double>& extent) const
-        {
-            return extent.contains(pt_);
-        }
-    };
+        return extent.contains(pt_);
+    }
+};
 }
 
 #endif //GEOM_UTIL_HPP
diff --git a/include/mapnik/geometry.hpp b/include/mapnik/geometry.hpp
index 07661f7..dea3125 100644
--- a/include/mapnik/geometry.hpp
+++ b/include/mapnik/geometry.hpp
@@ -20,7 +20,6 @@
  *
  *****************************************************************************/
 
-
 //$Id: geometry.hpp 39 2005-04-10 20:39:53Z pavlenko $
 
 #ifndef GEOMETRY_HPP
@@ -36,327 +35,381 @@
 #include <boost/ptr_container/ptr_vector.hpp>
 
 namespace mapnik {
-    enum GeomType {
-      Point = 1,
-      LineString = 2,
-      Polygon = 3
-    };
+
+enum eGeomType {
+    Point = 1,
+    LineString,
+    Polygon,
+    MultiPoint,
+    MultiLineString,
+    MultiPolygon
+};
+
+
+template <typename T, template <typename> class Container=vertex_vector>
+class geometry
+{
+public:
+    typedef T vertex_type;
+    typedef typename vertex_type::type value_type;
+    typedef Container<vertex_type> container_type;   
+private:
+    container_type cont_;
+    eGeomType type_;
+    mutable unsigned itr_;
+public:
+    
+    geometry(eGeomType type)
+        : type_(type),
+          itr_(0)
+    {}
+    
+    eGeomType type() const 
+    {
+        return type_;
+    }
     
-    template <typename T>
-    class geometry : private boost::noncopyable
-    {   
-    public:
-        typedef T vertex_type;
-        typedef typename vertex_type::type value_type;
-    public:
-        geometry () {}  
-  
-        Envelope<double> envelope() const
+    double area() const 
+    {
+        double sum = 0.0;
+        double x(0);
+        double y(0);
+        rewind(0);
+        double xs = x;
+        double ys = y;
+        for (unsigned i=0;i<num_points();++i)
         {
-            Envelope<double> result;    
-            double x,y;
-            rewind(0);
-            for (unsigned i=0;i<num_points();++i)
+            double x0(0);
+            double y0(0);
+            vertex(&x0,&y0);
+            sum += x * y0 - y * x0;
+            x = x0;
+            y = y0;
+        }
+        return (sum + x * ys - y * xs) * 0.5;
+    }
+    
+    box2d<double> envelope() const
+    {
+        box2d<double> result;
+        double x(0);
+        double y(0);
+        rewind(0);
+        for (unsigned i=0;i<num_points();++i)
+        {
+            vertex(&x,&y);
+            if (i==0)
             {
-                vertex(&x,&y);
-                if (i==0)
+                result.init(x,y,x,y);
+            }
+            else
+            {
+                result.expand_to_include(x,y);
+            }
+        }
+        return result;
+    }
+
+    void label_interior_position(double *x, double *y) const
+    {
+        // start with the default label position
+        label_position(x,y);
+        unsigned size = cont_.size();
+        // if we are not a polygon, or the default is within the polygon we are done
+        if (size < 3 || hit_test(*x,*y,0))
+            return;
+
+        // otherwise we find a horizontal line across the polygon and then return the
+        // center of the widest intersection between the polygon and the line.
+
+        std::vector<double> intersections; // only need to store the X as we know the y
+
+        double x0=0;
+        double y0=0;
+        rewind(0);
+        unsigned command = vertex(&x0, &y0);
+        double x1,y1;
+        while (SEG_END != (command=vertex(&x1, &y1)))
+        {
+            if (command != SEG_MOVETO)
+            {
+                // if the segments overlap
+                if (y0==y1)
                 {
-                    result.init(x,y,x,y);
+                    if (y0==*y)
+                    {
+                        double xi = (x0+x1)/2.0;
+                        intersections.push_back(xi);
+                    }
                 }
-                else
+                // if the path segment crosses the bisector
+                else if ((y0 <= *y && y1 >= *y) ||
+                        (y0 >= *y && y1 <= *y))
                 {
-                    result.expand_to_include(x,y);
+                    // then calculate the intersection
+                    double xi = x0;
+                    if (x0 != x1)
+                    {
+                        double m = (y1-y0)/(x1-x0);
+                        double c = y0 - m*x0;
+                        xi = (*y-c)/m;
+                    }
+
+                    intersections.push_back(xi);
                 }
             }
-            return result;
+            x0 = x1;
+            y0 = y1;
         }
-        
-        virtual int type() const=0;
-        virtual bool hit_test(value_type x,value_type y, double tol) const=0;  
-        virtual void label_position(double *x, double *y) const=0;
-        virtual void move_to(value_type x,value_type y)=0;
-        virtual void line_to(value_type x,value_type y)=0;
-        virtual unsigned num_points() const = 0;
-        virtual unsigned vertex(double* x, double* y) const=0;
-        virtual void rewind(unsigned) const=0;
-        virtual void set_capacity(size_t size)=0;
-        virtual ~geometry() {}
-    };
-    
-   template <typename T>
-   class point : public geometry<T>
-   {
-         typedef geometry<T> geometry_base;
-         typedef typename geometry<T>::vertex_type vertex_type;
-         typedef typename geometry<T>::value_type value_type;
-      private:
-         vertex_type pt_;
-      public:
-         point() : geometry<T>() {}
-         
-         int type() const 
-         {
-            return Point;
-         }
-         
-         void label_position(double *x, double *y) const
-         {
-            *x = pt_.x;
-            *y = pt_.y;
-         }
-         
-         void move_to(value_type x,value_type y)
-         {
-            pt_.x = x;
-            pt_.y = y;
-         }
-         
-         void line_to(value_type ,value_type ) {}
-         
-         unsigned num_points() const
-         {
-            return 1;
-         }
-         
-         unsigned vertex(double* x, double* y) const
-         {
-            *x = pt_.x;
-            *y = pt_.y;
-            return SEG_LINETO;
-         }
-         
-         void rewind(unsigned ) const {}
-         
-         bool hit_test(value_type x,value_type y, double tol) const
-         {
-            return point_in_circle(pt_.x,pt_.y, x,y,tol);
-         }
-         
-         void set_capacity(size_t) {}
-         virtual ~point() {}
-   };
-   
-   template <typename T, template <typename> class Container=vertex_vector2>
-   class polygon : public geometry<T>
-   {
-         typedef geometry<T> geometry_base;
-         typedef typename geometry<T>::vertex_type vertex_type;
-         typedef typename geometry_base::value_type value_type;
-         typedef Container<vertex_type> container_type;
-      private:
-         container_type cont_;
-         mutable unsigned itr_;
-      public:
-         polygon()
-            : geometry_base(),
-              itr_(0)
-         {}
-         
-         int type() const 
-         {
-            return Polygon;
-         }
-         
-         void label_position(double *x, double *y) const
-         {
-            unsigned size = cont_.size();
-            if (size < 3) 
+        // no intersections we just return the default
+        if (intersections.empty())
+            return;
+        x0=intersections[0];
+        double max_width = 0;
+        for (unsigned ii = 1; ii < intersections.size(); ++ii)
+        {
+            double x1=intersections[ii];
+            double xc=(x0+x1)/2.0;
+            double width = fabs(x1-x0);
+            if (width > max_width && hit_test(xc,*y,0))
             {
-               cont_.get_vertex(0,x,y);
-               return;
+                *x=xc;
+                max_width = width;
             }
-            
-            double ai;
-            double atmp = 0;
-            double xtmp = 0;
-            double ytmp = 0;
-            double x0 =0;
-            double y0 =0;
-            double x1 =0;
-            double y1 =0;
-            double ox =0;
-            double oy =0;
-      
-            unsigned i;
+        }
+    }
 
-            // Use first point as origin to improve numerical accuracy
-            cont_.get_vertex(0,&ox,&oy);
+    /* center of gravity centroid
+      - best visually but does not work with multipolygons
+    */
+    void label_position(double *x, double *y) const
+    {
+        if (type_ == LineString || type_ == MultiLineString)
+        {
+            middle_point(x,y);
+            return;
+        }
 
-            for (i = 0; i < size-1; i++)
-            {
-               cont_.get_vertex(i,&x0,&y0);
-               cont_.get_vertex(i+1,&x1,&y1);
+        unsigned size = cont_.size();
+        if (size < 3) 
+        {
+            cont_.get_vertex(0,x,y);
+            return;
+        }
+           
+        double ai;
+        double atmp = 0;
+        double xtmp = 0;
+        double ytmp = 0;
+        double x0 =0;
+        double y0 =0;
+        double x1 =0;
+        double y1 =0;
+        double ox =0;
+        double oy =0;
+           
+        unsigned i;
+           
+        // Use first point as origin to improve numerical accuracy
+        cont_.get_vertex(0,&ox,&oy);
+
+        for (i = 0; i < size-1; i++)
+        {
+            cont_.get_vertex(i,&x0,&y0);
+            cont_.get_vertex(i+1,&x1,&y1);
+               
+            x0 -= ox; y0 -= oy;
+            x1 -= ox; y1 -= oy;
 
-               x0 -= ox; y0 -= oy;
-               x1 -= ox; y1 -= oy;
+            ai = x0 * y1 - x1 * y0;
+            atmp += ai;
+            xtmp += (x1 + x0) * ai;
+            ytmp += (y1 + y0) * ai;
+        }    
+        if (atmp != 0)
+        {
+            *x = (xtmp/(3*atmp)) + ox;
+            *y = (ytmp/(3*atmp)) + oy;
+            return;
+        }
+        *x=x0;
+        *y=y0;            
+    }
+
+    /* center of bounding box centroid */
+    void label_position2(double *x, double *y) const
+    {
+
+        box2d<double> box = envelope();
+        *x = box.center().x;
+        *y = box.center().y; 
+    }
+
+    /* summarized distance centroid */
+    void label_position3(double *x, double *y) const
+    {
+        if (type_ == LineString || type_ == MultiLineString)
+        {
+            middle_point(x,y);
+            return;
+        }
 
-               ai = x0 * y1 - x1 * y0;
-               atmp += ai;
-               xtmp += (x1 + x0) * ai;
-               ytmp += (y1 + y0) * ai;
-            }    
-            if (atmp != 0)
+        unsigned i = 0;
+        double l = 0.0;
+        double tl = 0.0;
+        double cx = 0.0;
+        double cy = 0.0;
+        double x0 = 0.0;
+        double y0 = 0.0;
+        double x1 = 0.0;
+        double y1 = 0.0;
+        unsigned size = cont_.size();   
+        for (i = 0; i < size-1; i++)
+        {
+            cont_.get_vertex(i,&x0,&y0);
+            cont_.get_vertex(i+1,&x1,&y1);
+            l = distance(x0,y0,x1,y1);
+            cx += l * (x1 + x0)/2;
+            cy += l * (y1 + y0)/2;
+            tl += l;
+        }
+        *x = cx / tl;
+        *y = cy / tl;
+    }
+                 
+    void middle_point(double *x, double *y) const
+    {
+        // calculate mid point on path
+        double x0=0;
+        double y0=0;
+        double x1=0;
+        double y1=0;
+      
+        unsigned size = cont_.size();
+        if (size == 1)
+        {
+            cont_.get_vertex(0,x,y); 
+        }
+        else if (size == 2)
+        {
+            cont_.get_vertex(0,&x0,&y0);
+            cont_.get_vertex(1,&x1,&y1);
+            *x = 0.5 * (x1 + x0);
+            *y = 0.5 * (y1 + y0);    
+        }
+        else
+        {
+            double len=0.0;
+            for (unsigned pos = 1; pos < size; ++pos)
             {
-               *x = (xtmp/(3*atmp)) + ox;
-               *y = (ytmp/(3*atmp)) + oy;
-               return;
+                cont_.get_vertex(pos-1,&x0,&y0);
+                cont_.get_vertex(pos,&x1,&y1);
+                double dx = x1 - x0;
+                double dy = y1 - y0;
+                len += std::sqrt(dx * dx + dy * dy);
             }
-            *x=x0;
-            *y=y0;            
-         }
-         
-         void line_to(value_type x,value_type y)
-         {
-            cont_.push_back(x,y,SEG_LINETO);
-         }
-         
-         void move_to(value_type x,value_type y)
-         {
-            cont_.push_back(x,y,SEG_MOVETO);
-         }
-         
-         unsigned num_points() const
-         {
-            return cont_.size();
-         }
-         
-         unsigned vertex(double* x, double* y) const
-         {
-            return cont_.get_vertex(itr_++,x,y);
-         }
-         
-         void rewind(unsigned ) const
-         {
-            itr_=0;
-         }
+            double midlen = 0.5 * len;
+            double dist = 0.0;
+            for (unsigned pos = 1; pos < size;++pos)
+            {
+                cont_.get_vertex(pos-1,&x0,&y0);
+                cont_.get_vertex(pos,&x1,&y1);
+                double dx = x1 - x0;
+                double dy = y1 - y0; 
+                double seg_len = std::sqrt(dx * dx + dy * dy);
+                if (( dist + seg_len) >= midlen)
+                {
+                    double r = (midlen - dist)/seg_len;
+                    *x = x0 + (x1 - x0) * r;
+                    *y = y0 + (y1 - y0) * r;
+                    break;
+                }
+                dist += seg_len;
+            }
+        }  
+    }
+    
+    void push_vertex(value_type x, value_type y, CommandType c) 
+    {
+        cont_.push_back(x,y,c);
+    }
+
+    void line_to(value_type x,value_type y)
+    {
+        push_vertex(x,y,SEG_LINETO);
+    }
          
-         bool hit_test(value_type x,value_type y, double) const
-         {      
-            return point_inside_path(x,y,cont_.begin(),cont_.end());
-         } 
+    void move_to(value_type x,value_type y)
+    {
+        push_vertex(x,y,SEG_MOVETO);
+    }
+    
+    unsigned num_points() const
+    {
+        return cont_.size();
+    }
          
-         void set_capacity(size_t size) 
-         {
-            cont_.set_capacity(size);
-         }
-         virtual ~polygon() {}
-   };
-   
-   template <typename T, template <typename> class Container=vertex_vector2>
-   class line_string : public geometry<T>
-   {
-         typedef geometry<T> geometry_base;
-         typedef typename geometry_base::value_type value_type;
-         typedef typename geometry<T>::vertex_type vertex_type;
-         typedef Container<vertex_type> container_type;
-      private:
-         container_type cont_;
-         mutable unsigned itr_;
-      public:
-         line_string()
-            : geometry_base(),
-              itr_(0)
-         {}
+    unsigned vertex(double* x, double* y) const
+    {
+        return cont_.get_vertex(itr_++,x,y);
+    }         
+
+    unsigned get_vertex(unsigned pos, double* x, double* y) const
+    {
+        return cont_.get_vertex(pos, x, y);
+    }         
+
+    void rewind(unsigned ) const
+    {
+        itr_=0;
+    }
          
-         int type() const 
-         {
-            return LineString;
-         }
-         void label_position(double *x, double *y) const
-         {
-            // calculate mid point on line string
+    bool hit_test(value_type x, value_type y, double tol) const
+    {      
+        if (cont_.size() == 1) {
+            // Handle points
+            double x0, y0;
+            cont_.get_vertex(0, &x0, &y0);
+            return distance(x, y, x0, y0) <= fabs(tol);
+        } else if (cont_.size() > 1) {
+            bool inside=false;
             double x0=0;
             double y0=0;
-            double x1=0;
-            double y1=0;
-      
-            unsigned size = cont_.size();
-            if (size == 1)
-            {
-               cont_.get_vertex(0,x,y); 
-            }
-            else if (size == 2)
+            rewind(0);
+            vertex(&x0, &y0);
+                
+            unsigned command;
+            double x1,y1;
+            while (SEG_END != (command=vertex(&x1, &y1)))
             {
-               cont_.get_vertex(0,&x0,&y0);
-               cont_.get_vertex(1,&x1,&y1);
-               *x = 0.5 * (x1 + x0);
-               *y = 0.5 * (y1 + y0);    
+                if (command == SEG_MOVETO)
+                {
+                    x0 = x1;
+                    y0 = y1;
+                    continue;
+                }               
+                if ((((y1 <= y) && (y < y0)) ||
+                     ((y0 <= y) && (y < y1))) &&
+                    ( x < (x0 - x1) * (y - y1)/ (y0 - y1) + x1))
+                    inside=!inside;
+                x0=x1;
+                y0=y1;
             }
-            else
-            {
-               double len=0.0;
-               for (unsigned pos = 1; pos < size; ++pos)
-               {
-                  cont_.get_vertex(pos-1,&x0,&y0);
-                  cont_.get_vertex(pos,&x1,&y1);
-                  double dx = x1 - x0;
-                  double dy = y1 - y0;
-                  len += std::sqrt(dx * dx + dy * dy);
-               }
-               double midlen = 0.5 * len;
-               double dist = 0.0;
-               for (unsigned pos = 1; pos < size;++pos)
-               {
-                  cont_.get_vertex(pos-1,&x0,&y0);
-                  cont_.get_vertex(pos,&x1,&y1);
-                  double dx = x1 - x0;
-                  double dy = y1 - y0; 
-                  double seg_len = std::sqrt(dx * dx + dy * dy);
-                  if (( dist + seg_len) >= midlen)
-                  {
-                     double r = (midlen - dist)/seg_len;
-                     *x = x0 + (x1 - x0) * r;
-                     *y = y0 + (y1 - y0) * r;
-                     break;
-                  }
-                  dist += seg_len;
-               }
-            }  
-         }
-         void line_to(value_type x,value_type y)
-         {
-            cont_.push_back(x,y,SEG_LINETO);
-         }
-         
-         void move_to(value_type x,value_type y)
-         {
-            cont_.push_back(x,y,SEG_MOVETO);
-         }
-         
-         unsigned num_points() const
-         {
-            return cont_.size();
-         }
-         
-         unsigned vertex(double* x, double* y) const
-         {
-            return cont_.get_vertex(itr_++,x,y);
-         }
-         
-         void rewind(unsigned ) const
-         {
-            itr_=0;
-         }
-         
-         bool hit_test(value_type x,value_type y, double tol) const
-         {      
-            return point_on_path(x,y,cont_.begin(),cont_.end(),tol);
-         } 
+            return inside;
+        }
+        return false;
+    } 
          
-         void set_capacity(size_t size) 
-         {
-            cont_.set_capacity(size);
-         }
-         virtual ~line_string() {}
-   };
+    void set_capacity(size_t size) 
+    {
+        cont_.set_capacity(size);
+    }
+};
    
-   typedef point<vertex2d> point_impl;
-   typedef line_string<vertex2d,vertex_vector2> line_string_impl;
-   typedef polygon<vertex2d,vertex_vector2> polygon_impl;
-   
-   typedef geometry<vertex2d> geometry2d;
-   typedef boost::shared_ptr<geometry2d> geometry_ptr;
-   typedef boost::ptr_vector<geometry2d> geometry_containter;
+typedef geometry<vertex2d,vertex_vector> geometry_type; 
+typedef boost::shared_ptr<geometry_type> geometry_ptr;
+typedef boost::ptr_vector<geometry_type> geometry_containter;
+
 }
 
 #endif //GEOMETRY_HPP
diff --git a/include/mapnik/global.hpp b/include/mapnik/global.hpp
index 63b7262..83e87db 100644
--- a/include/mapnik/global.hpp
+++ b/include/mapnik/global.hpp
@@ -42,123 +42,123 @@ namespace mapnik
                                (((boost::uint16_t) ((boost::uint8_t) (A)[0])) << 8))
 
 #define int4net(A)  (int32_t)  (((boost::uint32_t) ((boost::uint8_t) (A)[3]))        | \
-                               (((boost::uint32_t) ((boost::uint8_t) (A)[2])) << 8)  | \
-                               (((boost::uint32_t) ((boost::uint8_t) (A)[1])) << 16) | \
-                               (((boost::uint32_t) ((boost::uint8_t) (A)[0])) << 24))
+                                (((boost::uint32_t) ((boost::uint8_t) (A)[2])) << 8)  | \
+                                (((boost::uint32_t) ((boost::uint8_t) (A)[1])) << 16) | \
+                                (((boost::uint32_t) ((boost::uint8_t) (A)[0])) << 24))
 
 #define int8net(A)  (int64_t)  (((boost::uint64_t) ((boost::uint8_t) (A)[7]))        | \
-                               (((boost::uint64_t) ((boost::uint8_t) (A)[6])) << 8)  | \
-                               (((boost::uint64_t) ((boost::uint8_t) (A)[5])) << 16) | \
-                               (((boost::uint64_t) ((boost::uint8_t) (A)[4])) << 24) | \
-                               (((boost::uint64_t) ((boost::uint8_t) (A)[3])) << 32) | \
-                               (((boost::uint64_t) ((boost::uint8_t) (A)[2])) << 40) | \
-                               (((boost::uint64_t) ((boost::uint8_t) (A)[1])) << 48) | \
-                               (((boost::uint64_t) ((boost::uint8_t) (A)[0])) << 56))
+                                (((boost::uint64_t) ((boost::uint8_t) (A)[6])) << 8)  | \
+                                (((boost::uint64_t) ((boost::uint8_t) (A)[5])) << 16) | \
+                                (((boost::uint64_t) ((boost::uint8_t) (A)[4])) << 24) | \
+                                (((boost::uint64_t) ((boost::uint8_t) (A)[3])) << 32) | \
+                                (((boost::uint64_t) ((boost::uint8_t) (A)[2])) << 40) | \
+                                (((boost::uint64_t) ((boost::uint8_t) (A)[1])) << 48) | \
+                                (((boost::uint64_t) ((boost::uint8_t) (A)[0])) << 56))
 
-   typedef boost::uint8_t byte;
+typedef boost::uint8_t byte;
 #define float8net(V,M)   do { double def_temp;  \
-    ((byte*) &def_temp)[0]=(M)[7]; \
-    ((byte*) &def_temp)[1]=(M)[6]; \
-    ((byte*) &def_temp)[2]=(M)[5]; \
-    ((byte*) &def_temp)[3]=(M)[4]; \
-    ((byte*) &def_temp)[4]=(M)[3]; \
-    ((byte*) &def_temp)[5]=(M)[2]; \
-    ((byte*) &def_temp)[6]=(M)[1]; \
-    ((byte*) &def_temp)[7]=(M)[0]; \
-    (V) = def_temp; } while(0)
-#define float4net(V,M)   do { float def_temp; \
-    ((byte*) &def_temp)[0]=(M)[3]; \
-    ((byte*) &def_temp)[1]=(M)[2]; \
-    ((byte*) &def_temp)[2]=(M)[1]; \
-    ((byte*) &def_temp)[3]=(M)[0]; \
-    (V)=def_temp; } while(0)
+        ((byte*) &def_temp)[0]=(M)[7];          \
+        ((byte*) &def_temp)[1]=(M)[6];          \
+        ((byte*) &def_temp)[2]=(M)[5];          \
+        ((byte*) &def_temp)[3]=(M)[4];          \
+        ((byte*) &def_temp)[4]=(M)[3];          \
+        ((byte*) &def_temp)[5]=(M)[2];          \
+        ((byte*) &def_temp)[6]=(M)[1];          \
+        ((byte*) &def_temp)[7]=(M)[0];          \
+        (V) = def_temp; } while(0)
+#define float4net(V,M)   do { float def_temp;   \
+        ((byte*) &def_temp)[0]=(M)[3];          \
+        ((byte*) &def_temp)[1]=(M)[2];          \
+        ((byte*) &def_temp)[2]=(M)[1];          \
+        ((byte*) &def_temp)[3]=(M)[0];          \
+        (V)=def_temp; } while(0)
 
     
-    // read int16_t NDR (little endian)
-    inline boost::int16_t& read_int16_ndr(const char* data, boost::int16_t & val)
-    {
+// read int16_t NDR (little endian)
+inline boost::int16_t& read_int16_ndr(const char* data, boost::int16_t & val)
+{
 #ifndef MAPNIK_BIG_ENDIAN
-        std::memcpy(&val,data,2);
+    std::memcpy(&val,data,2);
 #else
-        val = (data[0]&0xff) | 
-            ((data[1]&0xff)<<8);
+    val = (data[0]&0xff) | 
+        ((data[1]&0xff)<<8);
 #endif
-        return val;
-    }
+    return val;
+}
     
-    // read int32_t NDR (little endian)
-    inline boost::int32_t& read_int32_ndr(const char* data, boost::int32_t & val)
-    {
+// read int32_t NDR (little endian)
+inline boost::int32_t& read_int32_ndr(const char* data, boost::int32_t & val)
+{
 #ifndef MAPNIK_BIG_ENDIAN
-        std::memcpy(&val,data,4);
+    std::memcpy(&val,data,4);
 #else
-        val = (data[0]&0xff)     | 
-            ((data[1]&0xff)<<8)  | 
-            ((data[2]&0xff)<<16) | 
-            ((data[3]&0xff)<<24);
+    val = (data[0]&0xff)     | 
+        ((data[1]&0xff)<<8)  | 
+        ((data[2]&0xff)<<16) | 
+        ((data[3]&0xff)<<24);
 #endif
-        return val;
-    }
+    return val;
+}
     
-    // read double NDR (little endian)
-    inline double& read_double_ndr(const char* data, double & val)
-    {
+// read double NDR (little endian)
+inline double& read_double_ndr(const char* data, double & val)
+{
 #ifndef MAPNIK_BIG_ENDIAN
-        std::memcpy(&val,&data[0],8);
+    std::memcpy(&val,&data[0],8);
 #else
-        boost::int64_t bits = ((boost::int64_t)data[0] & 0xff) | 
-            ((boost::int64_t)data[1] & 0xff) << 8   |
-            ((boost::int64_t)data[2] & 0xff) << 16  |
-            ((boost::int64_t)data[3] & 0xff) << 24  |
-            ((boost::int64_t)data[4] & 0xff) << 32  |
-            ((boost::int64_t)data[5] & 0xff) << 40  |
-            ((boost::int64_t)data[6] & 0xff) << 48  |
-            ((boost::int64_t)data[7] & 0xff) << 56  ;
-        std::memcpy(&val,&bits,8);
+    boost::int64_t bits = ((boost::int64_t)data[0] & 0xff) | 
+        ((boost::int64_t)data[1] & 0xff) << 8   |
+        ((boost::int64_t)data[2] & 0xff) << 16  |
+        ((boost::int64_t)data[3] & 0xff) << 24  |
+        ((boost::int64_t)data[4] & 0xff) << 32  |
+        ((boost::int64_t)data[5] & 0xff) << 40  |
+        ((boost::int64_t)data[6] & 0xff) << 48  |
+        ((boost::int64_t)data[7] & 0xff) << 56  ;
+    std::memcpy(&val,&bits,8);
 #endif
-        return val;
-    } 
+    return val;
+} 
     
-    // read int16_t XDR (big endian)
-    inline boost::int16_t& read_int16_xdr(const char* data, boost::int16_t & val)
-    {
+// read int16_t XDR (big endian)
+inline boost::int16_t& read_int16_xdr(const char* data, boost::int16_t & val)
+{
 #ifndef MAPNIK_BIG_ENDIAN
-        val = (data[3]&0xff) | ((data[2]&0xff)<<8);
+    val = (data[3]&0xff) | ((data[2]&0xff)<<8);
 #else
-        std::memcpy(&val,data,2);
+    std::memcpy(&val,data,2);
 #endif
-        return val;
-    }
+    return val;
+}
     
-    // read int32_t XDR (big endian)
-    inline boost::int32_t& read_int32_xdr(const char* data, boost::int32_t & val)
-    {
+// read int32_t XDR (big endian)
+inline boost::int32_t& read_int32_xdr(const char* data, boost::int32_t & val)
+{
 #ifndef MAPNIK_BIG_ENDIAN
-        val = (data[3]&0xff) | ((data[2]&0xff)<<8) | ((data[1]&0xff)<<16) | ((data[0]&0xff)<<24);
+    val = (data[3]&0xff) | ((data[2]&0xff)<<8) | ((data[1]&0xff)<<16) | ((data[0]&0xff)<<24);
 #else
-        std::memcpy(&val,data,4);
+    std::memcpy(&val,data,4);
 #endif
-        return val;
-    }
+    return val;
+}
     
-    // read double XDR (big endian)
-    inline double& read_double_xdr(const char* data, double & val)
-    {
+// read double XDR (big endian)
+inline double& read_double_xdr(const char* data, double & val)
+{
 #ifndef MAPNIK_BIG_ENDIAN
-        boost::int64_t bits = ((boost::int64_t)data[7] & 0xff) | 
-            ((boost::int64_t)data[6] & 0xff) << 8   |
-            ((boost::int64_t)data[5] & 0xff) << 16  |
-            ((boost::int64_t)data[4] & 0xff) << 24  |
-            ((boost::int64_t)data[3] & 0xff) << 32  |
-            ((boost::int64_t)data[2] & 0xff) << 40  |
-            ((boost::int64_t)data[1] & 0xff) << 48  |
-            ((boost::int64_t)data[0] & 0xff) << 56  ;
-        std::memcpy(&val,&bits,8);
+    boost::int64_t bits = ((boost::int64_t)data[7] & 0xff) | 
+        ((boost::int64_t)data[6] & 0xff) << 8   |
+        ((boost::int64_t)data[5] & 0xff) << 16  |
+        ((boost::int64_t)data[4] & 0xff) << 24  |
+        ((boost::int64_t)data[3] & 0xff) << 32  |
+        ((boost::int64_t)data[2] & 0xff) << 40  |
+        ((boost::int64_t)data[1] & 0xff) << 48  |
+        ((boost::int64_t)data[0] & 0xff) << 56  ;
+    std::memcpy(&val,&bits,8);
 #else
-        std::memcpy(&val,&data[0],8);
+    std::memcpy(&val,&data[0],8);
 #endif
-        return val;
-    }
+    return val;
+}
 
 #ifdef _WINDOWS
 // msvc doesn't have rint in <cmath>
diff --git a/include/mapnik/glyph_symbolizer.hpp b/include/mapnik/glyph_symbolizer.hpp
new file mode 100644
index 0000000..a45830a
--- /dev/null
+++ b/include/mapnik/glyph_symbolizer.hpp
@@ -0,0 +1,193 @@
+#ifndef GLYPH_SYMBOLIZER_HPP
+#define GLYPH_SYMBOLIZER_HPP
+
+// mapnik
+#include <mapnik/enumeration.hpp>
+#include <mapnik/raster_colorizer.hpp>
+#include <mapnik/filter_factory.hpp>
+#include <mapnik/text_path.hpp>
+#include <mapnik/font_engine_freetype.hpp>
+#include <mapnik/color.hpp>
+#include <mapnik/feature.hpp>
+#include <mapnik/unicode.hpp>
+#include <mapnik/symbolizer.hpp>
+
+// boost
+#include <boost/tuple/tuple.hpp>
+
+namespace mapnik
+{
+
+typedef boost::tuple<double,double> position;
+
+enum angle_mode_enum {
+    AZIMUTH,
+    TRIGONOMETRIC,
+    angle_mode_enum_MAX
+};
+
+DEFINE_ENUM(angle_mode_e, angle_mode_enum);
+
+struct MAPNIK_DECL glyph_symbolizer : public symbolizer_base
+{    
+    glyph_symbolizer(std::string face_name, expression_ptr c)
+        : symbolizer_base(),
+        face_name_(face_name),
+        char_(c),
+        angle_(),
+        value_(),
+        size_(),
+        color_(),
+        colorizer_(),
+        allow_overlap_(false),
+        avoid_edges_(false),
+        displacement_(0.0, 0.0),
+        halo_fill_(color(255,255,255)),
+        halo_radius_(0),
+        angle_mode_(TRIGONOMETRIC) {}
+
+    std::string const& get_face_name() const
+    {
+        return face_name_;
+    }
+    void set_face_name(std::string face_name)
+    {
+        face_name_ = face_name;
+    }
+
+    expression_ptr get_char() const
+    {
+        return char_;
+    }
+    void set_char(expression_ptr c)
+    {
+        char_ = c;
+    }
+
+    bool get_allow_overlap() const
+    {
+        return allow_overlap_;
+    }
+    void set_allow_overlap(bool allow_overlap)
+    {
+        allow_overlap_ = allow_overlap;
+    }
+
+    bool get_avoid_edges() const
+    {
+        return avoid_edges_;
+    }
+    void set_avoid_edges(bool avoid_edges)
+    {
+        avoid_edges_ = avoid_edges;
+    }
+
+    void set_displacement(double x, double y)
+    {
+        displacement_ = boost::make_tuple(x,y);
+    }
+    position const& get_displacement() const
+    {
+        return displacement_;
+    }
+
+    void  set_halo_fill(color const& fill)
+    {
+        halo_fill_ = fill;
+    }
+    color const&  get_halo_fill() const
+    {
+        return halo_fill_;
+    }
+
+    void  set_halo_radius(unsigned radius)
+    {
+        halo_radius_ = radius;
+    }
+
+    unsigned  get_halo_radius() const
+    {
+        return halo_radius_;
+    }
+        
+    expression_ptr get_angle() const
+    {
+        return angle_;
+    }
+    void set_angle(expression_ptr angle)
+    {
+        angle_ = angle;
+    }
+
+    expression_ptr get_value() const
+    {
+        return value_;
+    }
+    void set_value(expression_ptr value)
+    {
+        value_ = value;
+    }
+
+    expression_ptr get_size() const
+    {
+        return size_;
+    }
+    void set_size(expression_ptr size)
+    {
+        size_ = size;
+    }
+
+    expression_ptr get_color() const
+    {
+        return color_;
+    }
+    void set_color(expression_ptr color)
+    {
+        color_ = color;
+    }
+
+    raster_colorizer_ptr get_colorizer() const
+    {
+        return colorizer_;
+    }
+    void set_colorizer(raster_colorizer_ptr const& colorizer)
+    {
+        colorizer_ = colorizer;
+    }
+    void set_angle_mode(angle_mode_e angle_mode)
+    {
+        angle_mode_ = angle_mode;
+    }
+    angle_mode_e get_angle_mode() const
+    {
+        return angle_mode_;
+    }
+
+
+    text_path_ptr get_text_path(face_set_ptr const& faces,
+                                Feature const& feature) const;
+    UnicodeString eval_char(Feature const& feature) const;
+    double eval_angle(Feature const& feature) const;
+    unsigned eval_size(Feature const& feature) const;
+    color eval_color(Feature const& feature) const;
+
+
+private:
+    std::string face_name_;
+    expression_ptr char_;
+    expression_ptr angle_;
+    expression_ptr value_;
+    expression_ptr size_;
+    expression_ptr color_;
+    raster_colorizer_ptr colorizer_;
+    bool allow_overlap_;
+    bool avoid_edges_;
+    position displacement_;
+    color halo_fill_;
+    unsigned halo_radius_;
+    angle_mode_e angle_mode_;
+};
+
+}  // end mapnik namespace
+
+#endif
diff --git a/include/mapnik/gradient.hpp b/include/mapnik/gradient.hpp
new file mode 100644
index 0000000..a1d029e
--- /dev/null
+++ b/include/mapnik/gradient.hpp
@@ -0,0 +1,107 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#ifndef GRADIENT_HPP
+#define GRADIENT_HPP
+
+#include <agg_trans_affine.h>
+
+// mapnik
+#include <mapnik/color.hpp>
+#include <mapnik/enumeration.hpp>
+
+// stl
+#include <vector>
+ 
+namespace mapnik
+{
+
+typedef std::pair<double, mapnik::color> stop_pair;
+typedef std::vector<stop_pair > stop_array;
+        
+enum gradient_enum
+{
+    NO_GRADIENT,
+    LINEAR,
+    RADIAL,
+    gradient_enum_MAX
+};
+
+DEFINE_ENUM( gradient_e, gradient_enum );
+
+enum gradient_unit_enum
+{
+    USER_SPACE_ON_USE,
+    USER_SPACE_ON_USE_BOUNDING_BOX, // used to indicate % age values were specified. This are % of the svg image extent.
+    OBJECT_BOUNDING_BOX, //  (i.e., the abstract coordinate system where (0,0) is at the top/left of the object bounding box and (1,1) is at the bottom/right of the object bounding box)
+    gradient_unit_enum_MAX
+};
+
+DEFINE_ENUM( gradient_unit_e, gradient_unit_enum );
+
+class MAPNIK_DECL gradient
+{       
+    gradient_e gradient_type_;
+    stop_array stops_;
+    // control points for the gradient, x1/y1 is the start point, x2/y2 the stop point.
+    double x1_;
+    double y1_;
+    double x2_;
+    double y2_;
+    // for radial gradients r specifies the radius of the stop circle centered on x2/y2
+    double r_;
+
+    // units for the coordinates
+    gradient_unit_e units_;
+
+    // transform
+    agg::trans_affine transform_;
+public:
+    explicit gradient();
+    gradient(gradient const& other);
+    gradient& operator=(const gradient& rhs);
+
+    void set_gradient_type(gradient_e grad);
+    gradient_e get_gradient_type() const;
+
+    void set_transform(agg::trans_affine transform);
+    agg::trans_affine get_transform() const;
+
+    void set_units(gradient_unit_e units);
+    gradient_unit_e get_units() const;
+
+    void add_stop(double offset, color const& c);
+    bool has_stop() const;
+    
+    stop_array const& get_stop_array() const;
+
+    void set_control_points(double x1, double y1, double x2, double y2, double r=0);
+    void get_control_points(double &x1, double &y1, double &x2, double &y2, double &r) const;
+    void get_control_points(double &x1, double &y1, double &x2, double &y2) const;
+
+private:
+    void swap(const gradient& other) throw();
+};
+}
+
+#endif //GRADIENT_HPP
diff --git a/include/mapnik/graphics.hpp b/include/mapnik/graphics.hpp
index 2928917..421e292 100644
--- a/include/mapnik/graphics.hpp
+++ b/include/mapnik/graphics.hpp
@@ -24,11 +24,12 @@
 
 #ifndef GRAPHICS_HPP
 #define GRAPHICS_HPP
+
 // mapnik
 #include <mapnik/color.hpp>
 #include <mapnik/gamma.hpp>
 #include <mapnik/image_data.hpp>
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 #include <mapnik/image_view.hpp>
 #include <mapnik/global.hpp>
 
@@ -42,427 +43,481 @@
 #include <cairomm/surface.h>
 #endif
 
+// boost
+#include <boost/optional/optional.hpp>
+
 namespace mapnik
 {
 
-   struct Multiply
-   {
-      inline static void mergeRGB(unsigned const &r0, unsigned const &g0, unsigned const &b0,
-                                  unsigned &r1, unsigned &g1, unsigned &b1)
-      {
-         r1 = r1*r0/255;
-         g1 = g1*g0/255;
-         b1 = b1*b0/255;
-      }
-   };
-   struct Multiply2
-   {
-      inline static void mergeRGB(unsigned const &r0, unsigned const &g0, unsigned const &b0,
-                                  unsigned &r1, unsigned &g1, unsigned &b1)
-      {
-         r1 = r1*r0/128;
-         if (r1>255) r1=255;
-         g1 = g1*g0/128;
-         if (g1>255) g1=255;
-         b1 = b1*b0/128;
-         if (b1>255) b1=255;
-                }
-   };
-   struct Divide
-   {
-      inline static void mergeRGB(unsigned const &r0, unsigned const &g0, unsigned const &b0,
-                                  unsigned &r1, unsigned &g1, unsigned &b1)
-      {
-         r1 = r0*256/(r1+1);
-         g1 = g0*256/(g1+1);
-         b1 = b0*256/(b1+1);
-      }
-   };
-   struct Divide2
-   {
-      inline static void mergeRGB(unsigned const &r0, unsigned const &g0, unsigned const &b0,
-                                  unsigned &r1, unsigned &g1, unsigned &b1)
-      {
-         r1 = r0*128/(r1+1);
-         g1 = g0*128/(g1+1);
-         b1 = b0*128/(b1+1);
-      }
-   };
-   struct Screen
-        {
-                inline static void mergeRGB(unsigned const &r0, unsigned const &g0, unsigned const &b0,
-                                            unsigned &r1, unsigned &g1, unsigned &b1)
-                {
-                      r1 = 255 - (255-r0)*(255-r1)/255;
-                      g1 = 255 - (255-g0)*(255-g1)/255;
-                      b1 = 255 - (255-b0)*(255-b1)/255;
-                }
-        };
-        struct HardLight
-        {
-                inline static void mergeRGB(unsigned const &r0, unsigned const &g0, unsigned const &b0,
-                                            unsigned &r1, unsigned &g1, unsigned &b1)
-                {
-                      r1 = (r1>128)?255-(255-r0)*(255-2*(r1-128))/256:r0*r1*2/256;
-                      g1 = (g1>128)?255-(255-g0)*(255-2*(g1-128))/256:g0*g1*2/256;
-                      b1 = (b1>128)?255-(255-b0)*(255-2*(b1-128))/256:b0*b1*2/256;
-                }
-        };
-        struct MergeGrain
-        {
-                inline static void mergeRGB(unsigned const &r0, unsigned const &g0, unsigned const &b0,
-                                            unsigned &r1, unsigned &g1, unsigned &b1)
-                {
-                      r1 = (r1+r0>128)?r1+r0-128:0;
-                      if (r1>255) r1=255;
-                      g1 = (g1+g0>128)?g1+g0-128:0;
-                      if (g1>255) g1=255;
-                      b1 = (b1+b0>128)?b1+b0-128:0;
-                      if (b1>255) b1=255;
-                }
-        };
-        struct MergeGrain2
-        {
-                inline static void mergeRGB(unsigned const &r0, unsigned const &g0, unsigned const &b0,
-                                            unsigned &r1, unsigned &g1, unsigned &b1)
-                {
-                      r1 = (2*r1+r0>256)?2*r1+r0-256:0;
-                      if (r1>255) r1=255;
-                      g1 = (2*g1+g0>256)?2*g1+g0-256:0;
-                      if (g1>255) g1=255;
-                      b1 = (2*b1+b0>256)?2*b1+b0-256:0;
-                      if (b1>255) b1=255;
-                }
-        };
-
-    class MAPNIK_DECL Image32
+struct Multiply
+{
+    inline static void mergeRGB(unsigned const &r0, unsigned const &g0, unsigned const &b0,
+                                unsigned &r1, unsigned &g1, unsigned &b1)
+    {
+        r1 = r1*r0/255;
+        g1 = g1*g0/255;
+        b1 = b1*b0/255;
+    }
+};
+struct Multiply2
+{
+    inline static void mergeRGB(unsigned const &r0, unsigned const &g0, unsigned const &b0,
+                                unsigned &r1, unsigned &g1, unsigned &b1)
+    {
+        r1 = r1*r0/128;
+        if (r1>255) r1=255;
+        g1 = g1*g0/128;
+        if (g1>255) g1=255;
+        b1 = b1*b0/128;
+        if (b1>255) b1=255;
+    }
+};
+struct Divide
+{
+    inline static void mergeRGB(unsigned const &r0, unsigned const &g0, unsigned const &b0,
+                                unsigned &r1, unsigned &g1, unsigned &b1)
+    {
+        r1 = r0*256/(r1+1);
+        g1 = g0*256/(g1+1);
+        b1 = b0*256/(b1+1);
+    }
+};
+struct Divide2
+{
+    inline static void mergeRGB(unsigned const &r0, unsigned const &g0, unsigned const &b0,
+                                unsigned &r1, unsigned &g1, unsigned &b1)
+    {
+        r1 = r0*128/(r1+1);
+        g1 = g0*128/(g1+1);
+        b1 = b0*128/(b1+1);
+    }
+};
+struct Screen
+{
+    inline static void mergeRGB(unsigned const &r0, unsigned const &g0, unsigned const &b0,
+                                unsigned &r1, unsigned &g1, unsigned &b1)
+    {
+        r1 = 255 - (255-r0)*(255-r1)/255;
+        g1 = 255 - (255-g0)*(255-g1)/255;
+        b1 = 255 - (255-b0)*(255-b1)/255;
+    }
+};
+struct HardLight
+{
+    inline static void mergeRGB(unsigned const &r0, unsigned const &g0, unsigned const &b0,
+                                unsigned &r1, unsigned &g1, unsigned &b1)
+    {
+        r1 = (r1>128)?255-(255-r0)*(255-2*(r1-128))/256:r0*r1*2/256;
+        g1 = (g1>128)?255-(255-g0)*(255-2*(g1-128))/256:g0*g1*2/256;
+        b1 = (b1>128)?255-(255-b0)*(255-2*(b1-128))/256:b0*b1*2/256;
+    }
+};
+struct MergeGrain
+{
+    inline static void mergeRGB(unsigned const &r0, unsigned const &g0, unsigned const &b0,
+                                unsigned &r1, unsigned &g1, unsigned &b1)
+    {
+        r1 = (r1+r0>128)?r1+r0-128:0;
+        if (r1>255) r1=255;
+        g1 = (g1+g0>128)?g1+g0-128:0;
+        if (g1>255) g1=255;
+        b1 = (b1+b0>128)?b1+b0-128:0;
+        if (b1>255) b1=255;
+    }
+};
+struct MergeGrain2
+{
+    inline static void mergeRGB(unsigned const &r0, unsigned const &g0, unsigned const &b0,
+                                unsigned &r1, unsigned &g1, unsigned &b1)
     {
-    private:
-        unsigned width_;
-        unsigned height_;
-        color background_;
-        ImageData32 data_;
-    public:
-        Image32(int width,int height);
-        Image32(Image32 const& rhs);
+        r1 = (2*r1+r0>256)?2*r1+r0-256:0;
+        if (r1>255) r1=255;
+        g1 = (2*g1+g0>256)?2*g1+g0-256:0;
+        if (g1>255) g1=255;
+        b1 = (2*b1+b0>256)?2*b1+b0-256:0;
+        if (b1>255) b1=255;
+    }
+};
+
+class MAPNIK_DECL image_32
+{
+private:
+    unsigned width_;
+    unsigned height_;
+    boost::optional<color> background_;
+    image_data_32 data_;
+    bool painted_;
+public:
+    image_32(int width,int height);
+    image_32(image_32 const& rhs);
 #ifdef HAVE_CAIRO
-        Image32(Cairo::RefPtr<Cairo::ImageSurface> rhs);
+    image_32(Cairo::RefPtr<Cairo::ImageSurface> rhs);
 #endif
-        ~Image32();
-        void setBackground(color const& background);
-        const color& getBackground() const;
-        const ImageData32& data() const;
+    ~image_32();
 
-        inline ImageData32& data()
-        {
-            return data_;
-        }
+    void painted(bool painted)
+    {
+        painted_ = painted;
+    }
 
-        inline const unsigned char* raw_data() const
-        {
-            return data_.getBytes();
-        }
+    bool painted() const
+    {
+        return painted_;
+    }
 
-        inline unsigned char* raw_data()
-        {
-            return data_.getBytes();
-        }
+    boost::optional<color> const& get_background() const;
+    
+    void set_background(const color& c);
 
-        inline image_view<ImageData32> get_view(unsigned x,unsigned y, unsigned w,unsigned h)
-        {
-            return image_view<ImageData32>(x,y,w,h,data_);
-        }
+    void set_grayscale_to_alpha();
 
-    private:
+    void set_color_to_alpha(color const& c);
 
-        inline bool checkBounds(unsigned x, unsigned y) const
-        {
-            return (x < width_ && y < height_);
-        }
+    void set_alpha(float opacity);
+    
+    inline const image_data_32& data() const
+    {
+        return data_;
+    }
+    
+    inline image_data_32& data()
+    {
+        return data_;
+    }
 
-    public:
-        inline void setPixel(int x,int y,unsigned int rgba)
-        {
-            if (checkBounds(x,y))
-            {
-                data_(x,y)=rgba;
-            }
-        }
-        inline void blendPixel(int x,int y,unsigned int rgba1,int t)
+    inline const unsigned char* raw_data() const
+    {
+        return data_.getBytes();
+    }
+
+    inline unsigned char* raw_data()
+    {
+        return data_.getBytes();
+    }
+
+    inline image_view<image_data_32> get_view(unsigned x,unsigned y, unsigned w,unsigned h)
+    {
+        return image_view<image_data_32>(x,y,w,h,data_);
+    }
+
+private:
+
+    inline bool checkBounds(unsigned x, unsigned y) const
+    {
+        return (x < width_ && y < height_);
+    }
+
+public:
+    inline void setPixel(int x,int y,unsigned int rgba)
+    {
+        if (checkBounds(x,y))
         {
-            blendPixel2(x,y,rgba1,t,1.0);  // do not change opacity
+            data_(x,y)=rgba;
         }
+    }
+    inline void blendPixel(int x,int y,unsigned int rgba1,int t)
+    {
+        blendPixel2(x,y,rgba1,t,1.0);  // do not change opacity
+    }
 
-        inline void blendPixel2(int x,int y,unsigned int rgba1,int t,double opacity)
+    inline void blendPixel2(int x,int y,unsigned int rgba1,int t,double opacity)
+    {
+        if (checkBounds(x,y))
         {
-            if (checkBounds(x,y))
-            {
-                unsigned rgba0 = data_(x,y);
+            unsigned rgba0 = data_(x,y);
 #ifdef MAPNIK_BIG_ENDIAN
-                unsigned a1 = (int)((rgba1 & 0xff) * opacity) & 0xff; // adjust for desired opacity
-                a1 = (t*a1) / 255;
-                if (a1 == 0) return;
-                unsigned r1 = (rgba1 >> 24) & 0xff;
-                unsigned g1 = (rgba1 >> 16 ) & 0xff;
-                unsigned b1 = (rgba1 >> 8) & 0xff;
-
-                unsigned a0 = (rgba0 & 0xff);
-                unsigned r0 = ((rgba0 >> 24 ) & 0xff) * a0;
-                unsigned g0 = ((rgba0 >> 16 ) & 0xff) * a0;
-                unsigned b0 = ((rgba0 >> 8) & 0xff) * a0;
-
-                a0 = ((a1 + a0) << 8) - a0*a1;
-
-                r0 = ((((r1 << 8) - r0) * a1 + (r0 << 8)) / a0);
-                g0 = ((((g1 << 8) - g0) * a1 + (g0 << 8)) / a0);
-                b0 = ((((b1 << 8) - b0) * a1 + (b0 << 8)) / a0);
-                a0 = a0 >> 8;
-                data_(x,y)= (a0)| (b0 << 8) |  (g0 << 16) | (r0 << 24) ;
+            unsigned a1 = (int)((rgba1 & 0xff) * opacity) & 0xff; // adjust for desired opacity
+            a1 = (t*a1) / 255;
+            if (a1 == 0) return;
+            unsigned r1 = (rgba1 >> 24) & 0xff;
+            unsigned g1 = (rgba1 >> 16 ) & 0xff;
+            unsigned b1 = (rgba1 >> 8) & 0xff;
+
+            unsigned a0 = (rgba0 & 0xff);
+            unsigned r0 = ((rgba0 >> 24 ) & 0xff) * a0;
+            unsigned g0 = ((rgba0 >> 16 ) & 0xff) * a0;
+            unsigned b0 = ((rgba0 >> 8) & 0xff) * a0;
+
+            a0 = ((a1 + a0) << 8) - a0*a1;
+
+            r0 = ((((r1 << 8) - r0) * a1 + (r0 << 8)) / a0);
+            g0 = ((((g1 << 8) - g0) * a1 + (g0 << 8)) / a0);
+            b0 = ((((b1 << 8) - b0) * a1 + (b0 << 8)) / a0);
+            a0 = a0 >> 8;
+            data_(x,y)= (a0)| (b0 << 8) |  (g0 << 16) | (r0 << 24) ;
 #else
-                unsigned a1 = (int)(((rgba1 >> 24) & 0xff) * opacity) & 0xff; // adjust for desired opacity
-                a1 = (t*a1) / 255;
-                if (a1 == 0) return;
-                unsigned r1 = rgba1 & 0xff;
-                unsigned g1 = (rgba1 >> 8 ) & 0xff;
-                unsigned b1 = (rgba1 >> 16) & 0xff;
-
-                unsigned a0 = (rgba0 >> 24) & 0xff;
-                unsigned r0 = (rgba0 & 0xff) * a0;
-                unsigned g0 = ((rgba0 >> 8 ) & 0xff) * a0;
-                unsigned b0 = ((rgba0 >> 16) & 0xff) * a0;
-
-                a0 = ((a1 + a0) << 8) - a0*a1;
-
-                r0 = ((((r1 << 8) - r0) * a1 + (r0 << 8)) / a0);
-                g0 = ((((g1 << 8) - g0) * a1 + (g0 << 8)) / a0);
-                b0 = ((((b1 << 8) - b0) * a1 + (b0 << 8)) / a0);
-                a0 = a0 >> 8;
-                data_(x,y)= (a0 << 24)| (b0 << 16) |  (g0 << 8) | (r0) ;
+            unsigned a1 = (int)(((rgba1 >> 24) & 0xff) * opacity) & 0xff; // adjust for desired opacity
+            a1 = (t*a1) / 255;
+            if (a1 == 0) return;
+            unsigned r1 = rgba1 & 0xff;
+            unsigned g1 = (rgba1 >> 8 ) & 0xff;
+            unsigned b1 = (rgba1 >> 16) & 0xff;
+
+            unsigned a0 = (rgba0 >> 24) & 0xff;
+            unsigned r0 = (rgba0 & 0xff) * a0;
+            unsigned g0 = ((rgba0 >> 8 ) & 0xff) * a0;
+            unsigned b0 = ((rgba0 >> 16) & 0xff) * a0;
+
+            a0 = ((a1 + a0) << 8) - a0*a1;
+
+            r0 = ((((r1 << 8) - r0) * a1 + (r0 << 8)) / a0);
+            g0 = ((((g1 << 8) - g0) * a1 + (g0 << 8)) / a0);
+            b0 = ((((b1 << 8) - b0) * a1 + (b0 << 8)) / a0);
+            a0 = a0 >> 8;
+            data_(x,y)= (a0 << 24)| (b0 << 16) |  (g0 << 8) | (r0) ;
 #endif
-            }
         }
+    }
 
-        inline unsigned width() const
-        {
-            return width_;
-        }
+    inline unsigned width() const
+    {
+        return width_;
+    }
 
-        inline unsigned height() const
-        {
-            return height_;
-        }
+    inline unsigned height() const
+    {
+        return height_;
+    }
 
-        inline void set_rectangle(int x0,int y0,ImageData32 const& data)
-        {
-            Envelope<int> ext0(0,0,width_,height_);
-            Envelope<int> ext1(x0,y0,x0+data.width(),y0+data.height());
+    inline void set_rectangle(int x0,int y0,image_data_32 const& data)
+    {
+        box2d<int> ext0(0,0,width_,height_);
+        box2d<int> ext1(x0,y0,x0+data.width(),y0+data.height());
 
-            if (ext0.intersects(ext1))
+        if (ext0.intersects(ext1))
+        {
+            box2d<int> box = ext0.intersect(ext1);
+            for (int y = box.miny(); y < box.maxy(); ++y)
             {
-               Envelope<int> box = ext0.intersect(ext1);
-               for (int y = box.miny(); y < box.maxy(); ++y)
-               {
-                  unsigned int* row_to =  data_.getRow(y);
-                  unsigned int const * row_from = data.getRow(y-y0);
-
-                  for (int x = box.minx(); x < box.maxx(); ++x)
-                  {
+                unsigned int* row_to =  data_.getRow(y);
+                unsigned int const * row_from = data.getRow(y-y0);
+
+                for (int x = box.minx(); x < box.maxx(); ++x)
+                {
 #ifdef MAPNIK_BIG_ENDIAN
-                     row_to[x] = row_from[x-x0];
+                    row_to[x] = row_from[x-x0];
 #else
-                     if (row_from[x-x0] & 0xff000000)
-                     {
+                    if (row_from[x-x0] & 0xff000000)
+                    {
                         row_to[x] = row_from[x-x0];
-                     }
+                    }
 #endif
-                  }
-               }
+                }
             }
         }
+    }
 
-        inline void set_rectangle_alpha(int x0,int y0,const ImageData32& data)
-        {
-            Envelope<int> ext0(0,0,width_,height_);
-            Envelope<int> ext1(x0,y0,x0 + data.width(),y0 + data.height());
+    inline void set_rectangle_alpha(int x0,int y0,const image_data_32& data)
+    {
+        box2d<int> ext0(0,0,width_,height_);
+        box2d<int> ext1(x0,y0,x0 + data.width(),y0 + data.height());
 
-            if (ext0.intersects(ext1))
+        if (ext0.intersects(ext1))
+        {
+            box2d<int> box = ext0.intersect(ext1);
+            for (int y = box.miny(); y < box.maxy(); ++y)
             {
-                Envelope<int> box = ext0.intersect(ext1);
-                for (int y = box.miny(); y < box.maxy(); ++y)
+                unsigned int* row_to =  data_.getRow(y);
+                unsigned int const * row_from = data.getRow(y-y0);
+                for (int x = box.minx(); x < box.maxx(); ++x)
                 {
-                   unsigned int* row_to =  data_.getRow(y);
-                   unsigned int const * row_from = data.getRow(y-y0);
-                   for (int x = box.minx(); x < box.maxx(); ++x)
-                   {
-                      unsigned rgba0 = row_to[x];
-                      unsigned rgba1 = row_from[x-x0];
+                    unsigned rgba0 = row_to[x];
+                    unsigned rgba1 = row_from[x-x0];
 
 #ifdef MAPNIK_BIG_ENDIAN
-                      unsigned a1 = rgba1 & 0xff;
-                      if (a1 == 0) continue;
-                      unsigned r1 = (rgba1 >> 24) & 0xff;
-                      unsigned g1 = (rgba1 >> 16 ) & 0xff;
-                      unsigned b1 = (rgba1 >> 8) & 0xff;
-
-                      unsigned a0 = rgba0 & 0xff;
-                      unsigned r0 = ((rgba0 >> 24) & 0xff) * a0;
-                      unsigned g0 = ((rgba0 >> 16 ) & 0xff) * a0;
-                      unsigned b0 = ((rgba0 >> 8) & 0xff) * a0;
-
-                      a0 = ((a1 + a0) << 8) - a0*a1;
-
-                      r0 = ((((r1 << 8) - r0) * a1 + (r0 << 8)) / a0);
-                      g0 = ((((g1 << 8) - g0) * a1 + (g0 << 8)) / a0);
-                      b0 = ((((b1 << 8) - b0) * a1 + (b0 << 8)) / a0);
-                      a0 = a0 >> 8;
-                      row_to[x] = (a0) | (b0 << 8) |  (g0 << 16) | (r0 << 24) ;
+                    unsigned a1 = rgba1 & 0xff;
+                    if (a1 == 0) continue;
+                    if (a1 == 0xff)
+                    {
+                        row_to[x] = rgba1;
+                        continue;
+                    }
+                    unsigned r1 = (rgba1 >> 24) & 0xff;
+                    unsigned g1 = (rgba1 >> 16 ) & 0xff;
+                    unsigned b1 = (rgba1 >> 8) & 0xff;
+
+                    unsigned a0 = rgba0 & 0xff;
+                    unsigned r0 = ((rgba0 >> 24) & 0xff) * a0;
+                    unsigned g0 = ((rgba0 >> 16 ) & 0xff) * a0;
+                    unsigned b0 = ((rgba0 >> 8) & 0xff) * a0;
+
+                    a0 = ((a1 + a0) << 8) - a0*a1;
+
+                    r0 = ((((r1 << 8) - r0) * a1 + (r0 << 8)) / a0);
+                    g0 = ((((g1 << 8) - g0) * a1 + (g0 << 8)) / a0);
+                    b0 = ((((b1 << 8) - b0) * a1 + (b0 << 8)) / a0);
+                    a0 = a0 >> 8;
+                    row_to[x] = (a0) | (b0 << 8) |  (g0 << 16) | (r0 << 24) ;
 #else
-                      unsigned a1 = (rgba1 >> 24) & 0xff;
-                      if (a1 == 0) continue;
-                      unsigned r1 = rgba1 & 0xff;
-                      unsigned g1 = (rgba1 >> 8 ) & 0xff;
-                      unsigned b1 = (rgba1 >> 16) & 0xff;
-
-                      unsigned a0 = (rgba0 >> 24) & 0xff;
-                      unsigned r0 = (rgba0 & 0xff) * a0;
-                      unsigned g0 = ((rgba0 >> 8 ) & 0xff) * a0;
-                      unsigned b0 = ((rgba0 >> 16) & 0xff) * a0;
-
-                      a0 = ((a1 + a0) << 8) - a0*a1;
-
-                      r0 = ((((r1 << 8) - r0) * a1 + (r0 << 8)) / a0);
-                      g0 = ((((g1 << 8) - g0) * a1 + (g0 << 8)) / a0);
-                      b0 = ((((b1 << 8) - b0) * a1 + (b0 << 8)) / a0);
-                      a0 = a0 >> 8;
-                      row_to[x] = (a0 << 24)| (b0 << 16) |  (g0 << 8) | (r0) ;
+                    unsigned a1 = (rgba1 >> 24) & 0xff;
+                    if (a1 == 0) continue;
+                    if (a1 == 0xff)
+                    {
+                        row_to[x] = rgba1;
+                        continue;
+                    }
+                    unsigned r1 = rgba1 & 0xff;
+                    unsigned g1 = (rgba1 >> 8 ) & 0xff;
+                    unsigned b1 = (rgba1 >> 16) & 0xff;
+
+                    unsigned a0 = (rgba0 >> 24) & 0xff;
+                    unsigned r0 = (rgba0 & 0xff) * a0;
+                    unsigned g0 = ((rgba0 >> 8 ) & 0xff) * a0;
+                    unsigned b0 = ((rgba0 >> 16) & 0xff) * a0;
+
+                    a0 = ((a1 + a0) << 8) - a0*a1;
+
+                    r0 = ((((r1 << 8) - r0) * a1 + (r0 << 8)) / a0);
+                    g0 = ((((g1 << 8) - g0) * a1 + (g0 << 8)) / a0);
+                    b0 = ((((b1 << 8) - b0) * a1 + (b0 << 8)) / a0);
+                    a0 = a0 >> 8;
+                    row_to[x] = (a0 << 24)| (b0 << 16) |  (g0 << 8) | (r0) ;
 #endif
-                   }
                 }
             }
         }
+    }
 
-        inline void set_rectangle_alpha2(ImageData32 const& data, unsigned x0, unsigned y0, float opacity)
-        {
-            Envelope<int> ext0(0,0,width_,height_);
-            Envelope<int> ext1(x0,y0,x0 + data.width(),y0 + data.height());
+    inline void set_rectangle_alpha2(image_data_32 const& data, unsigned x0, unsigned y0, float opacity)
+    {
+        box2d<int> ext0(0,0,width_,height_);
+        box2d<int> ext1(x0,y0,x0 + data.width(),y0 + data.height());
 
-            if (ext0.intersects(ext1))
+        if (ext0.intersects(ext1))
+        {
+            box2d<int> box = ext0.intersect(ext1);
+            for (int y = box.miny(); y < box.maxy(); ++y)
             {
-                Envelope<int> box = ext0.intersect(ext1);
-                for (int y = box.miny(); y < box.maxy(); ++y)
+                unsigned int* row_to =  data_.getRow(y);
+                unsigned int const * row_from = data.getRow(y-y0);
+                for (int x = box.minx(); x < box.maxx(); ++x)
                 {
-                   unsigned int* row_to =  data_.getRow(y);
-                   unsigned int const * row_from = data.getRow(y-y0);
-                   for (int x = box.minx(); x < box.maxx(); ++x)
-                   {
-                      unsigned rgba0 = row_to[x];
-                      unsigned rgba1 = row_from[x-x0];
+                    unsigned rgba0 = row_to[x];
+                    unsigned rgba1 = row_from[x-x0];
 #ifdef MAPNIK_BIG_ENDIAN
-                      unsigned a1 = int( (rgba1 & 0xff) * opacity );
-                      if (a1 == 0) continue;
-                      unsigned r1 = (rgba1 >> 24) & 0xff;
-                      unsigned g1 = (rgba1 >> 16 ) & 0xff;
-                      unsigned b1 = (rgba1 >> 8) & 0xff;
-
-                      unsigned a0 = rgba0 & 0xff;
-                      unsigned r0 = (rgba0 >> 24) & 0xff ;
-                      unsigned g0 = (rgba0 >> 16 ) & 0xff;
-                      unsigned b0 = (rgba0 >> 8) & 0xff;
-
-                      r0 = byte(((r1 - r0) * a1 + (r0 << 8)) >> 8);
-                      g0 = byte(((g1 - g0) * a1 + (g0 << 8)) >> 8);
-                      b0 = byte(((b1 - b0) * a1 + (b0 << 8)) >> 8);
-                      a0 = byte((a1 + a0) - ((a1 * a0 + 255) >> 8));
-
-                      row_to[x] = (a0)| (b0 << 8) |  (g0 << 16) | (r0 << 24) ;
+                    unsigned a1 = int( (rgba1 & 0xff) * opacity );
+                    if (a1 == 0) continue;
+                    if (a1 == 0xff)
+                    {
+                        row_to[x] = rgba1;
+                        continue;
+                    }
+                    unsigned r1 = (rgba1 >> 24) & 0xff;
+                    unsigned g1 = (rgba1 >> 16 ) & 0xff;
+                    unsigned b1 = (rgba1 >> 8) & 0xff;
+
+                    unsigned a0 = rgba0 & 0xff;
+                    unsigned r0 = (rgba0 >> 24) & 0xff ;
+                    unsigned g0 = (rgba0 >> 16 ) & 0xff;
+                    unsigned b0 = (rgba0 >> 8) & 0xff;
+
+                    unsigned atmp = a1 + a0 - ((a1 * a0 + 255) >> 8);
+                    if (atmp)
+                    {
+                        r0 = byte((r1 * a1 + (r0 * a0) - ((r0 * a0 * a1 + 255) >> 8)) / atmp);
+                        g0 = byte((g1 * a1 + (g0 * a0) - ((g0 * a0 * a1 + 255) >> 8)) / atmp);
+                        b0 = byte((b1 * a1 + (b0 * a0) - ((b0 * a0 * a1 + 255) >> 8)) / atmp);
+                    }
+                    a0 = byte(atmp);
+
+                    row_to[x] = (a0)| (b0 << 8) |  (g0 << 16) | (r0 << 24) ;
 #else
-                      unsigned a1 = int( ((rgba1 >> 24) & 0xff) * opacity );
-                      if (a1 == 0) continue;
-                      unsigned r1 = rgba1 & 0xff;
-                      unsigned g1 = (rgba1 >> 8 ) & 0xff;
-                      unsigned b1 = (rgba1 >> 16) & 0xff;
-
-                      unsigned a0 = (rgba0 >> 24) & 0xff;
-                      unsigned r0 = rgba0 & 0xff ;
-                      unsigned g0 = (rgba0 >> 8 ) & 0xff;
-                      unsigned b0 = (rgba0 >> 16) & 0xff;
-
-                      r0 = byte(((r1 - r0) * a1 + (r0 << 8)) >> 8);
-                      g0 = byte(((g1 - g0) * a1 + (g0 << 8)) >> 8);
-                      b0 = byte(((b1 - b0) * a1 + (b0 << 8)) >> 8);
-                      a0 = byte((a1 + a0) - ((a1 * a0 + 255) >> 8));
-                      
-                      row_to[x] = (a0 << 24)| (b0 << 16) |  (g0 << 8) | (r0) ;
-#endif
+                    unsigned a1 = int( ((rgba1 >> 24) & 0xff) * opacity );
+                    if (a1 == 0) continue;
+                    if (a1 == 0xff)
+                    {
+                        row_to[x] = rgba1;
+                        continue;
+                    }
+                    unsigned r1 = rgba1 & 0xff;
+                    unsigned g1 = (rgba1 >> 8 ) & 0xff;
+                    unsigned b1 = (rgba1 >> 16) & 0xff;
+
+                    unsigned a0 = (rgba0 >> 24) & 0xff;
+                    unsigned r0 = rgba0 & 0xff ;
+                    unsigned g0 = (rgba0 >> 8 ) & 0xff;
+                    unsigned b0 = (rgba0 >> 16) & 0xff;
+                    
+                    unsigned atmp = a1 + a0 - ((a1 * a0 + 255) >> 8);
+                    if (atmp)
+                    {
+                        r0 = byte((r1 * a1 + (r0 * a0) - ((r0 * a0 * a1 + 255) >> 8)) / atmp);
+                        g0 = byte((g1 * a1 + (g0 * a0) - ((g0 * a0 * a1 + 255) >> 8)) / atmp);
+                        b0 = byte((b1 * a1 + (b0 * a0) - ((b0 * a0 * a1 + 255) >> 8)) / atmp);
                     }
+                    a0 = byte(atmp);
+                    
+                    row_to[x] = (a0 << 24)| (b0 << 16) |  (g0 << 8) | (r0) ;
+#endif
                 }
             }
         }
+    }
 
-        template <typename MergeMethod>
-        inline void merge_rectangle(ImageData32 const& data, unsigned x0, unsigned y0, float opacity)
-        {
-            Envelope<int> ext0(0,0,width_,height_);
-            Envelope<int> ext1(x0,y0,x0 + data.width(),y0 + data.height());
+    template <typename MergeMethod>
+        inline void merge_rectangle(image_data_32 const& data, unsigned x0, unsigned y0, float opacity)
+    {
+        box2d<int> ext0(0,0,width_,height_);
+        box2d<int> ext1(x0,y0,x0 + data.width(),y0 + data.height());
 
-            if (ext0.intersects(ext1))
+        if (ext0.intersects(ext1))
+        {
+            box2d<int> box = ext0.intersect(ext1);
+            for (int y = box.miny(); y < box.maxy(); ++y)
             {
-                Envelope<int> box = ext0.intersect(ext1);
-                for (int y = box.miny(); y < box.maxy(); ++y)
+                unsigned int* row_to =  data_.getRow(y);
+                unsigned int const * row_from = data.getRow(y-y0);
+                for (int x = box.minx(); x < box.maxx(); ++x)
                 {
-                   unsigned int* row_to =  data_.getRow(y);
-                   unsigned int const * row_from = data.getRow(y-y0);
-                   for (int x = box.minx(); x < box.maxx(); ++x)
-                   {
-                      unsigned rgba0 = row_to[x];
-                      unsigned rgba1 = row_from[x-x0];
+                    unsigned rgba0 = row_to[x];
+                    unsigned rgba1 = row_from[x-x0];
 #ifdef MAPNIK_BIG_ENDIAN
-                      unsigned a1 = int( (rgba1 & 0xff) * opacity );
-                      if (a1 == 0) continue;
-                      unsigned r1 = (rgba1 >> 24)& 0xff;
-                      unsigned g1 = (rgba1 >> 16 ) & 0xff;
-                      unsigned b1 = (rgba1 >> 8) & 0xff;
+                    unsigned a1 = int( (rgba1 & 0xff) * opacity );
+                    if (a1 == 0) continue;
+                    unsigned r1 = (rgba1 >> 24)& 0xff;
+                    unsigned g1 = (rgba1 >> 16 ) & 0xff;
+                    unsigned b1 = (rgba1 >> 8) & 0xff;
 
-                      unsigned a0 = rgba0 & 0xff;
-                      unsigned r0 = (rgba0 >> 24) & 0xff ;
-                      unsigned g0 = (rgba0 >> 16 ) & 0xff;
-                      unsigned b0 = (rgba0 >> 8) & 0xff;
+                    unsigned a0 = rgba0 & 0xff;
+                    unsigned r0 = (rgba0 >> 24) & 0xff ;
+                    unsigned g0 = (rgba0 >> 16 ) & 0xff;
+                    unsigned b0 = (rgba0 >> 8) & 0xff;
 
-                      unsigned a = (a1 * 255 + (255 - a1) * a0 + 127)/255;
+                    unsigned a = (a1 * 255 + (255 - a1) * a0 + 127)/255;
 
-                      MergeMethod::mergeRGB(r0,g0,b0,r1,g1,b1);
+                    MergeMethod::mergeRGB(r0,g0,b0,r1,g1,b1);
 
-                      r0 = (r1*a1 + (((255 - a1) * a0 + 127)/255) * r0 + 127)/a;
-                      g0 = (g1*a1 + (((255 - a1) * a0 + 127)/255) * g0 + 127)/a;
-                      b0 = (b1*a1 + (((255 - a1) * a0 + 127)/255) * b0 + 127)/a;
+                    r0 = (r1*a1 + (((255 - a1) * a0 + 127)/255) * r0 + 127)/a;
+                    g0 = (g1*a1 + (((255 - a1) * a0 + 127)/255) * g0 + 127)/a;
+                    b0 = (b1*a1 + (((255 - a1) * a0 + 127)/255) * b0 + 127)/a;
 
-                      row_to[x] = (a)| (b0 << 8) |  (g0 << 16) | (r0 << 24) ;
+                    row_to[x] = (a)| (b0 << 8) |  (g0 << 16) | (r0 << 24) ;
 #else
-                      unsigned a1 = int( ((rgba1 >> 24) & 0xff) * opacity );
-                      if (a1 == 0) continue;
-                      unsigned r1 = rgba1 & 0xff;
-                      unsigned g1 = (rgba1 >> 8 ) & 0xff;
-                      unsigned b1 = (rgba1 >> 16) & 0xff;
+                    unsigned a1 = int( ((rgba1 >> 24) & 0xff) * opacity );
+                    if (a1 == 0) continue;
+                    unsigned r1 = rgba1 & 0xff;
+                    unsigned g1 = (rgba1 >> 8 ) & 0xff;
+                    unsigned b1 = (rgba1 >> 16) & 0xff;
 
-                      unsigned a0 = (rgba0 >> 24) & 0xff;
-                      unsigned r0 = rgba0 & 0xff ;
-                      unsigned g0 = (rgba0 >> 8 ) & 0xff;
-                      unsigned b0 = (rgba0 >> 16) & 0xff;
+                    unsigned a0 = (rgba0 >> 24) & 0xff;
+                    unsigned r0 = rgba0 & 0xff ;
+                    unsigned g0 = (rgba0 >> 8 ) & 0xff;
+                    unsigned b0 = (rgba0 >> 16) & 0xff;
 
-                      unsigned a = (a1 * 255 + (255 - a1) * a0 + 127)/255;
+                    unsigned a = (a1 * 255 + (255 - a1) * a0 + 127)/255;
 
-                      MergeMethod::mergeRGB(r0,g0,b0,r1,g1,b1);
+                    MergeMethod::mergeRGB(r0,g0,b0,r1,g1,b1);
 
-                      r0 = (r1*a1 + (((255 - a1) * a0 + 127)/255) * r0 + 127)/a;
-                      g0 = (g1*a1 + (((255 - a1) * a0 + 127)/255) * g0 + 127)/a;
-                      b0 = (b1*a1 + (((255 - a1) * a0 + 127)/255) * b0 + 127)/a;
+                    r0 = (r1*a1 + (((255 - a1) * a0 + 127)/255) * r0 + 127)/a;
+                    g0 = (g1*a1 + (((255 - a1) * a0 + 127)/255) * g0 + 127)/a;
+                    b0 = (b1*a1 + (((255 - a1) * a0 + 127)/255) * b0 + 127)/a;
 
-                      row_to[x] = (a << 24)| (b0 << 16) |  (g0 << 8) | (r0) ;
+                    row_to[x] = (a << 24)| (b0 << 16) |  (g0 << 8) | (r0) ;
 #endif
-                    }
                 }
             }
         }
-    };
+    }
+};
 }
 #endif //GRAPHICS_HPP
diff --git a/include/mapnik/grid/grid.hpp b/include/mapnik/grid/grid.hpp
new file mode 100644
index 0000000..bf644bb
--- /dev/null
+++ b/include/mapnik/grid/grid.hpp
@@ -0,0 +1,337 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_GRID_HPP
+#define MAPNIK_GRID_HPP
+
+// mapnik
+#include <mapnik/image_data.hpp>
+#include <mapnik/box2d.hpp>
+#include <mapnik/grid/grid_view.hpp>
+#include <mapnik/global.hpp>
+#include <mapnik/value.hpp>
+#include <mapnik/feature.hpp>
+
+// stl
+#include <map>
+#include <set>
+#include <cmath>
+#include <string>
+#include <cassert>
+#include <vector>
+
+namespace mapnik
+{
+
+template <typename T>
+class MAPNIK_DECL hit_grid
+{
+public:
+    typedef T value_type;
+    typedef mapnik::ImageData<value_type> data_type;
+    typedef std::string lookup_type;
+    // mapping between pixel id and key
+    typedef std::map<value_type, lookup_type> feature_key_type;
+    typedef std::map<lookup_type, value_type> key_type;
+    typedef std::map<std::string, mapnik::value> feature_properties_type;
+    // note: feature_type is not the same as a mapnik::Feature as it lacks a geometry
+    typedef std::map<std::string, feature_properties_type > feature_type;
+    
+private:
+    unsigned width_;
+    unsigned height_;
+    std::string key_;
+    feature_key_type f_keys_;
+    feature_type features_;
+    data_type data_;
+    std::set<std::string> names_;
+    unsigned int resolution_;
+    bool painted_;
+    
+public:
+
+    std::string id_name_;
+
+    hit_grid(int width, int height, std::string const& key, unsigned int resolution)
+        :width_(width),
+         height_(height),
+         key_(key),
+         data_(width,height),
+         resolution_(resolution),
+         id_name_("__id__") {
+             // this only works if each datasource's 
+             // feature count starts at 1
+             f_keys_[0] = "";
+         }
+    
+    hit_grid(const hit_grid<T>& rhs)
+        :width_(rhs.width_),
+         height_(rhs.height_),
+         key_(rhs.key_),
+         data_(rhs.data_),
+         resolution_(rhs.resolution_),
+         id_name_("__id__")  {
+             f_keys_[0] = "";     
+         }
+    
+    ~hit_grid() {}
+
+    void painted(bool painted)
+    {
+        painted_ = painted;
+    }
+
+    bool painted() const
+    {
+        return painted_;
+    }
+
+    void add_feature(mapnik::Feature const& feature)
+    {
+
+        // copies feature props
+        std::map<std::string,value> fprops = feature.props();
+        lookup_type lookup_value;
+        if (key_ == id_name_)
+        {
+            // TODO - this will break if lookup_type is not a string
+            std::stringstream s;
+            s << feature.id();
+            lookup_value = s.str();
+            // add this as a proper feature so filtering works later on
+            fprops[id_name_] = feature.id();
+            //fprops[id_name_] = tr_->transcode(lookup_value));
+        }
+        else
+        {
+            std::map<std::string,value>::const_iterator const& itr = fprops.find(key_);
+            if (itr != fprops.end())
+            {
+                lookup_value = itr->second.to_string();
+            }
+            else
+            {
+                std::clog << "should not get here: key '" << key_ << "' not found in feature properties\n";
+            }    
+        }
+
+        // what good is an empty lookup key?
+        if (!lookup_value.empty())
+        {
+            // TODO - consider shortcutting f_keys if feature_id == lookup_value
+            // create a mapping between the pixel id and the feature key
+            f_keys_.insert(std::make_pair(feature.id(),lookup_value));
+            // if extra fields have been supplied, push them into grid memory
+            if (!names_.empty()) {
+                // TODO - add ability to push WKT/WKB of geometry into grid storage
+                features_.insert(std::make_pair(lookup_value,fprops));
+            }
+        }
+        else
+        {
+            std::clog << "### Warning: key '" << key_ << "' was blank for " << feature << "\n";
+        }
+    } 
+    
+    void add_property_name(std::string const& name)
+    {
+        names_.insert(name);
+    } 
+
+    std::set<std::string> property_names() const
+    {
+        return names_;
+    }
+
+    inline const feature_type& get_grid_features() const
+    {
+        return features_;
+    }
+
+    inline feature_type& get_grid_features()
+    {
+        return features_;
+    }
+
+    inline const feature_key_type& get_feature_keys() const
+    {
+        return f_keys_;
+    }
+
+    inline feature_key_type& get_feature_keys()
+    {
+        return f_keys_;
+    }
+
+    inline const std::string& get_key() const
+    {
+        return key_;
+    }
+
+    inline void set_key(std::string const& key)
+    {
+        key_ = key;
+    }
+
+    // compatibility
+    inline const std::string& get_join_field() const
+    {
+        return key_;
+    }
+
+    // compatibility
+    inline unsigned int get_step() const
+    {
+        return resolution_;
+    }
+
+    inline unsigned int get_resolution() const
+    {
+        return resolution_;
+    }
+
+    inline void set_resolution(unsigned int res)
+    {
+        resolution_ = res;
+    }
+        
+    inline const data_type& data() const
+    {
+        return data_;
+    }
+    
+    inline data_type& data()
+    {
+        return data_;
+    }
+
+    inline const T* raw_data() const
+    {
+        return data_.getData();
+    }
+
+    inline T* raw_data()
+    {
+        return data_.getData();
+    }
+
+    inline const value_type* getRow(unsigned row) const
+    {
+        return data_.getRow(row);
+    }
+    
+    inline mapnik::grid_view get_view(unsigned x, unsigned y, unsigned w, unsigned h)
+    {
+        return mapnik::grid_view(x,y,w,h,
+            data_,key_,resolution_,names_,f_keys_,features_);
+    }
+    
+
+private:
+
+    inline bool checkBounds(unsigned x, unsigned y) const
+    {
+        return (x < width_ && y < height_);
+    }
+
+    hit_grid& operator=(const hit_grid&);
+    
+public:
+    inline void setPixel(int x,int y,value_type feature_id)
+    {
+        if (checkBounds(x,y))
+        {
+            data_(x,y) = feature_id;
+        }
+    }
+    inline unsigned width() const
+    {
+        return width_;
+    }
+
+    inline unsigned height() const
+    {
+        return height_;
+    }
+
+    inline void blendPixel(value_type feature_id,int x,int y,unsigned int rgba1,int t)
+    {
+        blendPixel2(x,y,rgba1,t,1.0);  // do not change opacity
+    }
+
+    inline void blendPixel2(value_type feature_id,int x,int y,unsigned int rgba1,int t,double opacity)
+    {
+        if (checkBounds(x,y))
+        {
+
+#ifdef MAPNIK_BIG_ENDIAN
+            unsigned a1 = (int)((rgba1 & 0xff) * opacity) & 0xff; // adjust for desired opacity
+#else
+            unsigned a = (int)(((rgba1 >> 24) & 0xff) * opacity) & 0xff; // adjust for desired opacity
+#endif                    
+            // if the pixel is more than a tenth
+            // opaque then burn in the feature id
+            if (a >= 25)
+            {
+                data_(x,y) = feature_id;
+            }
+        }
+    }
+    
+    inline void set_rectangle(value_type id,image_data_32 const& data,int x0,int y0)
+    {
+        box2d<int> ext0(0,0,width_,height_);
+        box2d<int> ext1(x0,y0,x0+data.width(),y0+data.height());
+
+        if (ext0.intersects(ext1))
+        {
+            box2d<int> box = ext0.intersect(ext1);
+            for (int y = box.miny(); y < box.maxy(); ++y)
+            {
+                value_type* row_to =  data_.getRow(y);
+                unsigned int const * row_from = data.getRow(y-y0);
+
+                for (int x = box.minx(); x < box.maxx(); ++x)
+                {
+                    unsigned rgba = row_from[x-x0];
+#ifdef MAPNIK_BIG_ENDIAN
+                    unsigned a = rgba & 0xff;
+#else
+                    unsigned a = (rgba >> 24) & 0xff;
+#endif                    
+                    // if the pixel is more than a tenth
+                    // opaque then burn in the feature id
+                    if (a >= 25)
+                    {
+                        row_to[x] = id;
+                    }
+                }
+            }
+        }
+    }
+
+};
+
+typedef hit_grid<uint16_t> grid;
+
+}
+#endif //MAPNIK_GRID_HPP
diff --git a/include/mapnik/grid/grid_pixel.hpp b/include/mapnik/grid/grid_pixel.hpp
new file mode 100644
index 0000000..a0bbfc5
--- /dev/null
+++ b/include/mapnik/grid/grid_pixel.hpp
@@ -0,0 +1,170 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_GRID_PIXEL_HPP
+#define MAPNIK_GRID_PIXEL_HPP
+
+#include "agg_basics.h"
+
+namespace mapnik
+{
+
+    //==================================================================gray16
+    struct gray16
+    {
+        typedef agg::int16u value_type;
+        typedef agg::int32u calc_type;
+        typedef agg::int64  long_type;
+        enum base_scale_e
+        {
+            base_shift = 16,
+            base_scale = 1 << base_shift,
+            base_mask  = base_scale - 1
+        };
+        typedef gray16 self_type;
+
+        value_type v;
+        value_type a;
+
+        //--------------------------------------------------------------------
+        gray16() {}
+
+        //--------------------------------------------------------------------
+        gray16(unsigned v_, unsigned a_=base_mask) :
+            v(agg::int16u(v_)), a(agg::int16u(a_)) {}
+
+        //--------------------------------------------------------------------
+        gray16(const self_type& c, unsigned a_) :
+            v(c.v), a(value_type(a_)) {}
+
+        //--------------------------------------------------------------------
+        void clear()
+        {
+            v = a = 0;
+        }
+
+        //--------------------------------------------------------------------
+        const self_type& transparent()
+        {
+            a = 0;
+            return *this;
+        }
+
+        //--------------------------------------------------------------------
+        void opacity(double a_)
+        {
+            if(a_ < 0.0) a_ = 0.0;
+            if(a_ > 1.0) a_ = 1.0;
+            a = (value_type)agg::uround(a_ * double(base_mask));
+        }
+
+        //--------------------------------------------------------------------
+        double opacity() const
+        {
+            return double(a) / double(base_mask);
+        }
+
+
+        //--------------------------------------------------------------------
+        const self_type& premultiply()
+        {
+            if(a == base_mask) return *this;
+            if(a == 0)
+            {
+                v = 0;
+                return *this;
+            }
+            v = value_type((calc_type(v) * a) >> base_shift);
+            return *this;
+        }
+
+        //--------------------------------------------------------------------
+        const self_type& premultiply(unsigned a_)
+        {
+            if(a == base_mask && a_ >= base_mask) return *this;
+            if(a == 0 || a_ == 0)
+            {
+                v = a = 0;
+                return *this;
+            }
+            calc_type v_ = (calc_type(v) * a_) / a;
+            v = value_type((v_ > a_) ? a_ : v_);
+            a = value_type(a_);
+            return *this;
+        }
+
+        //--------------------------------------------------------------------
+        const self_type& demultiply()
+        {
+            if(a == base_mask) return *this;
+            if(a == 0)
+            {
+                v = 0;
+                return *this;
+            }
+            calc_type v_ = (calc_type(v) * base_mask) / a;
+            v = value_type((v_ > base_mask) ? base_mask : v_);
+            return *this;
+        }
+
+        //--------------------------------------------------------------------
+        self_type gradient(self_type c, double k) const
+        {
+            self_type ret;
+            calc_type ik = agg::uround(k * base_scale);
+            ret.v = value_type(calc_type(v) + (((calc_type(c.v) - v) * ik) >> base_shift));
+            ret.a = value_type(calc_type(a) + (((calc_type(c.a) - a) * ik) >> base_shift));
+            return ret;
+        }
+
+        //--------------------------------------------------------------------
+        AGG_INLINE void add(const self_type& c, unsigned cover)
+        {
+            calc_type cv, ca;
+            if(cover == agg::cover_mask)
+            {
+                if(c.a == base_mask) 
+                {
+                    *this = c;
+                }
+                else
+                {
+                    cv = v + c.v; v = (cv > calc_type(base_mask)) ? calc_type(base_mask) : cv;
+                    ca = a + c.a; a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca;
+                }
+            }
+            else
+            {
+                cv = v + ((c.v * cover + agg::cover_mask/2) >> agg::cover_shift);
+                ca = a + ((c.a * cover + agg::cover_mask/2) >> agg::cover_shift);
+                v = (cv > calc_type(base_mask)) ? calc_type(base_mask) : cv;
+                a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca;
+            }
+        }
+
+        //--------------------------------------------------------------------
+        static self_type no_color() { return self_type(0,0); }
+    };
+
+}
+
+#endif
diff --git a/include/mapnik/grid/grid_pixfmt.hpp b/include/mapnik/grid/grid_pixfmt.hpp
new file mode 100644
index 0000000..0f39789
--- /dev/null
+++ b/include/mapnik/grid/grid_pixfmt.hpp
@@ -0,0 +1,640 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_GRID_PIXFMT_HPP
+#define MAPNIK_GRID_PIXFMT_HPP
+
+#include <string.h>
+#include "agg_basics.h"
+#include <mapnik/grid/grid_pixel.hpp>
+#include <mapnik/grid/grid_rendering_buffer.hpp>
+
+namespace mapnik
+{
+ 
+    //============================================================blender_gray
+    template<class ColorT> struct blender_gray
+    {
+        typedef ColorT color_type;
+        typedef typename color_type::value_type value_type;
+        typedef typename color_type::calc_type calc_type;
+        enum base_scale_e { base_shift = color_type::base_shift };
+
+        static AGG_INLINE void blend_pix(value_type* p, unsigned cv, 
+                                         unsigned alpha, unsigned cover=0)
+        {
+            *p = (value_type)((((cv - calc_type(*p)) * alpha) + (calc_type(*p) << base_shift)) >> base_shift);
+        }
+    };
+
+
+
+    //=====================================================apply_gamma_dir_gray
+    template<class ColorT, class GammaLut> class apply_gamma_dir_gray
+    {
+    public:
+        typedef typename ColorT::value_type value_type;
+
+        apply_gamma_dir_gray(const GammaLut& gamma) : m_gamma(gamma) {}
+
+        AGG_INLINE void operator () (value_type* p)
+        {
+            *p = m_gamma.dir(*p);
+        }
+
+    private:
+        const GammaLut& m_gamma;
+    };
+
+
+
+    //=====================================================apply_gamma_inv_gray
+    template<class ColorT, class GammaLut> class apply_gamma_inv_gray
+    {
+    public:
+        typedef typename ColorT::value_type value_type;
+
+        apply_gamma_inv_gray(const GammaLut& gamma) : m_gamma(gamma) {}
+
+        AGG_INLINE void operator () (value_type* p)
+        {
+            *p = m_gamma.inv(*p);
+        }
+
+    private:
+        const GammaLut& m_gamma;
+    };
+
+
+
+    //=================================================pixfmt_alpha_blend_gray
+    template<class Blender, class RenBuf, unsigned Step=1, unsigned Offset=0>
+    class pixfmt_alpha_blend_gray
+    {
+    public:
+        typedef RenBuf   rbuf_type;
+        typedef typename rbuf_type::row_data row_data;
+        typedef Blender  blender_type;
+        typedef typename blender_type::color_type color_type;
+        typedef int                               order_type; // A fake one
+        typedef typename color_type::value_type   value_type;
+        typedef typename color_type::calc_type    calc_type;
+        enum base_scale_e 
+        {
+            base_shift = color_type::base_shift,
+            base_scale = color_type::base_scale,
+            base_mask  = color_type::base_mask,
+            pix_width  = sizeof(value_type),
+            pix_step   = Step,
+            pix_offset = Offset
+        };
+
+    private:
+        //--------------------------------------------------------------------
+        static AGG_INLINE void copy_or_blend_pix(value_type* p, 
+                                                 const color_type& c, 
+                                                 unsigned cover)
+        {
+            if (c.a)
+            {
+                calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;
+                if(alpha == base_mask)
+                {
+                    *p = c.v;
+                }
+                else
+                {
+                    Blender::blend_pix(p, c.v, alpha, cover);
+                }
+            }
+        }
+
+
+        static AGG_INLINE void copy_or_blend_pix(value_type* p, 
+                                                 const color_type& c)
+        {
+            if (c.a)
+            {
+                if(c.a == base_mask)
+                {
+                    *p = c.v;
+                }
+                else
+                {
+                    Blender::blend_pix(p, c.v, c.a);
+                }
+            }
+        }
+
+
+    public:
+        //--------------------------------------------------------------------
+        explicit pixfmt_alpha_blend_gray(rbuf_type& rb) :
+            m_rbuf(&rb)
+        {}
+        void attach(rbuf_type& rb) { m_rbuf = &rb; }
+        //--------------------------------------------------------------------
+
+        template<class PixFmt>
+        bool attach(PixFmt& pixf, int x1, int y1, int x2, int y2)
+        {
+            agg::rect_i r(x1, y1, x2, y2);
+            if(r.clip(agg::rect_i(0, 0, pixf.width()-1, pixf.height()-1)))
+            {
+                int stride = pixf.stride();
+                m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1), 
+                               (r.x2 - r.x1) + 1,
+                               (r.y2 - r.y1) + 1,
+                               stride);
+                return true;
+            }
+            return false;
+        }
+
+        //--------------------------------------------------------------------
+        AGG_INLINE unsigned width()  const { return m_rbuf->width();  }
+        AGG_INLINE unsigned height() const { return m_rbuf->height(); }
+        AGG_INLINE int      stride() const { return m_rbuf->stride(); }
+
+        //--------------------------------------------------------------------
+              agg::int8u* row_ptr(int y)       { return m_rbuf->row_ptr(y); }
+        const agg::int8u* row_ptr(int y) const { return m_rbuf->row_ptr(y); }
+        row_data     row(int y)     const { return m_rbuf->row(y); }
+
+        const agg::int8u* pix_ptr(int x, int y) const
+        {
+            return m_rbuf->row_ptr(y) + x * Step + Offset;
+        }
+
+        agg::int8u* pix_ptr(int x, int y)
+        {
+            return m_rbuf->row_ptr(y) + x * Step + Offset;
+        }
+
+        //--------------------------------------------------------------------
+        AGG_INLINE static void make_pix(agg::int8u* p, const color_type& c)
+        {
+            *(value_type*)p = c.v;
+        }
+
+        //--------------------------------------------------------------------
+        AGG_INLINE color_type pixel(int x, int y) const
+        {
+            value_type* p = (value_type*)m_rbuf->row_ptr(y) + x * Step + Offset;
+            return color_type(*p);
+        }
+
+        //--------------------------------------------------------------------
+        AGG_INLINE void copy_pixel(int x, int y, const color_type& c)
+        {
+            *((value_type*)m_rbuf->row_ptr(x, y, 1) + x * Step + Offset) = c.v;
+        }
+
+        //--------------------------------------------------------------------
+        AGG_INLINE void blend_pixel(int x, int y, const color_type& c, agg::int8u cover)
+        {
+            copy_or_blend_pix((value_type*)
+                               m_rbuf->row_ptr(x, y, 1) + x * Step + Offset, 
+                               c, 
+                               cover);
+        }
+
+
+        //--------------------------------------------------------------------
+        AGG_INLINE void copy_hline(int x, int y, 
+                                   unsigned len, 
+                                   const color_type& c)
+        {
+            value_type* p = (value_type*)
+                m_rbuf->row_ptr(x, y, len) + x * Step + Offset;
+
+            do
+            {
+                *p = c.v; 
+                p += Step;
+            }
+            while(--len);
+        }
+
+
+        //--------------------------------------------------------------------
+        AGG_INLINE void copy_vline(int x, int y,
+                                   unsigned len, 
+                                   const color_type& c)
+        {
+            do
+            {
+                value_type* p = (value_type*)
+                    m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;
+
+                *p = c.v;
+            }
+            while(--len);
+        }
+
+
+        //--------------------------------------------------------------------
+        void blend_hline(int x, int y,
+                         unsigned len, 
+                         const color_type& c,
+                         agg::int8u cover)
+        {
+            if (c.a)
+            {
+                value_type* p = (value_type*)
+                    m_rbuf->row_ptr(x, y, len) + x * Step + Offset;
+
+                calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;
+                if(alpha == base_mask)
+                {
+                    do
+                    {
+                        *p = c.v; 
+                        p += Step;
+                    }
+                    while(--len);
+                }
+                else
+                {
+                    do
+                    {
+                        Blender::blend_pix(p, c.v, alpha, cover);
+                        p += Step;
+                    }
+                    while(--len);
+                }
+            }
+        }
+
+
+        //--------------------------------------------------------------------
+        void blend_vline(int x, int y,
+                         unsigned len, 
+                         const color_type& c,
+                         agg::int8u cover)
+        {
+            if (c.a)
+            {
+                value_type* p;
+                calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;
+                if(alpha == base_mask)
+                {
+                    do
+                    {
+                        p = (value_type*)
+                            m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;
+
+                        *p = c.v; 
+                    }
+                    while(--len);
+                }
+                else
+                {
+                    do
+                    {
+                        p = (value_type*)
+                            m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;
+
+                        Blender::blend_pix(p, c.v, alpha, cover);
+                    }
+                    while(--len);
+                }
+            }
+        }
+
+
+        //--------------------------------------------------------------------
+        void blend_solid_hspan(int x, int y,
+                               unsigned len, 
+                               const color_type& c,
+                               const agg::int8u* covers)
+        {
+            if (c.a)
+            {
+                value_type* p = (value_type*)
+                    m_rbuf->row_ptr(x, y, len) + x * Step + Offset;
+
+                do 
+                {
+                    calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8;
+                    if(alpha == base_mask)
+                    {
+                        *p = c.v;
+                    }
+                    else
+                    {
+                        Blender::blend_pix(p, c.v, alpha, *covers);
+                    }
+                    p += Step;
+                    ++covers;
+                }
+                while(--len);
+            }
+        }
+
+
+        //--------------------------------------------------------------------
+        void blend_solid_vspan(int x, int y,
+                               unsigned len, 
+                               const color_type& c,
+                               const agg::int8u* covers)
+        {
+            if (c.a)
+            {
+                do 
+                {
+                    calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8;
+
+                    value_type* p = (value_type*)
+                        m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;
+
+                    if(alpha == base_mask)
+                    {
+                        *p = c.v;
+                    }
+                    else
+                    {
+                        Blender::blend_pix(p, c.v, alpha, *covers);
+                    }
+                    ++covers;
+                }
+                while(--len);
+            }
+        }
+
+
+        //--------------------------------------------------------------------
+        void copy_color_hspan(int x, int y,
+                              unsigned len, 
+                              const color_type* colors)
+        {
+            value_type* p = (value_type*)
+                m_rbuf->row_ptr(x, y, len) + x * Step + Offset;
+
+            do 
+            {
+                *p = colors->v;
+                p += Step;
+                ++colors;
+            }
+            while(--len);
+        }
+
+
+        //--------------------------------------------------------------------
+        void copy_color_vspan(int x, int y,
+                              unsigned len, 
+                              const color_type* colors)
+        {
+            do 
+            {
+                value_type* p = (value_type*)
+                    m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;
+                *p = colors->v;
+                ++colors;
+            }
+            while(--len);
+        }
+
+
+        //--------------------------------------------------------------------
+        void blend_color_hspan(int x, int y,
+                               unsigned len, 
+                               const color_type* colors,
+                               const agg::int8u* covers,
+                               agg::int8u cover)
+        {
+            value_type* p = (value_type*)
+                m_rbuf->row_ptr(x, y, len) + x * Step + Offset;
+
+            if(covers)
+            {
+                do 
+                {
+                    copy_or_blend_pix(p, *colors++, *covers++);
+                    p += Step;
+                }
+                while(--len);
+            }
+            else
+            {
+                if(cover == 255)
+                {
+                    do 
+                    {
+                        if(colors->a == base_mask)
+                        {
+                            *p = colors->v;
+                        }
+                        else
+                        {
+                            copy_or_blend_pix(p, *colors);
+                        }
+                        p += Step;
+                        ++colors;
+                    }
+                    while(--len);
+                }
+                else
+                {
+                    do 
+                    {
+                        copy_or_blend_pix(p, *colors++, cover);
+                        p += Step;
+                    }
+                    while(--len);
+                }
+            }
+        }
+
+
+
+        //--------------------------------------------------------------------
+        void blend_color_vspan(int x, int y,
+                               unsigned len, 
+                               const color_type* colors,
+                               const agg::int8u* covers,
+                               agg::int8u cover)
+        {
+            value_type* p;
+            if(covers)
+            {
+                do 
+                {
+                    p = (value_type*)
+                        m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;
+
+                    copy_or_blend_pix(p, *colors++, *covers++);
+                }
+                while(--len);
+            }
+            else
+            {
+                if(cover == 255)
+                {
+                    do 
+                    {
+                        p = (value_type*)
+                            m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;
+
+                        if(colors->a == base_mask)
+                        {
+                            *p = colors->v;
+                        }
+                        else
+                        {
+                            copy_or_blend_pix(p, *colors);
+                        }
+                        ++colors;
+                    }
+                    while(--len);
+                }
+                else
+                {
+                    do 
+                    {
+                        p = (value_type*)
+                            m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;
+
+                        copy_or_blend_pix(p, *colors++, cover);
+                    }
+                    while(--len);
+                }
+            }
+        }
+
+        //--------------------------------------------------------------------
+        template<class Function> void for_each_pixel(Function f)
+        {
+            unsigned y;
+            for(y = 0; y < height(); ++y)
+            {
+                row_data r = m_rbuf->row(y);
+                if(r.ptr)
+                {
+                    unsigned len = r.x2 - r.x1 + 1;
+
+                    value_type* p = (value_type*)
+                        m_rbuf->row_ptr(r.x1, y, len) + r.x1 * Step + Offset;
+
+                    do
+                    {
+                        f(p);
+                        p += Step;
+                    }
+                    while(--len);
+                }
+            }
+        }
+
+        //--------------------------------------------------------------------
+        template<class GammaLut> void apply_gamma_dir(const GammaLut& g)
+        {
+            for_each_pixel(apply_gamma_dir_gray<color_type, GammaLut>(g));
+        }
+
+        //--------------------------------------------------------------------
+        template<class GammaLut> void apply_gamma_inv(const GammaLut& g)
+        {
+            for_each_pixel(apply_gamma_inv_gray<color_type, GammaLut>(g));
+        }
+
+        //--------------------------------------------------------------------
+        template<class RenBuf2>
+        void copy_from(const RenBuf2& from, 
+                       int xdst, int ydst,
+                       int xsrc, int ysrc,
+                       unsigned len)
+        {
+            const agg::int8u* p = from.row_ptr(ysrc);
+            if(p)
+            {
+                memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width, 
+                        p + xsrc * pix_width, 
+                        len * pix_width);
+            }
+        }
+
+        //--------------------------------------------------------------------
+        template<class SrcPixelFormatRenderer>
+        void blend_from_color(const SrcPixelFormatRenderer& from, 
+                              const color_type& color,
+                              int xdst, int ydst,
+                              int xsrc, int ysrc,
+                              unsigned len,
+                              agg::int8u cover)
+        {
+            typedef typename SrcPixelFormatRenderer::value_type src_value_type;
+            const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc);
+            if(psrc)
+            {
+                value_type* pdst = 
+                    (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst;
+                do 
+                {
+                    copy_or_blend_pix(pdst, 
+                                      color, 
+                                      (*psrc * cover + base_mask) >> base_shift);
+                    ++psrc;
+                    ++pdst;
+                }
+                while(--len);
+            }
+        }
+
+        //--------------------------------------------------------------------
+        template<class SrcPixelFormatRenderer>
+        void blend_from_lut(const SrcPixelFormatRenderer& from, 
+                            const color_type* color_lut,
+                            int xdst, int ydst,
+                            int xsrc, int ysrc,
+                            unsigned len,
+                            agg::int8u cover)
+        {
+            typedef typename SrcPixelFormatRenderer::value_type src_value_type;
+            const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc);
+            if(psrc)
+            {
+                value_type* pdst = 
+                    (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst;
+                do 
+                {
+                    copy_or_blend_pix(pdst, color_lut[*psrc], cover);
+                    ++psrc;
+                    ++pdst;
+                }
+                while(--len);
+            }
+        }
+
+    private:
+        rbuf_type* m_rbuf;
+    };
+
+    typedef blender_gray<gray16> blender_gray16;
+
+    typedef pixfmt_alpha_blend_gray<blender_gray16, 
+            mapnik::grid_rendering_buffer> pixfmt_gray16;     //----pixfmt_gray16
+}
+
+#endif
+
diff --git a/include/mapnik/grid/grid_rasterizer.hpp b/include/mapnik/grid/grid_rasterizer.hpp
new file mode 100644
index 0000000..7dc8136
--- /dev/null
+++ b/include/mapnik/grid/grid_rasterizer.hpp
@@ -0,0 +1,36 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#ifndef MAPNIK_GRID_RASTERIZER_HPP
+#define MAPNIK_GRID_RASTERIZER_HPP
+
+#include <boost/utility.hpp>
+#include "agg_rasterizer_scanline_aa.h"
+
+namespace mapnik {
+
+struct grid_rasterizer :  agg::rasterizer_scanline_aa<>, boost::noncopyable {};
+
+}
+
+#endif //MAPNIK_AGG_RASTERIZER_HPP
diff --git a/include/mapnik/grid/grid_renderer.hpp b/include/mapnik/grid/grid_renderer.hpp
new file mode 100644
index 0000000..54b0bae
--- /dev/null
+++ b/include/mapnik/grid/grid_renderer.hpp
@@ -0,0 +1,129 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+#ifndef GRID_RENDERER_HPP
+#define GRID_RENDERER_HPP
+
+// mapnik
+#include <mapnik/config.hpp>
+#include <mapnik/feature_style_processor.hpp>
+#include <mapnik/font_engine_freetype.hpp>
+#include <mapnik/label_collision_detector.hpp>
+#include <mapnik/placement_finder.hpp>
+#include <mapnik/map.hpp>
+//#include <mapnik/marker.hpp>
+
+#include <mapnik/grid/grid.hpp>
+
+// boost
+#include <boost/utility.hpp>
+#include <boost/scoped_ptr.hpp>
+
+// FIXME
+// forward declare so that
+// apps using mapnik do not
+// need agg headers
+namespace agg {
+  struct trans_affine;
+}
+
+namespace mapnik {
+
+class marker;
+   
+struct grid_rasterizer;
+   
+template <typename T>
+class MAPNIK_DECL grid_renderer : public feature_style_processor<grid_renderer<T> >,
+                                  private boost::noncopyable
+{
+     
+public:
+    grid_renderer(Map const& m, T & pixmap, double scale_factor=1.0, unsigned offset_x=0, unsigned offset_y=0);
+    ~grid_renderer();
+    void start_map_processing(Map const& map);
+    void end_map_processing(Map const& map);
+    void start_layer_processing(layer const& lay);
+    void end_layer_processing(layer const& lay);
+    void render_marker(Feature const& feature, unsigned int step, const int x, const int y, marker &marker, const agg::trans_affine & tr, double opacity);
+
+    void process(point_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(line_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(line_pattern_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(polygon_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(polygon_pattern_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(raster_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(shield_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(text_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(building_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(markers_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);
+    void process(glyph_symbolizer const& sym,
+                 Feature const& feature,
+                 proj_transform const& prj_trans);    
+    inline bool process(rule::symbolizers const& /*syms*/,
+                        Feature const& /*feature*/,
+                        proj_transform const& /*prj_trans*/)
+    {
+        // grid renderer doesn't support processing of multiple symbolizers.
+        return false;
+    };
+    void painted(bool painted)
+    {
+        pixmap_.painted(painted);
+    }
+
+private:
+    T & pixmap_;
+    unsigned width_;
+    unsigned height_;
+    double scale_factor_;
+    CoordTransform t_;
+    freetype_engine font_engine_;
+    face_manager<freetype_engine> font_manager_;
+    label_collision_detector4 detector_;
+    boost::scoped_ptr<grid_rasterizer> ras_ptr;
+};
+}
+
+#endif //GRID_RENDERER_HPP
diff --git a/include/mapnik/grid/grid_rendering_buffer.hpp b/include/mapnik/grid/grid_rendering_buffer.hpp
new file mode 100644
index 0000000..a643378
--- /dev/null
+++ b/include/mapnik/grid/grid_rendering_buffer.hpp
@@ -0,0 +1,36 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#ifndef MAPNIK_GRID_RENDERING_BUFFER_HPP
+#define MAPNIK_GRID_RENDERING_BUFFER_HPP
+
+#include <mapnik/grid/grid.hpp>
+#include "agg_rendering_buffer.h"
+
+namespace mapnik {
+
+typedef agg::row_ptr_cache<mapnik::grid::value_type> grid_rendering_buffer;
+
+}
+
+#endif //MAPNIK_AGG_RASTERIZER_HPP
diff --git a/include/mapnik/grid/grid_util.hpp b/include/mapnik/grid/grid_util.hpp
new file mode 100644
index 0000000..8a48f11
--- /dev/null
+++ b/include/mapnik/grid/grid_util.hpp
@@ -0,0 +1,106 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef GRID_UTIL_HPP
+#define GRID_UTIL_HPP
+
+// mapnik
+#include <mapnik/grid/grid.hpp>
+
+namespace mapnik {
+
+/*
+ * Nearest neighbor resampling for grids
+ */
+
+static inline void scale_grid(mapnik::grid::data_type & target,
+                        const mapnik::grid::data_type & source,
+                        double x_off_f, double y_off_f)
+{
+
+    int source_width=source.width();
+    int source_height=source.height();
+
+    int target_width=target.width();
+    int target_height=target.height();
+
+    if (source_width<1 || source_height<1 ||
+        target_width<1 || target_height<1) return;
+    int x=0,y=0,xs=0,ys=0;
+    int tw2 = target_width/2;
+    int th2 = target_height/2;
+    int offs_x = rint((source_width-target_width-x_off_f*2*source_width)/2);
+    int offs_y = rint((source_height-target_height-y_off_f*2*source_height)/2);
+    unsigned yprt, yprt1, xprt, xprt1;
+
+    //no scaling or subpixel offset
+    if (target_height == source_height && target_width == source_width && offs_x == 0 && offs_y == 0){
+        for (y=0;y<target_height;++y)
+            target.setRow(y,source.getRow(y),target_width);
+        return;
+    }
+
+    for (y=0;y<target_height;++y)
+    {
+        ys = (y*source_height+offs_y)/target_height;
+        int ys1 = ys+1;
+        if (ys1>=source_height)
+            ys1--;
+        if (ys<0)
+            ys=ys1=0;
+        if (source_height/2<target_height)
+            yprt = (y*source_height+offs_y)%target_height;
+        else
+            yprt = th2;
+        yprt1 = target_height-yprt;
+        for (x=0;x<target_width;++x)
+        {
+            xs = (x*source_width+offs_x)/target_width;
+            if (source_width/2<target_width)
+                xprt = (x*source_width+offs_x)%target_width;
+            else
+                xprt = tw2;
+            xprt1 = target_width-xprt;
+            int xs1 = xs+1;
+            if (xs1>=source_width)
+                xs1--;
+            if (xs<0)
+                xs=xs1=0;
+
+            mapnik::grid::value_type a = source(xs,ys);
+            mapnik::grid::value_type b = source(xs1,ys);
+            mapnik::grid::value_type c = source(xs,ys1);
+            mapnik::grid::value_type d = source(xs1,ys1);
+            
+            if ((a > 0) && (b > 0))
+                target(x,y) = b;
+            else if ((c > 0) && (d > 0))
+                target(x,y) = d;
+            else
+                target(x,y) = a;
+        }
+    }
+}
+
+}
+
+#endif // GRID_UTIL_HPP
diff --git a/include/mapnik/grid/grid_view.hpp b/include/mapnik/grid/grid_view.hpp
new file mode 100644
index 0000000..b09d274
--- /dev/null
+++ b/include/mapnik/grid/grid_view.hpp
@@ -0,0 +1,196 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+#ifndef MAPNIK_GRID_VIEW_HPP
+#define MAPNIK_GRID_VIEW_HPP
+
+#include <mapnik/image_data.hpp>
+#include <mapnik/box2d.hpp>
+#include <mapnik/global.hpp>
+#include <mapnik/value.hpp>
+
+// stl
+#include <map>
+#include <set>
+#include <cmath>
+#include <string>
+#include <cassert>
+#include <vector>
+
+
+namespace mapnik {
+    
+template <typename T>
+class hit_grid_view
+{
+public:
+    typedef T data_type;
+    typedef typename T::pixel_type value_type;
+    typedef std::string lookup_type;
+    typedef std::map<value_type, lookup_type> feature_key_type;
+    typedef std::map<lookup_type, value_type> key_type;
+    typedef std::map<std::string, mapnik::value> feature_properties_type;
+    typedef std::map<std::string, feature_properties_type > feature_type;
+          
+    hit_grid_view(unsigned x, unsigned y, 
+              unsigned width, unsigned height,
+              T const& data,
+              std::string const& key,
+              unsigned resolution,
+              std::set<std::string> const& names,
+              feature_key_type const& f_keys,
+              feature_type const& features
+              )
+        : x_(x),
+          y_(y),
+          width_(width),
+          height_(height),
+          data_(data),
+          key_(key),
+          resolution_(resolution),
+          names_(names),
+          f_keys_(f_keys),
+          features_(features)
+          
+    {
+        if (x_ >= data_.width()) x_=data_.width()-1;
+        if (y_ >= data_.height()) x_=data_.height()-1;
+        if (x_ + width_ > data_.width()) width_= data_.width() - x_;
+        if (y_ + height_ > data_.height()) height_= data_.height() - y_;
+    }
+        
+    ~hit_grid_view() {}
+        
+    hit_grid_view(hit_grid_view<T> const& rhs)
+        : x_(rhs.x_),
+          y_(rhs.y_),
+          width_(rhs.width_),
+          height_(rhs.height_),
+          data_(rhs.data_),
+          key_(rhs.key_),
+          resolution_(rhs.resolution_),
+          names_(rhs.names_),
+          f_keys_(rhs.f_keys_),
+          features_(rhs.features_)
+          {}
+        
+    hit_grid_view<T> & operator=(hit_grid_view<T> const& rhs)
+    {
+        if (&rhs==this) return *this;
+        x_ = rhs.x_;
+        y_ = rhs.y_;
+        width_ = rhs.width_;
+        height_ = rhs.height_;
+        data_ = rhs.data_;
+        key_ = rhs.key_;
+        resolution_ = rhs.resolution_;
+        names_ = rhs.names_;
+        f_keys_ = rhs.f_keys_;
+        features_ = rhs.features_;
+    }
+        
+    inline unsigned x() const
+    {
+        return x_;
+    }
+
+    inline unsigned y() const
+    {
+        return y_;
+    }
+        
+    inline unsigned width() const
+    {
+        return width_;
+    }
+
+    inline unsigned height() const
+    {
+        return height_;
+    }
+        
+    inline const value_type* getRow(unsigned row) const
+    {
+        return data_.getRow(row + y_) + x_;
+    }
+
+    inline T& data()
+    {
+        return data_;
+    }
+
+    inline T const& data() const
+    {
+        return data_;
+    }
+
+    inline const unsigned char* raw_data() const
+    {
+        return data_.getBytes();
+    }
+
+    std::set<std::string> const& property_names() const
+    {
+        return names_;
+    }
+
+    inline const feature_type& get_grid_features() const
+    {
+        return features_;
+    }
+
+    inline const feature_key_type& get_feature_keys() const
+    {
+        return f_keys_;
+    }
+
+    inline const lookup_type& get_key() const
+    {
+        return key_;
+    }
+
+    inline unsigned int get_resolution() const
+    {
+        return resolution_;
+    }
+
+private:
+    unsigned x_;
+    unsigned y_;
+    unsigned width_;
+    unsigned height_;
+    T const& data_;
+    std::string const& key_;
+    unsigned int resolution_;
+    std::set<std::string> const& names_;
+    feature_key_type const& f_keys_;
+    feature_type const& features_;
+};
+
+typedef hit_grid_view<mapnik::ImageData<uint16_t> > grid_view;
+
+}
+
+#endif // MAPNIK_GRID_VIEW_HPP
+
diff --git a/include/mapnik/hextree.hpp b/include/mapnik/hextree.hpp
index 729206d..3ac09cc 100644
--- a/include/mapnik/hextree.hpp
+++ b/include/mapnik/hextree.hpp
@@ -26,16 +26,11 @@
 
 // mapnik
 #include <mapnik/global.hpp>
+#include <mapnik/palette.hpp>
 
 // boost
 #include <boost/utility.hpp>
-
-// map vs hashmap 
-#if BOOST_VERSION < 103600
-    #include <map>
-#else
-    #include <boost/unordered_map.hpp>
-#endif
+#include <boost/unordered_map.hpp>
 
 // stl
 #include <vector>
@@ -46,465 +41,418 @@
 
 namespace mapnik {
 
-    typedef boost::uint8_t byte;
-    struct rgba
+struct RGBAPolicy
+{
+    const static unsigned MAX_LEVELS = 6;
+    const static unsigned MIN_ALPHA  = 5;
+    const static unsigned MAX_ALPHA  = 250;
+    inline static unsigned index_from_level(unsigned level, rgba const& c)
     {
-        byte r;
-        byte g;
-        byte b;
-        byte a;
-        rgba(byte r_, byte g_, byte b_, byte a_)
-            : r(r_), g(g_), b(b_), a(a_) {}
-        bool operator==(const rgba& y) const
-        {
-            return r==y.r && g==y.g && b==y.b && a==y.a;
-        }
-        int operator<(const rgba& y) const
+        unsigned shift = 7 - level;
+        return (((c.a >> shift) & 1) << 3)
+            | (((c.r >> shift) & 1) << 2)
+            | (((c.g >> shift) & 1) << 1)
+            | ((c.b >> shift) & 1);
+    }
+};
+
+template <typename T, typename InsertPolicy = RGBAPolicy >
+class hextree : private boost::noncopyable
+{
+    struct node
+    {
+        node ()
+            : reds(0),
+              greens(0),
+              blues(0),
+              alphas(0),
+              count(0),
+              pixel_count(0),
+              children_count(0)
         {
-            if (r!=y.r)
-                return r<y.r;
-            if (g!=y.g)
-                return g<y.g;
-            if (b!=y.b)
-                return b<y.b;
-            return a<y.a;
+            memset(&children_[0],0,sizeof(children_));
         }
-    };
 
-    #define HASH_RGBA(p) (((std::size_t)p.r * 33023 + (std::size_t)p.g * 30013 + (std::size_t)p.b * 27011 + (std::size_t)p.a * 24007) % 21001)
-    struct rgba_hash_func : public std::unary_function<rgba, std::size_t>
-    {
-        std::size_t operator()(rgba const&p) const
+        ~node ()
         {
-            return HASH_RGBA(p);
+            for (unsigned i = 0; i < 16; ++i)
+                if (children_[i] != 0) delete children_[i],children_[i]=0;
         }
+
+        bool is_leaf() const { return children_count == 0; }
+        node * children_[16];
+        // sum of values for computing mean value using count or pixel_count
+        double reds;
+        double greens;
+        double blues;
+        double alphas;
+        // if count!=0, then node represents color in output palette
+        int count;
+        // number of pixels represented by this subtree
+        unsigned pixel_count;
+        // penalty of using this node as color
+        double reduce_cost;
+        // number of !=0 positions in children_ array
+        byte children_count;
     };
 
-    struct RGBAPolicy
+    // highest reduce_cost first
+    struct node_rev_cmp
     {
-        const static unsigned MAX_LEVELS = 6;
-        const static unsigned MIN_ALPHA  = 5;
-        const static unsigned MAX_ALPHA  = 250;
-        inline static unsigned index_from_level(unsigned level, rgba const& c)
+        bool operator() (const node * lhs, const node* rhs) const
         {
-            unsigned shift = 7 - level;
-            return (((c.a >> shift) & 1) << 3)
-            | (((c.r >> shift) & 1) << 2)
-            | (((c.g >> shift) & 1) << 1)
-            | ((c.b >> shift) & 1);
+            if (lhs->reduce_cost != rhs->reduce_cost)
+                return lhs->reduce_cost > rhs->reduce_cost;
+            return lhs > rhs;
         }
     };
 
-    template <typename T, typename InsertPolicy = RGBAPolicy >
-    class hextree : private boost::noncopyable
+    unsigned max_colors_;
+    unsigned colors_;
+    // flag indicating existance of invisible pixels (a < InsertPolicy::MIN_ALPHA)
+    bool has_holes_;
+    node * root_;
+    // working palette for quantization, sorted on mean(r,g,b,a) for easier searching NN
+    std::vector<rgba> sorted_pal_;
+    // index remaping of sorted_pal_ indexes to indexes of returned image palette
+    std::vector<unsigned> pal_remap_;
+    // rgba hashtable for quantization
+    typedef boost::unordered_map<rgba, int, rgba::hash_func> rgba_hash_table;
+    mutable rgba_hash_table color_hashmap_;
+    // gamma correction to prioritize dark colors (>1.0)
+    double gamma_;
+    // look up table for gamma correction
+    double gammaLUT_[256];
+    // transparency handling
+    enum transparency_mode_t {NO_TRANSPARENCY=0, BINARY_TRANSPARENCY=1, FULL_TRANSPARENCY=2};
+    unsigned trans_mode_;
+
+    inline double gamma(const double &b, const double &g) const
     {
-        struct node
-        {
-            node ()
-              : reds(0),
-                greens(0),
-                blues(0),
-                alphas(0),
-                count(0),
-                pixel_count(0),
-                children_count(0)
-            {
-                memset(&children_[0],0,sizeof(children_));
-            }
+        return 255 * std::pow(b/255, g);
+    }
+    
+public:
+    explicit hextree(unsigned max_colors=256, const double &g=2.0)
+        : max_colors_(max_colors),
+          colors_(0),
+          has_holes_(false),
+          root_(new node()),
+          trans_mode_(FULL_TRANSPARENCY)
+    {
+        setGamma(g);
+    }
 
-            ~node ()
-            {
-                for (unsigned i = 0; i < 16; ++i)
-                    if (children_[i] != 0) delete children_[i],children_[i]=0;
-            }
+    ~hextree() { delete root_;}
 
-            bool is_leaf() const { return children_count == 0; }
-            node * children_[16];
-            // sum of values for computing mean value using count or pixel_count
-            double reds;
-            double greens;
-            double blues;
-            double alphas;
-            // if count!=0, then node represents color in output palette
-            int count;
-            // number of pixels represented by this subtree
-            unsigned pixel_count;
-            // penalty of using this node as color
-            double reduce_cost;
-            // number of !=0 positions in children_ array
-            byte children_count;
-        };
-
-        // highest reduce_cost first
-        struct node_rev_cmp
-        {
-            bool operator() (const node * lhs, const node* rhs) const
-            {
-                if (lhs->reduce_cost != rhs->reduce_cost)
-                    return lhs->reduce_cost > rhs->reduce_cost;
-                return lhs > rhs;
-            }
-        };
+    void setMaxColors(unsigned max_colors)
+    {
+        max_colors_ = max_colors;
+    }
 
-        // ordering by mean(a,r,g,b), a, r, g, b
-        struct rgba_mean_sort_cmp
-        {
-            bool operator() (const rgba& x, const rgba& y) const
-            {
-                int t1 = (int)x.a+x.r+x.g+x.b;
-                int t2 = (int)y.a+y.r+y.g+y.b;
-                if (t1!=t2)
-                    return t1<t2;
-
-                return  (((int)x.a-y.a) >> 24) +
-                        (((int)x.r-y.r) >> 16) +
-                        (((int)x.g-y.g) >> 8) +
-                        ((int)x.b-y.b);
-            }
-        };
-
-
-        unsigned max_colors_;
-        unsigned colors_;
-        // flag indicating existance of invisible pixels (a < InsertPolicy::MIN_ALPHA)
-        bool has_holes_;
-        node * root_;
-        // working palette for quantization, sorted on mean(r,g,b,a) for easier searching NN
-        std::vector<rgba> sorted_pal_;
-        // index remaping of sorted_pal_ indexes to indexes of returned image palette
-        std::vector<unsigned> pal_remap_;
-        // rgba hashtable for quantization
-#if BOOST_VERSION < 103600
-        typedef std::map<rgba, int> rgba_hash_table;
-#else
-        typedef boost::unordered_map<rgba, int, rgba_hash_func> rgba_hash_table;
-#endif
-        rgba_hash_table color_hashmap_;
-        // gamma correction to prioritize dark colors (>1.0)
-        double gamma_;
-        // look up table for gamma correction
-        double gammaLUT_[256];
-        // transparency handling
-        enum transparency_mode_t {NO_TRANSPARENCY=0, BINARY_TRANSPARENCY=1, FULL_TRANSPARENCY=2};
-        unsigned trans_mode_;
-
-        inline double gamma(const double &b, const double &g) const
-        {
-            return 255 * pow(b/255, g);
-        }
+    void setGamma(const double &g)
+    {
+        gamma_ = g;
+        for (unsigned i=0; i<256; i++)
+            gammaLUT_[i] = gamma(i, 1/gamma_);
+    }
 
-        public:
-            explicit hextree(unsigned max_colors=256, const double &g=2.0)
-              : max_colors_(max_colors),
-                colors_(0),
-                has_holes_(false),
-                root_(new node()),
-                trans_mode_(FULL_TRANSPARENCY)
-            {
-                setGamma(g);
-            }
+    void setTransMode(unsigned t)
+    {
+        trans_mode_ = t;
+    }
 
-            ~hextree() { delete root_;}
+    transparency_mode_t getTransMode() const
+    {
+        return trans_mode_;
+    }
 
-            void setMaxColors(unsigned max_colors)
-            {
-                max_colors_ = max_colors;
-            }
+    // process alpha value based on trans_mode_
+    byte preprocessAlpha(byte a) const
+    {
+        switch(trans_mode_)
+        {
+        case NO_TRANSPARENCY:
+            return 255;
+        case BINARY_TRANSPARENCY:
+            return a<127?0:255;
+        default:
+            return a;
+        }
+    }
 
-            void setGamma(const double &g)
-            {
-                gamma_ = g;
-                for (unsigned i=0; i<256; i++)
-                    gammaLUT_[i] = gamma(i, 1/gamma_);
-            }
+    void insert(T const& data)
+    {
+        byte a = preprocessAlpha(data.a);
+        unsigned level = 0;
+        node * cur_node = root_;
+        if (a < InsertPolicy::MIN_ALPHA)
+        {
+            has_holes_ = true;
+            return;
+        }
+        while (true)
+        {
+            cur_node->pixel_count++;
+            cur_node->reds   += gammaLUT_[data.r];
+            cur_node->greens += gammaLUT_[data.g];
+            cur_node->blues  += gammaLUT_[data.b];
+            cur_node->alphas += a;
 
-            void setTransMode(unsigned t)
+            if (level == InsertPolicy::MAX_LEVELS)
             {
-                trans_mode_ = t;
+                if (cur_node->pixel_count == 1)
+                    ++colors_;
+                break;
             }
 
-            transparency_mode_t getTransMode() const
+            unsigned idx = InsertPolicy::index_from_level(level,data);
+            if (cur_node->children_[idx] == 0)
             {
-                return trans_mode_;
+                cur_node->children_count++;
+                cur_node->children_[idx] = new node();
             }
+            cur_node = cur_node->children_[idx];
+            ++level;
+        }
+    }
 
-            // process alpha value based on trans_mode_
-            byte preprocessAlpha(byte a) const
+    // return color index in returned earlier palette
+    int quantize(rgba const& c) const
+    {
+        byte a = preprocessAlpha(c.a);
+        unsigned ind=0;
+        if (a < InsertPolicy::MIN_ALPHA || colors_ == 0)
+            return 0;
+        if (colors_ == 1)
+            return pal_remap_[has_holes_?1:0];
+
+        rgba_hash_table::iterator it = color_hashmap_.find(c);
+        if (it == color_hashmap_.end())
+        {
+            int dr, dg, db, da;
+            int dist, newdist;
+
+            // find closest match based on mean of r,g,b,a
+            std::vector<rgba>::const_iterator pit = 
+                std::lower_bound(sorted_pal_.begin(), sorted_pal_.end(), c, rgba::mean_sort_cmp());
+            ind = pit-sorted_pal_.begin();
+            if (ind == sorted_pal_.size())
+                ind--;
+            dr = sorted_pal_[ind].r - c.r;
+            dg = sorted_pal_[ind].g - c.g;
+            db = sorted_pal_[ind].b - c.b;
+            da = sorted_pal_[ind].a - a;
+            dist = dr*dr + dg*dg + db*db + da*da;
+            int poz = ind;
+
+            // search neighbour positions in both directions for better match
+            for (int i = poz - 1; i >= 0; i--)
             {
-                switch(trans_mode_)
+                dr = sorted_pal_[i].r - c.r;
+                dg = sorted_pal_[i].g - c.g;
+                db = sorted_pal_[i].b - c.b;
+                da = sorted_pal_[i].a - a;
+                // stop criteria based on properties of used sorting
+                if ((dr+db+dg+da) * (dr+db+dg+da) / 4 > dist)
+                    break;
+                newdist = dr*dr + dg*dg + db*db + da*da;
+                if (newdist < dist)
                 {
-                    case NO_TRANSPARENCY:
-                        return 255;
-                    case BINARY_TRANSPARENCY:
-                        return a<127?0:255;
-                    default:
-                        return a;
+                    ind = i;
+                    dist = newdist;
                 }
             }
-
-            void insert(T const& data)
+            for (unsigned i = poz + 1; i < sorted_pal_.size(); i++)
             {
-                byte a = preprocessAlpha(data.a);
-                unsigned level = 0;
-                node * cur_node = root_;
-                if (a < InsertPolicy::MIN_ALPHA)
+                dr = sorted_pal_[i].r - c.r;
+                dg = sorted_pal_[i].g - c.g;
+                db = sorted_pal_[i].b - c.b;
+                da = sorted_pal_[i].a - a;
+                // stop criteria based on properties of used sorting
+                if ((dr+db+dg+da) * (dr+db+dg+da) / 4 > dist)
+                    break;
+                newdist = dr*dr + dg*dg + db*db + da*da;
+                if (newdist < dist)
                 {
-                    has_holes_ = true;
-                    return;
+                    ind = i;
+                    dist = newdist;
                 }
-                while (true)
-                {
-                    cur_node->pixel_count++;
-                    cur_node->reds   += gammaLUT_[data.r];
-                    cur_node->greens += gammaLUT_[data.g];
-                    cur_node->blues  += gammaLUT_[data.b];
-                    cur_node->alphas += a;
+            }
+            //put found index in hash map
+            color_hashmap_[c] = ind;
+        }
+        else
+            ind = it->second;
 
-                    if (level == InsertPolicy::MAX_LEVELS)
-                    {
-                        if (cur_node->pixel_count == 1)
-                            ++colors_;
-                        break;
-                    }
+        return pal_remap_[ind];
+    }
 
-                    unsigned idx = InsertPolicy::index_from_level(level,data);
-                    if (cur_node->children_[idx] == 0)
-                    {
-                        cur_node->children_count++;
-                        cur_node->children_[idx] = new node();
-                    }
-                    cur_node = cur_node->children_[idx];
-                    ++level;
-                }
-            }
+    void create_palette(std::vector<rgba> & palette)
+    {
+        sorted_pal_.clear();
+        if (has_holes_)
+        {
+            max_colors_--;
+            sorted_pal_.push_back(rgba(0,0,0,0));
+        }
+        assign_node_colors();
 
-            // return color index in returned earlier palette
-            int quantize(rgba const& c)
-            {
-                byte a = preprocessAlpha(c.a);
-                unsigned ind=0;
-                if (a < InsertPolicy::MIN_ALPHA || colors_ <= 1)
-                    return 0;
+        sorted_pal_.reserve(colors_);
+        create_palette_rek(sorted_pal_, root_);
+        delete root_;
+        root_ = new node();
 
-                rgba_hash_table::iterator it = color_hashmap_.find(c);
-                if (it == color_hashmap_.end())
-                {
-                    int dr, dg, db, da;
-                    int dist, newdist;
-
-                    // find closest match based on mean of r,g,b,a
-                    vector<rgba>::iterator pit = std::lower_bound(sorted_pal_.begin(), sorted_pal_.end(), c, rgba_mean_sort_cmp());
-                    ind = pit-sorted_pal_.begin();
-                    if (ind == sorted_pal_.size())
-                        ind--;
-                    dr = sorted_pal_[ind].r - c.r;
-                    dg = sorted_pal_[ind].g - c.g;
-                    db = sorted_pal_[ind].b - c.b;
-                    da = sorted_pal_[ind].a - a;
-                    dist = dr*dr + dg*dg + db*db + da*da;
-                    int poz = ind;
-
-                    // search neighbour positions in both directions for better match
-                    for (int i = poz - 1; i >= 0; i--)
-                    {
-                        dr = sorted_pal_[i].r - c.r;
-                        dg = sorted_pal_[i].g - c.g;
-                        db = sorted_pal_[i].b - c.b;
-                        da = sorted_pal_[i].a - a;
-                        // stop criteria based on properties of used sorting
-                        if ((dr+db+dg+da) * (dr+db+dg+da) / 4 > dist)
-                            break;
-                        newdist = dr*dr + dg*dg + db*db + da*da;
-                        if (newdist < dist)
-                        {
-                            ind = i;
-                            dist = newdist;
-                        }
-                    }
-                    for (unsigned i = poz + 1; i < sorted_pal_.size(); i++)
-                    {
-                        dr = sorted_pal_[i].r - c.r;
-                        dg = sorted_pal_[i].g - c.g;
-                        db = sorted_pal_[i].b - c.b;
-                        da = sorted_pal_[i].a - a;
-                        // stop criteria based on properties of used sorting
-                        if ((dr+db+dg+da) * (dr+db+dg+da) / 4 > dist)
-                            break;
-                        newdist = dr*dr + dg*dg + db*db + da*da;
-                        if (newdist < dist)
-                        {
-                            ind = i;
-                            dist = newdist;
-                        }
-                    }
-                    //put found index in hash map
-                    color_hashmap_[c] = ind;
-                }
-                else
-                    ind = it->second;
+        // sort palette for binary searching in quantization
+        std::sort(sorted_pal_.begin(), sorted_pal_.end(),rgba::mean_sort_cmp());
 
-                return pal_remap_[ind];
+        // returned palette is rearanged, so that colors with a<255 are at the begining
+        pal_remap_.resize(sorted_pal_.size());
+        palette.clear();
+        palette.reserve(sorted_pal_.size());
+        for (unsigned i=0; i<sorted_pal_.size(); i++)
+        {
+            if (sorted_pal_[i].a<255)
+            {
+                pal_remap_[i] = palette.size();
+                palette.push_back(sorted_pal_[i]);
             }
-
-            void create_palette(std::vector<rgba> & palette)
+        }
+        for (unsigned i=0; i<sorted_pal_.size(); i++)
+        {
+            if (sorted_pal_[i].a==255)
             {
-                sorted_pal_.clear();
-                if (has_holes_)
-                {
-                    max_colors_--;
-                    sorted_pal_.push_back(rgba(0,0,0,0));
-                }
-                assign_node_colors();
-
-                sorted_pal_.reserve(colors_);
-                create_palette_rek(sorted_pal_, root_);
-                delete root_;
-                root_ = new node();
-
-                // sort palette for binary searching in quantization
-                std::sort(sorted_pal_.begin(), sorted_pal_.end(),rgba_mean_sort_cmp());
-
-                // returned palette is rearanged, so that colors with a<255 are at the begining
-                pal_remap_.resize(sorted_pal_.size());
-                palette.clear();
-                palette.reserve(sorted_pal_.size());
-                for (unsigned i=0; i<sorted_pal_.size(); i++)
-                {
-                    if (sorted_pal_[i].a<255)
-                    {
-                        pal_remap_[i] = palette.size();
-                        palette.push_back(sorted_pal_[i]);
-                    }
-                }
-                for (unsigned i=0; i<sorted_pal_.size(); i++)
-                {
-                    if (sorted_pal_[i].a==255)
-                    {
-                        pal_remap_[i] = palette.size();
-                        palette.push_back(sorted_pal_[i]);
-                    }
-                }
+                pal_remap_[i] = palette.size();
+                palette.push_back(sorted_pal_[i]);
             }
+        }
+    }
 
-        private:
+private:
 
-            void print_tree(node *r, int d=0, int id=0) const
+    void print_tree(node *r, int d=0, int id=0) const
+    {
+        for (int i=0; i<d; i++)
+            printf("\t");
+        if (r->count>0)
+            printf("%d: (+%d/%d/%.5f) (%d %d %d %d)\n",
+                   id, (int)r->count, (int)r->pixel_count, r->reduce_cost,
+                   (int)round(gamma(r->reds / r->count, gamma_)),
+                   (int)round(gamma(r->greens / r->count, gamma_)), 
+                   (int)round(gamma(r->blues / r->count, gamma_)),
+                   (int)(r->alphas / r->count));
+        else
+            printf("%d: (%d/%d/%.5f) (%d %d %d %d)\n", id, 
+                   (int)r->count, (int)r->pixel_count, r->reduce_cost,
+                   (int)round(gamma(r->reds / r->pixel_count, gamma_)),
+                   (int)round(gamma(r->greens / r->pixel_count, gamma_)),
+                   (int)round(gamma(r->blues / r->pixel_count, gamma_)),
+                   (int)(r->alphas / r->pixel_count));
+        for (unsigned idx=0; idx < 16; ++idx) if (r->children_[idx] != 0)
+                                              {
+                                                  print_tree(r->children_[idx], d+1, idx);
+                                              }
+    }
+
+    // traverse tree and search for nodes with count!=0, that represent single color.
+    // clip extreme alfa values
+    void create_palette_rek(std::vector<rgba> & palette, node * itr) const
+    {
+        // actually, ignore ones with < 3 pixels
+        if (itr->count >= 3)
+        {
+            unsigned count = itr->count;
+            byte a = byte(itr->alphas/float(count));
+            if (a > InsertPolicy::MAX_ALPHA) a = 255;
+            if (a < InsertPolicy::MIN_ALPHA) a = 0;
+            palette.push_back(rgba((byte)round(gamma(itr->reds   / count, gamma_)),
+                                   (byte)round(gamma(itr->greens / count, gamma_)),
+                                   (byte)round(gamma(itr->blues  / count, gamma_)), a));
+        }
+        for (unsigned idx=0; idx < 16; ++idx) if (itr->children_[idx] != 0)
+                                              {
+                                                  create_palette_rek(palette, itr->children_[idx]);
+                                              }
+    }
+
+    // assign value to r, representing some penalty for assigning one
+    // color to all pixels in this subtree
+    void compute_cost(node *r)
+    {
+        //initial small value, so that all nodes have >0 cost
+        r->reduce_cost = r->pixel_count/1000.0;
+        if (r->children_count==0)
+            return;
+        // mean color of all pixels in subtree
+        double mean_r = r->reds   / r->pixel_count;
+        double mean_g = r->greens / r->pixel_count;
+        double mean_b = r->blues  / r->pixel_count;
+        double mean_a = r->alphas / r->pixel_count;
+        for (unsigned idx=0; idx < 16; ++idx) 
+        {
+            if (r->children_[idx] != 0)
             {
-                for (int i=0; i<d; i++)
-                    printf("\t");
-                if (r->count>0)
-                    printf("%d: (+%d/%d/%.5f) (%d %d %d %d)\n",
-                           id, int(r->count), int(r->pixel_count), int(r->reduce_cost),
-                           rint(gamma(r->reds / r->count, gamma_)),
-                           rint(gamma(r->greens / r->count, gamma_)), 
-                           rint(gamma(r->blues / r->count, gamma_)),
-                           rint(r->alphas / r->count));
-                else
-                    printf("%d: (%d/%d/%.5f) (%d %d %d %d)\n", id, 
-                           int(r->count), int(r->pixel_count), int(r->reduce_cost),
-                           rint(gamma(r->reds / r->pixel_count, gamma_)),
-                           rint(gamma(r->greens / r->pixel_count, gamma_)),
-                           rint(gamma(r->blues / r->pixel_count, gamma_)),
-			   int(r->alphas / r->pixel_count));
-                for (unsigned idx=0; idx < 16; ++idx) if (r->children_[idx] != 0)
-                {
-                    print_tree(r->children_[idx], d+1, idx);
-                }
+                double dr,dg,db,da;
+                compute_cost(r->children_[idx]);
+                // include childrens penalty
+                r->reduce_cost += r->children_[idx]->reduce_cost;
+                // difference between mean value and subtree mean value
+                dr = r->children_[idx]->reds   / r->children_[idx]->pixel_count - mean_r;
+                dg = r->children_[idx]->greens / r->children_[idx]->pixel_count - mean_g;
+                db = r->children_[idx]->blues  / r->children_[idx]->pixel_count - mean_b;
+                da = r->children_[idx]->alphas / r->children_[idx]->pixel_count - mean_a;
+                // penalty_x = d_x^2 * pixel_count * mean_alfa/255, where x=r,g,b,a
+                // mean_alpha/255 because more opaque color = more noticable differences
+                r->reduce_cost += (dr*dr + dg*dg + db*db + da*da) * r->children_[idx]->alphas / 255;
             }
+        }
+    }
+    
+    // starting from root_, unfold nodes with biggest penalty
+    // until all available colors are assigned to processed nodes
+    void assign_node_colors()
+    {
+        compute_cost(root_);
 
-            // traverse tree and search for nodes with count!=0, that represent single color.
-            // clip extreme alfa values
-            void create_palette_rek(std::vector<rgba> & palette, node * itr) const
-            {
-                // actually, ignore ones with < 3 pixels
-                if (itr->count >= 3)
-                {
-                    unsigned count = itr->count;
-                    byte a = byte(itr->alphas/float(count));
-                    if (a > InsertPolicy::MAX_ALPHA) a = 255;
-                    if (a < InsertPolicy::MIN_ALPHA) a = 0;
-                    palette.push_back(rgba((byte)rint(gamma(itr->reds   / count, gamma_)),
-                                           (byte)rint(gamma(itr->greens / count, gamma_)),
-                                           (byte)rint(gamma(itr->blues  / count, gamma_)), a));
-                }
-                for (unsigned idx=0; idx < 16; ++idx) if (itr->children_[idx] != 0)
-                {
-                    create_palette_rek(palette, itr->children_[idx]);
-                }
-            }
+        int tries = 0;
 
-            // assign value to r, representing some penalty for assigning one
-            // color to all pixels in this subtree
-            void compute_cost(node *r)
+        // at the begining, single color assigned to root_
+        colors_ = 1;
+        root_->count = root_->pixel_count;
+
+        std::set<node*,node_rev_cmp> colored_leaves_heap;
+        colored_leaves_heap.insert(root_);
+        while(!colored_leaves_heap.empty() && colors_ < max_colors_ && tries < 16)
+        {
+            // select worst node to remove it from palette and replace with children
+            node * cur_node = *colored_leaves_heap.begin();
+            colored_leaves_heap.erase(colored_leaves_heap.begin());
+            if (cur_node->children_count + colors_ - 1 > max_colors_)
             {
-                //initial small value, so that all nodes have >0 cost
-                r->reduce_cost = r->pixel_count/1000.0;
-                if (r->children_count==0)
-                    return;
-                // mean color of all pixels in subtree
-                double mean_r = r->reds   / r->pixel_count;
-                double mean_g = r->greens / r->pixel_count;
-                double mean_b = r->blues  / r->pixel_count;
-                double mean_a = r->alphas / r->pixel_count;
-                for (unsigned idx=0; idx < 16; ++idx) if (r->children_[idx] != 0)
-                {
-                    double dr,dg,db,da;
-                    compute_cost(r->children_[idx]);
-                    // include childrens penalty
-                    r->reduce_cost += r->children_[idx]->reduce_cost;
-                    // difference between mean value and subtree mean value
-                    dr = r->children_[idx]->reds   / r->children_[idx]->pixel_count - mean_r;
-                    dg = r->children_[idx]->greens / r->children_[idx]->pixel_count - mean_g;
-                    db = r->children_[idx]->blues  / r->children_[idx]->pixel_count - mean_b;
-                    da = r->children_[idx]->alphas / r->children_[idx]->pixel_count - mean_a;
-                    // penalty_x = d_x^2 * pixel_count * mean_alfa/255, where x=r,g,b,a
-                    // mean_alpha/255 because more opaque color = more noticable differences
-                    r->reduce_cost += (dr*dr + dg*dg + db*db + da*da) * r->children_[idx]->alphas / 255;
-                }
+                tries++;
+                continue; // try few times, maybe next will have less children
             }
-
-            // starting from root_, unfold nodes with biggest penalty
-            // until all available colors are assigned to processed nodes
-            void assign_node_colors()
+            tries=0;
+            // ignore leaves and also nodes with small mean error and not excessive number of pixels
+            if ((cur_node->reduce_cost / cur_node->pixel_count + 1) * std::log(long(cur_node->pixel_count)) > 15
+                && cur_node->children_count > 0)
             {
-                compute_cost(root_);
-
-                int tries = 0;
-
-                // at the begining, single color assigned to root_
-                colors_ = 1;
-                root_->count = root_->pixel_count;
-
-                std::set<node*,node_rev_cmp> colored_leaves_heap;
-                colored_leaves_heap.insert(root_);
-                while(!colored_leaves_heap.empty() && colors_ < max_colors_ && tries < 16)
+                colors_--;
+                cur_node->count = 0;
+                for (unsigned idx=0; idx < 16; ++idx) 
                 {
-                    // select worst node to remove it from palette and replace with children
-                    node * cur_node = *colored_leaves_heap.begin();
-                    colored_leaves_heap.erase(colored_leaves_heap.begin());
-                    if (cur_node->children_count + colors_ - 1 > max_colors_)
+                    if (cur_node->children_[idx] != 0)
                     {
-                        tries++;
-                        continue; // try few times, maybe next will have less children
-                    }
-                    tries=0;
-                    // ignore leaves and also nodes with small mean error and not excessive number of pixels
-                    if (cur_node->reduce_cost / cur_node->pixel_count * std::log(double(cur_node->pixel_count)) > 20
-                            && cur_node->children_count > 0)
-                    {
-                        colors_--;
-                        cur_node->count = 0;
-                        for (unsigned idx=0; idx < 16; ++idx) if (cur_node->children_[idx] != 0)
-                        {
-                            node *n = cur_node->children_[idx];
-                            n->count = n->pixel_count;
-                            colored_leaves_heap.insert(n);
-                            colors_++;
-                        }
+                        node *n = cur_node->children_[idx];
+                        n->count = n->pixel_count;
+                        colored_leaves_heap.insert(n);
+                        colors_++;
                     }
                 }
             }
-    };
+        }
+    }
+};
 } // namespace mapnik
 
-#endif /* _HEXTREE_HPP_ */
+#endif // _HEXTREE_HPP_
diff --git a/include/mapnik/hit_test_filter.hpp b/include/mapnik/hit_test_filter.hpp
index df5911d..702d7d2 100644
--- a/include/mapnik/hit_test_filter.hpp
+++ b/include/mapnik/hit_test_filter.hpp
@@ -28,30 +28,30 @@
 #include <mapnik/feature.hpp>
 
 namespace mapnik {
-    class hit_test_filter
-    {
-    public:
-        hit_test_filter(double x, double y, double tol)
-            : x_(x),
-              y_(y), 
-              tol_(tol) {}
+class hit_test_filter
+{
+public:
+    hit_test_filter(double x, double y, double tol)
+        : x_(x),
+          y_(y), 
+          tol_(tol) {}
         
-        bool pass(Feature const& feature)
+    bool pass(Feature const& feature)
+    {
+        for (unsigned i=0;i<feature.num_geometries();++i)
         {
-           for (unsigned i=0;i<feature.num_geometries();++i)
-           {
-              geometry2d const& geom = feature.get_geometry(i);
-              if (geom.hit_test(x_,y_,tol_))
-                 return true;
-           }
-           return false;
+            geometry_type const& geom = feature.get_geometry(i);
+            if (geom.hit_test(x_,y_,tol_))
+                return true;
         }
+        return false;
+    }
         
-    private:
-        double x_;
-        double y_;
-        double tol_;
-    };
+private:
+    double x_;
+    double y_;
+    double tol_;
+};
 }
 
 #endif // HIT_TEST_FILTER_HPP
diff --git a/include/mapnik/image_compositing.hpp b/include/mapnik/image_compositing.hpp
new file mode 100644
index 0000000..adf5df9
--- /dev/null
+++ b/include/mapnik/image_compositing.hpp
@@ -0,0 +1,189 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+#ifndef IMAGE_COMPOSITING_HPP
+#define IMAGE_COMPOSITING_HPP
+
+// agg
+#include "agg_rendering_buffer.h"
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_scanline_u.h"
+#include "agg_renderer_scanline.h"
+#include "agg_pixfmt_rgba.h"
+
+namespace mapnik
+{
+
+// Compositing modes 
+// http://www.w3.org/TR/2009/WD-SVGCompositing-20090430/
+
+enum composite_mode_e
+{
+    clear = 1,
+    src,
+    dst,
+    src_over,
+    dst_over,
+    src_in,
+    dst_in,
+    src_out,
+    dst_out,
+    src_atop,
+    dst_atop,
+    _xor,
+    plus,
+    minus,
+    multiply,
+    screen,
+    overlay,
+    darken,
+    lighten,
+    color_dodge,
+    color_burn,
+    hard_light,
+    soft_light,
+    difference,
+    exclusion,
+    contrast,
+    invert,
+    invert_rgb
+};
+
+template <typename T1, typename T2>
+void composite(T1 & im, T2 & im2, composite_mode_e mode)
+{
+    typedef agg::rgba8 color;
+    typedef agg::order_bgra order;
+    typedef agg::pixel32_type pixel_type;
+    typedef agg::comp_op_adaptor_rgba<color, order> blender_type;
+    typedef agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer> pixfmt_type;
+    typedef agg::renderer_base<pixfmt_type> renderer_type;
+    typedef agg::comp_op_adaptor_rgba<color, order> blender_type;
+    typedef agg::renderer_base<pixfmt_type> renderer_type;
+    
+    agg::rendering_buffer source(im.getBytes(),im.width(),im.height(),im.width() * 4);
+    agg::rendering_buffer mask(im2.getBytes(),im2.width(),im2.height(),im2.width() * 4);
+    
+    agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer> pixf(source);
+    agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer> pixf_mask(mask);
+    
+    switch(mode)
+    {
+    case clear :
+        pixf.comp_op(agg::comp_op_clear);
+        break;
+    case src:
+        pixf.comp_op(agg::comp_op_src);
+        break;
+    case dst:
+        pixf.comp_op(agg::comp_op_dst);
+        break;
+    case src_over:
+        pixf.comp_op(agg::comp_op_src_over);
+        break;
+    case dst_over:
+        pixf.comp_op(agg::comp_op_dst_over);
+        break;
+    case src_in:
+        pixf.comp_op(agg::comp_op_src_in);
+        break;
+    case dst_in:
+        pixf.comp_op(agg::comp_op_dst_in);
+        break;
+    case src_out:
+        pixf.comp_op(agg::comp_op_src_out);
+        break;
+    case dst_out:
+        pixf.comp_op(agg::comp_op_dst_out);
+        break;
+    case src_atop:
+        pixf.comp_op(agg::comp_op_src_atop);
+        break;
+    case dst_atop:
+        pixf.comp_op(agg::comp_op_dst_atop);
+        break;
+    case _xor:
+        pixf.comp_op(agg::comp_op_xor);
+        break;
+    case plus:
+        pixf.comp_op(agg::comp_op_plus);
+        break;
+    case minus:
+        pixf.comp_op(agg::comp_op_minus);
+        break;
+    case multiply:
+        pixf.comp_op(agg::comp_op_multiply);
+        break;     
+    case screen:
+        pixf.comp_op(agg::comp_op_screen);
+        break;
+    case overlay:
+        pixf.comp_op(agg::comp_op_overlay);
+        break;
+    case darken:
+        pixf.comp_op(agg::comp_op_darken);
+        break;    
+    case lighten:
+        pixf.comp_op(agg::comp_op_lighten);
+        break;
+    case color_dodge:
+        pixf.comp_op(agg::comp_op_color_dodge);
+        break;
+    case color_burn:
+        pixf.comp_op(agg::comp_op_color_burn);
+        break;
+    case hard_light:
+        pixf.comp_op(agg::comp_op_hard_light);
+        break;
+    case soft_light:
+        pixf.comp_op(agg::comp_op_soft_light);
+        break;
+    case difference:
+        pixf.comp_op(agg::comp_op_difference);
+        break;
+    case exclusion:
+        pixf.comp_op(agg::comp_op_exclusion);
+        break;
+    case contrast:
+        pixf.comp_op(agg::comp_op_contrast);
+        break;
+    case invert:
+        pixf.comp_op(agg::comp_op_invert);
+        break;
+    case invert_rgb:
+        pixf.comp_op(agg::comp_op_invert_rgb);
+        break;
+    default:
+        break;
+    
+    }
+    renderer_type ren(pixf);
+    agg::renderer_base<pixfmt_type> rb(pixf);
+    rb.blend_from(pixf_mask,0,0,0,255);
+
+}
+
+}
+
+#endif // IMAGE_COMPOSITING_HPP
diff --git a/include/mapnik/image_data.hpp b/include/mapnik/image_data.hpp
index f16bb36..3b8de2b 100644
--- a/include/mapnik/image_data.hpp
+++ b/include/mapnik/image_data.hpp
@@ -31,112 +31,112 @@
 
 namespace mapnik 
 {
-    template <class T> class ImageData
-    {
-    public:
-        typedef T pixel_type;
+template <class T> class ImageData
+{
+public:
+    typedef T pixel_type;
         
-        ImageData(unsigned width,unsigned height)
-            : width_(width),
-              height_(height),
-              pData_((width!=0 && height!=0)? static_cast<T*>(::operator new(sizeof(T)*width*height)):0)
-        {
-           if (pData_) std::memset(pData_,0,sizeof(T)*width_*height_);
-        }
+    ImageData(unsigned width,unsigned height)
+        : width_(width),
+          height_(height),
+          pData_((width!=0 && height!=0)? static_cast<T*>(::operator new(sizeof(T)*width*height)):0)
+    {
+        if (pData_) std::memset(pData_,0,sizeof(T)*width_*height_);
+    }
           
-        ImageData(const ImageData<T>& rhs)
-            :width_(rhs.width_),
-             height_(rhs.height_),
-             pData_((rhs.width_!=0 && rhs.height_!=0)? 
-                    static_cast<T*>(::operator new(sizeof(T)*rhs.width_*rhs.height_)) :0)
-        {
-           if (pData_) std::memcpy(pData_,rhs.pData_,sizeof(T)*rhs.width_* rhs.height_);
-        }
-        inline T& operator() (unsigned i,unsigned j)
-        {
-            assert(i<width_ && j<height_);
-            return pData_[j*width_+i];
-        }
-        inline const T& operator() (unsigned i,unsigned j) const
-        {
-            assert(i<width_ && j<height_);
-            return pData_[j*width_+i];
-        }
-        inline unsigned width() const
-        {
-            return width_;
-        }
-        inline unsigned height() const
-        {
-            return height_;
-        }
-        inline void set(const T& t)
+    ImageData(const ImageData<T>& rhs)
+        :width_(rhs.width_),
+         height_(rhs.height_),
+         pData_((rhs.width_!=0 && rhs.height_!=0)? 
+                static_cast<T*>(::operator new(sizeof(T)*rhs.width_*rhs.height_)) :0)
+    {
+        if (pData_) std::memcpy(pData_,rhs.pData_,sizeof(T)*rhs.width_* rhs.height_);
+    }
+    inline T& operator() (unsigned i,unsigned j)
+    {
+        assert(i<width_ && j<height_);
+        return pData_[j*width_+i];
+    }
+    inline const T& operator() (unsigned i,unsigned j) const
+    {
+        assert(i<width_ && j<height_);
+        return pData_[j*width_+i];
+    }
+    inline unsigned width() const
+    {
+        return width_;
+    }
+    inline unsigned height() const
+    {
+        return height_;
+    }
+    inline void set(const T& t)
+    {
+        for (unsigned y = 0; y < height_; ++y)
         {
-            for (unsigned y = 0; y < height_; ++y)
+            T * row = getRow(y);    
+            for (unsigned x = 0; x < width_; ++x)
             {
-               T * row = getRow(y);    
-               for (unsigned x = 0; x < width_; ++x)
-               {
-                  row[x] = t;
-               }
+                row[x] = t;
             }
         }
+    }
         
-        inline const T* getData() const
-        {
-            return pData_;
-        }
+    inline const T* getData() const
+    {
+        return pData_;
+    }
 
-        inline T* getData()
-        {
-            return pData_;
-        }
+    inline T* getData()
+    {
+        return pData_;
+    }
 
-        inline const unsigned char* getBytes() const
-        {
-            return (unsigned char*)pData_;
-        }
-	
-        inline unsigned char* getBytes()
-        {
-            return (unsigned char*)pData_;
-        }
-	
-        inline const T* getRow(unsigned row) const
-        {
-            return pData_+row*width_;
-        }
+    inline const unsigned char* getBytes() const
+    {
+        return (unsigned char*)pData_;
+    }
+        
+    inline unsigned char* getBytes()
+    {
+        return (unsigned char*)pData_;
+    }
+        
+    inline const T* getRow(unsigned row) const
+    {
+        return pData_+row*width_;
+    }
           
-        inline T* getRow(unsigned row)
-        {
-            return pData_+row*width_;
-        }
+    inline T* getRow(unsigned row)
+    {
+        return pData_+row*width_;
+    }
           
-        inline void setRow(unsigned row,const T* buf,unsigned size)
-        {
-            assert(row<height_);
-            assert(size<=width_);
-            std::memcpy(pData_+row*width_,buf,size*sizeof(T));
-        }
-        inline void setRow(unsigned row,unsigned x0,unsigned x1,const T* buf)
-        {
-           std::memcpy(pData_+row*width_+x0,buf,(x1-x0)*sizeof(T));
-        }
+    inline void setRow(unsigned row,const T* buf,unsigned size)
+    {
+        assert(row<height_);
+        assert(size<=width_);
+        std::memcpy(pData_+row*width_,buf,size*sizeof(T));
+    }
+    inline void setRow(unsigned row,unsigned x0,unsigned x1,const T* buf)
+    {
+        std::memcpy(pData_+row*width_+x0,buf,(x1-x0)*sizeof(T));
+    }
 
-        inline ~ImageData()
-        {
-            ::operator delete(pData_),pData_=0;
-        }
+    inline ~ImageData()
+    {
+        ::operator delete(pData_),pData_=0;
+    }
         
-    private:
-          const unsigned width_;
-          const unsigned height_;
-          T *pData_;
-          ImageData& operator=(const ImageData&);
-    };
+private:
+    const unsigned width_;
+    const unsigned height_;
+    T *pData_;
+    ImageData& operator=(const ImageData&);
+};
 
-   typedef ImageData<unsigned> ImageData32;
-   typedef ImageData<byte>  ImageData8;
+typedef ImageData<unsigned> image_data_32;
+typedef ImageData<byte>  image_data_8;
 }
 
 #endif //IMAGE_DATA_HPP
diff --git a/include/mapnik/image_reader.hpp b/include/mapnik/image_reader.hpp
index 1d20d55..36074ea 100644
--- a/include/mapnik/image_reader.hpp
+++ b/include/mapnik/image_reader.hpp
@@ -33,33 +33,33 @@
 
 namespace mapnik 
 {
-    class ImageReaderException : public std::exception
-    {
-    private:
-        std::string message_;
-    public:
-        ImageReaderException(const std::string& message) 
-            : message_(message) {}
-
-        ~ImageReaderException() throw() {}
+class image_reader_exception : public std::exception
+{
+private:
+    std::string message_;
+public:
+    image_reader_exception(const std::string& message) 
+        : message_(message) {}
 
-        virtual const char* what() const throw()
-        {
-            return message_.c_str();
-        }
-    };
+    ~image_reader_exception() throw() {}
 
-    struct MAPNIK_DECL ImageReader
+    virtual const char* what() const throw()
     {
-        virtual unsigned width() const=0;
-        virtual unsigned height() const=0;
-        virtual void read(unsigned x,unsigned y,ImageData32& image)=0;
-        virtual ~ImageReader() {}
-    };
+        return message_.c_str();
+    }
+};
+
+struct MAPNIK_DECL image_reader
+{
+    virtual unsigned width() const=0;
+    virtual unsigned height() const=0;
+    virtual void read(unsigned x,unsigned y,image_data_32& image)=0;
+    virtual ~image_reader() {}
+};
 
-   bool register_image_reader(const std::string& type,ImageReader* (*)(const std::string&));
-   MAPNIK_DECL ImageReader* get_image_reader(const std::string& file,const std::string& type);
-   MAPNIK_DECL ImageReader* get_image_reader(const std::string& file);
+bool register_image_reader(const std::string& type,image_reader* (*)(const std::string&));
+MAPNIK_DECL image_reader* get_image_reader(const std::string& file,const std::string& type);
+MAPNIK_DECL image_reader* get_image_reader(const std::string& file);
    
 }
 
diff --git a/include/mapnik/image_util.hpp b/include/mapnik/image_util.hpp
index 197b71e..e841c98 100644
--- a/include/mapnik/image_util.hpp
+++ b/include/mapnik/image_util.hpp
@@ -27,482 +27,258 @@
 
 // mapnik
 #include <mapnik/config.hpp>
-#include <mapnik/map.hpp>
 #include <mapnik/graphics.hpp>
+#include <mapnik/palette.hpp>
 
 // boost
 #include <boost/algorithm/string.hpp>
-#include <boost/lexical_cast.hpp>
+#include <boost/optional.hpp>
+
 // stl
 #include <string>
 
 namespace mapnik {
-    
-    class ImageWriterException : public std::exception
+
+class Map;    
+class ImageWriterException : public std::exception
+{
+private:
+    std::string message_;
+public:
+    ImageWriterException(const std::string& message) 
+        : message_(message) {}
+
+    ~ImageWriterException() throw() {}
+
+    virtual const char* what() const throw()
     {
-    private:
-        std::string message_;
-    public:
-        ImageWriterException(const std::string& message) 
-            : message_(message) {}
-
-        ~ImageWriterException() throw() {}
-
-        virtual const char* what() const throw()
-        {
-            return message_.c_str();
-        }
-    };
-
-   MAPNIK_DECL void save_to_cairo_file(mapnik::Map const& map,
-                                        std::string const& filename,
-                                        std::string const& type);
-
-   template <typename T>
-   MAPNIK_DECL void save_to_file(T const& image,
-                                 std::string const& filename,
-                                 std::string const& type);
-   // guess type from file extension
-   template <typename T>
-   MAPNIK_DECL void save_to_file(T const& image,
-                                 std::string const& filename);
-   
-   template <typename T>
-   MAPNIK_DECL std::string save_to_string(T const& image,
-                                 std::string const& type);
+        return message_.c_str();
+    }
+};
+
+#if defined(HAVE_CAIRO)
+MAPNIK_DECL void save_to_cairo_file(mapnik::Map const& map,
+                                    std::string const& filename,
+                                    std::string const& type);
+#endif
 
-   template <typename T>
-   void save_as_png(T const& image,
-                    std::string const& filename);
-   
-   template <typename T>
-   void save_as_jpeg(std::string const& filename,
-                     int quality,
-                     T const& image);
-   
-   inline bool is_png (std::string const& filename)
-   {
-      return boost::algorithm::iends_with(filename,std::string(".png"));
-   }
-   
-   inline bool is_jpeg (std::string const& filename)
-   {
-      return boost::algorithm::iends_with(filename,std::string(".jpg")) ||
-         boost::algorithm::iends_with(filename,std::string(".jpeg"));
-   }
-   
-   inline bool is_tiff (std::string const& filename)
-   {
-      return boost::algorithm::iends_with(filename,std::string(".tif")) ||
-         boost::algorithm::iends_with(filename,std::string(".tiff"));
-   }
-
-   inline bool is_pdf (std::string const& filename)
-   {
-      return boost::algorithm::iends_with(filename,std::string(".pdf"));
-   }
-
-   inline bool is_svg (std::string const& filename)
-   {
-      return boost::algorithm::iends_with(filename,std::string(".svg"));
-   }
-
-   inline bool is_ps (std::string const& filename)
-   {
-      return boost::algorithm::iends_with(filename,std::string(".ps"));
-   }
-      
-   inline std::string type_from_filename(std::string const& filename)
-   {
-      if (is_png(filename)) return "png";
-      if (is_jpeg(filename)) return "jpeg";
-      if (is_tiff(filename)) return "tiff";
-      if (is_pdf(filename)) return "pdf";
-      if (is_svg(filename)) return "svg";
-      if (is_ps(filename)) return "ps";
-      return "unknown";
-   }
-
-   inline std::string guess_type( const std::string & filename )
-   {
-      std::string::size_type idx = filename.find_last_of(".");
-      if ( idx != std::string::npos ) {
-          return filename.substr( idx + 1 );
-      }
-      return "<unknown>";
-   }
-       
-   template <typename T>
-   double distance(T x0,T y0,T x1,T y1)
-   {
-      double dx = x1-x0;
-      double dy = y1-y0;
-      return std::sqrt(dx * dx + dy * dy);
-   }
-   
-   template <typename Image>
-   inline void scale_down2(Image& target,const Image& source)
-   {
-      int source_width=source.width();
-      int source_height=source.height();
-      
-      int target_width=target.width();
-      int target_height=target.height();
-      if (target_width<source_width/2 || target_height<source_height/2)
-         return;
-      int y1,x1;
-      for (int y=0;y<target_height;++y)
-      {
-         y1=2*y;
-         for(int x=0;x<target_width;++x)
-         {
-            x1=2*x;
-            //todo calculate average???
-            target(x,y)=source(x1,y1);
-         }
-      }
-   }
-   
-   template <typename Image,int scale>
-   struct image_op
-   {
-         static void scale_up(Image& target,const Image& source)
-         {
-            if (scale<3) return;
-            int source_width=source.width();
-            int source_height=source.height();
-            
-            int target_width=target.width();
-            int target_height=target.height();
-            if (target_width<scale*source_width || target_height<scale*source_height)
-               return;
-            for (int y=0;y<source_height;++y)
-            {
-               for(int x=0;x<source_width;++x)
-               {
-                  unsigned p=source(x,y);
-                  for (int i=0;i<scale;++i)
-                     for (int j=0;j<scale;++j)
-                        target(scale*x+i,scale*y+j)=p;
-               }
-            }
-         }
-   };
-
-   template <typename Image>
-   struct image_op<Image,2>
-   {
-         static void scale_up(Image& target,const Image& source)
-         {
-            int source_width=source.width();
-            int source_height=source.height();
-            
-            int target_width=target.width();
-            int target_height=target.height();
-            if (target_width<2*source_width || target_height<2*source_height)
-               return;
-            for (int y=0;y<source_height;++y)
-            {
-               for(int x=0;x<source_width;++x)
-               {
-                  target(2*x,2*y)=source(x,y);
-                  target(2*x+1,2*y)=source(x,y);
-                  target(2*x+1,2*y+1)=source(x,y);
-                  target(2*x,2*y+1)=source(x,y);
-               }
-            }
-         }
-   };
+template <typename T>
+MAPNIK_DECL void save_to_file(T const& image,
+                              std::string const& filename,
+                              std::string const& type);
+
+template <typename T>
+MAPNIK_DECL void save_to_file(T const& image,
+                              std::string const& filename,
+                              std::string const& type,
+                              rgba_palette const& palette);
+                              
+// guess type from file extension
+template <typename T>
+MAPNIK_DECL void save_to_file(T const& image,
+                              std::string const& filename);
+
+template <typename T>
+MAPNIK_DECL void save_to_file(T const& image,
+                              std::string const& filename,
+                              rgba_palette const& palette);
    
-   namespace
-   {
-      template <typename Image>
-      inline void scale_up(Image& target,const Image& source,unsigned scale)
-      {
-         int source_width=source.width();
-         int source_height=source.height();
-
-         int target_width=target.width();
-         int target_height=target.height();
-         if (target_width<scale*source_width || target_height<scale*source_height)
-            return;
-         for (int y=0;y<source_height;++y)
-         {
-            for(int x=0;x<source_width;++x)
-            {
-               unsigned p=source(x,y);
-               for (int i=0;i<scale;++i)
-                  for (int j=0;j<scale;++j)
-                     target(scale*x+i,scale*y+j)=p;
-            }
-         }
-      }
-   }
-    
-   template <typename Image>
-   void scale_image(Image& target,const Image& source,unsigned scale)
-   {
-      if (scale==2)
-      {
-         image_op<Image,2>::scale_up(target,source);
-      }
-      else
-      {
-         scale_up<Image>(target,source,scale);
-      }
-   }
-
-   template <typename Image>
-   inline void scale_image (Image& target,const Image& source)
-   {
-
-      int source_width=source.width();
-      int source_height=source.height();
-
-      int target_width=target.width();
-      int target_height=target.height();
-
-      if (source_width<1 || source_height<1 ||
-          target_width<1 || target_height<1) return;
-      int int_part_y=source_height/target_height;
-      int fract_part_y=source_height%target_height;
-      int err_y=0;
-      int int_part_x=source_width/target_width;
-      int fract_part_x=source_width%target_width;
-      int err_x=0;
-      int x=0,y=0,xs=0,ys=0;
-      int prev_y=-1;
-      for (y=0;y<target_height;++y)
-      {
-         if (ys==prev_y)
-         {
-            target.setRow(y,target.getRow(y-1),target_width);
-         }
-         else
-         {
-            xs=0;
-            for (x=0;x<target_width;++x)
-            {
-               target(x,y)=source(xs,ys);
-               xs+=int_part_x;
-               err_x+=fract_part_x;
-               if (err_x>=target_width)
-               {
-                  err_x-=target_width;
-                  ++xs;
-               }
-            }
-            prev_y=ys;
-         }
-         ys+=int_part_y;
-         err_y+=fract_part_y;
-         if (err_y>=target_height)
-         {
-            err_y-=target_height;
-            ++ys;
-         }
-      }
-   }
-   
-   template <typename Image>
-   inline void scale_image_bilinear (Image& target,const Image& source, double x_off_f=0, double y_off_f=0)
-   {
-
-      int source_width=source.width();
-      int source_height=source.height();
-
-      int target_width=target.width();
-      int target_height=target.height();
-
-      if (source_width<1 || source_height<1 ||
-          target_width<1 || target_height<1) return;
-      int x=0,y=0,xs=0,ys=0;
-      int tw2 = target_width/2;
-      int th2 = target_height/2;
-      int offs_x = rint((source_width-target_width-x_off_f*2*source_width)/2);
-      int offs_y = rint((source_height-target_height-y_off_f*2*source_height)/2);
-      unsigned yprt, yprt1, xprt, xprt1;
-
-      //no scaling or subpixel offset
-      if (target_height == source_height && target_width == source_width && offs_x == 0 && offs_y == 0){
-         for (y=0;y<target_height;++y)
-            target.setRow(y,source.getRow(y),target_width);
-         return;
-      }
-
-      for (y=0;y<target_height;++y)
-      {
-        ys = (y*source_height+offs_y)/target_height;
-        int ys1 = ys+1;
-        if (ys1>=source_height)
-            ys1--;
-        if (ys<0)
-            ys=ys1=0;
-        if (source_height/2<target_height)
-           yprt = (y*source_height+offs_y)%target_height;
-        else
-           yprt = th2;
-        yprt1 = target_height-yprt;
-        for (x=0;x<target_width;++x)
-        {
-            xs = (x*source_width+offs_x)/target_width;
-            if (source_width/2<target_width)
-               xprt = (x*source_width+offs_x)%target_width;
-            else
-               xprt = tw2;
-            xprt1 = target_width-xprt;
-            int xs1 = xs+1;
-            if (xs1>=source_width)
-                xs1--;
-            if (xs<0)
-                xs=xs1=0;
-
-            unsigned a = source(xs,ys);
-            unsigned b = source(xs1,ys);
-            unsigned c = source(xs,ys1);
-            unsigned d = source(xs1,ys1);
-            unsigned out=0;
-            unsigned t = 0;
-
-            for(int i=0; i<4; i++){
-                unsigned p,r,s;
-                // X axis
-                p = a&0xff;
-                r = b&0xff;
-                if (p!=r)
-                    r = (r*xprt+p*xprt1+tw2)/target_width;
-                p = c&0xff;
-                s = d&0xff;
-                if (p!=s)
-                    s = (s*xprt+p*xprt1+tw2)/target_width;
-                // Y axis
-                if (r!=s)
-                    r = (s*yprt+r*yprt1+th2)/target_height;
-                // channel up
-                out |= r << t;
-                t += 8;
-                a >>= 8;
-                b >>= 8;
-                c >>= 8;
-                d >>= 8;
-            }
-            target(x,y)=out;
-        }
-     }
-   }
-
-   template <typename Image>
-   inline void scale_image_bilinear8 (Image& target,const Image& source, double x_off_f=0, double y_off_f=0)
-   {
-
-      int source_width=source.width();
-      int source_height=source.height();
-
-      int target_width=target.width();
-      int target_height=target.height();
-
-      if (source_width<1 || source_height<1 ||
-          target_width<1 || target_height<1) return;
-      int x=0,y=0,xs=0,ys=0;
-      int tw2 = target_width/2;
-      int th2 = target_height/2;
-      int offs_x = rint((source_width-target_width-x_off_f*2*source_width)/2);
-      int offs_y = rint((source_height-target_height-y_off_f*2*source_height)/2);
-      unsigned yprt, yprt1, xprt, xprt1;
-
-      //no scaling or subpixel offset
-      if (target_height == source_height && target_width == source_width && offs_x == 0 && offs_y == 0){
-         for (y=0;y<target_height;++y)
-            target.setRow(y,source.getRow(y),target_width);
-         return;
-      }
-
-      for (y=0;y<target_height;++y)
-      {
-        ys = (y*source_height+offs_y)/target_height;
-        int ys1 = ys+1;
-        if (ys1>=source_height)
-            ys1--;
-        if (ys<0)
-            ys=ys1=0;
-        if (source_height/2<target_height)
-           yprt = (y*source_height+offs_y)%target_height;
-        else
-           yprt = th2;
-        yprt1 = target_height-yprt;
-        for (x=0;x<target_width;++x)
-        {
-            xs = (x*source_width+offs_x)/target_width;
-            if (source_width/2<target_width)
-               xprt = (x*source_width+offs_x)%target_width;
-            else
-               xprt = tw2;
-            xprt1 = target_width-xprt;
-            int xs1 = xs+1;
-            if (xs1>=source_width)
-                xs1--;
-            if (xs<0)
-                xs=xs1=0;
-
-            unsigned a = source(xs,ys);
-            unsigned b = source(xs1,ys);
-            unsigned c = source(xs,ys1);
-            unsigned d = source(xs1,ys1);
-            unsigned p,r,s;
-            // X axis
-            p = a&0xff;
-            r = b&0xff;
-            if (p!=r)
-                r = (r*xprt+p*xprt1+tw2)/target_width;
-            p = c&0xff;
-            s = d&0xff;
-            if (p!=s)
-                s = (s*xprt+p*xprt1+tw2)/target_width;
-            // Y axis
-            if (r!=s)
-                r = (s*yprt+r*yprt1+th2)/target_height;
-            target(x,y)=(0xff<<24) | (r<<16) | (r<<8) | r;
-        }
-     }
-   }
-
-   inline MAPNIK_DECL void save_to_file (Image32 const& image,
-                                         std::string const& file,
-                                         std::string const& type) 
-   {
-      save_to_file<ImageData32>(image.data(),file,type);
-   }
+template <typename T>
+MAPNIK_DECL std::string save_to_string(T const& image,
+                                       std::string const& type);
+
+template <typename T>
+MAPNIK_DECL std::string save_to_string(T const& image,
+                                       std::string const& type,
+                                       rgba_palette const& palette);
+
+template <typename T>
+void save_as_png(T const& image,
+                 std::string const& filename,
+                 rgba_palette const& palette);
+
+#if defined(HAVE_JPEG)
+template <typename T>
+void save_as_jpeg(std::string const& filename,
+                  int quality,
+                  T const& image);
+#endif
+
+inline bool is_png (std::string const& filename)
+{
+    return boost::algorithm::iends_with(filename,std::string(".png"));
+}
+
+inline bool is_jpeg (std::string const& filename)
+{
+    return boost::algorithm::iends_with(filename,std::string(".jpg")) ||
+        boost::algorithm::iends_with(filename,std::string(".jpeg"));
+}
+
+inline bool is_tiff (std::string const& filename)
+{
+    return boost::algorithm::iends_with(filename,std::string(".tif")) ||
+        boost::algorithm::iends_with(filename,std::string(".tiff"));
+}
+
+inline bool is_pdf (std::string const& filename)
+{
+    return boost::algorithm::iends_with(filename,std::string(".pdf"));
+}
+
+inline bool is_svg (std::string const& filename)
+{
+    return boost::algorithm::iends_with(filename,std::string(".svg"));
+}
+
+inline bool is_ps (std::string const& filename)
+{
+    return boost::algorithm::iends_with(filename,std::string(".ps"));
+}
    
-   inline MAPNIK_DECL void save_to_file(Image32 const& image,
-                                        std::string const& file) 
-   {
-      save_to_file<ImageData32>(image.data(),file);
-   }
-
-   inline MAPNIK_DECL std::string save_to_string(Image32 const& image,
-                                        std::string const& type)
-   {
-      return save_to_string<ImageData32>(image.data(),type);
-   }
+inline boost::optional<std::string> type_from_filename(std::string const& filename)
+
+{
+    typedef boost::optional<std::string> result_type;
+    if (is_png(filename)) return result_type("png");
+    if (is_jpeg(filename)) return result_type("jpeg");
+    if (is_tiff(filename)) return result_type("tiff");
+    if (is_pdf(filename)) return result_type("pdf");
+    if (is_svg(filename)) return result_type("svg");
+    if (is_ps(filename)) return result_type("ps");
+    return result_type();
+}
+
+inline std::string guess_type( const std::string & filename )
+{
+    std::string::size_type idx = filename.find_last_of(".");
+    if ( idx != std::string::npos ) {
+        return filename.substr( idx + 1 );
+    }
+    return "<unknown>";
+}
+
+template <typename T>
+double distance(T x0,T y0,T x1,T y1)
+{
+    double dx = x1-x0;
+    double dy = y1-y0;
+    return std::sqrt(dx * dx + dy * dy);
+}
+
+
+// add 1-px border around image - useful for debugging alignment issues
+template <typename T>
+void add_border(T & image)
+{
+    for (unsigned  x = 0; x < image.width();++x)
+    {
+        image(x,0) = 0xff0000ff; // red
+        image(x,image.height()-1) = 0xff00ff00; //green
+    }
+    for (unsigned y = 0; y < image.height();++y)
+    {
+        image(0,y) = 0xff00ffff; //yellow 
+        image(image.width()-1,y) = 0xffff0000; // blue
+    }
+}
+
+// IMAGE SCALING
+enum scaling_method_e
+{
+    SCALING_NEAR=0,
+    SCALING_BILINEAR=1,
+    SCALING_BICUBIC=2,
+    SCALING_SPLINE16=3,
+    SCALING_SPLINE36=4,
+    SCALING_HANNING=5,
+    SCALING_HAMMING=6,
+    SCALING_HERMITE=7,
+    SCALING_KAISER=8,
+    SCALING_QUADRIC=9,
+    SCALING_CATROM=10,
+    SCALING_GAUSSIAN=11,
+    SCALING_BESSEL=12,
+    SCALING_MITCHELL=13,
+    SCALING_SINC=14,
+    SCALING_LANCZOS=15,
+    SCALING_BLACKMAN=16
+};
+
+scaling_method_e get_scaling_method_by_name (std::string name);
+
+template <typename Image>
+void scale_image_agg (Image& target,const Image& source, scaling_method_e scaling_method, double scale_factor, double x_off_f=0, double y_off_f=0, double filter_radius=2, double ratio=1);
+
+template <typename Image>
+void scale_image_bilinear_old (Image& target,const Image& source, double x_off_f=0, double y_off_f=0);
+
+template <typename Image>
+void scale_image_bilinear8 (Image& target,const Image& source, double x_off_f=0, double y_off_f=0);
+
+/////////// save_to_file ////////////////////////////////////////////////    
+
+inline MAPNIK_DECL void save_to_file(image_32 const& image,
+                                     std::string const& file)
+{
+    save_to_file<image_data_32>(image.data(), file);
+}
+
+inline MAPNIK_DECL void save_to_file (image_32 const& image,
+                                      std::string const& file,
+                                      std::string const& type)
+{
+    save_to_file<image_data_32>(image.data(), file, type);
+}
+
+inline MAPNIK_DECL void save_to_file (image_32 const& image,
+                                      std::string const& file,
+                                      std::string const& type,
+                                      rgba_palette const& palette)
+{
+    save_to_file<image_data_32>(image.data(), file, type, palette);
+}
+
+//////////////////////////////////////////////////////////////////////////
+
+
+inline MAPNIK_DECL std::string save_to_string(image_32 const& image,
+                                              std::string const& type)
+{
+    return save_to_string<image_data_32>(image.data(), type);
+}
+
+inline MAPNIK_DECL std::string save_to_string(image_32 const& image,
+                                              std::string const& type,
+                                              rgba_palette const& palette)
+{
+    return save_to_string<image_data_32>(image.data(), type, palette);
+}
    
 #ifdef _MSC_VER
-   template MAPNIK_DECL void save_to_file<ImageData32>(ImageData32 const&,
-                                                       std::string const&,
-                                                       std::string const&);
-   template MAPNIK_DECL void save_to_file<ImageData32>(ImageData32 const&,
-                                                       std::string const&);
-   template MAPNIK_DECL std::string save_to_string<ImageData32>(ImageData32 const&,
-                                                       std::string const&);
+template MAPNIK_DECL void save_to_file<image_data_32>(image_data_32 const&,
+                                                      std::string const&,
+                                                      std::string const&,
+                                                      rgba_palette const&);
+template MAPNIK_DECL void save_to_file<image_data_32>(image_data_32 const&,
+                                                      std::string const&,
+                                                      rgba_palette const&);
+template MAPNIK_DECL std::string save_to_string<image_data_32>(image_data_32 const&,
+                                                               std::string const&,
+                                                               rgba_palette const&);
    
-   template MAPNIK_DECL void save_to_file<image_view<ImageData32> > (image_view<ImageData32> const&,
-                                                                     std::string const&,
-                                                                     std::string const&);
+template MAPNIK_DECL void save_to_file<image_view<image_data_32> > (image_view<image_data_32> const&,
+                                                                    std::string const&,
+                                                                    std::string const&,
+                                                                    rgba_palette const&);
  
-   template MAPNIK_DECL void save_to_file<image_view<ImageData32> > (image_view<ImageData32> const&,
-                                                                     std::string const&);
+template MAPNIK_DECL void save_to_file<image_view<image_data_32> > (image_view<image_data_32> const&,
+                                                                    std::string const&,
+                                                                    rgba_palette const&);
    
-   template MAPNIK_DECL std::string save_to_string<image_view<ImageData32> > (image_view<ImageData32> const&,
-                                                                     std::string const&);
+template MAPNIK_DECL std::string save_to_string<image_view<image_data_32> > (image_view<image_data_32> const&,
+                                                                             std::string const&,
+                                                                             rgba_palette const&);
 #endif
 
 }
diff --git a/include/mapnik/image_view.hpp b/include/mapnik/image_view.hpp
index 11bcd9e..45498b2 100644
--- a/include/mapnik/image_view.hpp
+++ b/include/mapnik/image_view.hpp
@@ -28,83 +28,83 @@
 
 namespace mapnik {
     
-   template <typename T> 
-   class image_view  
-   {
-      public:
-         typedef typename T::pixel_type pixel_type;
+template <typename T> 
+class image_view  
+{
+public:
+    typedef typename T::pixel_type pixel_type;
           
-         image_view(unsigned x, unsigned y, unsigned width, unsigned height, T const& data)
-            : x_(x),
-              y_(y),
-              width_(width),
-              height_(height),
-              data_(data) 
-         {
-            if (x_ >= data_.width()) x_=data_.width()-1;
-            if (y_ >= data_.height()) x_=data_.height()-1;
-            if (x_ + width_ > data_.width()) width_= data_.width() - x_;
-            if (y_ + height_ > data_.height()) height_= data_.height() - y_;
-         }
+    image_view(unsigned x, unsigned y, unsigned width, unsigned height, T const& data)
+        : x_(x),
+          y_(y),
+          width_(width),
+          height_(height),
+          data_(data) 
+    {
+        if (x_ >= data_.width()) x_=data_.width()-1;
+        if (y_ >= data_.height()) x_=data_.height()-1;
+        if (x_ + width_ > data_.width()) width_= data_.width() - x_;
+        if (y_ + height_ > data_.height()) height_= data_.height() - y_;
+    }
         
-         ~image_view() {}
+    ~image_view() {}
         
-         image_view(image_view<T> const& rhs)
-            : x_(rhs.x_),
-              y_(rhs.y_),
-              width_(rhs.width_),
-              height_(rhs.height_),
-              data_(rhs.data_) {}
+    image_view(image_view<T> const& rhs)
+        : x_(rhs.x_),
+          y_(rhs.y_),
+          width_(rhs.width_),
+          height_(rhs.height_),
+          data_(rhs.data_) {}
         
-         image_view<T> & operator=(image_view<T> const& rhs)
-         {
-            if (&rhs==this) return *this;
-            x_ = rhs.x_;
-            y_ = rhs.y_;
-            width_ = rhs.width_;
-            height_ = rhs.height_;
-            data_ = rhs.data_;
-         }
+    image_view<T> & operator=(image_view<T> const& rhs)
+    {
+        if (&rhs==this) return *this;
+        x_ = rhs.x_;
+        y_ = rhs.y_;
+        width_ = rhs.width_;
+        height_ = rhs.height_;
+        data_ = rhs.data_;
+    }
         
-         inline unsigned x() const
-         {
-            return x_;
-         }
+    inline unsigned x() const
+    {
+        return x_;
+    }
 
-         inline unsigned y() const
-         {
-            return y_;
-         }
+    inline unsigned y() const
+    {
+        return y_;
+    }
         
-         inline unsigned width() const
-         {
-            return width_;
-         }
-         inline unsigned height() const
-         {
-            return height_;
-         }
+    inline unsigned width() const
+    {
+        return width_;
+    }
+    inline unsigned height() const
+    {
+        return height_;
+    }
         
-         inline const pixel_type* getRow(unsigned row) const
-         {
-            return data_.getRow(row + y_) + x_;
-         }
-         inline T& data()
-         {
-            return data_;
-         }
-         inline T const& data() const
-         {
-            return data_;
-         }
+    inline const pixel_type* getRow(unsigned row) const
+    {
+        return data_.getRow(row + y_) + x_;
+    }
+    inline T& data()
+    {
+        return data_;
+    }
+    inline T const& data() const
+    {
+        return data_;
+    }
           
-      private:
-         unsigned x_;
-         unsigned y_;
-         unsigned width_;
-         unsigned height_;
-         T const& data_;
-   };
+private:
+    unsigned x_;
+    unsigned y_;
+    unsigned width_;
+    unsigned height_;
+    T const& data_;
+};
 }
 
 #endif // IMAGE_VIEW_HPP
diff --git a/include/mapnik/jpeg_io.hpp b/include/mapnik/jpeg_io.hpp
index 0bc8555..33a7fba 100644
--- a/include/mapnik/jpeg_io.hpp
+++ b/include/mapnik/jpeg_io.hpp
@@ -22,6 +22,11 @@
 
 //$Id$
 
+#ifndef MAPNIK_JPEG_IO_HPP
+#define MAPNIK_JPEG_IO_HPP
+
+#if defined(HAVE_JPEG)
+
 #include <mapnik/global.hpp>
 
 extern "C"
@@ -33,79 +38,79 @@ namespace mapnik {
 
 #define BUFFER_SIZE 4096
    
-   typedef struct  
-   {
-         struct jpeg_destination_mgr pub;
-         std::ostream * out;
-         JOCTET * buffer;
-   } dest_mgr;
+typedef struct  
+{
+    struct jpeg_destination_mgr pub;
+    std::ostream * out;
+    JOCTET * buffer;
+} dest_mgr;
    
-   inline void init_destination( j_compress_ptr cinfo)
-   {
-      dest_mgr * dest = reinterpret_cast<dest_mgr*>(cinfo->dest);
-      dest->buffer = (JOCTET*) (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-                                                           BUFFER_SIZE * sizeof(JOCTET));
-      dest->pub.next_output_byte = dest->buffer;
-      dest->pub.free_in_buffer = BUFFER_SIZE;
-   }
+inline void init_destination( j_compress_ptr cinfo)
+{
+    dest_mgr * dest = reinterpret_cast<dest_mgr*>(cinfo->dest);
+    dest->buffer = (JOCTET*) (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                                                         BUFFER_SIZE * sizeof(JOCTET));
+    dest->pub.next_output_byte = dest->buffer;
+    dest->pub.free_in_buffer = BUFFER_SIZE;
+}
 
-   inline boolean empty_output_buffer (j_compress_ptr cinfo)
-   {
-      dest_mgr * dest = reinterpret_cast<dest_mgr*>(cinfo->dest);
-      dest->out->write((char*)dest->buffer, BUFFER_SIZE);
-      if (!*(dest->out)) return false;
-      dest->pub.next_output_byte = dest->buffer;
-      dest->pub.free_in_buffer = BUFFER_SIZE;
-      return true;
-   }
+inline boolean empty_output_buffer (j_compress_ptr cinfo)
+{
+    dest_mgr * dest = reinterpret_cast<dest_mgr*>(cinfo->dest);
+    dest->out->write((char*)dest->buffer, BUFFER_SIZE);
+    if (!*(dest->out)) return false;
+    dest->pub.next_output_byte = dest->buffer;
+    dest->pub.free_in_buffer = BUFFER_SIZE;
+    return true;
+}
    
-   inline void term_destination( j_compress_ptr cinfo)
-   {
-      dest_mgr * dest = reinterpret_cast<dest_mgr*>(cinfo->dest);
-      size_t size  = BUFFER_SIZE - dest->pub.free_in_buffer;
-      if (size > 0) 
-      {
-         dest->out->write((char*)dest->buffer, size);
-      }
-      dest->out->flush();
-   }
+inline void term_destination( j_compress_ptr cinfo)
+{
+    dest_mgr * dest = reinterpret_cast<dest_mgr*>(cinfo->dest);
+    size_t size  = BUFFER_SIZE - dest->pub.free_in_buffer;
+    if (size > 0) 
+    {
+        dest->out->write((char*)dest->buffer, size);
+    }
+    dest->out->flush();
+}
    
-   template <typename T1, typename T2>
-   void save_as_jpeg(T1 & file,int quality, T2 const& image)
-   {  
-      struct jpeg_compress_struct cinfo;
-      struct jpeg_error_mgr jerr;
+template <typename T1, typename T2>
+void save_as_jpeg(T1 & file,int quality, T2 const& image)
+{  
+    struct jpeg_compress_struct cinfo;
+    struct jpeg_error_mgr jerr;
 
-      int width=image.width();
-      int height=image.height();
-	
-      cinfo.err = jpeg_std_error(&jerr);
-      jpeg_create_compress(&cinfo);
+    int width=image.width();
+    int height=image.height();
+        
+    cinfo.err = jpeg_std_error(&jerr);
+    jpeg_create_compress(&cinfo);
     
-      cinfo.dest = (struct jpeg_destination_mgr *)(*cinfo.mem->alloc_small)
-         ((j_common_ptr) &cinfo, JPOOL_PERMANENT, sizeof(dest_mgr));
-      dest_mgr * dest = (dest_mgr*) cinfo.dest;
-      dest->pub.init_destination = init_destination;
-      dest->pub.empty_output_buffer = empty_output_buffer;
-      dest->pub.term_destination = term_destination;
-      dest->out = &file;
+    cinfo.dest = (struct jpeg_destination_mgr *)(*cinfo.mem->alloc_small)
+        ((j_common_ptr) &cinfo, JPOOL_PERMANENT, sizeof(dest_mgr));
+    dest_mgr * dest = (dest_mgr*) cinfo.dest;
+    dest->pub.init_destination = init_destination;
+    dest->pub.empty_output_buffer = empty_output_buffer;
+    dest->pub.term_destination = term_destination;
+    dest->out = &file;
       
-      //jpeg_stdio_dest(&cinfo, fp);
-      cinfo.image_width = width;
-      cinfo.image_height = height;
-      cinfo.input_components = 3;
-      cinfo.in_color_space = JCS_RGB; 
-      jpeg_set_defaults(&cinfo);
-      jpeg_set_quality(&cinfo, quality,1);
-      jpeg_start_compress(&cinfo, 1);
-      JSAMPROW row_pointer[1];
-      JSAMPLE* row=reinterpret_cast<JSAMPLE*>( ::operator new (sizeof(JSAMPLE) * width*3));
-      while (cinfo.next_scanline < cinfo.image_height) 
-      {
-         const unsigned* imageRow=image.getRow(cinfo.next_scanline);
-         int index=0;
-         for (int i=0;i<width;++i)
-         {
+    //jpeg_stdio_dest(&cinfo, fp);
+    cinfo.image_width = width;
+    cinfo.image_height = height;
+    cinfo.input_components = 3;
+    cinfo.in_color_space = JCS_RGB; 
+    jpeg_set_defaults(&cinfo);
+    jpeg_set_quality(&cinfo, quality,1);
+    jpeg_start_compress(&cinfo, 1);
+    JSAMPROW row_pointer[1];
+    JSAMPLE* row=reinterpret_cast<JSAMPLE*>( ::operator new (sizeof(JSAMPLE) * width*3));
+    while (cinfo.next_scanline < cinfo.image_height) 
+    {
+        const unsigned* imageRow=image.getRow(cinfo.next_scanline);
+        int index=0;
+        for (int i=0;i<width;++i)
+        {
 #ifdef MAPNIK_BIG_ENDIAN
             row[index++]=(imageRow[i]>>24)&0xff;
             row[index++]=(imageRow[i]>>16)&0xff;
@@ -115,13 +120,18 @@ namespace mapnik {
             row[index++]=(imageRow[i]>>8)&0xff;
             row[index++]=(imageRow[i]>>16)&0xff;
 #endif
-         }
-         row_pointer[0] = &row[0];
-         (void) jpeg_write_scanlines(&cinfo, row_pointer, 1);
-      }
-      ::operator delete(row);
+        }
+        row_pointer[0] = &row[0];
+        (void) jpeg_write_scanlines(&cinfo, row_pointer, 1);
+    }
+    ::operator delete(row);
       
-      jpeg_finish_compress(&cinfo);
-      jpeg_destroy_compress(&cinfo);
-   }  
+    jpeg_finish_compress(&cinfo);
+    jpeg_destroy_compress(&cinfo);
+}  
 }
+
+#endif
+
+#endif // MAPNIK_JPEG_IO_HPP
+
diff --git a/include/mapnik/label_collision_detector.hpp b/include/mapnik/label_collision_detector.hpp
index cedde6c..f52d394 100644
--- a/include/mapnik/label_collision_detector.hpp
+++ b/include/mapnik/label_collision_detector.hpp
@@ -22,211 +22,209 @@
 
 //$Id$
 
-#if !defined LABEL_COLLISION_DETECTOR
-#define LABEL_COLLISION_DETECTOR
+#ifndef LABEL_COLLISION_DETECTOR_HPP
+#define LABEL_COLLISION_DETECTOR_HPP
+
 // mapnik
 #include <mapnik/quad_tree.hpp>
-#include <mapnik/value.hpp>
 // stl
 #include <vector>
 #include <unicode/unistr.h>
 
 namespace mapnik
 {
-   //this needs to be tree structure 
-   //as a proof of a concept _only_ we use sequential scan 
+//this needs to be tree structure 
+//as a proof of a concept _only_ we use sequential scan 
 
-   struct label_collision_detector
-   {
-      typedef std::vector<Envelope<double> > label_placements;
+struct label_collision_detector
+{
+    typedef std::vector<box2d<double> > label_placements;
 
-      bool has_plasement(Envelope<double> const& box)
-      {
-         label_placements::const_iterator itr=labels_.begin();
-         for( ; itr !=labels_.end();++itr)
-         {
+    bool has_plasement(box2d<double> const& box)
+    {
+        label_placements::const_iterator itr=labels_.begin();
+        for( ; itr !=labels_.end();++itr)
+        {
             if (itr->intersects(box))
             {
-               return false;
+                return false;
             }
-         }
-         labels_.push_back(box);
-         return true;
-      }
-      void clear()
-      {
-         labels_.clear();
-      }
+        }
+        labels_.push_back(box);
+        return true;
+    }
+    void clear()
+    {
+        labels_.clear();
+    }
           
-   private:
+private:
 
-      label_placements labels_;
-   };
+    label_placements labels_;
+};
 
-   // quad_tree based label collision detector
-   class label_collision_detector2 : boost::noncopyable
-   {
-      typedef quad_tree<Envelope<double> > tree_t;
-      tree_t tree_;
-   public:
+// quad_tree based label collision detector
+class label_collision_detector2 : boost::noncopyable
+{
+    typedef quad_tree<box2d<double> > tree_t;
+    tree_t tree_;
+public:
          
-      explicit label_collision_detector2(Envelope<double> const& extent)
-         : tree_(extent) {}
-	
-      bool has_placement(Envelope<double> const& box)
-      {
-         tree_t::query_iterator itr = tree_.query_in_box(box);
-         tree_t::query_iterator end = tree_.query_end();
-	    
-         for ( ;itr != end; ++itr)
-         {
+    explicit label_collision_detector2(box2d<double> const& extent)
+        : tree_(extent) {}
+        
+    bool has_placement(box2d<double> const& box)
+    {
+        tree_t::query_iterator itr = tree_.query_in_box(box);
+        tree_t::query_iterator end = tree_.query_end();
+            
+        for ( ;itr != end; ++itr)
+        {
             if (itr->intersects(box))
             {
-               return false;
+                return false;
             }
-         }
-	    
-         tree_.insert(box,box);
-         return true;
-      }
+        }
+            
+        tree_.insert(box,box);
+        return true;
+    }
          
-      void clear()
-      {
-         tree_.clear();
-      } 
+    void clear()
+    {
+        tree_.clear();
+    } 
          
-   };
+};
     
-   // quad_tree based label collision detector with seperate check/insert
-   class label_collision_detector3 : boost::noncopyable
-   {
-      typedef quad_tree< Envelope<double> > tree_t;
-      tree_t tree_;
-   public:
-	
-      explicit label_collision_detector3(Envelope<double> const& extent)
-         : tree_(extent) {}
-	
-      bool has_placement(Envelope<double> const& box)
-      {
-         tree_t::query_iterator itr = tree_.query_in_box(box);
-         tree_t::query_iterator end = tree_.query_end();
+// quad_tree based label collision detector with seperate check/insert
+class label_collision_detector3 : boost::noncopyable
+{
+    typedef quad_tree< box2d<double> > tree_t;
+    tree_t tree_;
+public:
+        
+    explicit label_collision_detector3(box2d<double> const& extent)
+        : tree_(extent) {}
+        
+    bool has_placement(box2d<double> const& box)
+    {
+        tree_t::query_iterator itr = tree_.query_in_box(box);
+        tree_t::query_iterator end = tree_.query_end();
           
-         for ( ;itr != end; ++itr)
-         {
+        for ( ;itr != end; ++itr)
+        {
             if (itr->intersects(box))
             {
-               return false;
+                return false;
             }
-         }
+        }
           
-         return true;
-      }
+        return true;
+    }
 
-      void insert(Envelope<double> const& box)
-      {
-         tree_.insert(box, box);
-      }
+    void insert(box2d<double> const& box)
+    {
+        tree_.insert(box, box);
+    }
          
-      void clear()
-      {
-         tree_.clear();
-      }
-   };
+    void clear()
+    {
+        tree_.clear();
+    }
+};
 
     
-   //quad tree based label collission detector so labels dont appear within a given distance
-   class label_collision_detector4 : boost::noncopyable
-   {
-      struct label
-      {
-         label(Envelope<double> const& b) : box(b) {}
-         label(Envelope<double> const& b, UnicodeString const& t) : box(b), text(t) {}
+//quad tree based label collission detector so labels dont appear within a given distance
+class label_collision_detector4 : boost::noncopyable
+{
+    struct label
+    {
+        label(box2d<double> const& b) : box(b) {}
+        label(box2d<double> const& b, UnicodeString const& t) : box(b), text(t) {}
                
-         Envelope<double> box;
-         UnicodeString text;
-      };
+        box2d<double> box;
+        UnicodeString text;
+    };
          
-      typedef quad_tree< label > tree_t;
-      Envelope<double> extent_;
-      tree_t tree_;
+    typedef quad_tree< label > tree_t;
+    tree_t tree_;
          
-   public:
-	
-      explicit label_collision_detector4(Envelope<double> const& extent)
-         : extent_(extent),
-           tree_(extent) {}
-	
-      bool has_placement(Envelope<double> const& box)
-      {
-         tree_t::query_iterator itr = tree_.query_in_box(box);
-         tree_t::query_iterator end = tree_.query_end();
+public:
+        
+    explicit label_collision_detector4(box2d<double> const& extent)
+        : tree_(extent) {}
+        
+    bool has_placement(box2d<double> const& box)
+    {
+        tree_t::query_iterator itr = tree_.query_in_box(box);
+        tree_t::query_iterator end = tree_.query_end();
           
-         for ( ;itr != end; ++itr)
-         {
+        for ( ;itr != end; ++itr)
+        {
             if (itr->box.intersects(box))
             {
-               return false;
+                return false;
             }
-         }
+        }
           
-         return true;
-      }	
+        return true;
+    }   
 
-      bool has_placement(Envelope<double> const& box, UnicodeString const& text, double distance)
-      {
-         Envelope<double> bigger_box(box.minx() - distance, box.miny() - distance, box.maxx() + distance, box.maxy() + distance);
-         tree_t::query_iterator itr = tree_.query_in_box(bigger_box);
-         tree_t::query_iterator end = tree_.query_end();
+    bool has_placement(box2d<double> const& box, UnicodeString const& text, double distance)
+    {
+        box2d<double> bigger_box(box.minx() - distance, box.miny() - distance, box.maxx() + distance, box.maxy() + distance);
+        tree_t::query_iterator itr = tree_.query_in_box(bigger_box);
+        tree_t::query_iterator end = tree_.query_end();
         
-         for ( ;itr != end; ++itr)
-         {
+        for ( ;itr != end; ++itr)
+        {
             if (itr->box.intersects(box) || (text == itr->text && itr->box.intersects(bigger_box)))
             {
-               return false;
+                return false;
             }
-         }
-	    
-         return true;
-      }	
+        }
+            
+        return true;
+    }   
 
-      bool has_point_placement(Envelope<double> const& box, double distance)
-      {
-         Envelope<double> bigger_box(box.minx() - distance, box.miny() - distance, box.maxx() + distance, box.maxy() + distance);
-         tree_t::query_iterator itr = tree_.query_in_box(bigger_box);
-         tree_t::query_iterator end = tree_.query_end();
+    bool has_point_placement(box2d<double> const& box, double distance)
+    {
+        box2d<double> bigger_box(box.minx() - distance, box.miny() - distance, box.maxx() + distance, box.maxy() + distance);
+        tree_t::query_iterator itr = tree_.query_in_box(bigger_box);
+        tree_t::query_iterator end = tree_.query_end();
          
-         for ( ;itr != end; ++itr)
-         {
+        for ( ;itr != end; ++itr)
+        {
             if (itr->box.intersects(bigger_box))
             {
-               return false;
+                return false;
             }
-         }
-	 
-         return true;
-      }	
+        }
+         
+        return true;
+    }   
       
-      void insert(Envelope<double> const& box)
-      {
-         tree_.insert(label(box), box);
-      }
+    void insert(box2d<double> const& box)
+    {
+        tree_.insert(label(box), box);
+    }
          
-      void insert(Envelope<double> const& box, UnicodeString const& text)
-      {
-         tree_.insert(label(box, text), box);
-      }
+    void insert(box2d<double> const& box, UnicodeString const& text)
+    {
+        tree_.insert(label(box, text), box);
+    }
          
-      void clear()
-      {
-         tree_.clear();
-      }
+    void clear()
+    {
+        tree_.clear();
+    }
       
-      Envelope<double> const& extent() const
-      {
-         return extent_;
-      }
-   };
+    box2d<double> const& extent() const
+    {
+        return tree_.extent();
+    }
+};
 }
 
-#endif 
+#endif // LABEL_COLLISION_DETECTOR_HPP
diff --git a/include/mapnik/label_placement.hpp b/include/mapnik/label_placement.hpp
index 39224c4..c1bdbad 100644
--- a/include/mapnik/label_placement.hpp
+++ b/include/mapnik/label_placement.hpp
@@ -26,29 +26,29 @@
 
 namespace mapnik
 {
-    struct point_
-    {
-        double x;
-        double y;
-        point_()
-            : x(0),y(0) {}
-        point_(double x_,double y_)
-            : x(x_),y(y_) {}	
-    };
+struct point_
+{
+    double x;
+    double y;
+    point_()
+        : x(0),y(0) {}
+    point_(double x_,double y_)
+        : x(x_),y(y_) {}        
+};
     
-    class label_placement
-    {
-    private:
-        point_ anchor_;
-        point_ displacement_;
-        double rotation_;
-    public:
-        label_placement() 
-            : anchor_(),
-              displacement_(),
-              rotation_(0.0) {}
-	
-    };
+class label_placement
+{
+private:
+    point_ anchor_;
+    point_ displacement_;
+    double rotation_;
+public:
+    label_placement() 
+        : anchor_(),
+          displacement_(),
+          rotation_(0.0) {}
+        
+};
 }
  
 #endif //LABEL_PLACEMENT_HPP
diff --git a/include/mapnik/layer.hpp b/include/mapnik/layer.hpp
index 9f7787d..d4d4c7e 100644
--- a/include/mapnik/layer.hpp
+++ b/include/mapnik/layer.hpp
@@ -26,185 +26,195 @@
 // mapnik
 #include <mapnik/feature.hpp>
 #include <mapnik/datasource.hpp>
-// boost
-#include <boost/shared_ptr.hpp>
+
 // stl
 #include <vector>
 
 namespace mapnik
 {
+/*!
+ * @brief A Mapnik map layer.
+ *
+ * Create a layer with a named string and, optionally, an srs string either 
+ * with a Proj.4 epsg code ('+init=epsg:<code>') or with a Proj.4 literal 
+ * ('+proj=<literal>'). If no srs is specified it will default to 
+ * '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
+ */
+class MAPNIK_DECL layer
+{
+public:
+    explicit layer(std::string const& name, std::string const& srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs");
+    layer(layer const& l);
+    layer& operator=(layer const& l);
+    bool operator==(layer const& other) const;
+        
+    /*!
+     * @brief Set the name of the layer.
+     */
+    void set_name(std::string const& name);
+        
+    /*!
+     * @return the name of the layer.
+     */
+    const std::string& name() const;
+        
+    /*!
+     * @brief Set the title of the layer.
+     */
+    void set_title(std::string const& title);
+        
+    /*!
+     * @return the title of the layer.
+     */
+    const std::string& title() const;
+        
+    /*!
+     * @brief Set the abstract of the layer.
+     */
+    void set_abstract(std::string const& abstract);
+        
+    /*!
+     * @return the abstract of the layer.
+     */
+    const std::string& abstract() const;
+        
     /*!
-     * @brief A Mapnik map layer.
+     * @brief Set the SRS of the layer.
+     */
+    void set_srs(std::string const& srs);
+        
+    /*!
+     * @return the SRS of the layer.
+     */
+    std::string const& srs() const;
+        
+    /*!
+     * @brief Add a new style to this layer.
      *
-     * Create a Layer with a named string and, optionally, an srs string either 
-     * with a Proj.4 epsg code ('+init=epsg:<code>') or with a Proj.4 literal 
-     * ('+proj=<literal>'). If no srs is specified it will default to 
-     * '+proj=latlong +datum=WGS84'
-     */
-    class MAPNIK_DECL Layer
-    {
-    public:
-        explicit Layer(std::string const& name, std::string const& srs="+proj=latlong +datum=WGS84");
-        Layer(Layer const& l);
-        Layer& operator=(Layer const& l);
-        bool operator==(Layer const& other) const;
-        
-        /*!
-         * @brief Set the name of the layer.
-         */
-        void set_name(std::string const& name);
-        
-        /*!
-         * @return the name of the layer.
-         */
-        const std::string& name() const;
-        
-        /*!
-         * @brief Set the title of the layer.
-         */
-        void set_title(std::string const& title);
-        
-        /*!
-         * @return the title of the layer.
-         */
-        const std::string& title() const;
-        
-        /*!
-         * @brief Set the abstract of the Layer.
-         */
-        void set_abstract(std::string const& abstract);
-        
-        /*!
-         * @return the abstract of the Layer.
-         */
-        const std::string& abstract() const;
-        
-        /*!
-         * @brief Set the SRS of the layer.
-         */
-        void set_srs(std::string const& srs);
-        
-        /*!
-         * @return the SRS of the layer.
-         */
-        std::string const& srs() const;
-        
-        /*!
-         * @brief Add a new style to this layer.
-         *
-         * @param stylename The name of the style to add.
-         */
-        void add_style(std::string const& stylename);
-        
-        /*!
-         * @return the styles list attached to this layer.
-         */
-        std::vector<std::string> const& styles() const;
-        
-        /*!
-         * @return the styles list attached to this layer
-         *         (const version).
-         */
-        std::vector<std::string>& styles();
-        
-        /*!
-         * @param maxZoom The minimum zoom level to set
-         */
-        void setMinZoom(double minZoom);
-        
-        /*!
-         * @param maxZoom The maximum zoom level to set
-         */
-        void setMaxZoom(double maxZoom);
-        
-        /*!
-         * @return the minimum zoom level of the layer.
-         */
-        double getMinZoom() const;
-        
-        /*!
-         * @return the maximum zoom level of the layer.
-         */
-        double getMaxZoom() const;
-        
-        /*!
-         * @brief Set whether this layer is active and will be rendered.
-         */
-        void setActive(bool active);
-        
-       /*!
-         * @return whether this layer is active and will be rendered.
-         */
-        bool isActive() const;
-        
-        /*!
-         * @brief Set whether this layer is queryable.
-         */
-        void setQueryable(bool queryable);
-        
-        /*!
-         * @return whether this layer is queryable or not.
-         */
-        bool isQueryable() const;
-        
-        /*!
-         * @brief Get the visability for a specific scale.
-         *
-         * @param scale Accepts an integer or float input.
-         *
-         * @return true if this layer's data is active and visible at a given scale.
-         *         Otherwise returns False.
-         * @return false if:
-         *         scale >= minzoom - 1e-6
-         *         or
-         *         scale < maxzoom + 1e-6
-         */
-        bool isVisible(double scale) const;
-        
-        /*!
-         * @param clear_cache Set whether this layer's labels are cached.
-         */
-        void set_clear_label_cache(bool clear_cache);
-        
-        /*!
-         * @return whether this layer's labels are cached.
-         */
-        bool clear_label_cache() const; 
-        
-        /*!
-         * @brief Attach a datasource for this Layer.
-         *
-         * @param ds The datasource to attach.
-         */
-        void set_datasource(datasource_ptr const& ds);
-        
-        /*!
-         * @return the datasource attached to this layer.
-         */
-        datasource_ptr datasource() const;
-        
-        /*!
-         * @return the geographic envelope/bounding box of the data in the layer.
-         */
-        Envelope<double> envelope() const;
-        
-        ~Layer();
-    private:
-        void swap(const Layer& other);
+     * @param stylename The name of the style to add.
+     */
+    void add_style(std::string const& stylename);
+        
+    /*!
+     * @return the styles list attached to this layer.
+     */
+    std::vector<std::string> const& styles() const;
+        
+    /*!
+     * @return the styles list attached to this layer
+     *         (const version).
+     */
+    std::vector<std::string>& styles();
+        
+    /*!
+     * @param maxZoom The minimum zoom level to set
+     */
+    void setMinZoom(double minZoom);
+        
+    /*!
+     * @param maxZoom The maximum zoom level to set
+     */
+    void setMaxZoom(double maxZoom);
+        
+    /*!
+     * @return the minimum zoom level of the layer.
+     */
+    double getMinZoom() const;
+        
+    /*!
+     * @return the maximum zoom level of the layer.
+     */
+    double getMaxZoom() const;
+        
+    /*!
+     * @brief Set whether this layer is active and will be rendered.
+     */
+    void setActive(bool active);
+        
+    /*!
+     * @return whether this layer is active and will be rendered.
+     */
+    bool isActive() const;
+        
+    /*!
+     * @brief Set whether this layer is queryable.
+     */
+    void setQueryable(bool queryable);
+        
+    /*!
+     * @return whether this layer is queryable or not.
+     */
+    bool isQueryable() const;
+        
+    /*!
+     * @brief Get the visability for a specific scale.
+     *
+     * @param scale Accepts an integer or float input.
+     *
+     * @return true if this layer's data is active and visible at a given scale.
+     *         Otherwise returns False.
+     * @return false if:
+     *         scale >= minzoom - 1e-6
+     *         or
+     *         scale < maxzoom + 1e-6
+     */
+    bool isVisible(double scale) const;
+        
+    /*!
+     * @param clear_cache Set whether this layer's labels are cached.
+     */
+    void set_clear_label_cache(bool clear_cache);
+        
+    /*!
+     * @return whether this layer's labels are cached.
+     */
+    bool clear_label_cache() const; 
+
+    /*!
+     * @param clear_cache Set whether this layer's features should be cached if used by multiple styles.
+     */
+    void set_cache_features(bool cache_features);
+        
+    /*!
+     * @return whether this layer's features will be cached if used by multiple styles
+     */
+    bool cache_features() const; 
+        
+    /*!
+     * @brief Attach a datasource for this layer.
+     *
+     * @param ds The datasource to attach.
+     */
+    void set_datasource(datasource_ptr const& ds);
+        
+    /*!
+     * @return the datasource attached to this layer.
+     */
+    datasource_ptr datasource() const;
+        
+    /*!
+     * @return the geographic envelope/bounding box of the data in the layer.
+     */
+    box2d<double> envelope() const;
+        
+    ~layer();
+private:
+    void swap(const layer& other);
 
-        std::string name_;
-        std::string title_;
-        std::string abstract_;
-        std::string srs_;
-        
-        double minZoom_;
-        double maxZoom_;
-        bool active_;
-        bool queryable_;
-        bool clear_label_cache_;
-        std::vector<std::string>  styles_;
-        datasource_ptr ds_;
-    };
+    std::string name_;
+    std::string title_;
+    std::string abstract_;
+    std::string srs_;
+        
+    double minZoom_;
+    double maxZoom_;
+    bool active_;
+    bool queryable_;
+    bool clear_label_cache_;
+    bool cache_features_;
+    std::vector<std::string>  styles_;
+    datasource_ptr ds_;
+};
 }
 
 #endif //LAYER_HPP
diff --git a/include/mapnik/libxml2_loader.hpp b/include/mapnik/libxml2_loader.hpp
index 9e0551c..d81e141 100644
--- a/include/mapnik/libxml2_loader.hpp
+++ b/include/mapnik/libxml2_loader.hpp
@@ -29,8 +29,8 @@
 
 namespace mapnik 
 {
-    void read_xml2( std::string const & filename, boost::property_tree::ptree & pt);
-    void read_xml2_string( std::string const & str, boost::property_tree::ptree & pt, std::string const & base_path="");
+void read_xml2( std::string const & filename, boost::property_tree::ptree & pt);
+void read_xml2_string( std::string const & str, boost::property_tree::ptree & pt, std::string const & base_path="");
 }
 
 #endif // LIBXML2_LOADER_INCLUDED
diff --git a/include/mapnik/line_pattern_symbolizer.hpp b/include/mapnik/line_pattern_symbolizer.hpp
index d054a38..88cea40 100644
--- a/include/mapnik/line_pattern_symbolizer.hpp
+++ b/include/mapnik/line_pattern_symbolizer.hpp
@@ -24,20 +24,18 @@
 #ifndef LINE_PATTERN_SYMBOLIZER_HPP
 #define LINE_PATTERN_SYMBOLIZER_HPP
 
-#include <mapnik/graphics.hpp>
+// mapnik
 #include <mapnik/symbolizer.hpp>
-#include <boost/shared_ptr.hpp>
+//#include <boost/shared_ptr.hpp>
 
 namespace mapnik 
 {      
-    struct MAPNIK_DECL line_pattern_symbolizer :
-        public symbolizer_with_image
-    {
-        line_pattern_symbolizer(std::string const& file,
-                                std::string const& type,
-                                unsigned width,unsigned height);
-        line_pattern_symbolizer(line_pattern_symbolizer const& rhs);
-    };    
+struct MAPNIK_DECL line_pattern_symbolizer :
+        public symbolizer_with_image, public symbolizer_base
+{
+    line_pattern_symbolizer(path_expression_ptr file);
+    line_pattern_symbolizer(line_pattern_symbolizer const& rhs);
+};    
 }
 
 #endif // LINE_PATTERN_SYMBOLIZER_HPP
diff --git a/include/mapnik/line_symbolizer.hpp b/include/mapnik/line_symbolizer.hpp
index c812dca..e76eccb 100644
--- a/include/mapnik/line_symbolizer.hpp
+++ b/include/mapnik/line_symbolizer.hpp
@@ -25,33 +25,61 @@
 #define LINE_SYMBOLIZER_HPP
 
 #include <mapnik/stroke.hpp>
+#include <mapnik/symbolizer.hpp>
+#include <mapnik/enumeration.hpp>
 
 namespace mapnik 
 {
-    struct MAPNIK_DECL line_symbolizer
-    {
-        explicit line_symbolizer()
-            : stroke_() {}
+
+enum line_rasterizer_enum {
+    RASTERIZER_FULL,           // agg::renderer_scanline_aa_solid
+    RASTERIZER_FAST,           // agg::rasterizer_outline_aa, twice as fast but only good for thin lines
+    line_rasterizer_enum_MAX
+};
+
+DEFINE_ENUM( line_rasterizer_e, line_rasterizer_enum );
+
+struct MAPNIK_DECL line_symbolizer : public symbolizer_base
+{
+    explicit line_symbolizer()
+        : symbolizer_base(),
+          stroke_(),
+          rasterizer_p_(RASTERIZER_FULL) {}
+        
+    line_symbolizer(stroke const& stroke)
+        : symbolizer_base(),
+          stroke_(stroke),
+          rasterizer_p_(RASTERIZER_FULL) {}
         
-        line_symbolizer(stroke const& stroke)
-            : stroke_(stroke) {}
-	
-        line_symbolizer(color const& pen,float width=1.0)
-            : stroke_(pen,width) {}
+    line_symbolizer(color const& pen,float width=1.0)
+        : symbolizer_base(),
+          stroke_(pen,width),
+          rasterizer_p_(RASTERIZER_FULL) {}
         
-        stroke const& get_stroke() const
-        {
-            return stroke_;
-        }
+    stroke const& get_stroke() const
+    {
+        return stroke_;
+    }
+
+    void set_stroke(stroke const& stk)
+    {
+        stroke_ = stk;
+    }
         
-        void set_stroke(stroke const& stroke)
-        {
-            stroke_ = stroke;
-        }
-
-    private:
-        stroke stroke_;
-    };
+    void set_rasterizer(line_rasterizer_e rasterizer_p)
+    {
+        rasterizer_p_ = rasterizer_p;
+    }
+    
+    line_rasterizer_e get_rasterizer() const
+    {
+        return rasterizer_p_;
+    }
+
+private:
+    stroke stroke_;
+    line_rasterizer_e rasterizer_p_;
+};
 }
 
 #endif //LINE_SYMBOLIZER_HPP
diff --git a/include/mapnik/load_map.hpp b/include/mapnik/load_map.hpp
index 5bc93cd..84d35a1 100644
--- a/include/mapnik/load_map.hpp
+++ b/include/mapnik/load_map.hpp
@@ -25,7 +25,7 @@
 #define MAP_LOADER_HPP
 
 #ifdef HAVE_CONFIG_H
-  #include <config.h>
+#include <config.h>
 #endif
 
 #include <mapnik/map.hpp>
@@ -33,8 +33,8 @@
 
 namespace mapnik
 {
-    MAPNIK_DECL void load_map(Map & map, std::string const& filename, bool strict = false);
-    MAPNIK_DECL void load_map_string(Map & map, std::string const& str, bool strict = false, std::string const& base_url="");
+MAPNIK_DECL void load_map(Map & map, std::string const& filename, bool strict = false);
+MAPNIK_DECL void load_map_string(Map & map, std::string const& str, bool strict = false, std::string const& base_path="");
 }
 
 #endif // LOAD_MAP_HPP
diff --git a/include/mapnik/logical.hpp b/include/mapnik/logical.hpp
deleted file mode 100644
index ebd2828..0000000
--- a/include/mapnik/logical.hpp
+++ /dev/null
@@ -1,172 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-//$Id$
-
-#ifndef LOGICAL_HPP
-#define LOGICAL_HPP
-
-#include <mapnik/filter.hpp>
-
-namespace mapnik
-{
-    template <typename FeatureT> 
-    struct logical_and : public filter<FeatureT>  
-    {
-	logical_and(filter<FeatureT> const& filter1,
-		    filter<FeatureT> const& filter2)
-	    : filter<FeatureT>(),
-	      filter1_(filter1.clone()),
-	      filter2_(filter2.clone()) {}
-	
-	logical_and(logical_and const& other)
-	    : filter<FeatureT>(),
-	      filter1_(other.filter1_->clone()),
-	      filter2_(other.filter2_->clone()) {}
-
-	bool pass(const FeatureT& feature) const
-	{
-	    return (filter1_->pass(feature) && 
-		filter2_->pass(feature));
-	}
-	std::string to_string() const
-	{
-	    return "("+filter1_->to_string()+" and "+filter2_->to_string()+")";
-	}
-	
-	filter<FeatureT>* clone() const
-	{
-	    return new logical_and(*this);
-	}
-
-	void accept(filter_visitor<FeatureT>& v)
-	{
-	    filter1_->accept(v);
-	    filter2_->accept(v);
-	    v.visit(*this);
-	}
-
-	virtual ~logical_and()
-	{
-	    delete filter1_;
-	    delete filter2_;
-	}
-	
-    private:
-	filter<FeatureT>* filter1_;
-	filter<FeatureT>* filter2_;
-    };
-
-    template <typename FeatureT> 
-    struct logical_or : public filter<FeatureT>  
-    {
-	
-	logical_or(const filter<FeatureT>& filter1,const filter<FeatureT>& filter2)
-	    : filter<FeatureT>(),
-	      filter1_(filter1.clone()),
-	      filter2_(filter2.clone()) {}
-	
-	logical_or(logical_or const& other)
-	    : filter<FeatureT>(),
-	      filter1_(other.filter1_->clone()),
-	      filter2_(other.filter2_->clone()) {}
-
-	bool pass(const FeatureT& feature) const
-	{
-	    if (filter1_->pass(feature))
-	    {
-		return true;
-	    }
-	    else
-	    {
-		return filter2_->pass(feature);
-	    }
-	}
-	filter<FeatureT>* clone() const
-	{
-	    return new logical_or(*this);
-	}
-
-	void accept(filter_visitor<FeatureT>& v)
-	{
-	    filter1_->accept(v);
-	    filter2_->accept(v);
-	    v.visit(*this);
-	}
-	std::string to_string() const
-	{
-	    return "("+filter1_->to_string()+" or "+filter2_->to_string()+")";
-	}	
-	virtual ~logical_or()
-	{  
-	    delete filter1_;
-	    delete filter2_;
-	}
-    private:
-	filter<FeatureT>* filter1_;
-	filter<FeatureT>* filter2_;
-    };
-
-    template <typename FeatureT> 
-    struct logical_not : public filter<FeatureT>  
-    {
-	logical_not(filter<FeatureT> const& _filter)
-	    : filter<FeatureT>(),
-	      filter_(_filter.clone()) {}
-	logical_not(logical_not const& other)
-	    : filter<FeatureT>(),
-	      filter_(other.filter_->clone()) {}
-
-	int type() const
-	{
-	    return filter<FeatureT>::LOGICAL_OPS;
-	}
-
-	bool pass(const FeatureT& feature) const
-	{
-	    return !(filter_->pass(feature));
-	}
-
-	filter<FeatureT>* clone() const
-	{
-	    return new logical_not(*this);
-	}
-	
-	void accept(filter_visitor<FeatureT>& v)
-	{
-	    filter_->accept(v);
-	    v.visit(*this);
-	}
-	std::string to_string() const
-	{
-	    return "not ("+filter_->to_string()+")";
-	}
-	 
-	~logical_not() 
-	{
-	    delete filter_;
-	}
-    private:
-	filter<FeatureT>* filter_;
-    };
-}
- 
-#endif //LOGICAL_HPP
diff --git a/include/mapnik/map.hpp b/include/mapnik/map.hpp
index 54973e2..9cc5811 100644
--- a/include/mapnik/map.hpp
+++ b/include/mapnik/map.hpp
@@ -25,7 +25,7 @@
 #define MAP_HPP
 
 #ifdef HAVE_CONFIG_H
-  #include <config.h>
+#include <config.h>
 #endif
 
 // mapnik
@@ -33,328 +33,432 @@
 #include <mapnik/feature_type_style.hpp>
 #include <mapnik/datasource.hpp>
 #include <mapnik/layer.hpp>
+#include <mapnik/metawriter.hpp>
+#include <mapnik/params.hpp>
 
 // boost
 #include <boost/optional/optional.hpp>
 
 namespace mapnik
 {
-    class MAPNIK_DECL Map
-    {	
-    public:
-
-        enum aspect_fix_mode 
-        {
-           // grow the width or height of the specified geo bbox to fill the map size. default behaviour.
-           GROW_BBOX,
-           // grow the width or height of the map to accomodate the specified geo bbox.
-           GROW_CANVAS,
-           // shrink the width or height of the specified geo bbox to fill the map size. 
-           SHRINK_BBOX,
-           // shrink the width or height of the map to accomodate the specified geo bbox.
-           SHRINK_CANVAS,
-           // adjust the width of the specified geo bbox, leave height and map size unchanged
-           ADJUST_BBOX_WIDTH,
-           // adjust the height of the specified geo bbox, leave width and map size unchanged
-           ADJUST_BBOX_HEIGHT,
-           // adjust the width of the map, leave height and geo bbox unchanged
-           ADJUST_CANVAS_WIDTH,
-           //adjust the height of the map, leave width and geo bbox unchanged 
-           ADJUST_CANVAS_HEIGHT,
-           // 
-           aspect_fix_mode_MAX
-        };
+class MAPNIK_DECL Map
+{       
+public:
+
+    enum aspect_fix_mode 
+    {
+        // grow the width or height of the specified geo bbox to fill the map size. default behaviour.
+        GROW_BBOX,
+        // grow the width or height of the map to accomodate the specified geo bbox.
+        GROW_CANVAS,
+        // shrink the width or height of the specified geo bbox to fill the map size. 
+        SHRINK_BBOX,
+        // shrink the width or height of the map to accomodate the specified geo bbox.
+        SHRINK_CANVAS,
+        // adjust the width of the specified geo bbox, leave height and map size unchanged
+        ADJUST_BBOX_WIDTH,
+        // adjust the height of the specified geo bbox, leave width and map size unchanged
+        ADJUST_BBOX_HEIGHT,
+        // adjust the width of the map, leave height and geo bbox unchanged
+        ADJUST_CANVAS_WIDTH,
+        //adjust the height of the map, leave width and geo bbox unchanged 
+        ADJUST_CANVAS_HEIGHT,
+        // 
+        aspect_fix_mode_MAX
+    };
         
-    private:
-        static const unsigned MIN_MAPSIZE=16;
-        static const unsigned MAX_MAPSIZE=MIN_MAPSIZE<<10;
-        unsigned width_;
-        unsigned height_;
-        std::string  srs_;
-        int buffer_size_;
-        boost::optional<color> background_;
-        std::map<std::string,feature_type_style> styles_;
-        std::map<std::string,FontSet> fontsets_;
-        std::vector<Layer> layers_;
-        aspect_fix_mode aspectFixMode_;
-        Envelope<double> currentExtent_;
+private:
+    static const unsigned MIN_MAPSIZE=16;
+    static const unsigned MAX_MAPSIZE=MIN_MAPSIZE<<10;
+    unsigned width_;
+    unsigned height_;
+    std::string srs_;
+    int buffer_size_;
+    boost::optional<color> background_;
+    boost::optional<std::string> background_image_;
+    std::map<std::string,feature_type_style> styles_;
+    std::map<std::string,metawriter_ptr> metawriters_;
+    std::map<std::string,font_set> fontsets_;
+    std::vector<layer> layers_;
+    aspect_fix_mode aspectFixMode_;
+    box2d<double> current_extent_;
+    boost::optional<box2d<double> > maximum_extent_;
+    std::string base_path_;
+    parameters extra_attr_;
         
-    public:
+public:
 
-        typedef std::map<std::string,feature_type_style>::const_iterator const_style_iterator;
-        typedef std::map<std::string,feature_type_style>::iterator style_iterator;
-        typedef std::map<std::string,FontSet>::const_iterator const_fontset_iterator;
-        typedef std::map<std::string,FontSet>::iterator fontset_iterator;
+    typedef std::map<std::string,feature_type_style>::const_iterator const_style_iterator;
+    typedef std::map<std::string,feature_type_style>::iterator style_iterator;
+    typedef std::map<std::string,font_set>::const_iterator const_fontset_iterator;
+    typedef std::map<std::string,font_set>::iterator fontset_iterator;
+    typedef std::map<std::string,metawriter_ptr>::const_iterator const_metawriter_iterator;
         
-        /*! \brief Default constructor.
-         *
-         *  Creates a map with these parameters:
-         *  - width = 400
-         *  - height = 400
-         *  - projection = "+proj=latlong +datum=WGS84"
-         */
-        Map();
-
-        /*! \brief Constructor
-         *  @param width Initial map width.
-         *  @param height Initial map height.
-         *  @param srs Initial map projection.
-         */
-        Map(int width, int height, std::string const& srs="+proj=latlong +datum=WGS84");
-
-        /*! \brief Copy Constructur.
-         *
-         *  @param rhs Map to copy from.
-         */
-        Map(const Map& rhs);
-
-        /*! \brief Assignment operator
-         *
-         *  TODO: to be documented
-         *  
-         */
-        Map& operator=(const Map& rhs);
+    /*! \brief Default constructor.
+     *
+     *  Creates a map with these parameters:
+     *  - width = 400
+     *  - height = 400
+     *  - projection = "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
+     */
+    Map();
+
+    /*! \brief Constructor
+     *  @param width Initial map width.
+     *  @param height Initial map height.
+     *  @param srs Initial map projection.
+     */
+    Map(int width, int height, std::string const& srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs");
+
+    /*! \brief Copy Constructur.
+     *
+     *  @param rhs Map to copy from.
+     */
+    Map(const Map& rhs);
+
+    /*! \brief Assignment operator
+     *
+     *  TODO: to be documented
+     *  
+     */
+    Map& operator=(const Map& rhs);
         
-        /*! \brief Get all styles
-         * @return Const reference to styles
-         */
-        std::map<std::string,feature_type_style> const& styles() const; 
+    /*! \brief Get all styles
+     * @return Const reference to styles
+     */
+    std::map<std::string,feature_type_style> const& styles() const; 
         
-        /*! \brief Get all styles 
-         * @return Non-constant reference to styles
-         */
-        std::map<std::string,feature_type_style> & styles();
+    /*! \brief Get all styles 
+     * @return Non-constant reference to styles
+     */
+    std::map<std::string,feature_type_style> & styles();
         
-        /*! \brief Get first iterator in styles.
-         *  @return Constant style iterator.
-         */
-        const_style_iterator begin_styles() const;
-
-        /*! \brief Get last iterator in styles.
-         *  @return Constant style iterator.
-         */
-        const_style_iterator end_styles() const;
-
-        /*! \brief Get first iterator in styles.
-         *  @return Non-constant style iterator.
-         */
-        style_iterator begin_styles();
-
-        /*! \brief Get last iterator in styles.
-         *  @return Non-constant style iterator.
-         */
-        style_iterator end_styles();
-
-        /*! \brief Insert a style in the map.
-         *  @param name The name of the style.
-         *  @param style The style to insert.
-         *  @return true If success.
-         *  @return false If no success.
-         */
-        bool insert_style(std::string const& name,feature_type_style const& style);
-
-        /*! \brief Remove a style from the map.
-         *  @param name The name of the style.
-         */
-        void remove_style(const std::string& name);
-
-        /*! \brief Find a style.
-         *  @param name The name of the style.
-         *  @return The style if found. If not found return the default map style.
-         */
-        boost::optional<feature_type_style const&> find_style(std::string const& name) const;
+    /*! \brief Get first iterator in styles.
+     *  @return Constant style iterator.
+     */
+    const_style_iterator begin_styles() const;
+
+    /*! \brief Get last iterator in styles.
+     *  @return Constant style iterator.
+     */
+    const_style_iterator end_styles() const;
+
+    /*! \brief Get first iterator in styles.
+     *  @return Non-constant style iterator.
+     */
+    style_iterator begin_styles();
+
+    /*! \brief Get last iterator in styles.
+     *  @return Non-constant style iterator.
+     */
+    style_iterator end_styles();
+
+    /*! \brief Insert a style in the map.
+     *  @param name The name of the style.
+     *  @param style The style to insert.
+     *  @return true If success.
+     *  @return false If no success.
+     */
+    bool insert_style(std::string const& name,feature_type_style const& style);
+
+    /*! \brief Remove a style from the map.
+     *  @param name The name of the style.
+     */
+    void remove_style(const std::string& name);
+
+    /*! \brief Find a style.
+     *  @param name The name of the style.
+     *  @return The style if found. If not found return the default map style.
+     */
+    boost::optional<feature_type_style const&> find_style(std::string const& name) const;
+
+    /*! \brief Insert a metawriter in the map.
+     *  @param name The name of the writer.
+     *  @param style A pointer to the writer to insert.
+     *  @return true If success.
+     *  @return false If no success.
+     */
+    bool insert_metawriter(std::string const& name, metawriter_ptr const& writer);
+
+    /*! \brief Remove a metawriter from the map.
+     *  @param name The name of the writer.
+     */
+    void remove_metawriter(const std::string& name);
+
+    /*! \brief Find a metawriter.
+     *  @param name The name of the writer.
+     *  @return The writer if found. If not found return 0.
+     */
+    metawriter_ptr find_metawriter(std::string const& name) const;
+
+    /*! \brief Get all metawriters.
+     *  @return Const reference to metawriters.
+     */
+    std::map<std::string,metawriter_ptr> const& metawriters() const;
+
+    /*! \brief Get first iterator in metawriters.
+     *  @return Constant metawriter iterator.
+     */
+    const_metawriter_iterator begin_metawriters() const;
+
+    /*! \brief Get last iterator in metawriters.
+     *  @return Constant metawriter iterator.
+     */
+    const_metawriter_iterator end_metawriters() const;
         
-        /*! \brief Insert a fontset into the map.
-         *  @param name The name of the fontset.
-         *  @param style The fontset to insert.
-         *  @return true If success.
-         *  @return false If failure.
-         */
-        bool insert_fontset(std::string const& name, FontSet const& fontset);
+    /*! \brief Insert a fontset into the map.
+     *  @param name The name of the fontset.
+     *  @param style The fontset to insert.
+     *  @return true If success.
+     *  @return false If failure.
+     */
+    bool insert_fontset(std::string const& name, font_set const& fontset);
        
-        /*! \brief Find a fontset.
-         *  @param name The name of the fontset.
-         *  @return The fontset if found. If not found return the default map fontset.
-         */
-        FontSet const& find_fontset(std::string const& name) const;
-
-        /*! \brief Get all fontsets
-         * @return Const reference to fontsets
-         */
-        std::map<std::string,FontSet> const& fontsets() const;
-
-        /*! \brief Get all fontsets
-         * @return Non-constant reference to fontsets
-         */
-        std::map<std::string,FontSet> & fontsets();
-
-        /*! \brief Get number of all layers.
-         */
-        size_t layerCount() const;
-
-        /*! \brief Add a layer to the map.
-         *  @param l The layer to add.
-         */
-        void addLayer(const Layer& l);
-
-        /*! \brief Get a layer.
-         *  @param index Layer number.
-         *  @return Constant layer.
-         */
-        const Layer& getLayer(size_t index) const;
-
-        /*! \brief Get a layer.
-         *  @param index Layer number.
-         *  @return Non-constant layer.
-         */
-        Layer& getLayer(size_t index);
+    /*! \brief Find a fontset.
+     *  @param name The name of the fontset.
+     *  @return The fontset if found. If not found return the default map fontset.
+     */
+    font_set const& find_fontset(std::string const& name) const;
+
+    /*! \brief Get all fontsets
+     * @return Const reference to fontsets
+     */
+    std::map<std::string,font_set> const& fontsets() const;
+
+    /*! \brief Get all fontsets
+     * @return Non-constant reference to fontsets
+     */
+    std::map<std::string,font_set> & fontsets();
+
+    /*! \brief Get number of all layers.
+     */
+    size_t layer_count() const;
+
+    /*! \brief Add a layer to the map.
+     *  @param l The layer to add.
+     */
+    void addLayer(const layer& l);
+
+    /*! \brief Get a layer.
+     *  @param index layer number.
+     *  @return Constant layer.
+     */
+    const layer& getLayer(size_t index) const;
+
+    /*! \brief Get a layer.
+     *  @param index layer number.
+     *  @return Non-constant layer.
+     */
+    layer& getLayer(size_t index);
         
-        /*! \brief Remove a layer.
-         *  @param index Layer number.
-         */
-        void removeLayer(size_t index);
-
-        /*! \brief Get all layers.
-         *  @return Constant layers.
-         */
-        std::vector<Layer> const& layers() const;
-
-        /*! \brief Get all layers.
-         *  @return Non-constant layers.
-         */
-        std::vector<Layer> & layers();
-
-        /*! \brief Remove all layers and styles from the map.
-         */
-        void remove_all();
-
-        /*! \brief Get map width.
-         */
-        unsigned getWidth() const;
-
-        /*! \brief Get map height.
-         */
-        unsigned getHeight() const;
-
-        /*! \brief Set map width.
-         */
-        void setWidth(unsigned width);
-
-        /*! \brief Set map height.
-         */
-        void setHeight(unsigned height);
-
-        /*! \brief Resize the map.
-         */
-        void resize(unsigned width,unsigned height);
-
-        /*! \brief Get the map projection.
-         *  @return Map projection.
-         */
-        std::string const& srs() const;
-
-        /*! \brief Set the map projection.
-         *  @param srs Map projection.
-         */
-        void set_srs(std::string const& srs);
-
-        /*! \brief Set the map background color.
-         *  @param c Background color.
-         */
-        void set_background(const color& c);
-
-        /*! \brief Get the map background color 
-         *  @return Background color as boost::optional
-         *  object
-         */
-        boost::optional<color> const& background() const;
-
-        /*! \brief Set buffer size 
-         *  @param buffer_size Buffer size in pixels.
-         */
+    /*! \brief Remove a layer.
+     *  @param index layer number.
+     */
+    void removeLayer(size_t index);
+
+    /*! \brief Get all layers.
+     *  @return Constant layers.
+     */
+    std::vector<layer> const& layers() const;
+
+    /*! \brief Get all layers.
+     *  @return Non-constant layers.
+     */
+    std::vector<layer> & layers();
+
+    /*! \brief Remove all layers and styles from the map.
+     */
+    void remove_all();
+
+    /*! \brief Get map width.
+     */
+    unsigned width() const;
+
+    /*! \brief Get map height.
+     */
+    unsigned height() const;
+
+    /*! \brief Set map width.
+     */
+    void set_width(unsigned width);
+
+    /*! \brief Set map height.
+     */
+    void set_height(unsigned height);
+
+    /*! \brief Resize the map.
+     */
+    void resize(unsigned width,unsigned height);
+
+    /*! \brief Get the map projection.
+     *  @return Map projection.
+     */
+    std::string const& srs() const;
+
+    /*! \brief Set the map projection.
+     *  @param srs Map projection.
+     */
+    void set_srs(std::string const& srs);
+
+    /*! \brief Set the map background color.
+     *  @param c Background color.
+     */
+    void set_background(const color& c);
+    
+    /*! \brief Get the map background color 
+     *  @return Background color as boost::optional
+     *  object
+     */
+    boost::optional<color> const& background() const;
+    
+    /*! \brief Set the map background image filename.
+     *  @param c Background image filename.
+     */
+    void set_background_image(std::string const& image_filename);
+    
+    /*! \brief Get the map background image
+     *  @return Background image path as std::string
+     *  object
+     */
+    boost::optional<std::string> const& background_image() const;
+    
+    /*! \brief Set buffer size 
+     *  @param buffer_size Buffer size in pixels.
+     */
         
-        void set_buffer_size(int buffer_size);
+    void set_buffer_size(int buffer_size);
         
-       /*! \brief Get the map buffer size 
-         *  @return Buffer size as int
-         */
-        int buffer_size() const;
+    /*! \brief Get the map buffer size 
+     *  @return Buffer size as int
+     */
+    int buffer_size() const;
+
+    /*! \brief Set the map maximum extent.
+     *  @param box The bounding box for the maximum extent.
+     */
+    void set_maximum_extent(box2d<double>const& box);
         
-        /*! \brief Zoom the map at the current position.
-         *  @param factor The factor how much the map is zoomed in or out.
-         */
-        void zoom(double factor);
-
-        /*! \brief Zoom the map to a bounding box. 
-         *
-         *  Aspect is handled automatic if not fitting to width/height.
-         *  @param box The bounding box where to zoom.
-         */
-        void zoomToBox(const Envelope<double>& box);
-
-        /*! \brief Zoom the map to show all data.
-         */
-        void zoom_all();
-
-        void pan(int x,int y);
-
-        void pan_and_zoom(int x,int y,double zoom);
-
-        /*! \brief Get current bounding box.
-         *  @return The current bounding box.
-         */
-        const Envelope<double>& getCurrentExtent() const;
-
-        /*! \brief Get current buffered bounding box.
-         *  @return The current buffered bounding box.
-         */
-        Envelope<double> get_buffered_extent() const;
+    /*! \brief Get the map maximum extent as box2d<double>
+    */
+    boost::optional<box2d<double> > const& maximum_extent() const;
+
+    /*! \brief Get the map base path where paths should be relative to.
+     */
+    std::string const& base_path() const;
+
+    /*! \brief Set the map base path where paths should be releative to.
+     *  @param srs Map base_path.
+     */
+    void set_base_path(std::string const& base);
+
+    /*! \brief Zoom the map at the current position.
+     *  @param factor The factor how much the map is zoomed in or out.
+     */
+    void zoom(double factor);
+
+    /*! \brief Zoom the map to a bounding box. 
+     *
+     *  Aspect is handled automatic if not fitting to width/height.
+     *  @param box The bounding box where to zoom.
+     */
+    void zoom_to_box(const box2d<double>& box);
+
+    /*! \brief Zoom the map to show all data.
+     */
+    void zoom_all();
+
+    void pan(int x,int y);
+
+    void pan_and_zoom(int x,int y,double zoom);
+
+    /*! \brief Get current bounding box.
+     *  @return The current bounding box.
+     */
+    const box2d<double>& get_current_extent() const;
+
+    /*! \brief Get current buffered bounding box.
+     *  @return The current buffered bounding box.
+     */
+    box2d<double> get_buffered_extent() const;
         
-        /*!
-         * @return The Map Scale.
-         */
-        double scale() const;
+    /*!
+     * @return The Map Scale.
+     */
+    double scale() const;
         
-        double scale_denominator() const;
+    double scale_denominator() const;
 
-        CoordTransform view_transform() const;
+    CoordTransform view_transform() const;
         
-        /*!
-         * @brief Query a Map Layer (by layer index) for features
-         *
-         * Intersecting the given x,y location in the coordinates
-         * of map projection.
-         *
-         * @param index The index of the layer to query from.
-         * @param x The x coordinate where to query.
-         * @param y The y coordinate where to query.
-         * @return A Mapnik Featureset if successful otherwise will return NULL.
-         */
-        featureset_ptr query_point(unsigned index, double x, double y) const;
-
-        /*!
-         * @brief Query a Map Layer (by layer index) for features
-         *
-         * Intersecting the given x,y location in the coordinates
-         * of the pixmap or map surface.
-         *
-         * @param index The index of the layer to query from.
-         * @param x The x coordinate where to query.
-         * @param y The y coordinate where to query.
-         * @return A Mapnik Featureset if successful otherwise will return NULL.
-         */
-        featureset_ptr query_map_point(unsigned index, double x, double y) const;
+    /*!
+     * @brief Query a Map layer (by layer index) for features
+     *
+     * Intersecting the given x,y location in the coordinates
+     * of map projection.
+     *
+     * @param index The index of the layer to query from.
+     * @param x The x coordinate where to query.
+     * @param y The y coordinate where to query.
+     * @return A Mapnik Featureset if successful otherwise will return NULL.
+     */
+    featureset_ptr query_point(unsigned index, double x, double y) const;
+
+    /*!
+     * @brief Query a Map layer (by layer index) for features
+     *
+     * Intersecting the given x,y location in the coordinates
+     * of the pixmap or map surface.
+     *
+     * @param index The index of the layer to query from.
+     * @param x The x coordinate where to query.
+     * @param y The y coordinate where to query.
+     * @return A Mapnik Featureset if successful otherwise will return NULL.
+     */
+    featureset_ptr query_map_point(unsigned index, double x, double y) const;
+
+    /*!
+     * @brief Resolve names to object references for metawriters.
+     */
+    void init_metawriters();
         
-        ~Map();
-
-        inline void setAspectFixMode(aspect_fix_mode afm) { aspectFixMode_ = afm; }
-        inline aspect_fix_mode getAspectFixMode() const { return aspectFixMode_; }
-
-    private:
-        void fixAspectRatio();
-    };
+    ~Map();
+
+    inline void set_aspect_fix_mode(aspect_fix_mode afm) { aspectFixMode_ = afm; }
+    inline aspect_fix_mode get_aspect_fix_mode() const { return aspectFixMode_; }
+
+    /*!
+     * @brief Metawriter properties.
+     *
+     * These properties are defined by the user and are substituted in filenames,
+     * sepcial columns in tables, etc.
+     */
+    metawriter_property_map metawriter_output_properties;
+
+    /*!
+     * @brief Set a metawriter property.
+     */
+    void set_metawriter_property(std::string name, std::string value);
+
+    /*!
+     * @brief Get a metawriter property.
+     */
+    std::string get_metawriter_property(std::string name) const;
+
+    /*!
+     * @brief Get extra properties that can be carried on the Map
+     */
+    parameters const& get_extra_attributes() const;
+
+    /*!
+     * @brief Set extra properties that can be carried on the Map
+     */
+    void set_extra_attributes(parameters& params);
+
+private:
+    void fixAspectRatio();
+};
    
-   DEFINE_ENUM(aspect_fix_mode_e,Map::aspect_fix_mode);
+DEFINE_ENUM(aspect_fix_mode_e,Map::aspect_fix_mode);
 }
 
 #endif //MAP_HPP
diff --git a/include/mapnik/mapped_memory_cache.hpp b/include/mapnik/mapped_memory_cache.hpp
new file mode 100644
index 0000000..b143a6f
--- /dev/null
+++ b/include/mapnik/mapped_memory_cache.hpp
@@ -0,0 +1,65 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+#ifndef MEMORY_REGION_CACHE_HPP
+#define MEMORY_REGION_CACHE_HPP
+
+// mapnik
+#include <mapnik/config.hpp>
+#include <mapnik/utils.hpp>
+// boost
+#include <boost/utility.hpp>
+#include <boost/unordered_map.hpp>
+#include <boost/interprocess/mapped_region.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/optional.hpp>
+
+#ifdef MAPNIK_THREADSAFE
+#include <boost/thread/mutex.hpp>
+#endif
+
+namespace mapnik
+{
+
+using namespace boost::interprocess;
+
+typedef boost::shared_ptr<mapped_region> mapped_region_ptr;
+
+struct MAPNIK_DECL mapped_memory_cache :
+        public singleton <mapped_memory_cache, CreateStatic>,
+        private boost::noncopyable
+{
+    friend class CreateStatic<mapped_memory_cache>;
+#ifdef MAPNIK_THREADSAFE
+    static boost::mutex mutex_;
+#endif
+    static boost::unordered_map<std::string,mapped_region_ptr> cache_;
+    static bool insert(std::string const& key, mapped_region_ptr);
+    static boost::optional<mapped_region_ptr> find(std::string const& key, bool update_cache = false);
+};
+
+}
+
+#endif // MAPNIK_MARKER_CACHE_HPP
+
diff --git a/include/mapnik/marker.hpp b/include/mapnik/marker.hpp
new file mode 100644
index 0000000..1fd9918
--- /dev/null
+++ b/include/mapnik/marker.hpp
@@ -0,0 +1,128 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id: image_data.hpp 39 2005-04-10 20:39:53Z pavlenko $
+
+#ifndef MARKER_HPP
+#define MARKER_HPP
+
+#include <mapnik/global.hpp>
+#include <mapnik/image_data.hpp>
+#include <mapnik/svg/svg_path_attributes.hpp>
+#include <mapnik/svg/svg_storage.hpp>
+#include <mapnik/svg/svg_path_adapter.hpp>
+
+#include "agg_path_storage.h"
+// boost
+#include <boost/utility.hpp>
+#include <boost/unordered_map.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/optional.hpp>
+#include <boost/make_shared.hpp>
+
+#include <cassert>
+#include <cstring>
+
+namespace mapnik 
+{
+
+typedef agg::pod_bvector<mapnik::svg::path_attributes> attr_storage;
+typedef mapnik::svg::svg_storage<mapnik::svg::svg_path_storage,attr_storage> svg_storage_type;
+typedef boost::shared_ptr<svg_storage_type> path_ptr;
+typedef boost::shared_ptr<image_data_32> image_ptr;
+/**
+ * A class to hold either vector or bitmap marker data. This allows these to be treated equally
+ * in the image caches and most of the render paths.
+ */
+class marker
+{
+public:
+    marker()
+    {
+        // create default OGC 4x4 black pixel
+        bitmap_data_ = boost::optional<mapnik::image_ptr>(boost::make_shared<image_data_32>(4,4));
+        (*bitmap_data_)->set(0xff000000);
+    }
+
+    marker(const boost::optional<mapnik::image_ptr> &data) : bitmap_data_(data)
+    {
+
+    }
+
+    marker(const boost::optional<mapnik::path_ptr> &data) : vector_data_(data)
+    {
+
+    }
+
+    marker(const marker& rhs) : bitmap_data_(rhs.bitmap_data_), vector_data_(rhs.vector_data_)
+    {
+    }
+
+    inline unsigned width() const
+    {
+        if (is_bitmap())
+            return (*bitmap_data_)->width();
+        else if (is_vector())
+            return (*vector_data_)->bounding_box().width();
+        return 0;
+    }
+    inline unsigned height() const
+    {
+        if (is_bitmap())
+            return (*bitmap_data_)->height();
+        else if (is_vector())
+            return (*vector_data_)->bounding_box().height();
+        return 0;
+    }
+
+    inline bool is_bitmap() const
+    {
+        return bitmap_data_;
+    }
+
+    inline bool is_vector() const
+    {
+        return vector_data_;
+    }
+
+    boost::optional<mapnik::image_ptr> get_bitmap_data()
+    {
+        return bitmap_data_;
+    }
+
+    boost::optional<mapnik::path_ptr> get_vector_data()
+    {
+        return vector_data_;
+    }
+
+
+private:
+    marker& operator=(const marker&);
+
+    boost::optional<mapnik::image_ptr> bitmap_data_;
+    boost::optional<mapnik::path_ptr> vector_data_;
+
+};
+
+}
+
+#endif //MARKER_HPP
diff --git a/include/mapnik/marker_cache.hpp b/include/mapnik/marker_cache.hpp
new file mode 100644
index 0000000..9c8c620
--- /dev/null
+++ b/include/mapnik/marker_cache.hpp
@@ -0,0 +1,70 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2009 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+#ifndef MAPNIK_MARKER_CACHE_HPP
+#define MAPNIK_MARKER_CACHE_HPP
+
+// mapnik
+#include <mapnik/utils.hpp>
+#include <mapnik/marker.hpp>
+#include <mapnik/config.hpp>
+#include <mapnik/svg/svg_path_attributes.hpp>
+#include <mapnik/svg/svg_storage.hpp>
+#include <mapnik/svg/svg_path_adapter.hpp>
+// agg
+#include "agg_path_storage.h"
+// boost
+#include <boost/utility.hpp>
+#include <boost/unordered_map.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/optional.hpp>
+#ifdef MAPNIK_THREADSAFE
+#include <boost/thread/mutex.hpp>
+#endif
+
+namespace mapnik
+{
+
+using namespace mapnik::svg;
+
+typedef boost::shared_ptr<marker> marker_ptr;
+
+
+struct MAPNIK_DECL marker_cache :
+        public singleton <marker_cache, CreateStatic>,
+        private boost::noncopyable
+{
+
+    friend class CreateStatic<marker_cache>;
+#ifdef MAPNIK_THREADSAFE
+    static boost::mutex mutex_;
+#endif
+    static boost::unordered_map<std::string,marker_ptr> cache_;
+    static bool insert(std::string const& key, marker_ptr);
+    static boost::optional<marker_ptr> find(std::string const& key, bool update_cache = false);
+};
+
+}
+
+#endif // MAPNIK_MARKER_CACHE_HPP
diff --git a/include/mapnik/markers_converter.hpp b/include/mapnik/markers_converter.hpp
deleted file mode 100644
index 6dbc271..0000000
--- a/include/mapnik/markers_converter.hpp
+++ /dev/null
@@ -1,166 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-
-//$Id$
-
-#ifndef MARKERS_CONVERTER_HPP
-#define MARKERS_CONVERTER_HPP
-
-#include "agg_basics.h"
-#include "agg_trans_affine.h"
-#include <boost/utility.hpp>
-
-namespace mapnik {
-   template <typename Locator, typename Shape, typename Detector>
-   class markers_converter : boost::noncopyable
-   {
-      public:
-         markers_converter(Locator & locator,Shape & shape, Detector & detector);
-         void rewind(unsigned path_id);
-         unsigned vertex(double * x, double * y);
-      private:
-         enum status_e
-         {
-            initial,
-            markers,
-            polygon,
-            stop
-         };
-         
-         Locator & locator_;
-         Shape & shape_;
-         Detector & detector_;
-         status_e status_;
-         agg::trans_affine transform_;
-         agg::trans_affine mtx_;
-         unsigned num_markers_;
-         unsigned marker_;
-   };
-
-   template <typename Locator,typename Shape,typename Detector>
-   markers_converter<Locator,Shape,Detector>::markers_converter(Locator & locator,Shape & shape, 
-                                                                Detector & detector)
-      : locator_(locator),
-        shape_(shape),
-        detector_(detector),
-        status_(initial),
-        num_markers_(1),
-        marker_(0) {}
-   
-   template <typename Locator, typename Shape,typename Detector>
-   void markers_converter<Locator,Shape,Detector>::rewind(unsigned path_id)
-   {
-      status_ = initial;
-      marker_ = 0;
-      num_markers_ = 1;
-   }
-   
-   template <typename Locator, typename Shape, typename Detector>
-   unsigned markers_converter<Locator,Shape,Detector>::vertex( double * x, double * y)
-   {
-      unsigned cmd = agg::path_cmd_move_to;
-      
-      double x1, y1, x2, y2;
-      while (!agg::is_stop(cmd))
-      {
-         switch (status_)
-         {
-            case initial:
-               if (num_markers_ == 0 )
-               {
-                  cmd = agg::path_cmd_stop;
-                  break;
-               }
-               locator_.rewind(marker_++);
-               status_ = markers;
-               num_markers_ = 0;
-               break;
-            case markers:
-            {
-               unsigned cmd1;
-               while (agg::is_move_to(cmd1 = locator_.vertex(&x1,&y1)));
-               if (agg::is_stop(cmd1))
-               {
-                  status_ = stop;
-                  break;
-               }
-               unsigned cmd2 = locator_.vertex(&x2,&y2);
-               if (agg::is_stop(cmd2))
-               {
-                  status_ = stop;
-                  break;
-               }
-              
-
-               ++num_markers_;
-               double dx = x2 - x1;
-               double dy = y2 - y1;
-               double d = std::sqrt(dx * dx + dy * dy);
-               Envelope<double> ext = shape_.extent();
-               if (d > ext.width())
-               {
-                  mtx_ = transform_;
-                  mtx_ *= agg::trans_affine_rotation(::atan2(dy,dx));
-                  double marker_x = x1 + dx * 0.5;
-                  double marker_y = y1 + dy * 0.5;
-                     
-                  mtx_ *= agg::trans_affine_translation(marker_x,marker_y);
-                                   
-                  double minx = ext.minx();
-                  double miny = ext.miny();
-                  double maxx = ext.maxx();
-                  double maxy = ext.maxy();
-                  mtx_.transform(&minx,&miny);
-                  mtx_.transform(&maxx,&maxy);
-                     
-                  Envelope<double> e0(minx,miny,maxx,maxy);
-                     
-                  if (detector_.has_placement(e0))
-                  {
-                     shape_.rewind(0);
-                     status_ = polygon;
-                     detector_.insert(ext);
-                  }
-               }
-               
-               break;
-            }
-            case polygon:
-               cmd = shape_.vertex(x,y);
-               if (agg::is_stop(cmd))
-               {
-                  cmd = agg::path_cmd_move_to;
-                  status_ = markers;
-                  break;
-               }
-               mtx_.transform(x,y);
-               return cmd;
-            case stop:
-               cmd = agg::path_cmd_stop;
-               break;
-         }
-      }
-      return cmd;
-   }
-}
-
-#endif // MARKERS_CONVERTER_HPP
diff --git a/include/mapnik/markers_placement.hpp b/include/mapnik/markers_placement.hpp
new file mode 100644
index 0000000..d2519af
--- /dev/null
+++ b/include/mapnik/markers_placement.hpp
@@ -0,0 +1,246 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Hermann Kraus
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef MARKERS_PLACEMENT_HPP
+#define MARKERS_PLACEMENT_HPP
+
+#include "agg_basics.h"
+#include <mapnik/box2d.hpp>
+
+#include <boost/utility.hpp>
+#include <cmath>
+
+namespace mapnik {
+
+template <typename Locator, typename Detector>
+class markers_placement : boost::noncopyable
+{
+public:
+    markers_placement(Locator &locator, box2d<double> size, Detector &detector, double spacing, double max_error, bool allow_overlap);
+    void rewind();
+    bool get_point(double *x, double *y, double *angle, bool add_to_detector = true);
+private:
+    Locator &locator_;
+    box2d<double> size_;
+    Detector &detector_;
+    double spacing_;
+    bool done_;
+    double last_x, last_y;
+    double next_x, next_y;
+    /** If a marker could not be placed at the exact point where it should
+     * go the next markers distance will be a bit lower. */
+    double error_;
+    double max_error_;
+    unsigned marker_nr_;
+    bool allow_overlap_;
+    box2d<double> perform_transform(double angle, double dx, double dy);
+    double find_optimal_spacing(double s);
+};
+
+/** Constructor for markers_placement object.
+ * \param locator  Path along which markers are placed (type: vertex source)
+ * \param size     Size of the marker
+ * \param detector Collision detection
+ * \param spacing  Distance between markers. If the value is negative it is
+ *                 converted to a positive value with similar magnitude, but
+ *                 choosen to optimize marker placement. 0 = no markers
+ */
+template <typename Locator,  typename Detector> markers_placement<Locator, Detector>::markers_placement(
+    Locator &locator, box2d<double> size, Detector &detector, double spacing, double max_error, bool allow_overlap)
+    : locator_(locator), size_(size), detector_(detector), max_error_(max_error), allow_overlap_(allow_overlap)
+{
+    if (spacing >= 0)
+    {
+        spacing_ = spacing;
+    } else if (spacing < 0)
+    {
+        spacing_ = find_optimal_spacing(-spacing);
+    }
+    rewind();
+}
+
+/** Autmatically chooses spacing. */
+template <typename Locator, typename Detector> double markers_placement<Locator, Detector>::find_optimal_spacing(double s)
+{
+    rewind();
+    //Calculate total path length
+    unsigned cmd = agg::path_cmd_move_to;
+    double length = 0;
+    while (!agg::is_stop(cmd))
+    {
+        double dx = next_x - last_x;
+        double dy = next_y - last_y;
+        length += std::sqrt(dx * dx + dy * dy);
+        last_x = next_x;
+        last_y = next_y;
+        while (agg::is_move_to(cmd = locator_.vertex(&next_x, &next_y)))
+        {
+            //Skip over "move" commands
+            last_x = next_x;
+            last_y = next_y;
+        }
+    }
+    unsigned points = round(length / s);
+    if (points == 0) return 0; //Path to short
+    return length / points;
+}
+
+/** Start again at first marker.
+ * \note Returning the same list of markers only works when they were NOT added
+ *       to the detector.
+ */
+template <typename Locator, typename Detector> void markers_placement<Locator, Detector>::rewind()
+{
+    locator_.rewind(0);
+    //Get first point
+    done_ = agg::is_stop(locator_.vertex(&next_x, &next_y)) || spacing_ < size_.width();
+    last_x = next_x;
+    last_y = next_y; // Force request of new segment
+    error_ = 0;
+    marker_nr_ = 0;
+}
+
+/** Get a point where the marker should be placed.
+ * Each time this function is called a new point is returned.
+ * \param x     Return value for x position
+ * \param y     Return value for x position
+ * \param angle Return value for rotation angle
+ * \param add_to_detector Add selected position to detector
+ * \return True if a place is found, false if none is found.
+ */
+template <typename Locator, typename Detector> bool markers_placement<Locator, Detector>::get_point(
+    double *x, double *y, double *angle, bool add_to_detector)
+{
+    if (done_) return false;
+    
+    unsigned cmd;
+    double spacing_left;
+    if (marker_nr_++ == 0)
+    {
+        spacing_left = spacing_ / 2;
+    } else
+    {
+        spacing_left = spacing_;
+    }
+
+    spacing_left -= error_;
+    error_ = 0;
+
+    while (true)
+    {
+        //Loop exits when a position is found or when no more segments are available
+        if (spacing_left < size_.width()/2)
+        {
+            //Do not place markers to close to the beginning of a segment
+            error_ += size_.width()/2 - spacing_left;
+            spacing_left = size_.width()/2;
+        }
+        if (abs(error_) > max_error_ * spacing_)
+        {
+            spacing_left += spacing_ - error_;
+            error_ = 0;
+        }
+        double dx = next_x - last_x;
+        double dy = next_y - last_y;
+        double d = std::sqrt(dx * dx + dy * dy);
+        if (d <= spacing_left)
+        {
+            //Segment is to short to place marker. Find next segment
+            spacing_left -= d;
+            last_x = next_x;
+            last_y = next_y;
+            while (agg::is_move_to(cmd = locator_.vertex(&next_x, &next_y)))
+            {
+                //Skip over "move" commands
+                last_x = next_x;
+                last_y = next_y;
+            }
+            if (agg::is_stop(cmd))
+            {
+                done_ = true;
+                return false;
+            }
+            continue; //Try again
+        }
+        //Check if marker really fits in this segment
+        if (d < size_.width())
+        {
+            //Segment to short => Skip this segment
+            error_ += d + size_.width()/2 - spacing_left;
+            spacing_left = d + size_.width()/2;
+            continue;
+        } else if (d - spacing_left < size_.width()/2)
+        {
+            //Segment is long enough, but we are to close to the end
+            
+            //Note: This function moves backwards. This could lead to an infinite
+            // loop when another function adds a positive offset. Therefore we
+            // only move backwards when there is no offset
+            if (error_ == 0)
+            {
+                error_ += d - size_.width()/2 - spacing_left;
+                spacing_left = d - size_.width()/2;
+            } else
+            {
+                //Skip this segment
+                error_ += d + size_.width()/2 - spacing_left;
+                spacing_left = d + size_.width()/2;
+            }
+            continue; //Force checking of max_error constraint
+        }
+        *angle = atan2(dy, dx);
+        *x = last_x + dx * (spacing_left / d);
+        *y = last_y + dy * (spacing_left / d);
+
+        box2d<double> box = perform_transform(*angle, *x, *y);
+        if (!allow_overlap_ && !detector_.has_placement(box))
+        {
+            //10.0 is choosen arbitrarily
+            error_ += spacing_ * max_error_ / 10.0;
+            spacing_left += spacing_ * max_error_ / 10.0;
+            continue;
+        }
+        if (add_to_detector) detector_.insert(box);
+        last_x = *x;
+        last_y = *y;
+        return true;
+    }
+}
+
+/** Rotates the size_ box and translates the position. */
+template <typename Locator, typename Detector> box2d<double> markers_placement<Locator, Detector>::perform_transform(double angle, double dx, double dy)
+{
+    double c = cos(angle), s = sin(angle);
+    double x1 = size_.minx();
+    double x2 = size_.maxx();
+    double y1 = size_.miny();
+    double y2 = size_.maxy();
+
+    double x1_ = dx + x1 * c - y1 * s;
+    double y1_ = dy + x1 * s + y1 * c;
+    double x2_ = dx + x2 * c - y2 * s;
+    double y2_ = dy + x2 * s + y2 * c;
+
+    return box2d<double>(x1_, y1_, x2_, y2_);
+}
+} /* end namespace */
+#endif // MARKERS_PLACEMENT_HPP
diff --git a/include/mapnik/markers_symbolizer.hpp b/include/mapnik/markers_symbolizer.hpp
index c43310b..5075191 100644
--- a/include/mapnik/markers_symbolizer.hpp
+++ b/include/mapnik/markers_symbolizer.hpp
@@ -25,17 +25,71 @@
 #ifndef MARKERS_SYMBOLIZER_HPP
 #define MARKERS_SYMBOLIZER_HPP
 
+//mapnik
+#include <mapnik/symbolizer.hpp>
+#include <mapnik/parse_path.hpp>
+#include <mapnik/color.hpp>
+#include <mapnik/stroke.hpp>
+#include <mapnik/enumeration.hpp>
+
 namespace mapnik {
-   
-   struct MAPNIK_DECL markers_symbolizer
-   {
-     public:
-      markers_symbolizer() 
-         : allow_overlap_(false) {}
-     private:
-      bool allow_overlap_;
-      
-   };
+
+// TODO - consider merging with text_symbolizer label_placement_e
+enum marker_placement_enum {
+    MARKER_POINT_PLACEMENT,
+    MARKER_LINE_PLACEMENT,
+    marker_placement_enum_MAX
+};
+
+DEFINE_ENUM( marker_placement_e, marker_placement_enum );
+
+enum marker_type_enum {
+    ARROW,
+    ELLIPSE,
+    marker_type_enum_MAX
+};
+
+DEFINE_ENUM( marker_type_e, marker_type_enum );
+
+struct MAPNIK_DECL markers_symbolizer : 
+        public symbolizer_with_image, public symbolizer_base
+{
+public:
+    explicit markers_symbolizer();
+    markers_symbolizer(path_expression_ptr filename);
+    markers_symbolizer(markers_symbolizer const& rhs);
+    void set_allow_overlap(bool overlap);
+    bool get_allow_overlap() const;
+    void set_spacing(double spacing);
+    double get_spacing() const;
+    void set_max_error(double max_error);
+    double get_max_error() const;
+    void set_fill(color fill);
+    color const& get_fill() const;
+    void set_width(double width);
+    double get_width() const;
+    void set_height(double height);
+    double get_height() const;
+    stroke const& get_stroke() const;
+    void set_stroke(stroke const& stroke);
+    void set_marker_placement(marker_placement_e marker_p);
+    marker_placement_e get_marker_placement() const;
+    void set_marker_type(marker_type_e marker_p);
+    marker_type_e get_marker_type() const;
+
+private:
+    bool allow_overlap_;
+    color fill_;
+    double spacing_;
+    double max_error_;
+    double width_;
+    double height_;
+    stroke stroke_;
+    marker_placement_e marker_p_;
+    marker_type_e marker_type_;
+
+};
+
 }
 
 #endif // MARKERS_SYMBOLIZER_HPP
diff --git a/include/mapnik/math_expr.hpp b/include/mapnik/math_expr.hpp
deleted file mode 100644
index c95f1c9..0000000
--- a/include/mapnik/math_expr.hpp
+++ /dev/null
@@ -1,141 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-//$Id$
-
-#ifndef MATH_EXPR_HPP
-#define MATH_EXPR_HPP
-
-#include <mapnik/expression.hpp>
-
-namespace mapnik
-{
-    template <typename T>
-    struct add
-    {
-        T operator () (T const& left, T const& right)
-        {
-            return left + right;
-        }
-        static std::string to_string()
-        {
-            return "+";
-        } 
-    };
-
-    template <typename T>
-    struct sub
-    {
-        T operator () (T const& left, T const& right)
-        {
-            return left - right;
-        }
-        static std::string to_string()
-        {
-            return "-";
-        } 
-    };
-    
-    template <typename T>
-    struct mult
-    {
-        T operator () (T const& left, T const& right)
-        {
-            return left * right;
-        }
-        static std::string to_string()
-        {
-            return "*";
-        } 
-    };
-    
-    template <typename T>
-    struct div
-    {
-        T operator () (T const& left, T const& right)
-        {
-            return left / right;
-        }
-        static std::string to_string()
-        {
-            return "/";
-        } 
-    };
-    
-    template <typename T>
-    struct mod
-    {
-        T operator () (T const& left, T const& right)
-        {
-            return left % right;
-        }
-        static std::string to_string()
-        {
-            return "%";
-        } 
-    };
-
-    template <typename FeatureT,typename Op>
-    struct math_expr_b : public expression<FeatureT>
-    {
-        math_expr_b(expression<FeatureT> const& left,
-                    expression<FeatureT> const& right)
-            : expression<FeatureT>(),
-              left_(left.clone()), 
-              right_(right.clone()) {}
-        math_expr_b(math_expr_b const& other)
-            : expression<FeatureT>(),
-              left_(other.left_->clone()),
-              right_(other.right_->clone()) {}
-
-        value get_value(FeatureT const& feature) const
-        {
-            return Op ()(left_->get_value(feature),right_->get_value(feature));
-        }
-
-        void accept(filter_visitor<FeatureT>& v)
-        {
-            left_->accept(v);
-            right_->accept(v);
-            v.visit(*this);
-        }
-
-        expression<FeatureT>* clone() const
-        {
-            return new math_expr_b<FeatureT,Op>(*this);
-        }
-        std::string to_string() const
-        {
-            return "("+left_->to_string() + Op::to_string() + right_->to_string()+")";
-        }
-
-        ~math_expr_b() 
-        {
-            delete left_;
-            delete right_;
-        }
-    private:
-        expression<FeatureT>* left_;
-        expression<FeatureT>* right_;	
-    }; 
-}
-
-#endif //
diff --git a/include/mapnik/memory.hpp b/include/mapnik/memory.hpp
index ce680a4..71ac50d 100644
--- a/include/mapnik/memory.hpp
+++ b/include/mapnik/memory.hpp
@@ -29,60 +29,60 @@
 
 namespace mapnik
 {
-    class MemoryUtils
-    {
-    public:
-        static size_t alignPointerSize(size_t ptrSize);
-    private:
-        MemoryUtils();
-        MemoryUtils(const MemoryUtils&);
-        MemoryUtils& operator=(const MemoryUtils&);
-    };
+class MemoryUtils
+{
+public:
+    static size_t alignPointerSize(size_t ptrSize);
+private:
+    MemoryUtils();
+    MemoryUtils(const MemoryUtils&);
+    MemoryUtils& operator=(const MemoryUtils&);
+};
 
-    class MemoryManager
-    {
-    public:
-        virtual void* allocate(size_t size)=0;
-        virtual void deallocate(void* p)=0;
-        virtual ~MemoryManager();
-    protected:
-        MemoryManager();                      // {}
-    private:
-        MemoryManager(const MemoryManager&);
-        MemoryManager& operator=(const MemoryManager&);
-    };
+class MemoryManager
+{
+public:
+    virtual void* allocate(size_t size)=0;
+    virtual void deallocate(void* p)=0;
+    virtual ~MemoryManager();
+protected:
+    MemoryManager();                      // {}
+private:
+    MemoryManager(const MemoryManager&);
+    MemoryManager& operator=(const MemoryManager&);
+};
 
-    class Object
+class Object
+{
+public:
+    void* operator new(size_t size);
+    void* operator new(size_t size, MemoryManager* manager);
+    void operator delete(void* p);
+    void operator delete(void* p, MemoryManager* manager);
+protected:
+    virtual ~Object() {}
+    Object() {}
+    Object(const Object&) {}
+protected:
+    Object& operator=(const Object&)
     {
-    public:
-        void* operator new(size_t size);
-        void* operator new(size_t size, MemoryManager* manager);
-        void operator delete(void* p);
-        void operator delete(void* p, MemoryManager* manager);
-    protected:
-        virtual ~Object() {}
-        Object() {}
-        Object(const Object&) {}
-    protected:
-        Object& operator=(const Object&)
-        {
-            return *this;
-        }
-    };
+        return *this;
+    }
+};
 
-    template <typename Geometry>
-    class geometry_pool
+template <typename Geometry>
+class geometry_pool
+{
+public:
+    void* allocate()
+    {
+        return ::operator new(sizeof(Geometry));
+    }
+    void deallocate(void* p)
     {
-    public:
-        void* allocate()
-        {
-            return ::operator new(sizeof(Geometry));
-        }
-        void deallocate(void* p)
-        {
-            ::operator delete(p);
-        }
-    };
+        ::operator delete(p);
+    }
+};
 
 }
 #endif //MEMORY_HPP
diff --git a/include/mapnik/memory_datasource.hpp b/include/mapnik/memory_datasource.hpp
index c1ec67a..f344ff1 100644
--- a/include/mapnik/memory_datasource.hpp
+++ b/include/mapnik/memory_datasource.hpp
@@ -26,50 +26,43 @@
 #define MEMORY_DATASOURCE_HPP
 
 #include <mapnik/datasource.hpp>
-#include <mapnik/feature_factory.hpp> // TODO remove
+#include <mapnik/feature_layer_desc.hpp>
 #include <vector>
 
 namespace mapnik {
     
-   class MAPNIK_DECL memory_datasource : public datasource
-   {
-      friend class memory_featureset;
-   public:
-      memory_datasource();
-      virtual ~memory_datasource();
-      void push(feature_ptr feature);
-      int type() const;
-      featureset_ptr features(const query& q) const;
-      featureset_ptr features_at_point(coord2d const& pt) const;
-      Envelope<double> envelope() const;
-      layer_descriptor get_descriptor() const;
-      size_t size() const;
-   private:
-      std::vector<mapnik::feature_ptr> features_;
-   }; 
+class MAPNIK_DECL memory_datasource : public datasource
+{
+    friend class memory_featureset;
+public:
+    memory_datasource();
+    virtual ~memory_datasource();
+    void push(feature_ptr feature);
+    int type() const;
+    featureset_ptr features(const query& q) const;
+    featureset_ptr features_at_point(coord2d const& pt) const;
+    box2d<double> envelope() const;
+    layer_descriptor get_descriptor() const;
+    size_t size() const;
+private:
+    std::vector<feature_ptr> features_;
+    mapnik::layer_descriptor desc_;
+}; 
    
-   // This class implements a simple way of displaying point-based data
-   // TODO -- possible redesign, move into separate file
-   //
+// This class implements a simple way of displaying point-based data
+// TODO -- possible redesign, move into separate file
+//
    
-   class MAPNIK_DECL point_datasource : public mapnik::memory_datasource {
-   public:
-      point_datasource() : feat_id(0) {}
-      void add_point(double x, double y, const char* key, const char* value) {
-         mapnik::feature_ptr feature(mapnik::feature_factory::create(feat_id++));
-         mapnik::geometry2d * pt = new mapnik::point_impl;
-         pt->move_to(x,y);
-         feature->add_geometry(pt);
-         mapnik::transcoder tr("utf-8");
-         (*feature)[key] = tr.transcode(value);
-         this->push(feature);
-      }
+class MAPNIK_DECL point_datasource : public memory_datasource {
+public:
+    point_datasource() :
+        feature_id_(1) {}
+    void add_point(double x, double y, const char* key, const char* value);  
+    inline int type() const { return datasource::Vector; }
       
-      int type() const { return mapnik::datasource::Vector; }
-      
-   private:
-      int feat_id;
-   };   
+private:
+    int feature_id_;
+};   
 }
 
 #endif // MEMORY_DATASOURCE_HPP
diff --git a/include/mapnik/memory_featureset.hpp b/include/mapnik/memory_featureset.hpp
index d137553..f8f97e3 100644
--- a/include/mapnik/memory_featureset.hpp
+++ b/include/mapnik/memory_featureset.hpp
@@ -29,38 +29,41 @@
 
 namespace mapnik {
     
-    class memory_featureset : public Featureset, private boost::noncopyable
-    {
-    public:
-        memory_featureset(Envelope<double> const& bbox, memory_datasource const& ds)
-            : bbox_(bbox),
-              pos_(ds.features_.begin()),
-              end_(ds.features_.end())
-        {}
-        virtual ~memory_featureset() {}
+class memory_featureset : public Featureset, private boost::noncopyable
+{
+public:
+    memory_featureset(box2d<double> const& bbox, memory_datasource const& ds)
+        : bbox_(bbox),
+          pos_(ds.features_.begin()),
+          end_(ds.features_.end())
+    {}
+    virtual ~memory_featureset() {}
         
-        feature_ptr next()
+    feature_ptr next()
+    {
+        while (pos_ != end_)
         {
-            while (pos_ != end_)
-            {
-                for  (unsigned i=0; i<(*pos_)->num_geometries();++i) {
-                    geometry2d & geom = (*pos_)->get_geometry(i);
-                    if (bbox_.intersects(geom.envelope()))
-                    {
-                        return *pos_++;
-                    }
+            for  (unsigned i=0; i<(*pos_)->num_geometries();++i) {
+                geometry_type & geom = (*pos_)->get_geometry(i);
+#ifdef MAPNIK_DEBUG
+                std::clog << "bbox_=" << bbox_ << ", geom.envelope=" << geom.envelope() << "\n";
+#endif
+                if (bbox_.intersects(geom.envelope()))
+                {
+                    return *pos_++;
                 }
-                ++pos_;
             }
-           
-            return feature_ptr();
+            ++pos_;
         }
+           
+        return feature_ptr();
+    }
         
-    private:
-        Envelope<double> const& bbox_;
-        std::vector<feature_ptr>::const_iterator pos_;
-        std::vector<feature_ptr>::const_iterator end_; 
-    };
+private:
+    box2d<double> bbox_;
+    std::vector<feature_ptr>::const_iterator pos_;
+    std::vector<feature_ptr>::const_iterator end_; 
+};
 }
 
 #endif // MEMORY_FEATURESET_HPP
diff --git a/include/mapnik/metawriter.hpp b/include/mapnik/metawriter.hpp
new file mode 100644
index 0000000..3549e4f
--- /dev/null
+++ b/include/mapnik/metawriter.hpp
@@ -0,0 +1,142 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Hermann Kraus
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+
+#ifndef METAWRITER_HPP
+#define METAWRITER_HPP
+
+// Mapnik
+#include <mapnik/box2d.hpp>
+#include <mapnik/feature.hpp>
+#include <mapnik/font_engine_freetype.hpp>
+
+// Boost
+#include <boost/utility.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/optional.hpp>
+#include <boost/concept_check.hpp>
+// STL
+#include <set>
+#include <string>
+
+
+namespace mapnik {
+
+struct placement;
+
+/** Implementation of std::map that also returns const& for operator[]. */
+class metawriter_property_map
+{
+public:
+    metawriter_property_map() {}
+    UnicodeString const& operator[](std::string const& key) const;
+    UnicodeString& operator[](std::string const& key) {return m_[key];}
+private:
+    std::map<std::string, UnicodeString> m_;
+    UnicodeString not_found_;
+};
+
+
+/** All properties to be output by a metawriter. */
+class metawriter_properties : public std::set<std::string>
+{
+public:
+    metawriter_properties(boost::optional<std::string> str);
+    metawriter_properties() {};
+    template <class InputIterator> metawriter_properties(
+        InputIterator first, InputIterator last) : std::set<std::string>(first, last) {}
+    std::string to_string() const;
+};
+
+/** Abstract baseclass for all metawriter classes. */
+class metawriter
+{
+public:
+    typedef coord_transform2<CoordTransform,geometry_type> path_type;
+    metawriter(metawriter_properties dflt_properties) :
+      dflt_properties_(dflt_properties),
+      width_(0),
+      height_(0) {}
+    virtual ~metawriter() {};
+    /** Output a rectangular area.
+     * \param box Area (in pixel coordinates)
+     * \param feature The feature being processed
+     * \param prj_trans Projection transformation
+     * \param t Coordinate transformation
+     * \param properties List of properties to output
+     */
+    virtual void add_box(box2d<double> const& box, Feature const& feature,
+                         CoordTransform const& t,
+                         metawriter_properties const& properties)=0;
+    virtual void add_text(placement const& placement,
+                          face_set_ptr face,
+                          Feature const& feature,
+                          CoordTransform const& t,
+                          metawriter_properties const& properties)=0;
+    virtual void add_polygon(path_type & path,
+                             Feature const& feature,
+                             CoordTransform const& t,
+                             metawriter_properties const& properties)=0;
+    virtual void add_line(path_type & path,
+                          Feature const& feature,
+                          CoordTransform const& t,
+                          metawriter_properties const& properties)=0;
+
+    /** Start processing.
+     * Write file header, init database connection, ...
+     *
+     * \param properties metawriter_property_map object with userdefined values.
+     *        Useful for setting filename etc.
+     */
+    virtual void start(metawriter_property_map const& properties) 
+    {
+        boost::ignore_unused_variable_warning(properties);
+    };
+    
+    /** Stop processing.
+     * Write file footer, close database connection, ...
+     */
+    virtual void stop() {};
+    /** Set output size (pixels).
+     * All features that are completely outside this size are discarded.
+     */
+    void set_size(int width, int height) { width_ = width; height_ = height; }
+    /** Set Map object's srs. */
+    virtual void set_map_srs(projection const& proj) { /* Not required when working with image coordinates. */ }
+    /** Return the list of default properties. */
+    metawriter_properties const& get_default_properties() const { return dflt_properties_;}
+protected:
+    metawriter_properties dflt_properties_;
+    /** Output width (pixels). */
+    int width_;
+    /** Output height (pixels). */
+    int height_;
+};
+
+/** Shared pointer to metawriter object. */
+typedef boost::shared_ptr<metawriter> metawriter_ptr;
+/** Metawriter object + properties. */
+typedef std::pair<metawriter_ptr, metawriter_properties> metawriter_with_properties;
+
+}
+
+#endif
diff --git a/include/mapnik/metawriter_factory.hpp b/include/mapnik/metawriter_factory.hpp
new file mode 100644
index 0000000..d9c4fff
--- /dev/null
+++ b/include/mapnik/metawriter_factory.hpp
@@ -0,0 +1,55 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 MapQuest
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+
+#ifndef METAWRITER_FACTORY_HPP
+#define METAWRITER_FACTORY_HPP
+
+// mapnik
+#include <mapnik/metawriter.hpp>
+
+// boost
+#include <boost/property_tree/ptree.hpp>
+
+namespace mapnik {
+
+/**
+ * Creates a metawriter with the properties specified in the property
+ * tree argument. Currently, this is hard-coded to the JSON and inmem
+ * metawriters, but should provide an easy point to make them a
+ * proper factory method if this is wanted in the future.
+ */
+metawriter_ptr metawriter_create(const boost::property_tree::ptree &pt);
+
+/**
+ * Writes properties into the given property tree representing the 
+ * metawriter argument, and which can be used to reconstruct it.
+ */
+void metawriter_save(
+  const metawriter_ptr &m, 
+  boost::property_tree::ptree &pt,
+  bool explicit_defaults);
+
+}
+
+#endif /* METAWRITER_FACTORY_HPP */
+
diff --git a/include/mapnik/metawriter_inmem.hpp b/include/mapnik/metawriter_inmem.hpp
new file mode 100644
index 0000000..38bfc32
--- /dev/null
+++ b/include/mapnik/metawriter_inmem.hpp
@@ -0,0 +1,119 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 MapQuest
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+
+#ifndef METAWRITER_INMEM_HPP
+#define METAWRITER_INMEM_HPP
+
+// mapnik
+#include <mapnik/metawriter.hpp>
+
+// boost
+#include <boost/shared_ptr.hpp>
+
+// stl
+#include <list>
+
+namespace mapnik {
+
+/**
+ * Keeps metadata information in-memory, where it can be retrieved by whatever's
+ * calling Mapnik and custom output provided. 
+ *
+ * Stored data is all in image coordinates in the current implementation.
+ *
+ * This is most useful when Mapnik is being called from Python, and the result
+ * of the metawriter can be queried and injected into the (meta)tile or whatever
+ * in a very flexible way. E.g: for a GUI app the metawriter can be used to 
+ * create hit areas, for a web app it could be used to create an HTML image map.
+ *
+ * Because this is kept in-memory, applying this metawriter to features which are
+ * very common in the rendered image will increase memory usage, especially if
+ * many attributes are also kept.
+ */
+class metawriter_inmem
+  : public metawriter, private boost::noncopyable {
+public:
+  /**
+   * Construct an in-memory writer which keeps properties specified by the
+   * dflt_properties argument. For example: if dflt_properties contains "name",
+   * then the name attribute of rendered features referencing this metawriter
+   * will be kept in memory.
+   */
+  metawriter_inmem(metawriter_properties dflt_properties);
+  ~metawriter_inmem();
+  
+  virtual void add_box(box2d<double> const& box, Feature const& feature,
+          CoordTransform const& t,
+          metawriter_properties const& properties);
+  virtual void add_text(placement const& p,
+          face_set_ptr face,
+          Feature const& feature,
+          CoordTransform const& t,
+          metawriter_properties const& properties);
+  virtual void add_polygon(path_type & path,
+          Feature const& feature,
+          CoordTransform const& t,
+          metawriter_properties const& properties);
+  virtual void add_line(path_type & path,
+          Feature const& feature,
+          CoordTransform const& t,
+          metawriter_properties const& properties);
+  
+  virtual void start(metawriter_property_map const& properties);
+
+  /**
+   * An instance of a rendered feature. The box represents the image
+   * coordinates of a bounding box around the feature. The properties
+   * are the intersection of the features' properties and the "kept"
+   * properties of the metawriter.
+   */
+  struct meta_instance {
+    box2d<double> box;
+    std::map<std::string, value> properties;
+  };
+
+  typedef std::list<meta_instance> meta_instance_list;
+
+  // const-only access to the instances.
+  const meta_instance_list &instances() const;
+
+  // utility iterators for use in the python bindings.
+  meta_instance_list::const_iterator inst_begin() const;
+  meta_instance_list::const_iterator inst_end() const;
+  
+private:
+
+  std::list<meta_instance> instances_;
+
+  void add_vertices(path_type & path,
+                    Feature const& feature,
+                    CoordTransform const& t,
+                    metawriter_properties const& properties);
+};
+  
+/** Shared pointer to metawriter_inmem object. */
+typedef boost::shared_ptr<metawriter_inmem> metawriter_inmem_ptr;
+
+}
+
+#endif /* METAWRITER_INMEM_HPP */
diff --git a/include/mapnik/metawriter_json.hpp b/include/mapnik/metawriter_json.hpp
new file mode 100644
index 0000000..f46a739
--- /dev/null
+++ b/include/mapnik/metawriter_json.hpp
@@ -0,0 +1,153 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Hermann Kraus
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+
+#ifndef METAWRITER_JSON_HPP
+#define METAWRITER_JSON_HPP
+
+// mapnik
+#include <mapnik/metawriter.hpp>
+#include <mapnik/parse_path.hpp>
+
+// boost
+#include <boost/shared_ptr.hpp>
+
+// stl
+#include <fstream>
+
+namespace mapnik {
+
+
+/** Write JSON data to a stream object. */
+class metawriter_json_stream : public metawriter, private boost::noncopyable
+{
+public:
+    metawriter_json_stream(metawriter_properties dflt_properties);
+    ~metawriter_json_stream();
+    virtual void add_box(box2d<double> const& box, Feature const& feature,
+                         CoordTransform const& t,
+                         metawriter_properties const& properties);
+    virtual void add_text(placement const& p,
+                          face_set_ptr face,
+                          Feature const& feature,
+                          CoordTransform const& t,
+                          metawriter_properties const& properties);
+    virtual void add_polygon(path_type & path,
+                          Feature const& feature,
+                          CoordTransform const& t,
+                          metawriter_properties const& properties);
+    virtual void add_line(path_type & path,
+                          Feature const& feature,
+                          CoordTransform const& t,
+                          metawriter_properties const& properties);
+
+    virtual void start(metawriter_property_map const& properties);
+    virtual void stop();
+    /** Set output stream. This function has to be called before the first output is made. */
+    void set_stream(std::ostream *f) { f_ = f; }
+    /** Get output stream. */
+    std::ostream *get_stream() const { return f_; }
+    /** Only write header/footer to file with one or more features. */
+    void set_output_empty(bool output_empty) { output_empty_ = output_empty; }
+    /** See set_output_empty(). */
+    bool get_output_empty() { return output_empty_; }
+    void set_pixel_coordinates(bool on) { pixel_coordinates_ = on; }
+    bool get_pixel_coordinates() { return pixel_coordinates_; }
+    virtual void set_map_srs(projection const& proj);
+protected:
+    enum {
+    HEADER_NOT_WRITTEN = -1,
+    STOPPED = -2,
+    STARTED = 0
+    };
+    /** Features written. */
+    int count_;
+    bool output_empty_;
+    /** Transformation from map srs to output srs. */
+    proj_transform *trans_;
+    projection output_srs_;
+    bool pixel_coordinates_;
+    virtual void write_header();
+    inline void write_feature_header(std::string type) {
+#ifdef MAPNIK_DEBUG
+        if (count_ == STOPPED)
+        {
+            std::cerr << "WARNING: Metawriter not started before using it.\n";
+        }
+#endif
+        if (count_ == HEADER_NOT_WRITTEN) write_header();
+        if (count_++) *f_ << ",\n";
+
+        *f_  << "{ \"type\": \"Feature\",\n  \"geometry\": { \"type\": \"" << type << "\",\n    \"coordinates\":";
+    }
+    void write_properties(Feature const& feature, metawriter_properties const& properties);
+    inline void write_point(CoordTransform const& t, double x, double y, bool last = false)
+    {
+        double z = 0.0;
+        if (!pixel_coordinates_) {
+            t.backward(&x, &y);
+            trans_->forward(x, y, z);
+        }
+        *f_ << "[" << x << "," << y << "]";
+        if (!last) {
+            *f_ << ",";
+        }
+    }
+    void write_line_polygon(path_type & path, CoordTransform const& t, bool polygon);
+
+private:
+    std::ostream *f_;
+};
+
+/** Shared pointer to metawriter_json_stream object. */
+typedef boost::shared_ptr<metawriter_json_stream> metawriter_json_stream_ptr;
+
+/** JSON writer. */
+class metawriter_json : public metawriter_json_stream
+{
+public:
+    metawriter_json(metawriter_properties dflt_properties, path_expression_ptr fn);
+
+    virtual void start(metawriter_property_map const& properties);
+    virtual void stop();
+    /** Set filename template.
+      *
+      * This template is processed with values from Map's metawriter properties to
+      * create the actual filename during start() call.
+      */
+    void set_filename(path_expression_ptr fn);
+    /** Get filename template. */
+    path_expression_ptr get_filename() const;
+private:
+    path_expression_ptr fn_;
+    std::fstream f_;
+    std::string filename_;
+protected:
+    virtual void write_header();
+};
+
+/** Shared pointer to metawriter_json object. */
+typedef boost::shared_ptr<metawriter_json> metawriter_json_ptr;
+
+}
+
+#endif
diff --git a/include/mapnik/octree.hpp b/include/mapnik/octree.hpp
index 67eed76..fc08302 100644
--- a/include/mapnik/octree.hpp
+++ b/include/mapnik/octree.hpp
@@ -26,6 +26,7 @@
 
 // mapnik
 #include <mapnik/global.hpp>
+#include <mapnik/palette.hpp>
 
 // boost
 #include <boost/utility.hpp>
@@ -36,277 +37,272 @@
 #include <deque>
 
 namespace mapnik {
-	
-   typedef boost::uint8_t byte ;
-   struct rgb	
-   {
-         byte r;
-         byte g;
-         byte b;
-         rgb(byte r_, byte g_, byte b_)
-            : r(r_), g(g_), b(b_) {}
-   };
 
-   struct RGBPolicy
-   {
-         const static unsigned MAX_LEVELS = 6;
-         const static unsigned MIN_LEVELS = 2;
-         inline static unsigned index_from_level(unsigned level, rgb const& c)
-         {
-            unsigned shift = 7 - level;
-            return (((c.r >> shift) & 1) << 2) 
-               | (((c.g >> shift) & 1) << 1) 
-               | ((c.b >> shift) & 1);
-         }
-   };
+struct RGBPolicy
+{
+    const static unsigned MAX_LEVELS = 6;
+    const static unsigned MIN_LEVELS = 2;
+    inline static unsigned index_from_level(unsigned level, rgb const& c)
+    {
+        unsigned shift = 7 - level;
+        return (((c.r >> shift) & 1) << 2) 
+            | (((c.g >> shift) & 1) << 1) 
+            | ((c.b >> shift) & 1);
+    }
+};
 
-   template <typename T, typename InsertPolicy = RGBPolicy >
-   class octree : private boost::noncopyable
-   {	
-         struct node 
-         {
-               node ()
-                  :  reds(0),
-                     greens(0),
-                     blues(0),
-                     count(0),
-                     count_cum(0),
-                     children_count(0),
-                     index(0)
-               {
-                  memset(&children_[0],0,sizeof(children_));
-               }
+template <typename T, typename InsertPolicy = RGBPolicy >
+class octree : private boost::noncopyable
+{       
+    struct node 
+    {
+        node ()
+            :  reds(0),
+               greens(0),
+               blues(0),
+               count(0),
+               count_cum(0),
+               children_count(0),
+               index(0)
+        {
+            memset(&children_[0],0,sizeof(children_));
+        }
 
-               ~node ()
-               {
-                  for (unsigned i = 0;i < 8; ++i) {
-                     if (children_[i] != 0) delete children_[i],children_[i]=0;
-                  }
-               }
-
-               bool is_leaf() const { return count == 0; }
-               node * children_[8];
-               boost::uint64_t reds;
-               boost::uint64_t greens;
-               boost::uint64_t blues;
-               unsigned count;
-               double reduce_cost;
-               unsigned count_cum;
-               byte  children_count;
-               byte  index;
-         };
-         struct node_cmp
-         {
-               bool operator() ( const node * lhs,const node* rhs) const
-               {
-                  return lhs->reduce_cost < rhs->reduce_cost;
-               }
-         };
+        ~node ()
+        {
+            for (unsigned i = 0;i < 8; ++i) {
+                if (children_[i] != 0) delete children_[i],children_[i]=0;
+            }
+        }
 
-         std::deque<node*> reducible_[InsertPolicy::MAX_LEVELS];
-         unsigned max_colors_;
-         unsigned colors_;
-         unsigned offset_;
-         unsigned leaf_level_;
-         bool has_alfa_;
+        bool is_leaf() const { return count == 0; }
+        node * children_[8];
+        boost::uint64_t reds;
+        boost::uint64_t greens;
+        boost::uint64_t blues;
+        unsigned count;
+        double reduce_cost;
+        unsigned count_cum;
+        byte  children_count;
+        byte  index;
+    };
+    struct node_cmp
+    {
+        bool operator() ( const node * lhs,const node* rhs) const
+        {
+            return lhs->reduce_cost < rhs->reduce_cost;
+        }
+    };
 
-      public:
-         explicit octree(unsigned max_colors=256)
-            : max_colors_(max_colors),
-              colors_(0),
-              offset_(0),
-              leaf_level_(InsertPolicy::MAX_LEVELS),
-              has_alfa_(false),
-              root_(new node())
-         {}
+    std::deque<node*> reducible_[InsertPolicy::MAX_LEVELS];
+    unsigned max_colors_;
+    unsigned colors_;
+    unsigned offset_;
+    unsigned leaf_level_;
+    bool has_alfa_;
 
-         ~octree() { delete root_;}
+public:
+    explicit octree(unsigned max_colors=256)
+        : max_colors_(max_colors),
+          colors_(0),
+          offset_(0),
+          leaf_level_(InsertPolicy::MAX_LEVELS),
+          has_alfa_(false),
+          root_(new node())
+    {}
 
-         void setMaxColors(unsigned max_colors)
-         {
-            max_colors_ = max_colors;
-         }
+    ~octree() { delete root_;}
 
-         void setOffset(unsigned offset)
-         {
-            offset_ = offset;
-         }
+    unsigned colors()
+    {
+        return colors_;
+    }
 
-         unsigned getOffset()
-         {
-            return offset_;
-         }
+    void setMaxColors(unsigned max_colors)
+    {
+        max_colors_ = max_colors;
+    }
 
-         void hasAlfa(bool v)
-         {
-            has_alfa_=v;
-         }
+    void setOffset(unsigned offset)
+    {
+        offset_ = offset;
+    }
 
-         bool hasAlfa()
-         {
-            return has_alfa_;
-         }
+    unsigned getOffset()
+    {
+        return offset_;
+    }
 
-         void insert(T const& data)
-         {
-            unsigned level = 0;
-            node * cur_node = root_;
-            while (true) {
-               cur_node->count_cum++;
-               cur_node->reds   += data.r;
-               cur_node->greens += data.g;
-               cur_node->blues  += data.b;
+    void hasAlfa(bool v)
+    {
+        has_alfa_=v;
+    }
 
-               if ( cur_node->count > 0 || level == leaf_level_)
-               {
-                  cur_node->count  += 1;
-                  if (cur_node->count == 1) ++colors_;
-                  //if (colors_ >= max_colors_ - 1)
-                  //reduce();
-                  break;
-               }
+    bool hasAlfa()
+    {
+        return has_alfa_;
+    }
 
-               unsigned idx = InsertPolicy::index_from_level(level,data);
-               if (cur_node->children_[idx] == 0) {
-                  cur_node->children_count++;
-                  cur_node->children_[idx] = new node();
-                  if (level < leaf_level_-1)
-                  {
-                     reducible_[level+1].push_back(cur_node->children_[idx]);
-                  }
-               }
-               cur_node = cur_node->children_[idx];
-               ++level;
-            }
-         }
+    void insert(T const& data)
+    {
+        unsigned level = 0;
+        node * cur_node = root_;
+        while (true) {
+            cur_node->count_cum++;
+            cur_node->reds   += data.r;
+            cur_node->greens += data.g;
+            cur_node->blues  += data.b;
 
-         int quantize(rgb const& c) const
-         {
-            unsigned level = 0;
-            node * cur_node = root_;
-            while (cur_node)
+            if ( cur_node->count > 0 || level == leaf_level_)
             {
-               if (cur_node->children_count == 0) 
-                    return cur_node->index + offset_;
-               unsigned idx = InsertPolicy::index_from_level(level,c);
-               cur_node = cur_node->children_[idx];
-               ++level;
+                cur_node->count  += 1;
+                if (cur_node->count == 1) ++colors_;
+                //if (colors_ >= max_colors_ - 1)
+                //reduce();
+                break;
             }
-            return -1;
-         }
 
-         void create_palette(std::vector<rgb> & palette)
-         {
-            if (has_alfa_)
-            {
-               max_colors_--;
-               palette.push_back(rgb(0,0,0));
+            unsigned idx = InsertPolicy::index_from_level(level,data);
+            if (cur_node->children_[idx] == 0) {
+                cur_node->children_count++;
+                cur_node->children_[idx] = new node();
+                if (level < leaf_level_-1)
+                {
+                    reducible_[level+1].push_back(cur_node->children_[idx]);
+                }
             }
-            reduce();
-            palette.reserve(colors_);
-            create_palette(palette, root_);
-         }
+            cur_node = cur_node->children_[idx];
+            ++level;
+        }
+    }
+
+    int quantize(rgb const& c) const
+    {
+        unsigned level = 0;
+        node * cur_node = root_;
+        while (cur_node)
+        {
+            if (cur_node->children_count == 0) 
+                return cur_node->index + offset_;
+            unsigned idx = InsertPolicy::index_from_level(level,c);
+            cur_node = cur_node->children_[idx];
+            ++level;
+        }
+        return -1;
+    }
+
+    void create_palette(std::vector<rgb> & palette)
+    {
+        if (has_alfa_)
+        {
+            max_colors_--;
+            palette.push_back(rgb(0,0,0));
+        }
+        reduce();
+        palette.reserve(colors_);
+        create_palette(palette, root_);
+    }
          
-         void computeCost(node *r)
-         {
-            r->reduce_cost = 0;
-            if (r->children_count==0)
-               return;
+    void computeCost(node *r)
+    {
+        r->reduce_cost = 0;
+        if (r->children_count==0)
+            return;
 
-            double mean_r = r->reds   / r->count_cum;
-            double mean_g = r->greens / r->count_cum;
-            double mean_b = r->blues  / r->count_cum;
-            for (unsigned idx=0; idx < 8; ++idx) if (r->children_[idx] != 0)
-            {
-               double dr,dg,db;
-               computeCost(r->children_[idx]);
+        double mean_r = r->reds   / r->count_cum;
+        double mean_g = r->greens / r->count_cum;
+        double mean_b = r->blues  / r->count_cum;
+        for (unsigned idx=0; idx < 8; ++idx) if (r->children_[idx] != 0)
+                                             {
+                                                 double dr,dg,db;
+                                                 computeCost(r->children_[idx]);
 
-               dr = r->children_[idx]->reds   / r->children_[idx]->count_cum - mean_r;
-               dg = r->children_[idx]->greens / r->children_[idx]->count_cum - mean_g;
-               db = r->children_[idx]->blues  / r->children_[idx]->count_cum - mean_b;
+                                                 dr = r->children_[idx]->reds   / r->children_[idx]->count_cum - mean_r;
+                                                 dg = r->children_[idx]->greens / r->children_[idx]->count_cum - mean_g;
+                                                 db = r->children_[idx]->blues  / r->children_[idx]->count_cum - mean_b;
                 
-               r->reduce_cost += r->children_[idx]->reduce_cost;
-               r->reduce_cost += (dr*dr + dg*dg + db*db) * r->children_[idx]->count_cum;
-            }
-         }
+                                                 r->reduce_cost += r->children_[idx]->reduce_cost;
+                                                 r->reduce_cost += (dr*dr + dg*dg + db*db) * r->children_[idx]->count_cum;
+                                             }
+    }
 
-         void reduce()
-         {
-            computeCost(root_);
-            reducible_[0].push_back(root_);
+    void reduce()
+    {
+        computeCost(root_);
+        reducible_[0].push_back(root_);
             
-            // sort reducible by reduce_cost
-            for (unsigned i=0;i<InsertPolicy::MAX_LEVELS;++i)
+        // sort reducible by reduce_cost
+        for (unsigned i=0;i<InsertPolicy::MAX_LEVELS;++i)
+        {
+            std::sort(reducible_[i].begin(), reducible_[i].end(),node_cmp());
+        }
+        while ( colors_ > max_colors_ && colors_ > 1)
+        {
+            while (leaf_level_ >0  && reducible_[leaf_level_-1].size() == 0)
             {
-               std::sort(reducible_[i].begin(), reducible_[i].end(),node_cmp());
+                --leaf_level_;
             }
-            while ( colors_ > max_colors_ && colors_ > 1)
-            {
-               while (leaf_level_ >0  && reducible_[leaf_level_-1].size() == 0)
-               {
-                  --leaf_level_;
-               }
 
-               if (leaf_level_ <= 0) return;
+            if (leaf_level_ <= 0) return;
 
-               // select best of all reducible:
-               unsigned red_idx = leaf_level_-1;
-               unsigned bestv = (*reducible_[red_idx].begin())->reduce_cost;
-               for(unsigned i=red_idx; i>=InsertPolicy::MIN_LEVELS; i--) if (!reducible_[i].empty()){
-                   node *nd = *reducible_[i].begin();
-                   unsigned gch = 0;
-                   for(unsigned idx=0; idx<8; idx++){
-                       if (nd->children_[idx])
-                           gch += nd->children_[idx]->children_count;
-                   }
-                   if (gch==0 && nd->reduce_cost < bestv){
-                       bestv = nd->reduce_cost;
-                       red_idx = i;
-                   }
-               }
+            // select best of all reducible:
+            unsigned red_idx = leaf_level_-1;
+            unsigned bestv = (*reducible_[red_idx].begin())->reduce_cost;
+            for(unsigned i=red_idx; i>=InsertPolicy::MIN_LEVELS; i--) if (!reducible_[i].empty()){
+                    node *nd = *reducible_[i].begin();
+                    unsigned gch = 0;
+                    for(unsigned idx=0; idx<8; idx++){
+                        if (nd->children_[idx])
+                            gch += nd->children_[idx]->children_count;
+                    }
+                    if (gch==0 && nd->reduce_cost < bestv){
+                        bestv = nd->reduce_cost;
+                        red_idx = i;
+                    }
+                }
 
-               typename std::deque<node*>::iterator pos = reducible_[red_idx].begin();
-               node * cur_node = *pos;
-               unsigned num_children = 0;
-               for (unsigned idx=0; idx < 8; ++idx)
-               {
-                  if (cur_node->children_[idx] != 0)
-                  {
-                     cur_node->children_count--;
-                     ++num_children;
-                     cur_node->count  += cur_node->children_[idx]->count;
-                     //todo: case of nonleaf children, if someday sorting by reduce_cost doesn't handle it
-                     delete cur_node->children_[idx], cur_node->children_[idx]=0;
-                  }
-               }
-               
-               reducible_[red_idx].erase(pos);
-               if (num_children > 0 ) 
-               {
-                  colors_ -= (num_children - 1);
-               }
-            }
-         }
-       
-         void create_palette(std::vector<rgb> & palette, node * itr) const
-         {
-            if (itr->count != 0)
+            typename std::deque<node*>::iterator pos = reducible_[red_idx].begin();
+            node * cur_node = *pos;
+            unsigned num_children = 0;
+            for (unsigned idx=0; idx < 8; ++idx)
             {
-               unsigned count = itr->count;
-               palette.push_back(rgb(byte(itr->reds/float(count)),
-                                     byte(itr->greens/float(count)),
-                                     byte(itr->blues/float(count))));
-               itr->index = palette.size() - 1;
+                if (cur_node->children_[idx] != 0)
+                {
+                    cur_node->children_count--;
+                    ++num_children;
+                    cur_node->count  += cur_node->children_[idx]->count;
+                    //todo: case of nonleaf children, if someday sorting by reduce_cost doesn't handle it
+                    delete cur_node->children_[idx], cur_node->children_[idx]=0;
+                }
             }
-            for (unsigned i=0; i < 8 ;++i)
+               
+            reducible_[red_idx].erase(pos);
+            if (num_children > 0 ) 
             {
-               if (itr->children_[i] != 0) 
-                  create_palette(palette, itr->children_[i]);
-            }  
-         }
-      private:	
-         node * root_;		
-   };
+                colors_ -= (num_children - 1);
+            }
+        }
+    }
+       
+    void create_palette(std::vector<rgb> & palette, node * itr) const
+    {
+        if (itr->count != 0)
+        {
+            unsigned count = itr->count;
+            palette.push_back(rgb(byte(itr->reds/float(count)),
+                                  byte(itr->greens/float(count)),
+                                  byte(itr->blues/float(count))));
+            itr->index = palette.size() - 1;
+        }
+        for (unsigned i=0; i < 8 ;++i)
+        {
+            if (itr->children_[i] != 0) 
+                create_palette(palette, itr->children_[i]);
+        }  
+    }
+private:        
+    node * root_;               
+};
 } // namespace mapnik
 
 #endif /* _OCTREE_HPP_ */
diff --git a/include/mapnik/palette.hpp b/include/mapnik/palette.hpp
new file mode 100644
index 0000000..e0df133
--- /dev/null
+++ b/include/mapnik/palette.hpp
@@ -0,0 +1,167 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#ifndef _PALETTE_HPP_
+#define _PALETTE_HPP_
+
+
+// mapnik
+#include <mapnik/global.hpp>
+#include <mapnik/config_error.hpp>
+
+// boost
+#include <boost/utility.hpp>
+#include <boost/unordered_map.hpp>
+
+// stl
+#include <vector>
+#include <map>
+#include <iostream>
+#include <set>
+#include <algorithm>
+#include <cmath>
+
+
+#ifdef MAPNIK_BIG_ENDIAN
+#define U2RED(x) (((x)>>24)&0xff)
+#define U2GREEN(x) (((x)>>16)&0xff)
+#define U2BLUE(x) (((x)>>8)&0xff)
+#define U2ALPHA(x) ((x)&0xff)
+#else
+#define U2RED(x) ((x)&0xff)
+#define U2GREEN(x) (((x)>>8)&0xff)
+#define U2BLUE(x) (((x)>>16)&0xff)
+#define U2ALPHA(x) (((x)>>24)&0xff)
+#endif
+
+
+namespace mapnik {
+
+typedef boost::uint8_t byte;
+struct rgba;
+
+struct rgb {
+    byte r;
+    byte g;
+    byte b;
+
+    inline rgb(byte r_, byte g_, byte b_) : r(r_), g(g_), b(b_) {};
+    rgb(rgba const& c);
+
+    inline bool operator==(const rgb& y) const
+    {
+        return r == y.r && g == y.g && b == y.b;
+    }
+};
+
+struct rgba
+{
+    byte r;
+    byte g;
+    byte b;
+    byte a;
+
+    inline rgba(byte r_, byte g_, byte b_, byte a_)
+        : r(r_), g(g_), b(b_), a(a_) {}
+
+    inline rgba(rgb const& c)
+        : r(c.r), g(c.g), b(c.b), a(0xFF) {}
+
+    inline rgba(unsigned const& c) {
+        r = U2RED(c);
+        g = U2GREEN(c);
+        b = U2BLUE(c);
+        a = U2ALPHA(c);
+    }
+
+    inline bool operator==(const rgba& y) const
+    {
+        return r == y.r && g == y.g && b == y.b && a == y.a;
+    }
+
+    inline operator unsigned() const
+    {
+#ifdef MAPNIK_BIG_ENDIAN
+        return (r << 24) | (g << 16) | (b << 8) | a;
+#else
+        return r | (g << 8) | (b << 16) | (a << 24);
+#endif
+    }
+
+    // ordering by mean(a,r,g,b), a, r, g, b
+    struct mean_sort_cmp
+    {
+        bool operator() (const rgba& x, const rgba& y) const;
+    };
+
+    struct hash_func : public std::unary_function<rgba, std::size_t>
+    {
+        std::size_t operator()(rgba const& p) const;
+    };
+};
+
+
+typedef boost::unordered_map<unsigned, unsigned> rgba_hash_table;
+
+
+class rgba_palette : private boost::noncopyable {
+public:
+    enum palette_type { PALETTE_RGBA = 0, PALETTE_RGB = 1, PALETTE_ACT = 2 };
+
+    explicit rgba_palette(std::string const& pal, palette_type type = PALETTE_RGBA);
+    rgba_palette();
+    
+    const std::vector<rgb>& palette() const;
+    const std::vector<unsigned>& alphaTable() const;
+
+    unsigned quantize(rgba const& c) const;
+    inline unsigned quantize(unsigned const& c) const
+    {
+        rgba_hash_table::const_iterator it = color_hashmap_.find(c);
+        if (it != color_hashmap_.end())
+        {
+            return it->second;
+        }
+        else {
+            return quantize(rgba(U2RED(c), U2GREEN(c), U2BLUE(c), U2ALPHA(c)));
+        }
+    }
+
+    bool valid() const;
+
+private:
+    void parse(std::string const& pal, palette_type type);
+
+private:
+    std::vector<rgba> sorted_pal_;
+    mutable rgba_hash_table color_hashmap_;
+
+    unsigned colors_;
+    std::vector<rgb> rgb_pal_;
+    std::vector<unsigned> alpha_pal_;
+};
+
+} // namespace mapnik
+
+#endif // _PALETTE_HPP_
+
diff --git a/include/mapnik/params.hpp b/include/mapnik/params.hpp
index a9a8009..4590d3b 100644
--- a/include/mapnik/params.hpp
+++ b/include/mapnik/params.hpp
@@ -33,71 +33,71 @@
 
 namespace mapnik
 {
-   typedef boost::variant<int,double,std::string> value_holder;
-   typedef std::pair<const std::string, value_holder> parameter;
-   typedef std::map<const std::string, value_holder> param_map;
+typedef boost::variant<int,double,std::string> value_holder;
+typedef std::pair<const std::string, value_holder> parameter;
+typedef std::map<const std::string, value_holder> param_map;
    
-   template <typename T>
-   struct value_extractor_visitor : public boost::static_visitor<>
-   {
-         value_extractor_visitor(boost::optional<T> & var)
-            :var_(var) {}
+template <typename T>
+struct value_extractor_visitor : public boost::static_visitor<>
+{
+    value_extractor_visitor(boost::optional<T> & var)
+        :var_(var) {}
          
-         void operator () (T val) const
-         {
-            var_ = val;
-         }
+    void operator () (T val) const
+    {
+        var_ = val;
+    }
          
-         template <typename T1>
-         void operator () (T1 val) const 
-         {
-            try 
-            {
-               var_ = boost::lexical_cast<T>(val);
-            }
-            catch (boost::bad_lexical_cast & ) {}
-         }
+    template <typename T1>
+    void operator () (T1 val) const 
+    {
+        try 
+        {
+            var_ = boost::lexical_cast<T>(val);
+        }
+        catch (boost::bad_lexical_cast & ) {}
+    }
          
-         boost::optional<T> & var_;
-   };
+    boost::optional<T> & var_;
+};
    
   
-   class parameters : public param_map
-   {
-         template <typename T> 
-         struct converter
-         {
-               typedef boost::optional<T> return_type;       
-               static return_type extract(parameters const& params,
-                                          std::string const& name, 
-                                          boost::optional<T> const& default_value)
-               {
-                  boost::optional<T> result(default_value);
-                  parameters::const_iterator itr = params.find(name);
-                  if (itr != params.end())
-                  {
-                     boost::apply_visitor(value_extractor_visitor<T>(result),itr->second);
-                  }
-                  return result;
-               }
-         };
+class parameters : public param_map
+{
+    template <typename T> 
+    struct converter
+    {
+        typedef boost::optional<T> return_type;       
+        static return_type extract(parameters const& params,
+                                   std::string const& name, 
+                                   boost::optional<T> const& default_value)
+        {
+            boost::optional<T> result(default_value);
+            parameters::const_iterator itr = params.find(name);
+            if (itr != params.end())
+            {
+                boost::apply_visitor(value_extractor_visitor<T>(result),itr->second);
+            }
+            return result;
+        }
+    };
          
-      public:
+public:
          
-         parameters() {}
+    parameters() {}
          
-         template <typename T>
-         boost::optional<T> get(std::string const& key) const
-         {
-            return converter<T>::extract(*this,key, boost::none);
-         }
+    template <typename T>
+    boost::optional<T> get(std::string const& key) const
+    {
+        return converter<T>::extract(*this,key, boost::none);
+    }
          
-         template <typename T>
-         boost::optional<T> get(std::string const& key, T const& default_value) const
-         {
-            return converter<T>::extract(*this,key,boost::optional<T>(default_value));
-         }
-   };
+    template <typename T>
+    boost::optional<T> get(std::string const& key, T const& default_value) const
+    {
+        return converter<T>::extract(*this,key,boost::optional<T>(default_value));
+    }
+};
 }
 
 #endif //PARAMS_HPP
diff --git a/include/mapnik/parse_path.hpp b/include/mapnik/parse_path.hpp
new file mode 100644
index 0000000..a1fc8fe
--- /dev/null
+++ b/include/mapnik/parse_path.hpp
@@ -0,0 +1,142 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_PARSE_PATH_HPP
+#define MAPNIK_PARSE_PATH_HPP
+
+// mapnik
+#include <mapnik/attribute.hpp>
+#include <mapnik/feature.hpp>
+#include <mapnik/value.hpp>
+// boost
+#include <boost/shared_ptr.hpp>
+#include <boost/variant.hpp>
+#include <boost/foreach.hpp>
+// stl
+#include <string>
+#include <vector>
+
+namespace mapnik {
+
+typedef boost::variant<std::string, attribute> path_component;
+typedef std::vector<path_component> path_expression;
+typedef boost::shared_ptr<path_expression> path_expression_ptr;
+
+path_expression_ptr parse_path(std::string const & str);
+
+template <typename T>
+struct path_processor
+{
+    typedef T feature_type;
+    struct path_visitor_ : boost::static_visitor<void>
+    {
+        path_visitor_ (std::string & filename, feature_type const& f)
+            : filename_(filename),
+              feature_(f) {}
+        
+        void operator() (std::string const& token) const
+        {
+            filename_ += token;
+        }
+        
+        void operator() (attribute const& attr) const
+        {
+            // convert mapnik::value to std::string
+            filename_ += attr.value<mapnik::value,feature_type>(feature_).to_string();
+        }
+        
+        std::string & filename_;
+        feature_type const& feature_;
+    };
+    
+    struct to_string_ : boost::static_visitor<void>
+    {
+        to_string_ (std::string & str)
+            : str_(str) {}
+        
+        void operator() (std::string const& token) const
+        {
+            str_ += token;
+        }
+
+        void operator() (attribute const& attr) const    
+        {
+            str_ += "[";
+            str_ += attr.name();
+            str_ += "]";
+        }
+        
+        std::string & str_;
+    };
+    
+    template <typename T1>
+    struct collect_ : boost::static_visitor<void>
+    {
+        collect_ (T1 & cont)
+            : cont_(cont) {}
+        
+        void operator() (std::string const& token) const
+        {
+            boost::ignore_unused_variable_warning(token);
+        }
+        
+        void operator() (attribute const& attr) const    
+        {
+            cont_.insert(attr.name());
+        }
+        
+        T1 & cont_;
+    };
+    
+    static std::string evaluate(path_expression const& path,feature_type const& f)
+    {
+        std::string out;
+        path_visitor_ eval(out,f);
+        BOOST_FOREACH( mapnik::path_component const& token, path)
+            boost::apply_visitor(eval,token);
+        return out;
+    }
+    
+    static std::string to_string(path_expression const& path)
+    {
+        std::string str;
+        to_string_ visitor(str);
+        BOOST_FOREACH( mapnik::path_component const& token, path)
+            boost::apply_visitor(visitor,token);
+        return str;
+    }
+    
+    template <typename T2>
+    static void collect_attributes(path_expression const& path, T2 & names)
+    {
+        typedef T2 cont_type;
+        collect_<cont_type> visitor(names);
+        BOOST_FOREACH( mapnik::path_component const& token, path)
+            boost::apply_visitor(visitor,token);
+    }
+};
+
+typedef mapnik::path_processor<Feature> path_processor_type;
+
+}
+
+#endif //MAPNIK_PARSE_PATH_HPP
diff --git a/include/mapnik/path_expression_grammar.hpp b/include/mapnik/path_expression_grammar.hpp
new file mode 100644
index 0000000..0102aa8
--- /dev/null
+++ b/include/mapnik/path_expression_grammar.hpp
@@ -0,0 +1,99 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2009 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+#ifndef MAPNIK_PATH_EXPRESSIONS_GRAMMAR_HPP
+#define MAPNIK_PATH_EXPRESSIONS_GRAMMAR_HPP
+
+// mapnik
+#include <mapnik/unicode.hpp>
+#include <mapnik/expression_node.hpp>
+#include <mapnik/feature.hpp>
+// boost
+#include <boost/variant.hpp>
+#include <boost/concept_check.hpp>
+
+//spirit2
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/qi_action.hpp>
+//fusion
+#include <boost/fusion/include/adapt_struct.hpp>
+//phoenix
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_object.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_function.hpp>
+#include <boost/spirit/include/phoenix_stl.hpp>
+#include <boost/spirit/home/phoenix/object/construct.hpp>
+// stl
+#include <string>
+#include <vector>
+
+namespace mapnik
+{
+
+namespace qi = boost::spirit::qi;
+namespace phoenix = boost::phoenix;
+namespace standard_wide =  boost::spirit::standard_wide;
+
+//
+using standard_wide::space_type;
+using standard_wide::space;
+
+
+template <typename Iterator>
+struct path_expression_grammar : qi::grammar<Iterator, std::vector<path_component>(), space_type>
+{    
+    path_expression_grammar()
+        : path_expression_grammar::base_type(expr)
+    {
+        using boost::phoenix::construct;
+        using standard_wide::char_;
+        using qi::_1;
+        using qi::_val;
+        using qi::lit;
+        using qi::lexeme;
+        using phoenix::push_back;
+        
+        expr =
+            * (
+                str [ push_back(_val, _1)]
+                |
+                ( '[' >> attr [ push_back(_val, construct<attribute>( _1 )) ] >> ']')
+                )
+            ;
+        
+        attr %= +(char_ - ']');
+        str  %= lexeme[+(char_ -'[')];
+    }
+    
+    qi::rule<Iterator, std::vector<path_component>() , space_type> expr;
+    qi::rule<Iterator, std::string() , space_type> attr;
+    qi::rule<Iterator, std::string() > str;
+};
+
+
+}
+
+#endif  // MAPNIK_PATH_EXPRESSIONS_GRAMMAR_HPP
+
diff --git a/include/mapnik/placement_finder.hpp b/include/mapnik/placement_finder.hpp
index e9f92bc..a2368ed 100644
--- a/include/mapnik/placement_finder.hpp
+++ b/include/mapnik/placement_finder.hpp
@@ -32,110 +32,115 @@
 #include <mapnik/shield_symbolizer.hpp>
 #include <mapnik/geometry.hpp>
 #include <mapnik/text_path.hpp>
+#include <mapnik/text_placements.hpp>
 
 #include <queue>
 
 namespace mapnik
 {
-   typedef text_path placement_element;
+typedef text_path placement_element;
 
-   struct placement : boost::noncopyable
-   {
-         placement(string_info & info_, shield_symbolizer const& sym, bool has_dimensions_= false);
-
-         placement(string_info & info_, text_symbolizer const& sym);
-
-         ~placement();
-
-         string_info & info;
-
-         position displacement_;
-         label_placement_e label_placement;
-
-         std::queue< Envelope<double> > envelopes;
-
-         //output
-         boost::ptr_vector<placement_element> placements;
-
-         int wrap_width;
-         bool wrap_before; // wraps text at wrap_char immediately before current word
-         unsigned char wrap_char;
-         int text_ratio;
-
-         int label_spacing; // distance between repeated labels on a single geometry
-         unsigned label_position_tolerance; //distance the label can be moved on the line to fit, if 0 the default is used
-         bool force_odd_labels; //Always try render an odd amount of labels
-
-         double max_char_angle_delta;
-         double minimum_distance;
-         bool avoid_edges;
-         bool has_dimensions;
-         bool allow_overlap;
-         std::pair<double, double> dimensions;
-         int text_size;
-   };
-
-
-
-   template <typename DetectorT>
-   class placement_finder : boost::noncopyable
-   {
-   public:
-      placement_finder(DetectorT & detector);
-
-      //Try place a single label at the given point
-      void find_point_placement(placement & p, double pos_x, double pos_y, vertical_alignment_e = MIDDLE, unsigned line_spacing=0, unsigned character_spacing=0, horizontal_alignment_e = H_MIDDLE, justify_alignment_e = J_MIDDLE);
+struct placement : boost::noncopyable
+{
+    placement(string_info & info_, shield_symbolizer const& sym, double scale_factor,  unsigned w, unsigned h, bool has_dimensions_= false);
 
-      //Iterate over the given path, placing point labels with respect to label_spacing
-      template <typename T>
-      void find_point_placements(placement & p, T & path);
+    placement(string_info & info_, text_symbolizer const& sym, double scale_factor);
 
-      //Iterate over the given path, placing line-following labels with respect to label_spacing
-      template <typename T>
-      void find_line_placements(placement & p, T & path);
+    ~placement();
 
-      void update_detector(placement & p);
+    string_info & info; // should only be used for finding placement. doesn't necessarily match placements.vertex() values
 
-      void clear();
+    double scale_factor_;
+    label_placement_e label_placement;
 
-   private:
-      ///Helpers for find_line_placement
+    std::queue< box2d<double> > envelopes;
 
-      ///Returns a possible placement on the given line, does not test for collisions
-      //index: index of the node the current line ends on
-      //distance: distance along the given index that the placement should start at, this includes the offset,
-      //          as such it may be > or < the length of the current line, so this must be checked for
-      //orientation: if set to != 0 the placement will be attempted with the given orientation
-      //             otherwise it will autodetect the orientation.
-      //             If >= 50% of the characters end up upside down, it will be retried the other way.
-      //             RETURN: 1/-1 depending which way up the string ends up being.
-      std::auto_ptr<placement_element> get_placement_offset(placement & p,
-                                                            const std::vector<vertex2d> & path_positions,
-                                                            const std::vector<double> & path_distances,
-                                                            int & orientation, unsigned index, double distance);
+    //output
+    boost::ptr_vector<placement_element> placements;
 
-      ///Tests wether the given placement_element be placed without a collision
-      // Returns true if it can
-      // NOTE: This edits p.envelopes so it can be used afterwards (you must clear it otherwise)
-      bool test_placement(placement & p, const std::auto_ptr<placement_element> & current_placement, const int & orientation);
+    int wrap_width;
+    bool wrap_before; // wraps text at wrap_char immediately before current word
+    unsigned char wrap_char;
+    int text_ratio;
 
-      ///Does a line-circle intersect calculation
-      // NOTE: Follow the strict pre conditions
-      // Pre Conditions: x1,y1 is within radius distance of cx,cy. x2,y2 is outside radius distance of cx,cy
-      //                 This means there is exactly one intersect point
-      // Result is returned in ix, iy
-      void find_line_circle_intersection(
-         const double &cx, const double &cy, const double &radius,
-         const double &x1, const double &y1, const double &x2, const double &y2,
-         double &ix, double &iy);
+    int label_spacing; // distance between repeated labels on a single geometry
+    unsigned label_position_tolerance; //distance the label can be moved on the line to fit, if 0 the default is used
+    bool force_odd_labels; //Always try render an odd amount of labels
 
-      ///General Internals
+    double max_char_angle_delta;
+    double minimum_distance;
+    double minimum_padding;
+    double minimum_path_length;
+    bool avoid_edges;
+    bool has_dimensions;
+    bool allow_overlap;
+    std::pair<double, double> dimensions;
+    bool collect_extents;
+    box2d<double> extents;
+};
 
 
 
-      DetectorT & detector_;
-      Envelope<double> const& dimensions_;
-   };
+template <typename DetectorT>
+class placement_finder : boost::noncopyable
+{
+public:
+    placement_finder(DetectorT & detector);
+    placement_finder(DetectorT & detector, box2d<double> const& extent);
+    
+    //Try place a single label at the given point
+    void find_point_placement(placement & p, text_placement_info_ptr po, double pos_x, double pos_y, double angle=0.0, unsigned line_spacing=0, unsigned character_spacing=0);
+
+    //Iterate over the given path, placing point labels with respect to label_spacing
+    template <typename T>
+    void find_point_placements(placement & p, text_placement_info_ptr po, T & path);
+
+    //Iterate over the given path, placing line-following labels with respect to label_spacing
+    template <typename T>
+    void find_line_placements(placement & p, text_placement_info_ptr po, T & path);
+
+    void update_detector(placement & p);
+
+    void clear();
+    
+private:
+    ///Helpers for find_line_placement
+
+    ///Returns a possible placement on the given line, does not test for collisions
+    //index: index of the node the current line ends on
+    //distance: distance along the given index that the placement should start at, this includes the offset,
+    //          as such it may be > or < the length of the current line, so this must be checked for
+    //orientation: if set to != 0 the placement will be attempted with the given orientation
+    //             otherwise it will autodetect the orientation.
+    //             If >= 50% of the characters end up upside down, it will be retried the other way.
+    //             RETURN: 1/-1 depending which way up the string ends up being.
+    std::auto_ptr<placement_element> get_placement_offset(placement & p,
+                                                          const std::vector<vertex2d> & path_positions,
+                                                          const std::vector<double> & path_distances,
+                                                          int & orientation, unsigned index, double distance);
+
+    ///Tests wether the given placement_element be placed without a collision
+    // Returns true if it can
+    // NOTE: This edits p.envelopes so it can be used afterwards (you must clear it otherwise)
+    bool test_placement(placement & p, const std::auto_ptr<placement_element> & current_placement, const int & orientation);
+
+    ///Does a line-circle intersect calculation
+    // NOTE: Follow the strict pre conditions
+    // Pre Conditions: x1,y1 is within radius distance of cx,cy. x2,y2 is outside radius distance of cx,cy
+    //                 This means there is exactly one intersect point
+    // Result is returned in ix, iy
+    void find_line_circle_intersection(
+        const double &cx, const double &cy, const double &radius,
+        const double &x1, const double &y1, const double &x2, const double &y2,
+        double &ix, double &iy);
+
+    ///General Internals
+
+
+
+    DetectorT & detector_;
+    box2d<double> const& dimensions_;
+};
 }
 
 #endif
diff --git a/include/mapnik/plugin.hpp b/include/mapnik/plugin.hpp
index fd7a58c..8d800f4 100644
--- a/include/mapnik/plugin.hpp
+++ b/include/mapnik/plugin.hpp
@@ -33,17 +33,17 @@
 
 namespace mapnik
 {
-   class PluginInfo : boost::noncopyable
-   {         
-    private:
-         std::string name_;
-         lt_dlhandle module_;     
-    public:
-         PluginInfo (const std::string& name,const lt_dlhandle module);
-         ~PluginInfo();
-         const std::string& name() const;
-         lt_dlhandle handle() const;
-   };
+class PluginInfo : boost::noncopyable
+{         
+private:
+    std::string name_;
+    lt_dlhandle module_;     
+public:
+    PluginInfo (const std::string& name,const lt_dlhandle module);
+    ~PluginInfo();
+    const std::string& name() const;
+    lt_dlhandle handle() const;
+};
 }
 
 #endif //PLUGIN_HPP
diff --git a/include/mapnik/png_io.hpp b/include/mapnik/png_io.hpp
index 4b8a79b..5c85c14 100644
--- a/include/mapnik/png_io.hpp
+++ b/include/mapnik/png_io.hpp
@@ -21,10 +21,16 @@
  *****************************************************************************/
 
 //$Id$
+
+#ifndef MAPNIK_PNG_IO_HPP
+#define MAPNIK_PNG_IO_HPP
+
 #include <mapnik/global.hpp>
+#include <mapnik/palette.hpp>
 #include <mapnik/octree.hpp>
 #include <mapnik/hextree.hpp>
-#include <mapnik/global.hpp>
+
+#include <zlib.h>
 
 extern "C"
 {
@@ -33,365 +39,365 @@ extern "C"
 
 #define MAX_OCTREE_LEVELS 4
 
-#ifdef MAPNIK_BIG_ENDIAN
-  #define U2RED(x) (((x)>>24)&0xff)
-  #define U2GREEN(x) (((x)>>16)&0xff)
-  #define U2BLUE(x) (((x)>>8)&0xff)
-  #define U2ALPHA(x) ((x)&0xff)
-#else
-  #define U2RED(x) ((x)&0xff)
-  #define U2GREEN(x) (((x)>>8)&0xff)
-  #define U2BLUE(x) (((x)>>16)&0xff)
-  #define U2ALPHA(x) (((x)>>24)&0xff)
-#endif
-
 namespace mapnik {
    
-   template <typename T>
-   void write_data (png_structp png_ptr, png_bytep data, png_size_t length)
-   {
-      T * out = static_cast<T*>(png_get_io_ptr(png_ptr));
-      out->write(reinterpret_cast<char*>(data), length);
-   }
-
-   template <typename T>
-   void flush_data (png_structp png_ptr)
-   {
-      T * out = static_cast<T*>(png_get_io_ptr(png_ptr));
-      out->flush();
-   }
-
-   template <typename T1, typename T2>
-   void save_as_png(T1 & file , T2 const& image)
-   {        
-      png_voidp error_ptr=0;
-      png_structp png_ptr=png_create_write_struct(PNG_LIBPNG_VER_STRING,
-                                                  error_ptr,0, 0);
+template <typename T>
+void write_data (png_structp png_ptr, png_bytep data, png_size_t length)
+{
+    T * out = static_cast<T*>(png_get_io_ptr(png_ptr));
+    out->write(reinterpret_cast<char*>(data), length);
+}
+
+template <typename T>
+void flush_data (png_structp png_ptr)
+{
+    T * out = static_cast<T*>(png_get_io_ptr(png_ptr));
+    out->flush();
+}
+
+template <typename T1, typename T2>
+void save_as_png(T1 & file , T2 const& image, int compression = Z_DEFAULT_COMPRESSION, int strategy = Z_DEFAULT_STRATEGY)
+{        
+    png_voidp error_ptr=0;
+    png_structp png_ptr=png_create_write_struct(PNG_LIBPNG_VER_STRING,
+                                                error_ptr,0, 0);
        
-      if (!png_ptr) return;
+    if (!png_ptr) return;
       
-      // switch on optimization only if supported
+    // switch on optimization only if supported
 #if defined(PNG_LIBPNG_VER) && (PNG_LIBPNG_VER >= 10200) && defined(PNG_MMX_CODE_SUPPORTED)
-      png_uint_32 mask, flags;
-      flags = png_get_asm_flags(png_ptr);
-      mask = png_get_asm_flagmask(PNG_SELECT_READ | PNG_SELECT_WRITE);
-      png_set_asm_flags(png_ptr, flags | mask);
+    png_uint_32 mask, flags;
+    flags = png_get_asm_flags(png_ptr);
+    mask = png_get_asm_flagmask(PNG_SELECT_READ | PNG_SELECT_WRITE);
+    png_set_asm_flags(png_ptr, flags | mask);
 #endif
-      png_set_filter (png_ptr, 0, PNG_FILTER_NONE);
-      png_infop info_ptr = png_create_info_struct(png_ptr);
-      if (!info_ptr)
-      {
-         png_destroy_write_struct(&png_ptr,(png_infopp)0);
-         return;
-      }
-      if (setjmp(png_jmpbuf(png_ptr)))
-      {
-         png_destroy_write_struct(&png_ptr, &info_ptr);
-         return;
-      }
-      png_set_write_fn (png_ptr, &file, &write_data<T1>, &flush_data<T1>);
-        
-      //png_set_compression_level(png_ptr, Z_BEST_COMPRESSION);
-      //png_set_compression_strategy(png_ptr, Z_FILTERED);
-      png_set_IHDR(png_ptr, info_ptr,image.width(),image.height(),8,
-                   PNG_COLOR_TYPE_RGB_ALPHA,PNG_INTERLACE_NONE,
-                   PNG_COMPRESSION_TYPE_DEFAULT,PNG_FILTER_TYPE_DEFAULT);
-      png_write_info(png_ptr, info_ptr);
-      for (unsigned i=0;i<image.height();i++)
-      {
-         png_write_row(png_ptr,(png_bytep)image.getRow(i));
-      }
-
-      png_write_end(png_ptr, info_ptr);
-      png_destroy_write_struct(&png_ptr, &info_ptr);
-   }
-
-   template <typename T>
-   void reduce_8  (T const& in, ImageData8 & out, octree<rgb> trees[], unsigned limits[], unsigned levels, std::vector<unsigned> & alpha)
-   {
-      unsigned width = in.width();
-      unsigned height = in.height();
-
-      //unsigned alphaCount[alpha.size()];
-      std::vector<unsigned> alphaCount(alpha.size());
-      for(unsigned i=0; i<alpha.size(); i++)
-      {
-         alpha[i] = 0;
-         alphaCount[i] = 0;
-      }
+    png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE, PNG_FILTER_NONE);
+    png_infop info_ptr = png_create_info_struct(png_ptr);
+    if (!info_ptr)
+    {
+        png_destroy_write_struct(&png_ptr,(png_infopp)0);
+        return;
+    }
+    jmp_buf* jmp_context = (jmp_buf*) png_get_error_ptr(png_ptr);
+    if (jmp_context)
+    {
+        png_destroy_write_struct(&png_ptr, &info_ptr);
+        return;
+    }
+    png_set_write_fn (png_ptr, &file, &write_data<T1>, &flush_data<T1>);
+
+    png_set_compression_level(png_ptr, compression);
+    png_set_compression_strategy(png_ptr, strategy);
+    png_set_compression_buffer_size(png_ptr, 32768);
+
+    png_set_IHDR(png_ptr, info_ptr,image.width(),image.height(),8,
+                 PNG_COLOR_TYPE_RGB_ALPHA,PNG_INTERLACE_NONE,
+                 PNG_COMPRESSION_TYPE_DEFAULT,PNG_FILTER_TYPE_DEFAULT);
+    png_write_info(png_ptr, info_ptr);
+    for (unsigned i=0;i<image.height();i++)
+    {
+        png_write_row(png_ptr,(png_bytep)image.getRow(i));
+    }
+
+    png_write_end(png_ptr, info_ptr);
+    png_destroy_write_struct(&png_ptr, &info_ptr);
+}
+
+template <typename T>
+void reduce_8  (T const& in, image_data_8 & out, octree<rgb> trees[], unsigned limits[], unsigned levels, std::vector<unsigned> & alpha)
+{
+    unsigned width = in.width();
+    unsigned height = in.height();
+
+    //unsigned alphaCount[alpha.size()];
+    std::vector<unsigned> alphaCount(alpha.size());
+    for(unsigned i=0; i<alpha.size(); i++)
+    {
+        alpha[i] = 0;
+        alphaCount[i] = 0;
+    }
       
-      for (unsigned y = 0; y < height; ++y)
-      {
-         mapnik::ImageData32::pixel_type const * row = in.getRow(y);
-         mapnik::ImageData8::pixel_type  * row_out = out.getRow(y);
-         for (unsigned x = 0; x < width; ++x)
-         {
+    for (unsigned y = 0; y < height; ++y)
+    {
+        mapnik::image_data_32::pixel_type const * row = in.getRow(y);
+        mapnik::image_data_8::pixel_type  * row_out = out.getRow(y);
+        for (unsigned x = 0; x < width; ++x)
+        {
             unsigned val = row[x];
             mapnik::rgb c(U2RED(val), U2GREEN(val), U2BLUE(val));
             byte index = 0;
             int idx = -1;
             for(int j=levels-1; j>0; j--){
-               if (U2ALPHA(val)>=limits[j]) {
-                  index = idx = trees[j].quantize(c);
-                  break;
-               }
+                if (U2ALPHA(val)>=limits[j] && trees[j].colors()>0) {
+                    index = idx = trees[j].quantize(c);
+                    break;
+                }
             }
             if (idx>=0 && idx<(int)alpha.size())
             {
-               alpha[idx]+=U2ALPHA(val);
-               alphaCount[idx]++;
+                alpha[idx]+=U2ALPHA(val);
+                alphaCount[idx]++;
             }
             row_out[x] = index;
-         }
-      }
-      for(unsigned i=0; i<alpha.size(); i++) 
-      {
-         if (alphaCount[i]!=0)
+        }
+    }
+    for(unsigned i=0; i<alpha.size(); i++) 
+    {
+        if (alphaCount[i]!=0)
             alpha[i] /= alphaCount[i];
-      }
-   }
-
-   template <typename T>
-   void reduce_4 (T const& in, ImageData8 & out, octree<rgb> trees[], unsigned limits[], unsigned levels, std::vector<unsigned> & alpha)
-   {
-      unsigned width = in.width();
-      unsigned height = in.height();
-
-      //unsigned alphaCount[alpha.size()];
-      std::vector<unsigned> alphaCount(alpha.size());
-      for(unsigned i=0; i<alpha.size(); i++)
-      {
-         alpha[i] = 0;
-         alphaCount[i] = 0;
-      }
-
-      for (unsigned y = 0; y < height; ++y)
-      {
-         mapnik::ImageData32::pixel_type const * row = in.getRow(y);
-         mapnik::ImageData8::pixel_type  * row_out = out.getRow(y);
-
-         for (unsigned x = 0; x < width; ++x)
-         {
+    }
+}
+
+template <typename T>
+void reduce_4 (T const& in, image_data_8 & out, octree<rgb> trees[], unsigned limits[], unsigned levels, std::vector<unsigned> & alpha)
+{
+    unsigned width = in.width();
+    unsigned height = in.height();
+
+    //unsigned alphaCount[alpha.size()];
+    std::vector<unsigned> alphaCount(alpha.size());
+    for(unsigned i=0; i<alpha.size(); i++)
+    {
+        alpha[i] = 0;
+        alphaCount[i] = 0;
+    }
+
+    for (unsigned y = 0; y < height; ++y)
+    {
+        mapnik::image_data_32::pixel_type const * row = in.getRow(y);
+        mapnik::image_data_8::pixel_type  * row_out = out.getRow(y);
+
+        for (unsigned x = 0; x < width; ++x)
+        {
             unsigned val = row[x];
             mapnik::rgb c(U2RED(val), U2GREEN(val), U2BLUE(val));
             byte index = 0;
             int idx=-1;
             for(int j=levels-1; j>0; j--){
-               if (U2ALPHA(val)>=limits[j]) {
-                  index = idx = trees[j].quantize(c);
-                  break;
-               }
+                if (U2ALPHA(val)>=limits[j] && trees[j].colors()>0) {
+                    index = idx = trees[j].quantize(c);
+                    break;
+                }
             }
             if (idx>=0 && idx<(int)alpha.size())
             {
-               alpha[idx]+=U2ALPHA(val);
-               alphaCount[idx]++;
+                alpha[idx]+=U2ALPHA(val);
+                alphaCount[idx]++;
             }
             if (x%2 == 0) index = index<<4;
             row_out[x>>1] |= index;
-         }
-      }
-      for(unsigned i=0; i<alpha.size(); i++) 
-      {
-         if (alphaCount[i]!=0)
+        }
+    }
+    for(unsigned i=0; i<alpha.size(); i++) 
+    {
+        if (alphaCount[i]!=0)
             alpha[i] /= alphaCount[i];
-      }
-   }
-
-   // 1-bit but only one color.
-   template <typename T>
-   void reduce_1(T const&, ImageData8 & out, octree<rgb> trees[], unsigned limits[], std::vector<unsigned> & alpha)
-   {
-      out.set(0); // only one color!!!
-   }
-
-   template <typename T>
-   void save_as_png(T & file, std::vector<mapnik::rgb> & palette,
-                    mapnik::ImageData8 const& image,
-                    unsigned width,
-                    unsigned height,
-                    unsigned color_depth,
-                    std::vector<unsigned> &alpha)
-   {
-      png_voidp error_ptr=0;
-      png_structp png_ptr=png_create_write_struct(PNG_LIBPNG_VER_STRING,
-                                                  error_ptr,0, 0);
-
-      if (!png_ptr) return;
-
-      // switch on optimization only if supported
+    }
+}
+
+// 1-bit but only one color.
+template <typename T>
+void reduce_1(T const&, image_data_8 & out, octree<rgb> /*trees*/[], unsigned /*limits*/[], std::vector<unsigned> & /*alpha*/)
+{
+    out.set(0); // only one color!!!
+}
+
+template <typename T>
+void save_as_png(T & file, std::vector<mapnik::rgb> const& palette,
+                 mapnik::image_data_8 const& image,
+                 unsigned width,
+                 unsigned height,
+                 unsigned color_depth,
+                 int compression,
+                 int strategy,
+                 std::vector<unsigned> const&alpha)
+{
+    png_voidp error_ptr=0;
+    png_structp png_ptr=png_create_write_struct(PNG_LIBPNG_VER_STRING,
+                                                error_ptr,0, 0);
+
+    if (!png_ptr) return;
+
+    // switch on optimization only if supported
 #if defined(PNG_LIBPNG_VER) && (PNG_LIBPNG_VER >= 10200) && defined(PNG_MMX_CODE_SUPPORTED)
-      png_uint_32 mask, flags;
-      flags = png_get_asm_flags(png_ptr);
-      mask = png_get_asm_flagmask(PNG_SELECT_READ | PNG_SELECT_WRITE);
-      png_set_asm_flags(png_ptr, flags | mask);
+    png_uint_32 mask, flags;
+    flags = png_get_asm_flags(png_ptr);
+    mask = png_get_asm_flagmask(PNG_SELECT_READ | PNG_SELECT_WRITE);
+    png_set_asm_flags(png_ptr, flags | mask);
 #endif
-      png_set_filter (png_ptr, 0, PNG_FILTER_NONE);
-      png_infop info_ptr = png_create_info_struct(png_ptr);
-      if (!info_ptr)
-      {
-         png_destroy_write_struct(&png_ptr,(png_infopp)0);
-         return;
-      }
-      if (setjmp(png_jmpbuf(png_ptr)))
-      {
-         png_destroy_write_struct(&png_ptr, &info_ptr);
-         return;
-      }
-      png_set_write_fn (png_ptr, &file, &write_data<T>, &flush_data<T>);
-
-      png_set_IHDR(png_ptr, info_ptr,width,height,color_depth,
-                   PNG_COLOR_TYPE_PALETTE,PNG_INTERLACE_NONE,
-                   PNG_COMPRESSION_TYPE_DEFAULT,PNG_FILTER_TYPE_DEFAULT);
-
-      png_set_PLTE(png_ptr,info_ptr,reinterpret_cast<png_color*>(&palette[0]),palette.size());
-
-      // make transparent lowest indexes, so tRNS is small
-      if (alpha.size()>0)
-      {
-	  std::vector<png_byte> trans(alpha.size());
-	  unsigned alphaSize=0;//truncate to nonopaque values
-	  for(unsigned i=0; i < alpha.size(); i++) 
-	  {
-	      trans[i]=alpha[i];
-	      if (alpha[i]<255)
-		  alphaSize = i+1;
-	  }
-	  if (alphaSize>0)
-	      png_set_tRNS(png_ptr, info_ptr, (png_bytep)&trans[0], alphaSize, 0);
-      }
-
-      png_write_info(png_ptr, info_ptr);
-      for (unsigned i=0;i<height;i++)
-      {
-         png_write_row(png_ptr,(png_bytep)image.getRow(i));
-      }
-
-      png_write_end(png_ptr, info_ptr);
-      png_destroy_write_struct(&png_ptr, &info_ptr);
-   }
-
-   template <typename T1,typename T2>
-   void save_as_png256(T1 & file, T2 const& image, const unsigned max_colors = 256, int trans_mode = -1)
-   {
-      // number of alpha ranges in png256 format; 2 results in smallest image with binary transparency
-      // 3 is minimum for semitransparency, 4 is recommended, anything else is worse
-      const unsigned TRANSPARENCY_LEVELS = (trans_mode==2||trans_mode<0)?MAX_OCTREE_LEVELS:2;
-      unsigned width = image.width();
-      unsigned height = image.height();
-      unsigned alphaHist[256];//transparency histogram
-      unsigned semiCount = 0;//sum of semitransparent pixels
-      unsigned meanAlpha = 0;
-      for(int i=0; i<256; i++){
+    png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE, PNG_FILTER_NONE);
+    png_infop info_ptr = png_create_info_struct(png_ptr);
+    if (!info_ptr)
+    {
+        png_destroy_write_struct(&png_ptr,(png_infopp)0);
+        return;
+    }
+    jmp_buf* jmp_context = (jmp_buf*) png_get_error_ptr(png_ptr);
+    if (jmp_context)
+    {
+        png_destroy_write_struct(&png_ptr, &info_ptr);
+        return;
+    }
+    png_set_write_fn (png_ptr, &file, &write_data<T>, &flush_data<T>);
+
+    png_set_compression_level(png_ptr, compression);
+    png_set_compression_strategy(png_ptr, strategy);
+    png_set_compression_buffer_size(png_ptr, 32768);
+
+    png_set_IHDR(png_ptr, info_ptr,width,height,color_depth,
+                 PNG_COLOR_TYPE_PALETTE,PNG_INTERLACE_NONE,
+                 PNG_COMPRESSION_TYPE_DEFAULT,PNG_FILTER_TYPE_DEFAULT);
+
+    png_color* pal = const_cast<png_color*>(reinterpret_cast<const png_color*>(&palette[0]));
+    png_set_PLTE(png_ptr, info_ptr, pal, palette.size());
+
+    // make transparent lowest indexes, so tRNS is small
+    if (alpha.size()>0)
+    {
+        std::vector<png_byte> trans(alpha.size());
+        unsigned alphaSize=0;//truncate to nonopaque values
+        for(unsigned i=0; i < alpha.size(); i++) 
+        {
+            trans[i]=alpha[i];
+            if (alpha[i]<255)
+                alphaSize = i+1;
+        }
+        if (alphaSize>0)
+            png_set_tRNS(png_ptr, info_ptr, (png_bytep)&trans[0], alphaSize, 0);
+    }
+
+    png_write_info(png_ptr, info_ptr);
+    for (unsigned i=0;i<height;i++)
+    {
+        png_write_row(png_ptr,(png_bytep)image.getRow(i));
+    }
+
+    png_write_end(png_ptr, info_ptr);
+    png_destroy_write_struct(&png_ptr, &info_ptr);
+}
+
+template <typename T1,typename T2>
+void save_as_png8_oct(T1 & file, T2 const& image, const unsigned max_colors = 256,
+    int compression = Z_DEFAULT_COMPRESSION, int strategy = Z_DEFAULT_STRATEGY, int trans_mode = -1)
+{
+    // number of alpha ranges in png8 format; 2 results in smallest image with binary transparency
+    // 3 is minimum for semitransparency, 4 is recommended, anything else is worse
+    const unsigned TRANSPARENCY_LEVELS = (trans_mode==2||trans_mode<0)?MAX_OCTREE_LEVELS:2;
+    unsigned width = image.width();
+    unsigned height = image.height();
+    unsigned alphaHist[256];//transparency histogram
+    unsigned semiCount = 0;//sum of semitransparent pixels
+    unsigned meanAlpha = 0;
+    for(int i=0; i<256; i++){
         alphaHist[i] = 0;
-      }
-      for (unsigned y = 0; y < height; ++y){
-         for (unsigned x = 0; x < width; ++x){
+    }
+    for (unsigned y = 0; y < height; ++y){
+        for (unsigned x = 0; x < width; ++x){
             unsigned val = U2ALPHA((unsigned)image.getRow(y)[x]);
             if (trans_mode==0)
-               val=255;
+                val=255;
             alphaHist[val]++;
             meanAlpha += val;
             if (val>0 && val<255)
                 semiCount++;
-         }
-      }
-      meanAlpha /= width*height;
-
-      // transparency ranges division points
-      unsigned limits[MAX_OCTREE_LEVELS+1];
-      limits[0] = 0;
-      limits[1] = (alphaHist[0]>0)?1:0;
-      limits[TRANSPARENCY_LEVELS] = 256;
-      unsigned alphaHistSum = 0;
-      for(unsigned j=1; j<TRANSPARENCY_LEVELS; j++)
-         limits[j] = limits[1];
-      for(unsigned i=1; i<256; i++){
-          alphaHistSum += alphaHist[i];
-          for(unsigned j=1; j<TRANSPARENCY_LEVELS; j++){
-              if (alphaHistSum<semiCount*(j)/4)
+        }
+    }
+    meanAlpha /= width*height;
+
+    // transparency ranges division points
+    unsigned limits[MAX_OCTREE_LEVELS+1];
+    limits[0] = 0;
+    limits[1] = (alphaHist[0]>0)?1:0;
+    limits[TRANSPARENCY_LEVELS] = 256;
+    unsigned alphaHistSum = 0;
+    for(unsigned j=1; j<TRANSPARENCY_LEVELS; j++)
+        limits[j] = limits[1];
+    for(unsigned i=1; i<256; i++){
+        alphaHistSum += alphaHist[i];
+        for(unsigned j=1; j<TRANSPARENCY_LEVELS; j++){
+            if (alphaHistSum<semiCount*(j)/4)
                 limits[j] = i;
-          }
-      }
-      // avoid too wide full transparent range
-      if (limits[1]>256/(TRANSPARENCY_LEVELS-1))
-         limits[1]=256/(TRANSPARENCY_LEVELS-1);
-      // avoid too wide full opaque range
-      if (limits[TRANSPARENCY_LEVELS-1]<212)
-         limits[TRANSPARENCY_LEVELS-1]=212;
-      if (TRANSPARENCY_LEVELS==2) {
-         limits[1]=127;
-      }
-      // estimated number of colors from palette assigned to chosen ranges
-      unsigned cols[MAX_OCTREE_LEVELS];
-      // count colors
-      for(unsigned j=1; j<=TRANSPARENCY_LEVELS; j++) {
-         cols[j-1] = 0;
-         for(unsigned i=limits[j-1]; i<limits[j]; i++){
+        }
+    }
+    // avoid too wide full transparent range
+    if (limits[1]>256/(TRANSPARENCY_LEVELS-1))
+        limits[1]=256/(TRANSPARENCY_LEVELS-1);
+    // avoid too wide full opaque range
+    if (limits[TRANSPARENCY_LEVELS-1]<212)
+        limits[TRANSPARENCY_LEVELS-1]=212;
+    if (TRANSPARENCY_LEVELS==2) {
+        limits[1]=127;
+    }
+    // estimated number of colors from palette assigned to chosen ranges
+    unsigned cols[MAX_OCTREE_LEVELS];
+    // count colors
+    for(unsigned j=1; j<=TRANSPARENCY_LEVELS; j++) {
+        cols[j-1] = 0;
+        for(unsigned i=limits[j-1]; i<limits[j]; i++){
             cols[j-1] += alphaHist[i];
-         }
-      }
-
-      unsigned divCoef = width*height-cols[0];
-      if (divCoef==0) divCoef = 1;
-      cols[0] = cols[0]>0?1:0; // fully transparent color (one or not at all)
-
-      if (max_colors>=64) {
-          // give chance less populated but not empty cols to have at least few colors(12)
-          unsigned minCols = (12+1)*divCoef/(max_colors-cols[0]);
-          for(unsigned j=1; j<TRANSPARENCY_LEVELS; j++) if (cols[j]>12 && cols[j]<minCols) {
-             divCoef += minCols-cols[j];
-             cols[j] = minCols;
-          }
-      }
-      unsigned usedColors = cols[0];
-      for(unsigned j=1; j<TRANSPARENCY_LEVELS-1; j++){
-         cols[j] = cols[j]*(max_colors-cols[0])/divCoef;
-         usedColors += cols[j];
-      }
-      // use rest for most opaque group of pixels
-      cols[TRANSPARENCY_LEVELS-1] = max_colors-usedColors;
-
-      //no transparency
-      if (trans_mode == 0)
-      {
-         limits[1] = 0;
-         cols[0] = 0;
-         cols[1] = max_colors;
-      }
-
-      // octree table for separate alpha range with 1-based index (0 is fully transparent: no color)
-      octree<rgb> trees[MAX_OCTREE_LEVELS];
-      for(unsigned j=1; j<TRANSPARENCY_LEVELS; j++)
-         trees[j].setMaxColors(cols[j]);
-      for (unsigned y = 0; y < height; ++y)
-      {
-         typename T2::pixel_type const * row = image.getRow(y);
-         for (unsigned x = 0; x < width; ++x)
-         {
+        }
+    }
+
+    unsigned divCoef = width*height-cols[0];
+    if (divCoef==0) divCoef = 1;
+    cols[0] = cols[0]>0?1:0; // fully transparent color (one or not at all)
+
+    if (max_colors>=64) {
+        // give chance less populated but not empty cols to have at least few colors(12)
+        unsigned minCols = (12+1)*divCoef/(max_colors-cols[0]);
+        for(unsigned j=1; j<TRANSPARENCY_LEVELS; j++) if (cols[j]>12 && cols[j]<minCols) {
+                divCoef += minCols-cols[j];
+                cols[j] = minCols;
+            }
+    }
+    unsigned usedColors = cols[0];
+    for(unsigned j=1; j<TRANSPARENCY_LEVELS-1; j++){
+        cols[j] = cols[j]*(max_colors-cols[0])/divCoef;
+        usedColors += cols[j];
+    }
+    // use rest for most opaque group of pixels
+    cols[TRANSPARENCY_LEVELS-1] = max_colors-usedColors;
+
+    //no transparency
+    if (trans_mode == 0)
+    {
+        limits[1] = 0;
+        cols[0] = 0;
+        cols[1] = max_colors;
+    }
+
+    // octree table for separate alpha range with 1-based index (0 is fully transparent: no color)
+    octree<rgb> trees[MAX_OCTREE_LEVELS];
+    for(unsigned j=1; j<TRANSPARENCY_LEVELS; j++)
+        trees[j].setMaxColors(cols[j]);
+    for (unsigned y = 0; y < height; ++y)
+    {
+        typename T2::pixel_type const * row = image.getRow(y);
+        for (unsigned x = 0; x < width; ++x)
+        {
             unsigned val = row[x];
             
             // insert to proper tree based on alpha range
             for(unsigned j=TRANSPARENCY_LEVELS-1; j>0; j--){
-               if (cols[j]>0 && U2ALPHA(val)>=limits[j]) {
-                  trees[j].insert(mapnik::rgb(U2RED(val), U2GREEN(val), U2BLUE(val)));
-                  break;
-               }
+                if (cols[j]>0 && U2ALPHA(val)>=limits[j]) {
+                    trees[j].insert(mapnik::rgb(U2RED(val), U2GREEN(val), U2BLUE(val)));
+                    break;
+                }
             }
-         }
-      }
-      unsigned leftovers = 0;
-      std::vector<rgb> palette;
-      palette.reserve(max_colors);
-      if (cols[0])
-         palette.push_back(rgb(0,0,0));
-
-      for(unsigned j=1; j<TRANSPARENCY_LEVELS; j++) {
-         if (cols[j]>0) {
+        }
+    }
+    unsigned leftovers = 0;
+    std::vector<rgb> palette;
+    palette.reserve(max_colors);
+    if (cols[0])
+        palette.push_back(rgb(0,0,0));
+
+    for(unsigned j=1; j<TRANSPARENCY_LEVELS; j++) {
+        if (cols[j]>0) {
             if (leftovers>0) {
-               cols[j] += leftovers;
-               trees[j].setMaxColors(cols[j]);
-               leftovers = 0;
+                cols[j] += leftovers;
+                trees[j].setMaxColors(cols[j]);
+                leftovers = 0;
             }
             std::vector<rgb> pal;
             trees[j].setOffset(palette.size());
@@ -400,135 +406,156 @@ namespace mapnik {
             leftovers = cols[j]-pal.size();
             cols[j] = pal.size();
             for(unsigned i=0; i<pal.size(); i++){
-               palette.push_back(pal[i]);
+                palette.push_back(pal[i]);
             }
             assert(palette.size() <= 256);
-         }
-      }
-
-      //transparency values per palette index
-      std::vector<unsigned> alphaTable;
-      //alphaTable.resize(palette.size());//allow semitransparency also in almost opaque range
-      if (trans_mode != 0)
-         alphaTable.resize(palette.size() - cols[TRANSPARENCY_LEVELS-1]);
+        }
+    }
+
+    //transparency values per palette index
+    std::vector<unsigned> alphaTable;
+    //alphaTable.resize(palette.size());//allow semitransparency also in almost opaque range
+    if (trans_mode != 0)
+        alphaTable.resize(palette.size() - cols[TRANSPARENCY_LEVELS-1]);
       
-      if (palette.size() > 16 )
-      {
-         // >16 && <=256 colors -> write 8-bit color depth
-         ImageData8 reduced_image(width,height);
-         reduce_8(image, reduced_image, trees, limits, TRANSPARENCY_LEVELS, alphaTable);
-         save_as_png(file,palette,reduced_image,width,height,8,alphaTable);
-      }
-      else if (palette.size() == 1)
-      {
-         // 1 color image ->  write 1-bit color depth PNG
-         unsigned image_width  = (int(0.125*width) + 7)&~7;
-         unsigned image_height = height;
-         ImageData8 reduced_image(image_width,image_height);
-         reduce_1(image,reduced_image,trees, limits, alphaTable);
-         if (meanAlpha<255 && cols[0]==0) {
+    if (palette.size() > 16 )
+    {
+        // >16 && <=256 colors -> write 8-bit color depth
+        image_data_8 reduced_image(width,height);
+        reduce_8(image, reduced_image, trees, limits, TRANSPARENCY_LEVELS, alphaTable);
+        save_as_png(file,palette,reduced_image,width,height,8,compression,strategy,alphaTable);
+    }
+    else if (palette.size() == 1)
+    {
+        // 1 color image ->  write 1-bit color depth PNG
+        unsigned image_width  = (int(0.125*width) + 7)&~7;
+        unsigned image_height = height;
+        image_data_8 reduced_image(image_width,image_height);
+        reduce_1(image,reduced_image,trees, limits, alphaTable);
+        if (meanAlpha<255 && cols[0]==0) {
             alphaTable.resize(1);
             alphaTable[0] = meanAlpha;
-         }
-         save_as_png(file,palette,reduced_image,width,height,1,alphaTable);
-      }
-      else
-      {
-         // <=16 colors -> write 4-bit color depth PNG
-         unsigned image_width  = (int(0.5*width) + 3)&~3;
-         unsigned image_height = height;
-         ImageData8 reduced_image(image_width,image_height);
-         reduce_4(image, reduced_image, trees, limits, TRANSPARENCY_LEVELS, alphaTable);
-         save_as_png(file,palette,reduced_image,width,height,4,alphaTable);
-      }
-   }
-
-   template <typename T1,typename T2>
-   void save_as_png256_hex(T1 & file, T2 const& image, int colors = 256, int trans_mode = -1, double gamma = 2.0)
-   {
-      unsigned width = image.width();
-      unsigned height = image.height();
-
-      // structure for color quantization
-      hextree<mapnik::rgba> tree(colors);
-      if (trans_mode >= 0)
-         tree.setTransMode(trans_mode);
-      if (gamma > 0)
-         tree.setGamma(gamma);
-
-      for (unsigned y = 0; y < height; ++y)
-      {
-         typename T2::pixel_type const * row = image.getRow(y);
-         for (unsigned x = 0; x < width; ++x)
-         {
-            unsigned val = row[x];
-            tree.insert(mapnik::rgba(U2RED(val), U2GREEN(val), U2BLUE(val), U2ALPHA(val)));
-         }
-      }
-
-      //transparency values per palette index
-      std::vector<mapnik::rgba> pal;
-      tree.create_palette(pal);
-      assert(pal.size() <= colors);
-
-      std::vector<mapnik::rgb> palette;
-      std::vector<unsigned> alphaTable;
-      for(unsigned i=0; i<pal.size(); i++)
-      {
-          palette.push_back(rgb(pal[i].r, pal[i].g, pal[i].b));
-          alphaTable.push_back(pal[i].a);
-      }
-
-      if (palette.size() > 16 )
-      {
-          // >16 && <=256 colors -> write 8-bit color depth
-          ImageData8 reduced_image(width, height);
-
-          for (unsigned y = 0; y < height; ++y)
-          {
-             mapnik::ImageData32::pixel_type const * row = image.getRow(y);
-             mapnik::ImageData8::pixel_type  * row_out = reduced_image.getRow(y);
-
-             for (unsigned x = 0; x < width; ++x)
-             {
-                unsigned val = row[x];
-                mapnik::rgba c(U2RED(val), U2GREEN(val), U2BLUE(val), U2ALPHA(val));
-                row_out[x] = tree.quantize(c);
-             }
-          }
-          save_as_png(file, palette, reduced_image, width, height, 8, alphaTable);
-      }
-      else if (palette.size() == 1)
-      {
-         // 1 color image ->  write 1-bit color depth PNG
-         unsigned image_width  = (int(0.125*width) + 7)&~7;
-         unsigned image_height = height;
-         ImageData8 reduced_image(image_width, image_height);
-         reduced_image.set(0);
-         save_as_png(file, palette, reduced_image, width, height, 1, alphaTable);
-      }
-      else
-      {
-         // <=16 colors -> write 4-bit color depth PNG
-         unsigned image_width  = (int(0.5*width) + 3)&~3;
-         unsigned image_height = height;
-         ImageData8 reduced_image(image_width, image_height);
-          for (unsigned y = 0; y < height; ++y)
-          {
-             mapnik::ImageData32::pixel_type const * row = image.getRow(y);
-             mapnik::ImageData8::pixel_type  * row_out = reduced_image.getRow(y);
-             byte index = 0;
-
-             for (unsigned x = 0; x < width; ++x)
-             {
-                unsigned val = row[x];
-                mapnik::rgba c(U2RED(val), U2GREEN(val), U2BLUE(val), U2ALPHA(val));
-                index = tree.quantize(c);
+        }
+        save_as_png(file,palette,reduced_image,width,height,1,compression,strategy,alphaTable);
+    }
+    else
+    {
+        // <=16 colors -> write 4-bit color depth PNG
+        unsigned image_width  = (int(0.5*width) + 3)&~3;
+        unsigned image_height = height;
+        image_data_8 reduced_image(image_width,image_height);
+        reduce_4(image, reduced_image, trees, limits, TRANSPARENCY_LEVELS, alphaTable);
+        save_as_png(file,palette,reduced_image,width,height,4,compression,strategy,alphaTable);
+    }
+}
+
+
+template <typename T1, typename T2, typename T3>
+void save_as_png8(T1 & file, T2 const& image, T3 const & tree,
+        std::vector<mapnik::rgb> const& palette, std::vector<unsigned> const& alphaTable,
+        int compression = Z_DEFAULT_COMPRESSION, int strategy = Z_DEFAULT_STRATEGY)
+{
+    unsigned width = image.width();
+    unsigned height = image.height();
+
+    if (palette.size() > 16 )
+    {
+        // >16 && <=256 colors -> write 8-bit color depth
+        image_data_8 reduced_image(width, height);
+
+        for (unsigned y = 0; y < height; ++y)
+        {
+            mapnik::image_data_32::pixel_type const * row = image.getRow(y);
+            mapnik::image_data_8::pixel_type  * row_out = reduced_image.getRow(y);
+
+            for (unsigned x = 0; x < width; ++x)
+            {
+                row_out[x] = tree.quantize(row[x]);
+            }
+        }
+        save_as_png(file, palette, reduced_image, width, height, 8, compression, strategy, alphaTable);
+    }
+    else if (palette.size() == 1)
+    {
+        // 1 color image ->  write 1-bit color depth PNG
+        unsigned image_width  = (int(0.125*width) + 7)&~7;
+        unsigned image_height = height;
+        image_data_8 reduced_image(image_width, image_height);
+        reduced_image.set(0);
+        save_as_png(file, palette, reduced_image, width, height, 1, compression, strategy, alphaTable);
+    }
+    else
+    {
+        // <=16 colors -> write 4-bit color depth PNG
+        unsigned image_width  = (int(0.5*width) + 3)&~3;
+        unsigned image_height = height;
+        image_data_8 reduced_image(image_width, image_height);
+        for (unsigned y = 0; y < height; ++y)
+        {
+            mapnik::image_data_32::pixel_type const * row = image.getRow(y);
+            mapnik::image_data_8::pixel_type  * row_out = reduced_image.getRow(y);
+            byte index = 0;
+
+            for (unsigned x = 0; x < width; ++x)
+            {
+
+                index = tree.quantize(row[x]);
                 if (x%2 == 0) index = index<<4;
                 row_out[x>>1] |= index;
-             }
-          }
-         save_as_png(file, palette, reduced_image, width, height, 4, alphaTable);
-      }
-   }   
+            }
+        }
+        save_as_png(file, palette, reduced_image, width, height, 4, compression, strategy, alphaTable);
+    }
+}
+
+template <typename T1,typename T2>
+void save_as_png8_hex(T1 & file, T2 const& image, int colors = 256,
+        int compression = Z_DEFAULT_COMPRESSION, int strategy = Z_DEFAULT_STRATEGY,
+        int trans_mode = -1, double gamma = 2.0)
+{
+    unsigned width = image.width();
+    unsigned height = image.height();
+
+    // structure for color quantization
+    hextree<mapnik::rgba> tree(colors);
+    if (trans_mode >= 0)
+        tree.setTransMode(trans_mode);
+    if (gamma > 0)
+        tree.setGamma(gamma);
+
+    for (unsigned y = 0; y < height; ++y)
+    {
+        typename T2::pixel_type const * row = image.getRow(y);
+        for (unsigned x = 0; x < width; ++x)
+        {
+            unsigned val = row[x];
+            tree.insert(mapnik::rgba(U2RED(val), U2GREEN(val), U2BLUE(val), U2ALPHA(val)));
+        }
+    }
+
+    //transparency values per palette index
+    std::vector<mapnik::rgba> pal;
+    tree.create_palette(pal);
+    assert(int(pal.size()) <= colors);
+
+    std::vector<mapnik::rgb> palette;
+    std::vector<unsigned> alphaTable;
+    for(unsigned i=0; i<pal.size(); i++)
+    {
+        palette.push_back(rgb(pal[i].r, pal[i].g, pal[i].b));
+        alphaTable.push_back(pal[i].a);
+    }
+
+    save_as_png8<T1, T2, hextree<mapnik::rgba> >(file, image, tree, palette, alphaTable, compression, strategy);
+}
+
+template <typename T1, typename T2>
+void save_as_png8_pal(T1 & file, T2 const& image, rgba_palette const& pal,
+        int compression = Z_DEFAULT_COMPRESSION, int strategy = Z_DEFAULT_STRATEGY)
+{
+    save_as_png8<T1, T2, rgba_palette>(file, image, pal, pal.palette(), pal.alphaTable(), compression, strategy);
 }
+
+}
+
+#endif // MAPNIK_PNG_IO_HPP
diff --git a/include/mapnik/point_symbolizer.hpp b/include/mapnik/point_symbolizer.hpp
index fcbc59f..e47ea4f 100644
--- a/include/mapnik/point_symbolizer.hpp
+++ b/include/mapnik/point_symbolizer.hpp
@@ -21,31 +21,42 @@
  *****************************************************************************/
 //$Id: image_symbolizer.hpp 39 2005-04-10 20:39:53Z pavlenko $
 
-#ifndef POINT_SYMBOLIZER_HPP
-#define POINT_SYMBOLIZER_HPP
+#ifndef MAPNIK_POINT_SYMBOLIZER_HPP
+#define MAPNIK_POINT_SYMBOLIZER_HPP
 
-#include <mapnik/graphics.hpp> 
+// mapnik
 #include <mapnik/symbolizer.hpp> 
-#include <boost/shared_ptr.hpp>
-
+#include <mapnik/enumeration.hpp>
+ 
 namespace mapnik 
-{   
-    struct MAPNIK_DECL point_symbolizer : 
-        public symbolizer_with_image
-    {	
-        explicit point_symbolizer();
-        point_symbolizer(std::string const& file,
-                         std::string const& type,
-                         unsigned width,unsigned height);
-        point_symbolizer(point_symbolizer const& rhs);
-        void set_allow_overlap(bool overlap);
-        bool get_allow_overlap() const;
-        void set_opacity(float opacity);
-        float get_opacity() const;
-    private:
-        float opacity_;
-        bool overlap_;
-    };
+{
+
+enum point_placement_enum {
+    CENTROID_POINT_PLACEMENT,
+    INTERIOR_POINT_PLACEMENT,
+    point_placement_enum_MAX
+};
+
+DEFINE_ENUM( point_placement_e, point_placement_enum );
+
+struct MAPNIK_DECL point_symbolizer : 
+        public symbolizer_with_image, public symbolizer_base
+{       
+    explicit point_symbolizer();
+    point_symbolizer(path_expression_ptr file);
+    point_symbolizer(point_symbolizer const& rhs);
+    void set_allow_overlap(bool overlap);
+    bool get_allow_overlap() const;
+    void set_point_placement(point_placement_e point_p);
+    point_placement_e get_point_placement() const;
+    void set_ignore_placement(bool ignore_placement);
+    bool get_ignore_placement() const;
+        
+private:
+    bool overlap_;
+    point_placement_e point_p_;
+    bool ignore_placement_;
+};
 }
 
-#endif // POINT_SYMBOLIZER_HPP
+#endif // MAPNIK_POINT_SYMBOLIZER_HPP
diff --git a/include/mapnik/polygon_pattern_symbolizer.hpp b/include/mapnik/polygon_pattern_symbolizer.hpp
index 3c39799..0c389e3 100644
--- a/include/mapnik/polygon_pattern_symbolizer.hpp
+++ b/include/mapnik/polygon_pattern_symbolizer.hpp
@@ -24,22 +24,37 @@
 #ifndef POLYGON_PATTERN_SYMBOLIZER_HPP
 #define POLYGON_PATTERN_SYMBOLIZER_HPP
 
-#include <mapnik/graphics.hpp> 
-#include <mapnik/symbolizer.hpp> 
-#include <boost/shared_ptr.hpp>
+// mapnik 
+#include <mapnik/symbolizer.hpp>
+#include <mapnik/enumeration.hpp>
 
 namespace mapnik
 {
-    struct MAPNIK_DECL polygon_pattern_symbolizer :
-            public symbolizer_with_image
-    {
-	
-        polygon_pattern_symbolizer(std::string const& file,
-                                   std::string const& type,
-                                   unsigned width,unsigned height);
+
+enum pattern_alignment_enum {
+    LOCAL_ALIGNMENT,
+    GLOBAL_ALIGNMENT,
+    pattern_alignment_enum_MAX
+};
+
+DEFINE_ENUM( pattern_alignment_e, pattern_alignment_enum );
+
+struct MAPNIK_DECL polygon_pattern_symbolizer :
+        public symbolizer_with_image, public symbolizer_base
+{
         
-        polygon_pattern_symbolizer(polygon_pattern_symbolizer const& rhs);
-    };
+    polygon_pattern_symbolizer(path_expression_ptr file);
+    polygon_pattern_symbolizer(polygon_pattern_symbolizer const& rhs);
+    pattern_alignment_e get_alignment() const;
+    void set_alignment(pattern_alignment_e align);
+    void set_gamma(double gamma);
+    double get_gamma() const;
+
+private:
+    pattern_alignment_e alignment_;
+    double gamma_;
+
+};
 }
 
 #endif //POLYGON_PATTERN_SYMBOLIZER_HPP
diff --git a/include/mapnik/polygon_symbolizer.hpp b/include/mapnik/polygon_symbolizer.hpp
index 809c806..d6695ba 100644
--- a/include/mapnik/polygon_symbolizer.hpp
+++ b/include/mapnik/polygon_symbolizer.hpp
@@ -25,95 +25,101 @@
 #ifndef POLYGON_SYMBOLIZER_HPP
 #define POLYGON_SYMBOLIZER_HPP
 
+// mapnik
 #include <mapnik/color.hpp>
+#include <mapnik/symbolizer.hpp>
 
 namespace mapnik 
 {
-    struct MAPNIK_DECL polygon_symbolizer
-    {
-        explicit polygon_symbolizer() 
-            : fill_(color(128,128,128)),
-              opacity_(1.0),
-              gamma_(1.0) {}
+struct MAPNIK_DECL polygon_symbolizer : public symbolizer_base
+{
+    explicit polygon_symbolizer() 
+        : symbolizer_base(),
+        fill_(color(128,128,128)),
+        opacity_(1.0),
+        gamma_(1.0) {}
 
-        polygon_symbolizer(color const& fill)
-            : fill_(fill),
-              opacity_(1.0),
-              gamma_(1.0) {}
+    polygon_symbolizer(color const& fill)
+        : symbolizer_base(),
+        fill_(fill),
+        opacity_(1.0),
+        gamma_(1.0) {}
         
-        color const& get_fill() const
-        {
-            return fill_;
-        }
-        void set_fill(color const& fill)
-        {
-            fill_ = fill;
-        }
-        void set_opacity(float opacity)
-        {
-            opacity_ = opacity;
-        }
-        float get_opacity() const
-        {
-            return opacity_;
-        }
-        void set_gamma(float gamma)
-        {
-            gamma_ = gamma;
-        }
-        float get_gamma() const
-        {
-            return gamma_;
-        }
-
-    private:
-        color fill_;
-        float opacity_;
-        float gamma_;
-    }; 
-   
-   struct MAPNIK_DECL building_symbolizer
+    color const& get_fill() const
+    {
+        return fill_;
+    }
+    void set_fill(color const& fill)
+    {
+        fill_ = fill;
+    }
+    void set_opacity(double opacity)
+    {
+        opacity_ = opacity;
+    }
+    double get_opacity() const
+    {
+        return opacity_;
+    }
+    void set_gamma(double gamma)
+    {
+        gamma_ = gamma;
+    }
+    double get_gamma() const
     {
-       explicit building_symbolizer() 
-          : fill_(color(128,128,128)),
-          height_(0.0),
-          opacity_(1.0)
-          {}
+        return gamma_;
+    }
 
-       building_symbolizer(color const& fill,double height)
-          : fill_(fill),
-          height_(height),
-          opacity_(1.0) {}
+private:
+    color fill_;
+    double opacity_;
+    double gamma_;
+}; 
+   
+struct MAPNIK_DECL building_symbolizer : public symbolizer_base
+{
+    explicit building_symbolizer() 
+        : symbolizer_base(),
+        fill_(color(128,128,128)),
+        height_(0.0),
+        opacity_(1.0)
+        {}
+       
+    building_symbolizer(color const& fill,double height)
+        : symbolizer_base(),
+        fill_(fill),
+        height_(height),
+        opacity_(1.0) {}
        
-        color const& get_fill() const
-        {
-            return fill_;
-        }
-        void set_fill(color const& fill)
-        {
-            fill_ = fill;
-        }
-        double height() const
-        {
-           return height_;
-        }
-        void set_height(double height) 
-        {
-           height_=height;
-        }
-        void set_opacity(float opacity)
-        {
-            opacity_ = opacity;
-        }
-        float get_opacity() const
-        {
-            return opacity_;
-        }
-    private:
-        color fill_;
-        double height_;
-        float opacity_;
-    };  
+    color const& get_fill() const
+    {
+        return fill_;
+    }
+    void set_fill(color const& fill)
+    {
+        fill_ = fill;
+    }
+    double height() const
+    {
+        return height_;
+    }
+    void set_height(double height) 
+    {
+        height_=height;
+    }
+    void set_opacity(double opacity)
+    {
+        opacity_ = opacity;
+    }
+    double get_opacity() const
+    {
+        return opacity_;
+    }
+private:
+    color fill_;
+    double height_;
+    double opacity_;
+};  
 }
 
 #endif // POLYGON_SYMBOLIZER_HPP
diff --git a/include/mapnik/pool.hpp b/include/mapnik/pool.hpp
index e0920e6..7459fd7 100644
--- a/include/mapnik/pool.hpp
+++ b/include/mapnik/pool.hpp
@@ -43,116 +43,126 @@
 
 namespace mapnik
 {
-   template <typename T, typename PoolT>
-   class PoolGuard
-   {
-      private:
-         const T& obj_;
-         PoolT& pool_; 
-      public:
-         explicit PoolGuard(const T& ptr,PoolT& pool)
-            : obj_(ptr),
-              pool_(pool) {}
+template <typename T, typename PoolT>
+class PoolGuard
+{
+private:
+    const T& obj_;
+    PoolT& pool_; 
+public:
+    explicit PoolGuard(const T& ptr,PoolT& pool)
+        : obj_(ptr),
+          pool_(pool) {}
 
-         ~PoolGuard() 
-         {
-            pool_->returnObject(obj_);
-         }
+    ~PoolGuard() 
+    {
+        pool_->returnObject(obj_);
+    }
 
-      private:
-         PoolGuard();
-         PoolGuard(const PoolGuard&);
-         PoolGuard& operator=(const PoolGuard&);
-   };
+private:
+    PoolGuard();
+    PoolGuard(const PoolGuard&);
+    PoolGuard& operator=(const PoolGuard&);
+};
 
-   template <typename T,template <typename> class Creator>
-   class Pool : private boost::noncopyable
-   {
-         typedef boost::shared_ptr<T> HolderType;
-         typedef std::deque<HolderType> ContType;	
-	
-         Creator<T> creator_;
-         const unsigned initialSize_; 
-         const unsigned maxSize_;
-         ContType usedPool_;
-         ContType unusedPool_;
+template <typename T,template <typename> class Creator>
+class Pool : private boost::noncopyable
+{
+    typedef boost::shared_ptr<T> HolderType;
+    typedef std::deque<HolderType> ContType;    
+        
+    Creator<T> creator_;
+    const unsigned initialSize_; 
+    const unsigned maxSize_;
+    ContType usedPool_;
+    ContType unusedPool_;
 #ifdef MAPNIK_THREADSAFE
-         mutable boost::mutex mutex_;
+    mutable boost::mutex mutex_;
 #endif
-      public:
+public:
 
-         Pool(const Creator<T>& creator,unsigned initialSize=1, unsigned maxSize=10)
-            :creator_(creator),
-             initialSize_(initialSize),
-             maxSize_(maxSize)
-         {
-            for (unsigned i=0; i < initialSize_; ++i) 
-            {
-               HolderType conn(creator_());
-               if (conn->isOK())
-                  unusedPool_.push_back(conn);
-            }
-         }
+    Pool(const Creator<T>& creator,unsigned initialSize=1, unsigned maxSize=10)
+        :creator_(creator),
+         initialSize_(initialSize),
+         maxSize_(maxSize)
+    {
+        for (unsigned i=0; i < initialSize_; ++i) 
+        {
+            HolderType conn(creator_());
+            if (conn->isOK())
+                unusedPool_.push_back(conn);
+        }
+    }
 
-         HolderType borrowObject()
-         {	
+    HolderType borrowObject()
+    {   
 #ifdef MAPNIK_THREADSAFE    
-            mutex::scoped_lock lock(mutex_);
+        mutex::scoped_lock lock(mutex_);
 #endif
-            typename ContType::iterator itr=unusedPool_.begin();
-            if (itr!=unusedPool_.end())
-            { 
+        typename ContType::iterator itr=unusedPool_.begin();
+        while ( itr!=unusedPool_.end())
+        { 
 #ifdef MAPNIK_DEBUG
-               std::clog<<"borrow "<<(*itr).get()<<"\n";
+            std::clog<<"borrow "<<(*itr).get()<<"\n";
 #endif
-               usedPool_.push_back(*itr);
-               itr=unusedPool_.erase(itr);
-               return usedPool_[usedPool_.size()-1];
+            if ((*itr)->isOK())
+            {
+                usedPool_.push_back(*itr);
+                unusedPool_.erase(itr);
+                return usedPool_[usedPool_.size()-1];
+            }
+            else
+            {
+#ifdef MAPNIK_DEBUG
+                std::clog<<"bad connection (erase)" << (*itr).get()<<"\n";
+#endif 
+                itr=unusedPool_.erase(itr);
             }
-            else if (unusedPool_.size() < maxSize_)
+        }
+        if (usedPool_.size() < maxSize_)
+        {
+            HolderType conn(creator_());
+            if (conn->isOK())
             {
-               HolderType conn(creator_());
-               if (conn->isOK())
-               {
-                  usedPool_.push_back(conn);
+                usedPool_.push_back(conn);
 #ifdef MAPNIK_DEBUG
-                  std::clog << "create << " << conn.get() << "\n";
+                std::clog << "create << " << conn.get() << "\n";
 #endif
-                  return conn;
-               }
+                return conn;
             }
-            return HolderType();
-         } 
+        }
+        return HolderType();
+    } 
 
-         void returnObject(HolderType obj)
-         {
+    void returnObject(HolderType obj)
+    {
 #ifdef MAPNIK_THREADSAFE
-            mutex::scoped_lock lock(mutex_);
+        mutex::scoped_lock lock(mutex_);
 #endif
-            typename ContType::iterator itr=usedPool_.begin();
-            while (itr != usedPool_.end())
+        typename ContType::iterator itr=usedPool_.begin();
+        while (itr != usedPool_.end())
+        {
+            if (obj.get()==(*itr).get()) 
             {
-               if (obj.get()==(*itr).get()) 
-               {
 #ifdef MAPNIK_DEBUG
-                  std::clog<<"return "<<(*itr).get()<<"\n";
+                std::clog<<"return "<<(*itr).get()<<"\n";
 #endif
-                  unusedPool_.push_back(*itr);
-                  usedPool_.erase(itr);
-                  return;
-               }
-               ++itr;
+                unusedPool_.push_back(*itr);
+                usedPool_.erase(itr);
+                return;
             }
-         }
+            ++itr;
+        }
+    }
          
-         std::pair<unsigned,unsigned> size() const
-         {
+    std::pair<unsigned,unsigned> size() const
+    {
 #ifdef MAPNIK_THREADSAFE
-            mutex::scoped_lock lock(mutex_);
+        mutex::scoped_lock lock(mutex_);
 #endif
-            std::pair<unsigned,unsigned> size(unusedPool_.size(),usedPool_.size());
-            return size;
-         }
-   };
+        std::pair<unsigned,unsigned> size(unusedPool_.size(),usedPool_.size());
+        return size;
+    }
+};
 }
 #endif //POOL_HPP
diff --git a/include/mapnik/proj_transform.hpp b/include/mapnik/proj_transform.hpp
index 923a26c..83430bf 100644
--- a/include/mapnik/proj_transform.hpp
+++ b/include/mapnik/proj_transform.hpp
@@ -27,29 +27,39 @@
 
 // mapnik
 #include <mapnik/projection.hpp>
+#include <mapnik/box2d.hpp>
+
 // boost
 #include <boost/utility.hpp>
 
 namespace mapnik {
     
-    class MAPNIK_DECL proj_transform : private boost::noncopyable
-    {
-    public:
-        proj_transform(projection const& source, 
-                       projection const& dest);
+class MAPNIK_DECL proj_transform : private boost::noncopyable
+{
+public:
+    proj_transform(projection const& source, 
+                   projection const& dest);
         
-        bool forward (double& x, double& y , double& z) const;
-        bool backward (double& x, double& y , double& z) const;
-        mapnik::projection const& source() const;
-        mapnik::projection const& dest() const;
+    bool equal() const;
+    bool forward (double& x, double& y , double& z) const;
+    bool backward (double& x, double& y , double& z) const;
+    bool forward (double *x, double *y , double *z, int point_count) const;
+    bool backward (double *x, double *y , double *z, int point_count) const;
+    bool forward (box2d<double> & box) const;
+    bool backward (box2d<double> & box) const;
+    bool forward (box2d<double> & box, int points) const;
+    bool backward (box2d<double> & box, int points) const;
+    mapnik::projection const& source() const;
+    mapnik::projection const& dest() const;
         
-    private:
-        projection const& source_;
-        projection const& dest_;
-        bool is_source_latlong_;
-        bool is_dest_latlong_;
-        bool is_source_equal_dest;
-    };
+private:
+    projection const source_;
+    projection const dest_;
+    bool is_source_longlat_;
+    bool is_dest_longlat_;
+    bool is_source_equal_dest_;
+    bool wgs84_to_merc_;
+};
 }
 
 #endif // PROJ_TRANSFORM_HPP
diff --git a/include/mapnik/projection.hpp b/include/mapnik/projection.hpp
index 76a7816..33a534d 100644
--- a/include/mapnik/projection.hpp
+++ b/include/mapnik/projection.hpp
@@ -26,10 +26,13 @@
 #define PROJECTION_HPP
 
 // mapnik
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
+
+// proj4
+#include <proj_api.h>
 
 // boost
-#ifdef MAPNIK_THREADSAFE
+#if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480
 #include <boost/thread/mutex.hpp>
 #endif
 
@@ -41,42 +44,47 @@
 
 namespace mapnik {
     
-    class proj_init_error : public std::runtime_error
-    {
-    public:
-        proj_init_error(std::string const& params)
-            : std::runtime_error("failed to initialize projection with:" + params) {}
-    };
+class proj_init_error : public std::runtime_error
+{
+public:
+    proj_init_error(std::string const& params)
+        : std::runtime_error("failed to initialize projection with: '" + params + "'") {}
+};
     
-    class MAPNIK_DECL projection
-    {
-        friend class proj_transform;
-    public:
-        explicit projection(std::string params = "+proj=latlong +ellps=WGS84");
-        projection(projection const& rhs);
-        ~projection();
+class MAPNIK_DECL projection
+{
+    friend class proj_transform;
+public:
+    explicit projection(std::string const& params = "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs");
+    projection(projection const& rhs);
+    ~projection();
         
-        projection& operator=(projection const& rhs);
-        bool operator==(const projection& other) const;
-        bool operator!=(const projection& other) const;
-        bool is_initialized() const;
-        bool is_geographic() const;
-        std::string const& params() const;
+    projection& operator=(projection const& rhs);
+    bool operator==(const projection& other) const;
+    bool operator!=(const projection& other) const;
+    bool is_initialized() const;
+    bool is_geographic() const;
+    std::string const& params() const;
       
-        void forward(double & x, double &y ) const;
-        void inverse(double & x,double & y) const;
+    void forward(double & x, double &y ) const;
+    void inverse(double & x,double & y) const;
+
+    std::string expanded() const;
         
-    private:
-        void init(); 
-        void swap (projection& rhs);
+private:
+    void init(); 
+    void swap (projection& rhs);
        
-    private:
-        std::string params_;
-        void * proj_;
-#ifdef MAPNIK_THREADSAFE
-        static boost::mutex mutex_;
+private:
+    std::string params_;
+    projPJ proj_;
+    bool is_geographic_;
+#if PJ_VERSION >= 480
+    projCtx proj_ctx_;
+#elif defined(MAPNIK_THREADSAFE)
+    static boost::mutex mutex_;
 #endif
-    };
+};
 }
 
 #endif //PROJECTION_HPP
diff --git a/include/mapnik/ptree_helpers.hpp b/include/mapnik/ptree_helpers.hpp
index 13e266b..88a75f4 100644
--- a/include/mapnik/ptree_helpers.hpp
+++ b/include/mapnik/ptree_helpers.hpp
@@ -36,392 +36,392 @@
 
 namespace mapnik {
 
-    template <typename T>
-    T get(const boost::property_tree::ptree & node, const std::string & name, bool is_attribute,
-            const T & default_value);
-    template <typename T>
-    T get(const boost::property_tree::ptree & node, const std::string & name, bool is_attribute);
-    template <typename T>
-    T get_own(const boost::property_tree::ptree & node, const std::string & name);
-    template <typename T>
-    boost::optional<T> get_optional(const boost::property_tree::ptree & node, const std::string & name,
-                                    bool is_attribute);
-
-    template <typename T>
-    boost::optional<T> get_opt_attr( const boost::property_tree::ptree & node,
-                                      const std::string & name)
+template <typename T>
+T get(const boost::property_tree::ptree & node, const std::string & name, bool is_attribute,
+      const T & default_value);
+template <typename T>
+T get(const boost::property_tree::ptree & node, const std::string & name, bool is_attribute);
+template <typename T>
+T get_value(const boost::property_tree::ptree & node, const std::string & name);
+template <typename T>
+boost::optional<T> get_optional(const boost::property_tree::ptree & node, const std::string & name,
+                                bool is_attribute);
+
+template <typename T>
+boost::optional<T> get_opt_attr( const boost::property_tree::ptree & node,
+                                 const std::string & name)
+{
+    return get_optional<T>( node, name, true);
+}
+
+template <typename T>
+boost::optional<T> get_opt_child( const boost::property_tree::ptree & node,
+                                  const std::string & name)
+{
+    return get_optional<T>( node, name, false);
+}
+
+template <typename T>
+T get_attr( const boost::property_tree::ptree & node, const std::string & name,
+            const T & default_value )
+{
+    return get<T>( node, name, true, default_value);
+}
+
+template <typename T>
+T get_attr( const boost::property_tree::ptree & node, const std::string & name )
+{
+    return get<T>( node, name, true );
+}
+
+template <typename T>
+T get_css( const boost::property_tree::ptree & node, const std::string & name )
+{
+    return get_value<T>( node, std::string("CSS parameter '") + name + "'");
+}
+
+// specialization for color type
+template <>
+inline color get_css (boost::property_tree::ptree const& node, std::string const& name)
+{
+    std::string str = get_value<std::string>( node, std::string("CSS parameter '") + name + "'"); ;
+    try
     {
-        return get_optional<T>( node, name, true);
+        return mapnik::color_factory::from_string(str.c_str());
     }
-
-    template <typename T>
-    boost::optional<T> get_opt_child( const boost::property_tree::ptree & node,
-                                      const std::string & name)
-    {
-        return get_optional<T>( node, name, false);
-    }
-
-    template <typename T>
-    T get_attr( const boost::property_tree::ptree & node, const std::string & name,
-                const T & default_value )
+    catch (...)
     {
-        return get<T>( node, name, true, default_value);
+        throw config_error(std::string("Failed to parse ") +
+                           name + "'. Expected CSS color"  +
+                           " but got '" + str + "'");
     }
-
-    template <typename T>
-    T get_attr( const boost::property_tree::ptree & node, const std::string & name )
-    {
-        return get<T>( node, name, true );
-    }
-
-    template <typename T>
-    T get_css( const boost::property_tree::ptree & node, const std::string & name )
-    {
-        return get_own<T>( node, std::string("CSS parameter '") + name + "'");
-    }
-
-   // specialization for color type
-   template <>
-   inline color get_css (boost::property_tree::ptree const& node, std::string const& name)
-   {
-      std::string str = get_own<std::string>( node, std::string("CSS parameter '") + name + "'"); ;
-      try
-      {
-         return mapnik::color_factory::from_string(str.c_str());
-      }
-      catch (...)
-      {
-          throw config_error(std::string("Failed to parse ") +
-                             name + "'. Expected CSS color"  +
-                             " but got '" + str + "'");
-      }
-   }
+}
    
    
-    template <typename charT, typename traits>
-    std::basic_ostream<charT, traits> &
-    operator << ( std::basic_ostream<charT, traits> & s, const mapnik::color & c )
+template <typename charT, typename traits>
+std::basic_ostream<charT, traits> &
+operator << ( std::basic_ostream<charT, traits> & s, const mapnik::color & c )
+{
+    std::string hex_string( c.to_string() );
+    s << hex_string;
+    return s;
+}
+
+/** Helper for class bool */
+class boolean {
+public:
+    boolean() {}
+    boolean(bool b) : b_(b) {}
+    boolean(const boolean & b) : b_(b.b_) {}
+
+    operator bool() const 
     {
-        std::string hex_string( c.to_string() );
-        s << hex_string;
-        return s;
+        return b_;
     }
-
-    /** Helper for class bool */
-    class boolean {
-        public:
-            boolean() {}
-            boolean(bool b) : b_(b) {}
-            boolean(const boolean & b) : b_(b.b_) {}
-
-            operator bool() const 
-            {
-                return b_;
-            }
-            boolean & operator = (const boolean & other)
-            {
-                b_ = other.b_;
-                return * this;
-            }
-            boolean & operator = (bool other)
-            {
-                b_ = other;
-                return * this;
-            }
-        private:
-            bool b_;
-    };
-
-    /** Special stream input operator for boolean values */
-    template <typename charT, typename traits>
-    std::basic_istream<charT, traits> &
-    operator >> ( std::basic_istream<charT, traits> & s, boolean & b )
+    boolean & operator = (const boolean & other)
     {
-        std::string word;
-        s >> word;
-        if ( s ) 
-        {
-            if ( word == "true" || word == "yes" || word == "on" || 
-                 word == "1")
-            {
-                b = true;
-            }
-            else if ( word == "false" || word == "no" || word == "off" ||
-                      word == "0")
-            {
-                b = false;
-            }
-            else
-            {
-                s.setstate( std::ios::failbit );    
-            }
-        }
-        return s;
+        b_ = other.b_;
+        return * this;
     }
-
-    template <typename charT, typename traits>
-    std::basic_ostream<charT, traits> &
-    operator << ( std::basic_ostream<charT, traits> & s, const boolean & b )
+    boolean & operator = (bool other)
     {
-        s << ( b ? "true" : "false" );
-        return s;
+        b_ = other;
+        return * this;
     }
-
-    template <typename T>
-    void set_attr(boost::property_tree::ptree & pt, const std::string & name, const T & v)
+private:
+    bool b_;
+};
+
+/** Special stream input operator for boolean values */
+template <typename charT, typename traits>
+std::basic_istream<charT, traits> &
+operator >> ( std::basic_istream<charT, traits> & s, boolean & b )
+{
+    std::string word;
+    s >> word;
+    if ( s ) 
     {
-        pt.put("<xmlattr>." + name, v);
+        if ( word == "true" || word == "yes" || word == "on" || 
+             word == "1")
+        {
+            b = true;
+        }
+        else if ( word == "false" || word == "no" || word == "off" ||
+                  word == "0")
+        {
+            b = false;
+        }
+        else
+        {
+            s.setstate( std::ios::failbit );    
+        }
     }
-
-    /*
-    template <>
-    void set_attr<bool>(boost::property_tree::ptree & pt, const std::string & name, const bool & v)
+    return s;
+}
+
+template <typename charT, typename traits>
+std::basic_ostream<charT, traits> &
+operator << ( std::basic_ostream<charT, traits> & s, const boolean & b )
+{
+    s << ( b ? "true" : "false" );
+    return s;
+}
+
+template <typename T>
+void set_attr(boost::property_tree::ptree & pt, const std::string & name, const T & v)
+{
+    pt.put("<xmlattr>." + name, v);
+}
+
+/*
+  template <>
+  void set_attr<bool>(boost::property_tree::ptree & pt, const std::string & name, const bool & v)
+  {
+  pt.put("<xmlattr>." + name, boolean(v));
+  }
+*/
+
+class boolean;
+
+template <typename T>
+void set_css(boost::property_tree::ptree & pt, const std::string & name, const T & v)
+{
+    boost::property_tree::ptree & css_node = pt.push_back(
+        boost::property_tree::ptree::value_type("CssParameter", 
+                                                boost::property_tree::ptree()))->second;
+    css_node.put("<xmlattr>.name", name );
+    css_node.put_value( v );
+}
+
+template <typename T>
+struct name_trait
+{
+    static std::string name()
     {
-        pt.put("<xmlattr>." + name, boolean(v));
+        return "<unknown>";
     }
-    */
-
-    class boolean;
-
-    template <typename T>
-    void set_css(boost::property_tree::ptree & pt, const std::string & name, const T & v)
-    {
-        boost::property_tree::ptree & css_node = pt.push_back(
-            boost::property_tree::ptree::value_type("CssParameter", 
-            boost::property_tree::ptree()))->second;
-        css_node.put("<xmlattr>.name", name );
-        css_node.put_own( v );
-    }
-
-    template <typename T>
-    struct name_trait
-    {
-        static std::string name()
-        {
-            return "<unknown>";
-        }
-        // missing name_trait for type ...
-        // if you get here you are probably using a new type
-        // in the XML file. Just add a name trait for the new
-        // type below.
-        BOOST_STATIC_ASSERT( sizeof(T) == 0 );
-    };
-
-#define DEFINE_NAME_TRAIT_WITH_NAME( type, type_name ) \
-    template <> \
-    struct name_trait<type> \
-    { \
+    // missing name_trait for type ...
+    // if you get here you are probably using a new type
+    // in the XML file. Just add a name trait for the new
+    // type below.
+    BOOST_STATIC_ASSERT( sizeof(T) == 0 );
+};
+
+#define DEFINE_NAME_TRAIT_WITH_NAME( type, type_name )                  \
+    template <>                                                         \
+    struct name_trait<type>                                             \
+    {                                                                   \
         static std::string name() { return std::string("type ") + type_name; } \
     };
 
-#define DEFINE_NAME_TRAIT( type ) \
-    DEFINE_NAME_TRAIT_WITH_NAME( type, #type );
+#define DEFINE_NAME_TRAIT( type )               \
+    DEFINE_NAME_TRAIT_WITH_NAME( type, #type )
 
-    DEFINE_NAME_TRAIT( double );
-    DEFINE_NAME_TRAIT( float );
-    DEFINE_NAME_TRAIT( unsigned );
-    DEFINE_NAME_TRAIT( boolean );
-    DEFINE_NAME_TRAIT_WITH_NAME( int, "integer" );
-    DEFINE_NAME_TRAIT_WITH_NAME( std::string, "string" );
-    DEFINE_NAME_TRAIT_WITH_NAME( color, "color" );
+DEFINE_NAME_TRAIT( double )
+DEFINE_NAME_TRAIT( float )
+DEFINE_NAME_TRAIT( unsigned )
+DEFINE_NAME_TRAIT( boolean )
+DEFINE_NAME_TRAIT_WITH_NAME( int, "integer" )
+DEFINE_NAME_TRAIT_WITH_NAME( std::string, "string" )
+DEFINE_NAME_TRAIT_WITH_NAME( color, "color" )
 
-    template <typename ENUM, int MAX>
-    struct name_trait< mapnik::enumeration<ENUM, MAX> >
-    {
-        typedef enumeration<ENUM, MAX> Enum;
+template <typename ENUM, int MAX>
+struct name_trait< mapnik::enumeration<ENUM, MAX> >
+{
+    typedef enumeration<ENUM, MAX> Enum;
 
-        static std::string name()
-        {
-            std::string value_list("one of [");
-            for (unsigned i = 0; i < Enum::MAX; ++i)
-            {
-                value_list += Enum::get_string( i );
-                if ( i + 1 < Enum::MAX ) value_list += ", ";
-            }
-            value_list += "]";
-            
-            return value_list;
-        }
-    };
-
-    template <typename T>
-    T get(const boost::property_tree::ptree & node, const std::string & name, bool is_attribute,
-          const T & default_value)
+    static std::string name()
     {
-        boost::optional<std::string> str;
-        if (is_attribute)
-        {
-            str = node.get_optional<std::string>( std::string("<xmlattr>.") + name );
-        }
-        else
+        std::string value_list("one of [");
+        for (unsigned i = 0; i < Enum::MAX; ++i)
         {
-            str = node.get_optional<std::string>(name );
-        }
-
-        if ( str ) {
-            try
-            {
-                return boost::lexical_cast<T>( * str );
-            }
-            catch (const boost::bad_lexical_cast & )
-            {
-                throw config_error(std::string("Failed to parse ") +
-                        (is_attribute ? "attribute" : "child node") + " '" +
-                        name + "'. Expected " + name_trait<T>::name() +
-                        " but got '" + *str + "'");
-            }
-        } else {
-            return default_value;
+            value_list += Enum::get_string( i );
+            if ( i + 1 < Enum::MAX ) value_list += ", ";
         }
+        value_list += "]";
+            
+        return value_list;
     }
-
-   template <>
-   inline color get(boost::property_tree::ptree const& node, std::string const& name, bool is_attribute,
-             color const& default_value)
-   {
-      boost::optional<std::string> str;
-      if (is_attribute)
-      {
-         str = node.get_optional<std::string>( std::string("<xmlattr>.") + name );
-      }
-      else
-      {
-         str = node.get_optional<std::string>(name );
-      }
-      
-      if ( str ) 
-      {
-         try
-         {
-            return mapnik::color_factory::from_string((*str).c_str());
-         }
-         catch (...)
-         {
-             throw config_error(std::string("Failed to parse ") +
-                                (is_attribute ? "attribute" : "child node") + " '" +
-                                name + "'. Expected " + name_trait<color>::name() +
-                                " but got '" + *str + "'");
-         }
-      } 
-      else 
-      {
-         return default_value;
-      }
-   }
-   
-    template <typename T>
-    T get(const boost::property_tree::ptree & node, const std::string & name, bool is_attribute)
+};
+
+template <typename T>
+T get(const boost::property_tree::ptree & node, const std::string & name, bool is_attribute,
+      const T & default_value)
+{
+    boost::optional<std::string> str;
+    if (is_attribute)
     {
-        boost::optional<std::string> str;
-        if (is_attribute)
-        {
-            str = node.get_optional<std::string>( std::string("<xmlattr>.") + name);
-        }
-        else
-        {
-            str = node.get_optional<std::string>(name);
-        }
+        str = node.get_optional<std::string>( std::string("<xmlattr>.") + name );
+    }
+    else
+    {
+        str = node.get_optional<std::string>(name );
+    }
 
-        if ( ! str ) {
-            throw config_error(std::string("Required ") +
-                    (is_attribute ? "attribute " : "child node ") +
-                    "'" + name + "' is missing");
-        }
+    if ( str ) {
         try
         {
-            return boost::lexical_cast<T>( *str );
+            return boost::lexical_cast<T>( * str );
         }
         catch (const boost::bad_lexical_cast & )
         {
             throw config_error(std::string("Failed to parse ") +
-                    (is_attribute ? "attribute" : "child node") + " '" +
-                    name + "'. Expected " + name_trait<T>::name() +
-                    " but got '" + *str + "'");
+                               (is_attribute ? "attribute" : "child node") + " '" +
+                               name + "'. Expected " + name_trait<T>::name() +
+                               " but got '" + *str + "'");
         }
+    } else {
+        return default_value;
     }
-
-    template <typename T>
-    T get_own(const boost::property_tree::ptree & node, const std::string & name)
+}
+
+template <>
+inline color get(boost::property_tree::ptree const& node, std::string const& name, bool is_attribute,
+                 color const& default_value)
+{
+    boost::optional<std::string> str;
+    if (is_attribute)
+    {
+        str = node.get_optional<std::string>( std::string("<xmlattr>.") + name );
+    }
+    else
+    {
+        str = node.get_optional<std::string>(name );
+    }
+      
+    if ( str ) 
     {
         try
         {
-            return node.get_own<T>();
+            return mapnik::color_factory::from_string((*str).c_str());
         }
         catch (...)
         {
             throw config_error(std::string("Failed to parse ") +
-                    name + ". Expected " + name_trait<T>::name() +
-                    " but got '" + node.data() + "'");
+                               (is_attribute ? "attribute" : "child node") + " '" +
+                               name + "'. Expected " + name_trait<color>::name() +
+                               " but got '" + *str + "'");
         }
+    } 
+    else 
+    {
+        return default_value;
+    }
+}
+   
+template <typename T>
+T get(const boost::property_tree::ptree & node, const std::string & name, bool is_attribute)
+{
+    boost::optional<std::string> str;
+    if (is_attribute)
+    {
+        str = node.get_optional<std::string>( std::string("<xmlattr>.") + name);
+    }
+    else
+    {
+        str = node.get_optional<std::string>(name);
     }
 
-    template <typename T>
-    boost::optional<T> get_optional(const boost::property_tree::ptree & node, const std::string & name,
-                                    bool is_attribute)
+    if ( ! str ) {
+        throw config_error(std::string("Required ") +
+                           (is_attribute ? "attribute " : "child node ") +
+                           "'" + name + "' is missing");
+    }
+    try
     {
-        boost::optional<std::string> str;
-        if (is_attribute)
-        {
-            str = node.get_optional<std::string>( std::string("<xmlattr>.") + name);
-        }
-        else
-        {
-            str = node.get_optional<std::string>(name);
-        }
+        return boost::lexical_cast<T>( *str );
+    }
+    catch (const boost::bad_lexical_cast & )
+    {
+        throw config_error(std::string("Failed to parse ") +
+                           (is_attribute ? "attribute" : "child node") + " '" +
+                           name + "'. Expected " + name_trait<T>::name() +
+                           " but got '" + *str + "'");
+    }
+}
+
+template <typename T>
+T get_value(const boost::property_tree::ptree & node, const std::string & name)
+{
+    try
+    {
+        return node.get_value<T>();
+    }
+    catch (...)
+    {
+        throw config_error(std::string("Failed to parse ") +
+                           name + ". Expected " + name_trait<T>::name() +
+                           " but got '" + node.data() + "'");
+    }
+}
+
+template <typename T>
+boost::optional<T> get_optional(const boost::property_tree::ptree & node, const std::string & name,
+                                bool is_attribute)
+{
+    boost::optional<std::string> str;
+    if (is_attribute)
+    {
+        str = node.get_optional<std::string>( std::string("<xmlattr>.") + name);
+    }
+    else
+    {
+        str = node.get_optional<std::string>(name);
+    }
         
-        boost::optional<T> result;
-        if ( str ) 
+    boost::optional<T> result;
+    if ( str ) 
+    {
+        try
         {
-           try
-           {
-              result = boost::lexical_cast<T>( *str );
-           }
-           catch (const boost::bad_lexical_cast &)
-           {
-               throw config_error(std::string("Failed to parse ") +
-                                 (is_attribute ? "attribute" : "child node") + " '" +
-                                 name + "'. Expected " + name_trait<T>::name() +
-                                 " but got '" + *str + "'");
-           }  
+            result = boost::lexical_cast<T>( *str );
         }
-        
-        return result;
+        catch (const boost::bad_lexical_cast &)
+        {
+            throw config_error(std::string("Failed to parse ") +
+                               (is_attribute ? "attribute" : "child node") + " '" +
+                               name + "'. Expected " + name_trait<T>::name() +
+                               " but got '" + *str + "'");
+        }  
     }
-   //
+        
+    return result;
+}
+//
    
-   template <>
-   inline boost::optional<color> get_optional(const boost::property_tree::ptree & node, const std::string & name,
-                                       bool is_attribute)
+template <>
+inline boost::optional<color> get_optional(const boost::property_tree::ptree & node, const std::string & name,
+                                           bool is_attribute)
+{
+    boost::optional<std::string> str;
+    if (is_attribute)
     {
-        boost::optional<std::string> str;
-        if (is_attribute)
-        {
-            str = node.get_optional<std::string>( std::string("<xmlattr>.") + name);
-        }
-        else
-        {
-            str = node.get_optional<std::string>(name);
-        }
+        str = node.get_optional<std::string>( std::string("<xmlattr>.") + name);
+    }
+    else
+    {
+        str = node.get_optional<std::string>(name);
+    }
         
-        boost::optional<color> result;
-        if ( str ) 
+    boost::optional<color> result;
+    if ( str ) 
+    {
+        try
         {
-           try
-           {
-              //result = boost::lexical_cast<T>( *str );
-              result = mapnik::color_factory::from_string((*str).c_str());
-           }
-           catch (...)
-           {
-               throw config_error(std::string("Failed to parse ") +
-                                  (is_attribute ? "attribute" : "child node") + " '" +
-                                  name + "'. Expected " + name_trait<color>::name() +
-                                  " but got '" + *str + "'");
-           }  
+            //result = boost::lexical_cast<T>( *str );
+            result = mapnik::color_factory::from_string((*str).c_str());
         }
-        
-        return result;
+        catch (...)
+        {
+            throw config_error(std::string("Failed to parse ") +
+                               (is_attribute ? "attribute" : "child node") + " '" +
+                               name + "'. Expected " + name_trait<color>::name() +
+                               " but got '" + *str + "'");
+        }  
     }
+        
+    return result;
+}
 } // end of namespace mapnik
 
 #endif // MAPNIK_CONFIG_HELPERS_INCLUDED
diff --git a/include/mapnik/quad_tree.hpp b/include/mapnik/quad_tree.hpp
index cb424ff..0c9af81 100644
--- a/include/mapnik/quad_tree.hpp
+++ b/include/mapnik/quad_tree.hpp
@@ -24,7 +24,7 @@
 #ifndef QUAD_TREE_HPP
 #define QUAD_TREE_HPP
 // mapnik
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 // boost
 #include <boost/ptr_container/ptr_vector.hpp>
 #include <boost/noncopyable.hpp>
@@ -34,193 +34,190 @@
 
 namespace mapnik
 {
-   template <typename T>
-   class quad_tree : boost::noncopyable
-   {
-         struct node
-         {
-               typedef T value_t;
-               typedef std::vector<T> cont_t;
-               typedef typename cont_t::iterator iterator;
-               typedef typename cont_t::const_iterator const_iterator;
-               Envelope<double> extent_;
-               cont_t cont_;
-               node * children_[4];
+template <typename T>
+class quad_tree : boost::noncopyable
+{
+    struct node
+    {
+        typedef T value_t;
+        typedef std::vector<T> cont_t;
+        typedef typename cont_t::iterator iterator;
+        typedef typename cont_t::const_iterator const_iterator;
+        box2d<double> extent_;
+        cont_t cont_;
+        node * children_[4];
 
-               explicit node(Envelope<double> const& ext)
-                  : extent_(ext)
-               {
-                  std::memset(children_,0,4*sizeof(node*));
-               }
+        explicit node(box2d<double> const& ext)
+            : extent_(ext)
+        {
+            std::memset(children_,0,4*sizeof(node*));
+        }
    
-               Envelope<double> const& extent() const
-               {
-                  return extent_;
-               }
-	    
-               iterator begin() 
-               {
-                  return cont_.begin();
-               }
-	    
-               const_iterator begin() const 
-               {
-                  return cont_.begin();
-               }
-	    
-               iterator end() 
-               {
-                  return cont_.end();
-               }
-	    
-               const_iterator end() const 
-               {
-                  return cont_.end();
-               }
-               ~node () {}
-         };
-	
-         typedef boost::ptr_vector<node> nodes_t;	
-         typedef typename node::cont_t cont_t;
-         typedef typename cont_t::iterator node_data_iterator;
-	
-         nodes_t nodes_;
-         node * root_;	
-         const unsigned int max_depth_;
-         const double ratio_; 
-      public:
-         typedef typename nodes_t::iterator iterator;
-         typedef typename nodes_t::const_iterator const_iterator;
-         typedef typename boost::ptr_vector<T,boost::view_clone_allocator> result_t;	
-         typedef typename result_t::iterator query_iterator;
+        box2d<double> const& extent() const
+        {
+            return extent_;
+        }
+            
+        iterator begin() 
+        {
+            return cont_.begin();
+        }
+            
+        const_iterator begin() const 
+        {
+            return cont_.begin();
+        }
+            
+        iterator end() 
+        {
+            return cont_.end();
+        }
+            
+        const_iterator end() const 
+        {
+            return cont_.end();
+        }
+        ~node () {}
+    };
+        
+    typedef boost::ptr_vector<node> nodes_t;    
+    typedef typename node::cont_t cont_t;
+    typedef typename cont_t::iterator node_data_iterator;
+        
+    nodes_t nodes_;
+    node * root_;       
+    const unsigned int max_depth_;
+    const double ratio_; 
+public:
+    typedef typename nodes_t::iterator iterator;
+    typedef typename nodes_t::const_iterator const_iterator;
+    typedef typename boost::ptr_vector<T,boost::view_clone_allocator> result_t; 
+    typedef typename result_t::iterator query_iterator;
    
-         result_t query_result_;
-	
-         explicit quad_tree(Envelope<double> const& ext, 
-                            unsigned int max_depth = 8, 
-                            double ratio = 0.55) 
-            : max_depth_(max_depth),
-              ratio_(ratio)
-         {
-            nodes_.push_back(new node(ext));
-            root_ = &nodes_[0];
-         }
-		
-         void insert(T data, Envelope<double> const& box)
-         {
-            unsigned int depth=0;
-            do_insert_data(data,box,root_,depth);
-         }
+    result_t query_result_;
+        
+    explicit quad_tree(box2d<double> const& ext, 
+                       unsigned int max_depth = 8, 
+                       double ratio = 0.55) 
+        : max_depth_(max_depth),
+          ratio_(ratio)
+    {
+        nodes_.push_back(new node(ext));
+        root_ = &nodes_[0];
+    }
+                
+    void insert(T data, box2d<double> const& box)
+    {
+        unsigned int depth=0;
+        do_insert_data(data,box,root_,depth);
+    }
          
-         query_iterator query_in_box(Envelope<double> const& box)
-         {
-            query_result_.clear();
-            query_node(box,query_result_,root_);
-            return query_result_.begin();
-         }
-	
-         query_iterator query_end()
-         {
-            return query_result_.end();
-         }
-
-         iterator begin()
-         {
-            return nodes_.begin();
-         }
-	
-         const_iterator begin() const
-         {
-            return nodes_.begin();
-         }
+    query_iterator query_in_box(box2d<double> const& box)
+    {
+        query_result_.clear();
+        query_node(box,query_result_,root_);
+        return query_result_.begin();
+    }
+        
+    query_iterator query_end()
+    {
+        return query_result_.end();
+    }
+        
+    const_iterator begin() const
+    {
+        return nodes_.begin();
+    }
 
-         iterator end()
-         {
-            return  nodes_.end();
-         }
-	
-         const_iterator end() const
-         {
-            return  nodes_.end();
-         }
+    
+    const_iterator end() const
+    {
+        return  nodes_.end();
+    }
           
-         void clear () 
-         {
-            Envelope<double> ext = root_->extent_;
-            nodes_.clear();
-            nodes_.push_back(new node(ext));
-            root_ = &nodes_[0];
-         }
-
-      private:
-         void query_node(Envelope<double> const& box, result_t & result, node * node_) const
-         {
-            if (node_)
-            {
-               Envelope<double> const& node_extent = node_->extent();
-               if (box.intersects(node_extent))
-               {
-                  node_data_iterator i=node_->begin();
-                  node_data_iterator end=node_->end();
-                  while ( i!=end)
-                  {
-                     result.push_back(&(*i));
-                     ++i;
-                  }
-                  for (int k = 0; k < 4; ++k)
-                  {
-                     query_node(box,result,node_->children_[k]);
-                  }
-               }
-            }
-         }
-	
-         void do_insert_data(T data, Envelope<double> const& box, node * n, unsigned int& depth)
-         {
-            if (++depth >= max_depth_)
+    void clear () 
+    {
+        box2d<double> ext = root_->extent_;
+        nodes_.clear();
+        nodes_.push_back(new node(ext));
+        root_ = &nodes_[0];
+    }
+    
+    box2d<double> const& extent() const
+    {
+        return root_->extent_;
+    }
+    
+private:
+    
+    void query_node(box2d<double> const& box, result_t & result, node * node_) const
+    {
+        if (node_)
+        {
+            box2d<double> const& node_extent = node_->extent();
+            if (box.intersects(node_extent))
             {
-               n->cont_.push_back(data);
+                node_data_iterator i=node_->begin();
+                node_data_iterator end=node_->end();
+                while ( i!=end)
+                {
+                    result.push_back(&(*i));
+                    ++i;
+                }
+                for (int k = 0; k < 4; ++k)
+                {
+                    query_node(box,result,node_->children_[k]);
+                }
             }
-            else 
+        }
+    }
+        
+    void do_insert_data(T data, box2d<double> const& box, node * n, unsigned int& depth)
+    {
+        if (++depth >= max_depth_)
+        {
+            n->cont_.push_back(data);
+        }
+        else 
+        {
+            box2d<double> const& node_extent = n->extent();
+            box2d<double> ext[4];
+            split_box(node_extent,ext);         
+            for (int i=0;i<4;++i)
             {
-               Envelope<double> const& node_extent = n->extent();
-               Envelope<double> ext[4];
-               split_box(node_extent,ext);		
-               for (int i=0;i<4;++i)
-               {
-                  if (ext[i].contains(box))
-                  {
-                     if (!n->children_[i])
-                     {
+                if (ext[i].contains(box))
+                {
+                    if (!n->children_[i])
+                    {
                         nodes_.push_back(new node(ext[i]));
                         n->children_[i]=&nodes_.back();
-                     }
-                     do_insert_data(data,box,n->children_[i],depth);
-                     return;
-                  }
-               }
-               n->cont_.push_back(data);
+                    }
+                    do_insert_data(data,box,n->children_[i],depth);
+                    return;
+                }
             }
-         }
-	
-         void split_box(Envelope<double> const& node_extent,Envelope<double> * ext)
-         {
-            coord2d c=node_extent.center();
+            n->cont_.push_back(data);
+        }
+    }
+        
+    void split_box(box2d<double> const& node_extent,box2d<double> * ext)
+    {
+        //coord2d c=node_extent.center();
 
-            double width=node_extent.width();
-            double height=node_extent.height();
-	    
-            double lox=node_extent.minx();
-            double loy=node_extent.miny();
-            double hix=node_extent.maxx();
-            double hiy=node_extent.maxy();
-	    
-            ext[0]=Envelope<double>(lox,loy,lox + width * ratio_,loy + height * ratio_);
-            ext[1]=Envelope<double>(hix - width * ratio_,loy,hix,loy + height * ratio_);
-            ext[2]=Envelope<double>(lox,hiy - height*ratio_,lox + width * ratio_,hiy);
-            ext[3]=Envelope<double>(hix - width * ratio_,hiy - height*ratio_,hix,hiy);
-         }
-   };    
+        double width=node_extent.width();
+        double height=node_extent.height();
+            
+        double lox=node_extent.minx();
+        double loy=node_extent.miny();
+        double hix=node_extent.maxx();
+        double hiy=node_extent.maxy();
+            
+        ext[0]=box2d<double>(lox,loy,lox + width * ratio_,loy + height * ratio_);
+        ext[1]=box2d<double>(hix - width * ratio_,loy,hix,loy + height * ratio_);
+        ext[2]=box2d<double>(lox,hiy - height*ratio_,lox + width * ratio_,hiy);
+        ext[3]=box2d<double>(hix - width * ratio_,hiy - height*ratio_,hix,hiy);
+    }
+};    
 } 
 
 #endif
diff --git a/include/mapnik/query.hpp b/include/mapnik/query.hpp
index bc72f77..d43c8b7 100644
--- a/include/mapnik/query.hpp
+++ b/include/mapnik/query.hpp
@@ -24,78 +24,105 @@
 
 #ifndef QUERY_HPP
 #define QUERY_HPP
+
 //mapnik
-#include <mapnik/filter.hpp>
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 #include <mapnik/feature.hpp>
+
+// boost
+#include <boost/tuple/tuple.hpp>
+
 // stl
 #include <set>
 #include <limits>
 
 namespace mapnik {
-   class query 
-   {
-      private:
-         Envelope<double> bbox_;
-         double resolution_;
-         double scale_denominator_;
-         std::set<std::string> names_;
-      public:
-         
-         explicit query(const Envelope<double>& bbox, double resolution, double scale_denominator)
-            : bbox_(bbox),
-              resolution_(resolution),
-              scale_denominator_(scale_denominator)
-         {}
 
-         explicit query(const Envelope<double>& bbox, double resolution)
-            : bbox_(bbox),
-              resolution_(resolution),
-              scale_denominator_(0.0)
-         {}         
-        
-         query(const query& other)
-            : bbox_(other.bbox_),
-              resolution_(other.resolution_),
-              scale_denominator_(other.scale_denominator_),
-              names_(other.names_)
-         {}
+class query 
+{
+public:
+    typedef boost::tuple<double,double> resolution_type;
+private:
+    box2d<double> bbox_;
+    resolution_type resolution_;
+    double scale_denominator_;
+    double filter_factor_;
+    std::set<std::string> names_;
+public:
          
-         query& operator=(const query& other)
-         {
-            if (this == &other) return *this;
-            bbox_=other.bbox_;
-            resolution_=other.resolution_;
-            scale_denominator_=other.scale_denominator_;
-            names_=other.names_;
-            return *this;
-         }
-         
-         double resolution() const
-         {
-            return resolution_;
-         }
+    query(box2d<double> const& bbox, resolution_type const& resolution, double scale_denominator = 1.0)
+        : bbox_(bbox),
+          resolution_(resolution),
+          scale_denominator_(scale_denominator),
+          filter_factor_(1.0)
+    {}
 
-         double scale_denominator() const
-         {
-            return scale_denominator_;
-         }
+    query(box2d<double> const& bbox)
+        : bbox_(bbox),
+          resolution_(resolution_type(1.0,1.0)),
+          scale_denominator_(1.0),
+          filter_factor_(1.0)
+    {}
+    
+    query(query const& other)
+        : bbox_(other.bbox_),
+          resolution_(other.resolution_),
+          scale_denominator_(other.scale_denominator_),
+          filter_factor_(other.filter_factor_),
+          names_(other.names_)
+    {}
          
-         const Envelope<double>& get_bbox() const
-         {
-            return bbox_;
-         }
+    query& operator=(query const& other)
+    {
+        if (this == &other) return *this;
+        bbox_=other.bbox_;
+        resolution_=other.resolution_;
+        scale_denominator_=other.scale_denominator_;
+        filter_factor_=other.filter_factor_;
+        names_=other.names_;
+        return *this;
+    }
          
-         void add_property_name(const std::string& name)
-         {
-            names_.insert(name);
-         } 
+    query::resolution_type const& resolution() const
+    {
+        return resolution_;
+    }
+    
+    double scale_denominator() const
+    {
+        return scale_denominator_;
+    }
+
+    box2d<double> const& get_bbox() const
+    {
+        return bbox_;
+    }
+
+    void set_bbox(const box2d<double>& bbox)
+    {
+        bbox_ = bbox;
+    }
+
+    double get_filter_factor() const
+    {
+        return filter_factor_;
+    }
+    
+    void set_filter_factor(double factor)
+    {
+        filter_factor_ = factor;
+    }
+             
+    void add_property_name(std::string const& name)
+    {
+        names_.insert(name);
+    } 
          
-         const std::set<std::string>& property_names() const
-         {
-            return names_;
-         }
-   };
+    std::set<std::string> const& property_names() const
+    {
+        return names_;
+    }
+};
 }
 
 
diff --git a/include/mapnik/raster.hpp b/include/mapnik/raster.hpp
index b4a7c7f..5449294 100644
--- a/include/mapnik/raster.hpp
+++ b/include/mapnik/raster.hpp
@@ -27,14 +27,14 @@
 #include <mapnik/graphics.hpp>
 
 namespace mapnik {
-    struct raster
-    {
-        Envelope<double> ext_;
-        ImageData32 data_;
-        raster(Envelope<double> const& ext,ImageData32& data)
-            : ext_(ext),
-              data_(data) {}
-    };
+struct raster
+{
+    box2d<double> ext_;
+    image_data_32 data_;
+    raster(box2d<double> const& ext,image_data_32 const& data)
+        : ext_(ext),
+          data_(data) {}
+};
 }
 
 #endif //RASTER_HPP
diff --git a/include/mapnik/raster_colorizer.hpp b/include/mapnik/raster_colorizer.hpp
new file mode 100644
index 0000000..8aeb351
--- /dev/null
+++ b/include/mapnik/raster_colorizer.hpp
@@ -0,0 +1,227 @@
+
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+/** \brief Raster Colouriser
+ * 
+ * This class allows GDAL raster bands to be colourised. It only works with single
+ * band GDAL rasters, not greyscale, alpha, or rgb  (due to the GDAL featureset loading
+ * single channel GDAL rasters as FLOAT32, and the others as BYTE, and not having a method
+ * of figuring out which).
+ * 
+ * Every input value is translated to an output value. The output value is determined by
+ * what 'stop' the input value is in. Each stop covers the range of input values from its
+ * 'value' parameter, up to the 'value' parameter of the next stop.  
+ * 
+ */
+
+
+#ifndef RASTER_COLORIZER_HPP
+#define RASTER_COLORIZER_HPP
+
+// mapnik
+#include <mapnik/config.hpp>
+#include <mapnik/config_error.hpp>
+#include <mapnik/color.hpp>
+#include <mapnik/feature.hpp>
+#include <mapnik/enumeration.hpp>
+
+// boost
+#include <boost/shared_ptr.hpp>
+
+// stl
+#include <vector>
+
+namespace mapnik
+{
+
+//! \brief Enumerates the modes of interpolation
+enum colorizer_mode_enum
+{
+    COLORIZER_INHERIT = 0,    //!< The stop inherits the mode from the colorizer
+    COLORIZER_LINEAR = 1,     //!< Linear interpolation between colors
+    COLORIZER_DISCRETE = 2,   //!< Single color for stop
+    COLORIZER_EXACT = 3,      //!< Only the exact value specified for the stop gets translated, others use the default
+    colorizer_mode_enum_MAX
+}; 
+
+DEFINE_ENUM( colorizer_mode, colorizer_mode_enum );
+    
+//! \brief Structure to represent a stop position.    
+class colorizer_stop {
+public:
+    
+    //! \brief Constructor
+    //!
+    //! \param[in] value The stop value
+    //! \param[in] mode The stop mode
+    //! \param[in] color The stop color
+    colorizer_stop(const float value = 0, const colorizer_mode mode = COLORIZER_INHERIT, const color& _color = color(0,0,0,0), const std::string& label="");
+    
+    //! \brief Copy constructor
+    colorizer_stop(const colorizer_stop& stop);
+    
+    //! \brief Destructor
+    ~colorizer_stop();
+
+
+    //! \brief Set the stop value
+    //! \param[in] value The stop value
+    inline void set_value(const float value) { value_ = value; }; 
+    
+    //! \brief Get the stop value
+    //! \return The stop value
+    inline float get_value(void) const {return value_; };
+    
+    
+    //! \brief Set the stop mode
+    //! \param[in] mode The stop mode
+    inline void set_mode(const colorizer_mode mode) { mode_ = mode; };
+    inline void set_mode_enum(const colorizer_mode_enum mode) { set_mode(mode); };
+    
+    //! \brief Get the stop mode
+    //! \return The stop mode
+    inline colorizer_mode get_mode(void) const { return mode_; };
+    inline colorizer_mode_enum get_mode_enum(void) const { return get_mode(); };
+    
+    
+    //! \brief set the stop color
+    //! \param[in] the stop color
+    inline void set_color(const color& _color) { color_ = _color; };
+    
+    //! \brief get the stop color
+    //! \return The stop color
+    inline const color& get_color(void) const {return color_; };
+
+    //! \brief set the stop label
+    //! \param[in] the stop label
+    inline void set_label(const std::string& label) { label_ = label; };
+    
+    //! \brief get the stop label
+    //! \return The stop label
+    inline const std::string& get_label(void) const {return label_; };
+    
+
+    //! \brief Equality operator
+    //! \return True if equal, false otherwise
+    bool operator==(colorizer_stop const& other) const;
+
+    //! \brief Print the stop to a string
+    //! \return A string representing this stop.
+    std::string to_string() const;
+    
+private:
+    float value_;   //!< The stop value
+    colorizer_mode mode_; //!< The stop mode
+    color color_;   //!< The stop color
+    std::string label_; //!< The stop label for use in legends
+};
+
+
+typedef std::vector<colorizer_stop> colorizer_stops;
+
+
+//! \brief Class representing the raster colorizer
+class raster_colorizer {
+public:
+    //! \brief Constructor
+    raster_colorizer(colorizer_mode mode = COLORIZER_LINEAR, const color& _color = color(0,0,0,0));
+    
+    //! \brief Destructor
+    ~raster_colorizer();
+
+
+    //! \brief Set the default mode
+    //!
+    //! This can not be set as INHERIT, if you do, LINEAR will be used instead.
+    //! \param[in] mode The default mode
+    void set_default_mode(const colorizer_mode mode) { default_mode_ = (mode == COLORIZER_INHERIT) ? COLORIZER_LINEAR:(colorizer_mode_enum)mode; };
+    void set_default_mode_enum(const colorizer_mode_enum mode) { set_default_mode(mode); };
+    
+    //! \brief Get the default mode
+    //! \return The default mode
+    colorizer_mode get_default_mode(void) const {return default_mode_; };
+    colorizer_mode_enum get_default_mode_enum(void) const {return get_default_mode(); };
+    
+    //! \brief Set the default color
+    //! \param[in] color The default color
+    void set_default_color(const color& color) { default_color_ = color; };
+    
+    //! \brief Get the default color
+    //! \return The default color
+    const color& get_default_color(void) const {return default_color_; };
+
+
+    //! \brief Add a stop
+    //!
+    //! \param[in] stop The stop to add
+    //! \return True if added, false if error
+    bool add_stop(const colorizer_stop & stop);
+
+    //! \brief Get the list of stops
+    //! \return The list of stops
+    const colorizer_stops& get_stops(void) const {return stops_; };
+
+
+    //! \brief Colorize a raster
+    //!
+    //! \param[in, out] raster A raster stored in float32 single channel format, which gets colorized in place.
+    //! \param[in] properties belonging to the feature, used to find 'NODATA' information if available
+    void colorize(raster_ptr const& raster,const std::map<std::string,value> &Props) const;
+
+
+    //! \brief Perform the translation of input to output
+    //!
+    //! \param[in] value Input value
+    //! \return color associated with the value
+    color get_color(float value) const;
+
+
+    //! \brief Set the epsilon value for exact mode
+    //! \param[in] e The epsilon value
+    inline void set_epsilon(const float e) { if(e > 0) epsilon_ = e; };
+    
+    //! \brief Get the epsilon value for exact mode
+    //! \return The epsilon value
+    inline float get_epsilon(void) const { return epsilon_; };
+
+private:
+    colorizer_stops stops_;         //!< The vector of stops
+    
+    colorizer_mode default_mode_;   //!< The default mode inherited by stops
+    color default_color_;           //!< The default color
+    float epsilon_;                 //!< The epsilon value for exact mode
+};
+
+
+
+
+
+
+
+typedef boost::shared_ptr<raster_colorizer> raster_colorizer_ptr;
+
+
+} // mapnik namespace
+
+#endif //RASTER_COLORIZER_HPP
diff --git a/include/mapnik/raster_symbolizer.hpp b/include/mapnik/raster_symbolizer.hpp
index 560450d..2bc4cad 100644
--- a/include/mapnik/raster_symbolizer.hpp
+++ b/include/mapnik/raster_symbolizer.hpp
@@ -24,45 +24,139 @@
 #ifndef RASTER_SYMBOLIZER_HPP
 #define RASTER_SYMBOLIZER_HPP
 
+// mapnik
 #include <mapnik/config.hpp>
+#include <mapnik/raster_colorizer.hpp>
+#include <mapnik/symbolizer.hpp>
+#include <mapnik/image_util.hpp>
 
 namespace mapnik
 {
-    struct MAPNIK_DECL raster_symbolizer {
-        explicit raster_symbolizer()
-            : mode_("normal"),
-              scaling_("fast"),
-              opacity_(1.0) {}
+struct MAPNIK_DECL raster_symbolizer : public symbolizer_base 
+{
+    
+    raster_symbolizer()
+        : symbolizer_base(),
+        mode_("normal"),
+        scaling_("fast"),
+        opacity_(1.0),
+        colorizer_(),
+        filter_factor_(-1),
+        mesh_size_(16) {}
 
-        std::string const& get_mode() const
-        {
-            return mode_;
-        }
-        void set_mode(std::string const& mode)
-        {
-            mode_ = mode;
-        }
-        std::string const& get_scaling() const
-        {
-            return scaling_;
-        }
-        void set_scaling(std::string const& scaling)
-        {
-            scaling_ = scaling;
-        }
-        void set_opacity(float opacity)
-        {
-            opacity_ = opacity;
-        }
-        float get_opacity() const
+    raster_symbolizer(const raster_symbolizer &rhs)
+        : symbolizer_base(rhs),
+        mode_(rhs.get_mode()),
+        scaling_(rhs.get_scaling()),
+        opacity_(rhs.get_opacity()),
+        colorizer_(rhs.colorizer_),
+        filter_factor_(rhs.filter_factor_),
+        mesh_size_(rhs.mesh_size_) {}
+    
+    std::string const& get_mode() const
+    {
+        return mode_;
+    }
+    void set_mode(std::string const& mode)
+    {
+        mode_ = mode;
+    }
+    std::string const& get_scaling() const
+    {
+        return scaling_;
+    }
+    void set_scaling(std::string const& scaling)
+    {
+        scaling_ = scaling;
+    }
+    void set_opacity(float opacity)
+    {
+        opacity_ = opacity;
+    }
+    float get_opacity() const
+    {
+        return opacity_;
+    }
+    raster_colorizer_ptr get_colorizer() const
+    {
+        return colorizer_;
+    }
+    void set_colorizer(raster_colorizer_ptr const& colorizer)
+    {
+        colorizer_ = colorizer;
+    }
+    double get_filter_factor() const
+    {
+        return filter_factor_;
+    }
+    void set_filter_factor(double filter_factor)
+    {
+        filter_factor_=filter_factor;
+    }
+    double calculate_filter_factor() const
+    {
+        if (filter_factor_ > 0)
         {
-            return opacity_;
+            // respect explicitly specified values
+            return filter_factor_;
+        } else {
+            // No filter factor specified, calculate a sensible default value
+            // based on the scaling algorithm being employed.
+            scaling_method_e scaling = get_scaling_method_by_name (scaling_);
+            
+            double ff = 1.0;
+            
+            switch(scaling)
+            {
+                case SCALING_NEAR:
+                    ff = 1.0;
+                    break;
+                
+                // TODO potentially some of these algorithms would use filter_factor >2.0.
+                // Contributions welcome from someone who knows more about them.
+                case SCALING_BILINEAR:
+                case SCALING_BICUBIC:
+                case SCALING_SPLINE16:
+                case SCALING_SPLINE36:
+                case SCALING_HANNING:
+                case SCALING_HAMMING:
+                case SCALING_HERMITE:
+                case SCALING_KAISER:
+                case SCALING_QUADRIC:
+                case SCALING_CATROM:
+                case SCALING_GAUSSIAN:
+                case SCALING_BESSEL:
+                case SCALING_MITCHELL:
+                case SCALING_SINC:
+                case SCALING_LANCZOS:
+                case SCALING_BLACKMAN:
+                    ff = 2.0;
+                    break;
+                default:
+                    ff = 1.0;
+                    break;
+            }
+            return ff;
         }
-    private:
-        std::string mode_;
-        std::string scaling_;
-        float opacity_;
-    };
+    }
+    unsigned get_mesh_size() const
+    {
+        return mesh_size_;
+    }
+    void set_mesh_size(unsigned mesh_size)
+    {
+        mesh_size_=mesh_size;
+    }
+    
+    
+private:
+    std::string mode_;
+    std::string scaling_;
+    float opacity_;
+    raster_colorizer_ptr colorizer_;
+    double filter_factor_;
+    unsigned mesh_size_;
+};
 }
 
 #endif //RASTER_SYMBOLIZER_HPP
diff --git a/include/mapnik/regex_filter.hpp b/include/mapnik/regex_filter.hpp
deleted file mode 100644
index 4cb3795..0000000
--- a/include/mapnik/regex_filter.hpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-
-
-//$Id$
-
-#ifndef REGEX_FILTER_HPP
-#define REGEX_FILTER_HPP
-// mapnik
-#include <mapnik/filter.hpp>
-#include <mapnik/expression.hpp>
-// boost
-#include <boost/regex.hpp>
-#include <boost/algorithm/string.hpp>
-
-namespace mapnik
-{ 
-    template <typename FeatureT>
-    struct regex_filter : public filter<FeatureT>
-    {
-
-        regex_filter(expression<FeatureT> const& exp,
-                     std::string const& pattern)
-            : filter<FeatureT>(),
-              exp_(exp.clone()),
-              pattern_(pattern) {}
-	
-        regex_filter(regex_filter const& other)
-            :  filter<FeatureT>(),
-               exp_(other.exp_->clone()),
-               pattern_(other.pattern_) {}
-	
-        bool pass(FeatureT const& feature) const
-        {
-            std::string text=exp_->get_value(feature).to_string();
-            boost::trim_if(text, boost::is_any_of("'"));
-            return boost::regex_match(text,pattern_);
-        } 
-	
-        void accept(filter_visitor<FeatureT>& v)
-        {
-            exp_->accept(v);
-            v.visit(*this);
-        }
-	
-        filter<FeatureT>* clone() const
-        {
-            return new regex_filter(*this);
-        }
-        std::string to_string() const
-        {
-            return exp_->to_string()+".match("+pattern_.str()+")";
-        }
-        ~regex_filter()
-        {
-            delete exp_;
-        }
-	
-    private:
-        expression<FeatureT>* exp_;
-        boost::regex pattern_;
-	
-    };   
-}
-
-
-#endif //REGEX_FILTER_HPP
diff --git a/include/mapnik/rule.hpp b/include/mapnik/rule.hpp
index 181475b..a5f111a 100644
--- a/include/mapnik/rule.hpp
+++ b/include/mapnik/rule.hpp
@@ -22,6 +22,7 @@
 
 #ifndef RULE_HPP
 #define RULE_HPP
+
 // mapnik
 #include <mapnik/line_symbolizer.hpp>
 #include <mapnik/line_pattern_symbolizer.hpp>
@@ -32,284 +33,298 @@
 #include <mapnik/shield_symbolizer.hpp>
 #include <mapnik/text_symbolizer.hpp>
 #include <mapnik/markers_symbolizer.hpp>
-#include <mapnik/filter.hpp>
-#include <mapnik/filter_visitor.hpp>
+#include <mapnik/glyph_symbolizer.hpp>
+#include <mapnik/feature.hpp>
+#include <mapnik/filter_factory.hpp>
 
 // boost
 #include <boost/shared_ptr.hpp>
+#include <boost/make_shared.hpp>
 #include <boost/variant.hpp>
+
 // stl
 #include <string>
 #include <vector>
 
 namespace mapnik
 {
-   inline bool operator==(point_symbolizer const& lhs,
-                          point_symbolizer const& rhs)
-   {
-      return (&lhs == &rhs); 
-   }
-   inline bool operator==(line_symbolizer const& lhs,
-                          line_symbolizer const& rhs)
-   {
-      return (&lhs == &rhs); 
-   }
-   inline bool operator==(line_pattern_symbolizer const& lhs,
-                          line_pattern_symbolizer const& rhs)
-   {
-      return (&lhs == &rhs); 
-   }
+inline bool operator==(point_symbolizer const& lhs,
+                       point_symbolizer const& rhs)
+{
+    return (&lhs == &rhs); 
+}
+inline bool operator==(line_symbolizer const& lhs,
+                       line_symbolizer const& rhs)
+{
+    return (&lhs == &rhs); 
+}
+inline bool operator==(line_pattern_symbolizer const& lhs,
+                       line_pattern_symbolizer const& rhs)
+{
+    return (&lhs == &rhs); 
+}
 
-   inline bool operator==(polygon_symbolizer const& lhs,
-                          polygon_symbolizer const& rhs)
-   {
-      return (&lhs == &rhs); 
-   }
-    
-   inline bool operator==(polygon_pattern_symbolizer const& lhs,
-                          polygon_pattern_symbolizer const& rhs)
-   {
-      return (&lhs == &rhs); 
-   }
-    
-   inline bool operator==(raster_symbolizer const& lhs,
-                          raster_symbolizer const& rhs)
-   {
-      return (&lhs == &rhs); 
-   }
-    
-   inline bool operator==(text_symbolizer const& lhs,
-                          text_symbolizer const& rhs)
-   {
-      return (&lhs == &rhs); 
-   }
-    
-   inline bool operator==(shield_symbolizer const& lhs,
-                          shield_symbolizer const& rhs)
-   {
-      return (&lhs == &rhs); 
-   }
-    
-   inline bool operator==(building_symbolizer const& lhs,
-                          building_symbolizer const& rhs)
-   {
-      return (&lhs == &rhs); 
-   }
-   
-   inline bool operator==(markers_symbolizer const& lhs,
-                          markers_symbolizer const& rhs)
-   {
-      return (&lhs == &rhs); 
-   }
-   typedef boost::variant<point_symbolizer,
-                          line_symbolizer,
-                          line_pattern_symbolizer,
-                          polygon_symbolizer,
-                          polygon_pattern_symbolizer,
-                          raster_symbolizer,
-                          shield_symbolizer,
-                          text_symbolizer,
-                          building_symbolizer,
-                          markers_symbolizer> symbolizer;
+inline bool operator==(polygon_symbolizer const& lhs,
+                       polygon_symbolizer const& rhs)
+{
+    return (&lhs == &rhs); 
+}
     
-        
-   typedef std::vector<symbolizer> symbolizers;
+inline bool operator==(polygon_pattern_symbolizer const& lhs,
+                       polygon_pattern_symbolizer const& rhs)
+{
+    return (&lhs == &rhs); 
+}
     
-   template <typename FeatureT> class all_filter;
-
-   template <typename FeatureT,template <typename> class Filter>
-   class rule
-   {
-         typedef Filter<FeatureT> filter_type;
-         typedef boost::shared_ptr<filter_type> filter_ptr;
-      private:
-
-         std::string name_;
-         std::string title_;
-         std::string abstract_;
-         double min_scale_;
-         double max_scale_;
-         symbolizers syms_;
-         filter_ptr filter_;
-         bool else_filter_;
-      public:
-         rule()
-            : name_(),
-              title_(),
-              abstract_(),
-              min_scale_(0),
-              max_scale_(std::numeric_limits<double>::infinity()),
-              syms_(),
-              filter_(new all_filter<FeatureT>),
-              else_filter_(false) {}
-                
-         rule(const std::string& name,
-              const std::string& title="",
-              double min_scale_denominator=0,
-              double max_scale_denominator=std::numeric_limits<double>::infinity())
-            : name_(name),
-              title_(title),
-              min_scale_(min_scale_denominator),
-              max_scale_(max_scale_denominator),
-              syms_(),
-              filter_(new all_filter<FeatureT>),
-              else_filter_(false) {}
-	    
-         rule(const rule& rhs)    
-            : name_(rhs.name_),
-              title_(rhs.title_),
-              abstract_(rhs.abstract_),
-              min_scale_(rhs.min_scale_),
-              max_scale_(rhs.max_scale_),
-              syms_(rhs.syms_),
-              filter_(rhs.filter_),
-              else_filter_(rhs.else_filter_) {}
-	
-         rule& operator=(rule const& rhs) 
-         {
-            rule tmp(rhs);
-            swap(tmp);
-            return *this;
-         }
-         bool operator==(rule const& other)
-         {
-            return  (this == &other); 
-         }
-	
-         void set_max_scale(double scale)
-         {
-            max_scale_=scale;
-         }
-        
-         double get_max_scale() const
-         {
-            return max_scale_;
-         }
-        
-         void set_min_scale(double scale)
-         {
-            min_scale_=scale;
-         }
-
-         double get_min_scale() const
-         {
-            return min_scale_;
-         }
-
-         void set_name(std::string const& name)
-         {
-            name_=name;
-         }
-	
-         std::string const& get_name() const
-         {
-            return name_;
-         }
-	
-         std::string const& get_title() const
-         {
-            return  title_;
-         }
-
-         void set_title(std::string const& title)
-         {
-            title_=title;
-         }
-  
-         void set_abstract(std::string const& abstract)
-         {
-            abstract_=abstract;
-         }
-	
-         std::string const& get_abstract() const
-         {
-            return abstract_;
-         }
-		
-         void append(const symbolizer& sym)
-         {
-            syms_.push_back(sym);
-         }
-	
-         void remove_at(size_t index)
-         {
-            if (index < syms_.size())
-            {
-               syms_.erase(syms_.begin()+index);
-            }
-         }
-	
-         const symbolizers& get_symbolizers() const
-         {
-            return syms_;
-         }
-	
-         symbolizers::const_iterator begin() const
-         {
-            return syms_.begin();
-         }
-	
-         symbolizers::const_iterator end() const
-         {
-            return syms_.end();
-         }
-	
-         symbolizers::iterator begin()
-         {
-            return syms_.begin();
-         }
-          
-         symbolizers::iterator end()
-         {
-            return syms_.end();
-         }
-          
-         void set_filter(const filter_ptr& filter)
-         {
-            filter_=filter;
-         }
+inline bool operator==(raster_symbolizer const& lhs,
+                       raster_symbolizer const& rhs)
+{
+    return (&lhs == &rhs); 
+}
+    
+inline bool operator==(text_symbolizer const& lhs,
+                       text_symbolizer const& rhs)
+{
+    return (&lhs == &rhs); 
+}
+    
+inline bool operator==(shield_symbolizer const& lhs,
+                       shield_symbolizer const& rhs)
+{
+    return (&lhs == &rhs); 
+}
+    
+inline bool operator==(building_symbolizer const& lhs,
+                       building_symbolizer const& rhs)
+{
+    return (&lhs == &rhs); 
+}
+   
+inline bool operator==(markers_symbolizer const& lhs,
+                       markers_symbolizer const& rhs)
+{
+    return (&lhs == &rhs); 
+}
 
-         filter_ptr const& get_filter() const
-         {
-            return filter_;
-         }
-	
-         void set_else(bool else_filter)
-         {
-            else_filter_=else_filter;
-         }
-     
-         bool has_else_filter() const
-         {
-            return else_filter_;
-         }
+inline bool operator==(glyph_symbolizer const& lhs,
+                       glyph_symbolizer const& rhs)
+{
+    return (&lhs == &rhs); 
+}
+typedef boost::variant<point_symbolizer,
+                       line_symbolizer,
+                       line_pattern_symbolizer,
+                       polygon_symbolizer,
+                       polygon_pattern_symbolizer,
+                       raster_symbolizer,
+                       shield_symbolizer,
+                       text_symbolizer,
+                       building_symbolizer,
+                       markers_symbolizer,
+                       glyph_symbolizer> symbolizer;
+    
         
-         bool active(double scale) const
-         {
-            return ( scale >= min_scale_ - 1e-6 && scale < max_scale_ + 1e-6);
-         }
-
-         void accept(filter_visitor<FeatureT>& v) const
-         {
-            v.visit(*this);
-         }
-	
-      private:
-	
-         void swap(rule& rhs) throw()
-         {
-            name_=rhs.name_;
-            title_=rhs.title_;
-            abstract_=rhs.abstract_;
-            min_scale_=rhs.min_scale_;
-            max_scale_=rhs.max_scale_;
-            syms_=rhs.syms_;
-            filter_=rhs.filter_;
-            else_filter_=rhs.else_filter_;
-         }
-   };
+class rule
+{    
+public:
+    typedef std::vector<symbolizer> symbolizers;
+private:
+    
+    std::string name_;
+    std::string title_;
+    std::string abstract_;
+    double min_scale_;
+    double max_scale_;
+    symbolizers syms_;
+    expression_ptr filter_;
+    bool else_filter_;
+    bool also_filter_;
+public:
+    rule()
+        : name_(),
+          title_(),
+          abstract_(),
+          min_scale_(0),
+          max_scale_(std::numeric_limits<double>::infinity()),
+          syms_(),
+          filter_(boost::make_shared<mapnik::expr_node>(true)),
+          else_filter_(false), 
+          also_filter_(false) {}
+    
+    rule(const std::string& name,
+         const std::string& title="",
+         double min_scale_denominator=0,
+         double max_scale_denominator=std::numeric_limits<double>::infinity())
+        : name_(name),
+          title_(title),
+          min_scale_(min_scale_denominator),
+          max_scale_(max_scale_denominator),
+          syms_(),
+          filter_(boost::make_shared<mapnik::expr_node>(true)),
+          else_filter_(false), 
+          also_filter_(false)  {}
+    
+    rule(const rule& rhs)    
+        : name_(rhs.name_),
+          title_(rhs.title_),
+          abstract_(rhs.abstract_),
+          min_scale_(rhs.min_scale_),
+          max_scale_(rhs.max_scale_),
+          syms_(rhs.syms_),
+          filter_(rhs.filter_),
+          else_filter_(rhs.else_filter_), 
+          also_filter_(rhs.also_filter_) {}
+    
+    rule& operator=(rule const& rhs) 
+    {
+        rule tmp(rhs);
+        swap(tmp);
+        return *this;
+    }
+    bool operator==(rule const& other)
+    {
+        return  (this == &other); 
+    }
+    
+    void set_max_scale(double scale)
+    {
+        max_scale_=scale;
+    }
+    
+    double get_max_scale() const
+    {
+        return max_scale_;
+    }
+    
+    void set_min_scale(double scale)
+    {
+        min_scale_=scale;
+    }
+    
+    double get_min_scale() const
+    {
+        return min_scale_;
+    }
+    
+    void set_name(std::string const& name)
+    {
+        name_=name;
+    }
+    
+    std::string const& get_name() const
+    {
+        return name_;
+    }
+    
+    std::string const& get_title() const
+    {
+        return  title_;
+    }
+    
+    void set_title(std::string const& title)
+    {
+        title_=title;
+    }
+    
+    void set_abstract(std::string const& abstract)
+    {
+        abstract_=abstract;
+    }
+    
+    std::string const& get_abstract() const
+    {
+        return abstract_;
+    }
+    
+    void append(const symbolizer& sym)
+    {
+        syms_.push_back(sym);
+    }
+    
+    void remove_at(size_t index)
+    {
+        if (index < syms_.size())
+        {
+            syms_.erase(syms_.begin()+index);
+        }
+    }
+    
+    const symbolizers& get_symbolizers() const
+    {
+        return syms_;
+    }
+    
+    symbolizers::const_iterator begin() const
+    {
+        return syms_.begin();
+    }
+    
+    symbolizers::const_iterator end() const
+    {
+        return syms_.end();
+    }
+    
+    symbolizers::iterator begin()
+    {
+        return syms_.begin();
+    }
+    
+    symbolizers::iterator end()
+    {
+        return syms_.end();
+    }
+    
+    void set_filter(const expression_ptr& filter)
+    {
+        filter_=filter;
+    }
+    
+    expression_ptr const& get_filter() const
+    {
+        return filter_;
+    }
+    
+    void set_else(bool else_filter)
+    {
+        else_filter_=else_filter;
+    }
+    
+    bool has_else_filter() const
+    {
+        return else_filter_;
+    }
+    
+    void set_also(bool also_filter)
+    {
+        also_filter_=also_filter;
+    }
+    
+    bool has_also_filter() const
+    {
+        return also_filter_;
+    }
+    
+    bool active(double scale) const
+    {
+        return ( scale >= min_scale_ - 1e-6 && scale < max_scale_ + 1e-6);
+    }
+    
+private:
+    
+    void swap(rule& rhs) throw()
+    {
+        name_=rhs.name_;
+        title_=rhs.title_;
+        abstract_=rhs.abstract_;
+        min_scale_=rhs.min_scale_;
+        max_scale_=rhs.max_scale_;
+        syms_=rhs.syms_;
+        filter_=rhs.filter_;
+        else_filter_=rhs.else_filter_;
+        also_filter_=rhs.also_filter_;
+    }
+};
 
-   typedef rule<Feature,filter> rule_type;
 }
 
 #endif //RULE_HPP
diff --git a/include/mapnik/save_map.hpp b/include/mapnik/save_map.hpp
index 92fff46..f28746d 100644
--- a/include/mapnik/save_map.hpp
+++ b/include/mapnik/save_map.hpp
@@ -24,15 +24,16 @@
 #ifndef SAVE_MAP_HPP
 #define SAVE_MAP_HPP
 // mapnik
-#include <mapnik/map.hpp>
+#include <mapnik/config.hpp>
 // stl
 #include <string>
 
 namespace mapnik
 {
-    MAPNIK_DECL void save_map(Map const& map, std::string const& filename, bool explicit_defaults = false);
+class Map;
+MAPNIK_DECL void save_map(Map const& map, std::string const& filename, bool explicit_defaults = false);
 
-    MAPNIK_DECL std::string save_map_to_string(Map const& map, bool explicit_defaults = false);
+MAPNIK_DECL std::string save_map_to_string(Map const& map, bool explicit_defaults = false);
 
 }
 
diff --git a/include/mapnik/scale_denominator.hpp b/include/mapnik/scale_denominator.hpp
index 92fd52c..31562bc 100644
--- a/include/mapnik/scale_denominator.hpp
+++ b/include/mapnik/scale_denominator.hpp
@@ -21,10 +21,15 @@
  *****************************************************************************/
 
 //$Id$
+#ifndef MAPNIK_SCALE_DENOMINATOR_HPP
+#define MAPNIK_SCALE_DENOMINATOR_HPP
+
 #include <mapnik/config.hpp>
 
 namespace mapnik {
  
-    class Map;
-    MAPNIK_DECL double scale_denominator(Map const& map, bool geographic);
+class Map;
+MAPNIK_DECL double scale_denominator(Map const& map, bool geographic);
 }
+
+#endif // MAPNIK_SCALE_DENOMINATOR_HPP
diff --git a/include/mapnik/segment.hpp b/include/mapnik/segment.hpp
new file mode 100644
index 0000000..1836eb6
--- /dev/null
+++ b/include/mapnik/segment.hpp
@@ -0,0 +1,44 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+#ifndef MAPNIK_SEGMENT_HPP
+#define MAPNIK_SEGMENT_HPP
+
+#include <boost/tuple/tuple.hpp>
+
+namespace mapnik
+{
+
+typedef boost::tuple<double,double,double,double> segment_t;
+
+static bool y_order(segment_t const& first,segment_t const& second)
+{
+    double miny0 = std::min(first.get<1>(),first.get<3>());
+    double miny1 = std::min(second.get<1>(),second.get<3>());
+    return miny0 > miny1;
+}
+
+}
+
+#endif //MAPNIK_SEGMENT_HPP
diff --git a/include/mapnik/shield_symbolizer.hpp b/include/mapnik/shield_symbolizer.hpp
index 28039e9..b373608 100644
--- a/include/mapnik/shield_symbolizer.hpp
+++ b/include/mapnik/shield_symbolizer.hpp
@@ -22,44 +22,44 @@
  *****************************************************************************/
 //$Id$
 
-#ifndef SHIELD_SYMBOLIZER_HPP
-#define SHIELD_SYMBOLIZER_HPP
+#ifndef MAPNIK_SHIELD_SYMBOLIZER_HPP
+#define MAPNIK_SHIELD_SYMBOLIZER_HPP
 
-#include <mapnik/graphics.hpp>
-#include <mapnik/text_symbolizer.hpp>
+// mapnik
 #include <mapnik/symbolizer.hpp>
+#include <mapnik/text_symbolizer.hpp>
 
+// boost
 #include <boost/shared_ptr.hpp>
+#include <boost/tuple/tuple.hpp>
 
 namespace mapnik
 {
-  struct MAPNIK_DECL shield_symbolizer : public text_symbolizer,
-                                         public symbolizer_with_image
-  {
-    shield_symbolizer(std::string const& name,
+struct MAPNIK_DECL shield_symbolizer : public text_symbolizer,
+                                       public symbolizer_with_image
+{
+    shield_symbolizer(expression_ptr name,
                       std::string const& face_name,
                       unsigned size,
                       color const& fill,
-                      std::string const& file,
-                      std::string const& type,
-                      unsigned width,unsigned height);
-    shield_symbolizer(std::string const& name,
+                      path_expression_ptr file);
+    shield_symbolizer(expression_ptr name,
                       unsigned size,
                       color const& fill,
-                      std::string const& file,
-                      std::string const& type,
-                      unsigned width,unsigned height);
-
-                      bool get_unlock_image() const;              // image is not locked to the text placement
-                      void set_unlock_image(bool unlock_image);
-                      bool get_no_text() const;                   // do no render text
-                      void set_no_text(bool unlock_image);
-
-    private:
-
-        bool unlock_image_;
-        bool no_text_;
-  };
+                      path_expression_ptr file);
+    
+    bool get_unlock_image() const;              // image is not locked to the text placement
+    void set_unlock_image(bool unlock_image);
+    bool get_no_text() const;                   // do no render text
+    void set_no_text(bool unlock_image);
+    void set_shield_displacement(double shield_dx,double shield_dy);
+    boost::tuple<double,double> const& get_shield_displacement() const;
+    
+private:
+    bool unlock_image_;
+    bool no_text_;
+    boost::tuple<double,double> shield_displacement_;
+};
 }
 
 #endif // SHIELD_SYMBOLIZER_HPP
diff --git a/include/mapnik/spatial.hpp b/include/mapnik/spatial.hpp
deleted file mode 100644
index d17a14a..0000000
--- a/include/mapnik/spatial.hpp
+++ /dev/null
@@ -1,153 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-#ifndef SPATIAL_HPP
-#define SPATIAL_HPP
-
-#include <mapnik/filter.hpp>
-#include <mapnik/filter_visitor.hpp>
-
-namespace mapnik
-{    
-
-    template <typename FeatureT>
-    struct equals_ : public filter<FeatureT>
-    {
-
-        bool pass(const FeatureT& feature) const
-        {
-            return false;
-        }
-	
-        void accept(const filter_visitor<FeatureT>& v)
-        {
-            v.visit(*this);
-        }
-    };
-    
-    template <typename FeatureT>
-    struct disjoint : public filter<FeatureT>
-    {
-	  
-	
-        bool pass(const FeatureT& feature) const
-        {
-            return false;
-        }
-	
-        void accept(const filter_visitor<FeatureT>& v)
-        {
-            v.visit(*this);
-        }
-    };
-  
-    template <typename FeatureT>
-    struct touches : public filter<FeatureT>
-    {
-
-	
-        bool pass(const FeatureT& feature) const
-        {
-            return false;
-        }
-	
-        void accept(const filter_visitor<FeatureT>& v)
-        {
-            v.visit(*this);
-        }
-    };
-
-    template <typename FeatureT>
-    struct within : public filter<FeatureT>
-    {
-
-        bool pass(const FeatureT& feature) const
-        {
-            return false;
-        }
-
-        void accept(const filter_visitor<FeatureT>& v)
-        {
-            v.visit(*this);
-        }
-    };
-
-    template <typename FeatureT>
-    struct overlaps : public filter<FeatureT>
-    {
-
-        bool pass(const FeatureT& feature) const
-        {
-            return false;
-        }
-	
-        void accept(const filter_visitor<FeatureT>& v)
-        {
-            v.visit(*this);
-        }
-    };
-
-    template <typename FeatureT>
-    struct crosses : public filter<FeatureT>
-    {
-
-	
-        bool pass(const FeatureT& feature) const
-        {
-            return false;
-        }
-	
-        void accept(const filter_visitor<FeatureT>& v)
-        {
-            v.visit(*this);
-        }
-    };
-    
-    template <typename FeatureT>
-    struct bbox  : public filter<FeatureT> 
-    {
-    private:
-        Envelope<double> box_;
-    public:
-        bbox(const Envelope<double>& box)
-            : box_(box) {}
-
-	
-        bool pass(const FeatureT& feature) const
-        {
-            return box_.contains(feature.get_geometry()->bbox());
-        }
-	
-
-        filter<FeatureT>* clone() const
-        {
-            return new bbox<FeatureT>(box_);
-        }
-        void accept(const filter_visitor<FeatureT>& v)
-        {
-            v.visit(*this);
-        }
-	
-        virtual ~bbox() {}
-    };
-}
-
-#endif //SPATIAL_HPP
diff --git a/include/mapnik/sql_utils.hpp b/include/mapnik/sql_utils.hpp
new file mode 100644
index 0000000..c208d3b
--- /dev/null
+++ b/include/mapnik/sql_utils.hpp
@@ -0,0 +1,199 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id: sql_utils.hpp 39 2005-04-10 20:39:53Z pavlenko $
+
+#ifndef SQL_UTILS_HPP
+#define SQL_UTILS_HPP
+
+// boost
+#include <boost/algorithm/string.hpp>
+#include <boost/scoped_array.hpp>
+
+namespace mapnik
+{
+
+inline std::string unquote_sql(const std::string& sql)
+{
+    std::string table_name = boost::algorithm::to_lower_copy(sql);  
+    boost::algorithm::trim_if(table_name,boost::algorithm::is_any_of("\""));
+    return table_name;
+}
+
+inline std::string unquote_sql2(const std::string& sql)
+{
+    std::string table_name = boost::algorithm::to_lower_copy(sql);  
+    boost::algorithm::trim_if(table_name,boost::algorithm::is_any_of("\"\'"));
+    return table_name;
+}
+
+inline void quote_attr(std::ostringstream& s, const std::string& field)
+{
+    if (boost::algorithm::icontains(field,".")) {
+        std::vector<std::string> parts;
+        boost::split(parts, field, boost::is_any_of("."));
+        s << ",\"" << parts[0] << "\".\"" << parts[1] << "\"";
+    }
+    else
+    {
+        s << ",\"" + field + "\"";
+    }
+}
+
+inline std::string table_from_sql(const std::string& sql)
+{
+    std::string table_name = boost::algorithm::to_lower_copy(sql);
+    boost::algorithm::replace_all(table_name,"\n"," ");
+   
+    std::string::size_type idx = table_name.rfind(" from ");
+    if (idx!=std::string::npos)
+    {
+      
+        idx = table_name.find_first_not_of(" ",idx+5);
+        if (idx != std::string::npos)
+        {
+            table_name=table_name.substr(idx);
+        }
+        idx = table_name.find_first_of(" )");
+        if (idx != std::string::npos)
+        {
+            table_name = table_name.substr(0,idx);
+        }
+    }
+    return table_name;
+}
+
+inline std::string numeric2string(const char* buf)
+{
+   int16_t ndigits = int2net(buf);
+   int16_t weight  = int2net(buf+2);
+   int16_t sign    = int2net(buf+4);
+   int16_t dscale  = int2net(buf+6);
+   
+   boost::scoped_array<int16_t> digits(new int16_t[ndigits]); 
+   for (int n=0; n < ndigits ;++n)
+   {
+      digits[n] = int2net(buf+8+n*2);
+   }
+   
+   std::ostringstream ss;
+   
+   if (sign == 0x4000) ss << "-";
+   
+   int i = std::max(weight,int16_t(0));
+   int d = 0;
+
+   // Each numeric "digit" is actually a value between 0000 and 9999 stored in a 16 bit field.
+   // For example, the number 1234567809990001 is stored as four digits: [1234] [5678] [999] [1].
+   // Note that the last two digits show that the leading 0's are lost when the number is split.
+   // We must be careful to re-insert these 0's when building the string.
+
+   while ( i >= 0)
+   {
+      if (i <= weight && d < ndigits)
+      {
+         // All digits after the first must be padded to make the field 4 characters long
+         if (d != 0) 
+         {
+#ifdef _WINDOWS
+             int dig = digits[d];
+             if (dig < 10)
+             {
+                 ss << "000"; // 0000 - 0009
+             }
+             else if (dig < 100)
+             {
+                 ss << "00";  // 0010 - 0099
+             }
+             else
+             {
+                 ss << "0";   // 0100 - 0999;
+             }
+#else
+             switch(digits[d])
+             {
+                 case 0 ... 9:
+                     ss << "000"; // 0000 - 0009
+                     break;
+                 case 10 ... 99:
+                     ss << "00";  // 0010 - 0099
+                     break;
+                 case 100 ... 999:
+                     ss << "0";   // 0100 - 0999
+                     break;
+             }
+#endif
+         }
+         ss << digits[d++];
+      }
+      else
+      {
+         if (d == 0)
+             ss <<  "0";
+         else
+             ss <<  "0000";
+      }
+      
+      i--;
+   }
+   if (dscale > 0)
+   {
+      ss << '.';
+      // dscale counts the number of decimal digits following the point, not the numeric digits
+      while (dscale > 0)
+      {
+         int value;
+         if (i <= weight && d < ndigits)
+              value = digits[d++];
+         else
+              value = 0;
+
+         // Output up to 4 decimal digits for this value
+         if (dscale > 0) {
+              ss << (value / 1000);
+              value %= 1000;
+              dscale--;
+         }
+         if (dscale > 0) {
+              ss << (value / 100);
+              value %= 100;
+              dscale--;
+         }
+         if (dscale > 0) {
+              ss << (value / 10);
+              value %= 10;
+              dscale--;
+         }
+         if (dscale > 0) {
+              ss << value;
+              dscale--;
+         }
+
+         i--;
+      }
+   }
+   return ss.str();
+}
+
+}
+
+#endif //SQL_UTILS_HPP
diff --git a/include/mapnik/stroke.hpp b/include/mapnik/stroke.hpp
index ad6f701b..1948788 100644
--- a/include/mapnik/stroke.hpp
+++ b/include/mapnik/stroke.hpp
@@ -31,73 +31,80 @@
  
 namespace mapnik
 {
-    using std::pair;
-    using std::vector;
-    typedef vector<pair<float,float> > dash_array;
+using std::pair;
+using std::vector;
+typedef vector<pair<double,double> > dash_array;
     
-    // if you add new tokens, don't forget to add them to the corresponding
-    // string array in the cpp file.
-    enum line_cap_enum
-        {
-            BUTT_CAP,
-            SQUARE_CAP,
-            ROUND_CAP,
-            line_cap_enum_MAX
-        }; 
+// if you add new tokens, don't forget to add them to the corresponding
+// string array in the cpp file.
+enum line_cap_enum
+{
+    BUTT_CAP,
+    SQUARE_CAP,
+    ROUND_CAP,
+    line_cap_enum_MAX
+}; 
 
-    DEFINE_ENUM( line_cap_e, line_cap_enum );
+DEFINE_ENUM( line_cap_e, line_cap_enum );
     
-    // if you add new tokens, don't forget to add them to the corresponding
-    // string array in the cpp file.
-    enum line_join_enum
-        {
-            MITER_JOIN,
-            MITER_REVERT_JOIN,
-            ROUND_JOIN,
-            BEVEL_JOIN,
-            line_join_enum_MAX
-        };
+// if you add new tokens, don't forget to add them to the corresponding
+// string array in the cpp file.
+enum line_join_enum
+{
+    MITER_JOIN,
+    MITER_REVERT_JOIN,
+    ROUND_JOIN,
+    BEVEL_JOIN,
+    line_join_enum_MAX
+};
 
-    DEFINE_ENUM( line_join_e, line_join_enum );
+DEFINE_ENUM( line_join_e, line_join_enum );
     
-  class MAPNIK_DECL stroke
-  {	
-        color c_;
-        float width_;
-        float opacity_; // 0.0 - 1.0
-        line_cap_e  line_cap_;
-        line_join_e line_join_;
-        dash_array dash_;	
-    public:
-        explicit stroke();
-        stroke(color const& c, float width=1.0);
-        stroke(stroke const& other);
-        stroke& operator=(const stroke& rhs);
+class MAPNIK_DECL stroke
+{       
+    color c_;
+    double width_;
+    double opacity_; // 0.0 - 1.0
+    line_cap_e  line_cap_;
+    line_join_e line_join_;
+    double gamma_;
+    dash_array dash_;
+    double dash_offset_;
+public:
+    explicit stroke();
+    stroke(color const& c, double width=1.0);
+    stroke(stroke const& other);
+    stroke& operator=(const stroke& rhs);
+
+    void set_color(const color& c);
+    color const& get_color() const;
+        
+    double get_width() const;
+    void set_width(double w);
 
-        void set_color(const color& c);
-	
-        color const& get_color() const;
-	
-        float get_width() const;
-        void set_width(float w);
-        void set_opacity(float opacity);
+    void set_opacity(double opacity);
+    double get_opacity() const;
+        
+    void set_line_cap(line_cap_e line_cap);
+    line_cap_e get_line_cap() const;
+        
+    void set_line_join(line_join_e line_join);
+    line_join_e get_line_join() const;
 
-        float get_opacity() const;
-	
-        void set_line_cap(line_cap_e line_cap);
-        line_cap_e get_line_cap() const;
-	
-        void set_line_join(line_join_e line_join);
-        line_join_e get_line_join() const;
-	
-        void add_dash(float dash,float gap);
-        bool has_dash() const;
-	
-        dash_array const& get_dash_array() const;
-	
-    private:
-        void swap(const stroke& other) throw();
-    };
+    void set_gamma(double gamma);
+    double get_gamma() const;
+        
+    void add_dash(double dash,double gap);
+    bool has_dash() const;
+
+    void set_dash_offset(double offset);
+    double dash_offset() const;
+    
+    dash_array const& get_dash_array() const;
+        
+private:
+    void swap(const stroke& other) throw();
+};
 }
 
 #endif //STROKE_HPP
diff --git a/include/mapnik/style.hpp b/include/mapnik/style.hpp
deleted file mode 100644
index ba4b29f..0000000
--- a/include/mapnik/style.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-//$Id: style.hpp 39 2005-04-10 20:39:53Z pavlenko $
-
-#ifndef STYLE_HPP
-#define STYLE_HPP
-// mapnik
-#include <mapnik/color.hpp>
-#include <mapnik/symbolizer.hpp>
-// boost
-#include <boost/shared_ptr.hpp>
-// stl
-#include <vector>
-#include <algorithm>
-#include <functional>
-
-namespace mapnik { }
-
-#endif //STYLE_HPP
diff --git a/include/mapnik/style_factory.hpp b/include/mapnik/style_factory.hpp
index fd20eaa..aa372d7 100644
--- a/include/mapnik/style_factory.hpp
+++ b/include/mapnik/style_factory.hpp
@@ -28,9 +28,9 @@
 
 namespace mapnik {
     
-    class style_factory 
-    {
-    };
+class style_factory 
+{
+};
 }
 
 
diff --git a/include/mapnik/svg/svg_converter.hpp b/include/mapnik/svg/svg_converter.hpp
new file mode 100644
index 0000000..a875fee
--- /dev/null
+++ b/include/mapnik/svg/svg_converter.hpp
@@ -0,0 +1,331 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+// $Id$
+
+#ifndef MAPNIK_SVG_CONVERTER_HPP
+#define MAPNIK_SVG_CONVERTER_HPP
+// mapnik
+#include <mapnik/svg/svg_path_attributes.hpp>
+#include <mapnik/svg/svg_path_adapter.hpp>
+// boost
+#include <boost/utility.hpp>
+// agg
+#include "agg_path_storage.h"
+#include "agg_conv_transform.h"
+#include "agg_conv_stroke.h"
+#include "agg_conv_contour.h"
+#include "agg_conv_curve.h"
+#include "agg_color_rgba.h"
+#include "agg_bounding_rect.h"
+// stl
+#include <stdexcept>
+
+namespace mapnik {
+namespace svg {
+
+template <typename VertexSource, typename AttributeSource>
+class svg_converter : boost::noncopyable
+{
+public:
+    
+    svg_converter(VertexSource & source, AttributeSource & attributes)
+        : source_(source),
+          attributes_(attributes) {}
+    
+    void begin_path()
+    {
+        push_attr();
+        unsigned idx = source_.start_new_path();
+        attributes_.add(path_attributes(cur_attr(), idx));
+    }
+    
+    void end_path()
+    {
+        if(attributes_.size() == 0) 
+        {
+            throw std::runtime_error("end_path : The path was not begun");
+        }
+        path_attributes attr = cur_attr();
+        unsigned idx = attributes_[attributes_.size() - 1].index;
+        attr.index = idx;
+        attributes_[attributes_.size() - 1] = attr;
+        pop_attr();   
+    }
+    
+    void move_to(double x, double y, bool rel=false)  // M, m
+    {
+        if(rel) source_.rel_to_abs(&x, &y);
+        source_.move_to(x, y);
+    }
+    
+    void line_to(double x,  double y, bool rel=false)  // L, l
+    {
+        if(rel) source_.rel_to_abs(&x, &y);
+        source_.line_to(x, y);   
+    }
+    
+    void hline_to(double x, bool rel=false)           // H, h
+    {
+        double x2 = 0.0;
+        double y2 = 0.0;
+        if(source_.total_vertices())
+        {
+            source_.vertex(source_.total_vertices() - 1, &x2, &y2);
+            if(rel) x += x2;
+            source_.line_to(x, y2);
+        }   
+    }
+    
+    void vline_to(double y, bool rel=false)           // V, v
+    {
+        double x2 = 0.0;
+        double y2 = 0.0;
+        if(source_.total_vertices())
+        {
+            source_.vertex(source_.total_vertices() - 1, &x2, &y2);
+            if(rel) y += y2;
+            source_.line_to(x2, y);
+        }
+    }
+    void curve3(double x1, double y1,                   // Q, q
+                double x,  double y, bool rel=false) 
+    {
+        if(rel) 
+        {
+            source_.rel_to_abs(&x1, &y1);
+            source_.rel_to_abs(&x,  &y);
+        }
+        source_.curve3(x1, y1, x, y);
+    }
+    
+    void curve3(double x, double y, bool rel=false)   // T, t
+    {
+        if(rel) 
+        {
+            source_.curve3_rel(x, y);
+        } else 
+        {
+            source_.curve3(x, y);
+        }
+    }
+    
+    void curve4(double x1, double y1,                   // C, c
+                double x2, double y2, 
+                double x,  double y, bool rel=false) 
+    {
+        if(rel) 
+        {
+            source_.rel_to_abs(&x1, &y1);
+            source_.rel_to_abs(&x2, &y2);
+            source_.rel_to_abs(&x,  &y);
+        }
+        source_.curve4(x1, y1, x2, y2, x, y);
+    }
+    
+    void curve4(double x2, double y2,                   // S, s
+        double x,  double y, bool rel=false) 
+    {
+        if(rel) 
+        {
+            source_.curve4_rel(x2, y2, x, y);
+        } else 
+        {
+            source_.curve4(x2, y2, x, y);
+        }
+    }
+    
+    void arc_to(double rx, double ry,                   // A, a
+                double angle, 
+                bool large_arc_flag,
+                bool sweep_flag,
+                double x, double y,bool rel=false) 
+    {
+        
+        if(rel) 
+        {
+            source_.arc_rel(rx, ry, angle, large_arc_flag, sweep_flag, x, y);
+        }
+        else 
+        {
+            source_.arc_to(rx, ry, angle, large_arc_flag, sweep_flag, x, y);
+            
+        }
+    }
+    
+    void close_subpath()                              // Z, z
+    {
+        source_.end_poly(agg::path_flags_close);
+    }
+    
+    void push_attr()
+    {
+        attr_stack_.add(attr_stack_.size() ? 
+                        attr_stack_[attr_stack_.size() - 1] :
+                        path_attributes());
+    }
+    void pop_attr()
+    {
+        if(attr_stack_.size() == 0)
+        {
+            throw std::runtime_error("pop_attr : Attribute stack is empty");
+        }
+        attr_stack_.remove_last();
+    }
+    
+    // Attribute setting functions.
+    void fill(const agg::rgba8& f)
+    {
+        path_attributes& attr = cur_attr();
+        double a = attr.fill_color.opacity();
+        attr.fill_color = f;
+        attr.fill_color.opacity(a * f.opacity()); 
+        attr.fill_flag = true;
+    }
+
+    void add_fill_gradient(mapnik::gradient& grad)
+    {
+        path_attributes& attr = cur_attr();
+        attr.fill_gradient = grad;
+    }
+
+    void add_stroke_gradient(mapnik::gradient& grad)
+    {
+        path_attributes& attr = cur_attr();
+        attr.stroke_gradient = grad;
+    }
+
+    void stroke(const agg::rgba8& s)
+    {
+        path_attributes& attr = cur_attr();
+        double a = attr.stroke_color.opacity();
+        attr.stroke_color = s;
+        attr.stroke_color.opacity(a * s.opacity());
+        attr.stroke_flag = true;
+    }
+    
+    void even_odd(bool flag)
+    {
+        cur_attr().even_odd_flag = flag;
+    }
+
+    void visibility(bool flag)
+    {
+        cur_attr().visibility_flag = flag;
+    }
+
+    
+    void stroke_width(double w)
+    {
+        cur_attr().stroke_width = w;
+    }
+    void fill_none()
+    {
+        cur_attr().fill_flag = false;
+    }
+    
+    void stroke_none()
+    {
+        cur_attr().stroke_flag = false;
+    }
+    
+    void fill_opacity(double op)
+    {
+        cur_attr().fill_color.opacity(op);
+    }
+    void stroke_opacity(double op)
+    {
+        cur_attr().stroke_color.opacity(op);
+    }
+
+    void opacity(double op)
+    {
+        cur_attr().opacity = op;
+    }
+        
+    void line_join(agg::line_join_e join)
+    {
+        cur_attr().line_join = join;
+    }
+    
+    void line_cap(agg::line_cap_e cap)
+    {
+        cur_attr().line_cap = cap;
+    }
+    void miter_limit(double ml)
+    {
+        cur_attr().miter_limit = ml;
+    }
+    
+    // Make all polygons CCW-oriented
+    void arrange_orientations()
+    {
+        source_.arrange_orientations_all_paths(agg::path_flags_ccw);
+    }
+    
+    // FIXME!!!!
+    unsigned operator [](unsigned idx)
+    {
+        transform_ = attributes_[idx].transform;
+        return attributes_[idx].index;
+    }
+    
+    void bounding_rect(double* x1, double* y1, double* x2, double* y2)
+    {
+        agg::conv_transform<mapnik::svg::svg_path_adapter> trans(source_, transform_);
+        agg::bounding_rect(trans, *this, 0, attributes_.size(), x1, y1, x2, y2);
+    }
+    
+    VertexSource & storage() 
+    {
+        return source_;
+    }
+    
+    agg::trans_affine& transform()
+    {
+        return cur_attr().transform;
+    }
+
+    path_attributes& cur_attr() 
+    {
+        if(attr_stack_.size() == 0)
+        {
+            throw std::runtime_error("cur_attr : Attribute stack is empty");
+        }
+        return attr_stack_[attr_stack_.size() - 1];
+    }
+    
+private:    
+    
+    VertexSource & source_;
+    AttributeSource & attributes_;
+    AttributeSource  attr_stack_;
+    agg::trans_affine transform_;
+};
+
+
+typedef svg_converter<svg_path_adapter,agg::pod_bvector<mapnik::svg::path_attributes> > svg_converter_type;
+
+}}
+
+
+#endif // #ifndef MAPNIK_SVG_CONVERTER_HPP
diff --git a/include/mapnik/svg/svg_generator.hpp b/include/mapnik/svg/svg_generator.hpp
new file mode 100644
index 0000000..2df7b3b
--- /dev/null
+++ b/include/mapnik/svg/svg_generator.hpp
@@ -0,0 +1,70 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_SVG_GENERATOR_HPP
+#define MAPNIK_SVG_GENERATOR_HPP
+
+// mapnik
+#include <mapnik/ctrans.hpp>
+#include <mapnik/color.hpp>
+#include <mapnik/geometry.hpp>
+#include <mapnik/svg/svg_output_grammars.hpp>
+#include <mapnik/svg/svg_output_attributes.hpp>
+
+// boost
+#include <boost/utility.hpp>
+
+namespace mapnik { namespace svg {
+
+    /*!
+     * @brief Performs the actual generation of output calling the underlying library.
+     * A method to generate each kind of SVG tag is provided. The information needed
+     * needed to generate the attributes of a tag is passed within a *_output_attributes
+     * structure.
+     */
+    template <typename OutputIterator>
+    class svg_generator : private boost::noncopyable
+    {
+        typedef coord_transform2<CoordTransform, geometry_type> path_type;
+        
+        typedef svg::svg_root_attributes_grammar<OutputIterator> root_attributes_grammar;
+        typedef svg::svg_rect_attributes_grammar<OutputIterator> rect_attributes_grammar;
+        typedef svg::svg_path_data_grammar<OutputIterator, path_type> path_data_grammar;
+        typedef svg::svg_path_attributes_grammar<OutputIterator> path_attributes_grammar;
+        typedef svg::svg_path_dash_array_grammar<OutputIterator> path_dash_array_grammar;
+
+    public:
+        explicit svg_generator(OutputIterator& output_iterator);
+        ~svg_generator();
+      
+        void generate_header();
+        void generate_opening_root(root_output_attributes const& root_attributes);
+        void generate_closing_root();
+        void generate_rect(rect_output_attributes const& rect_attributes);
+        void generate_path(path_type const& path, path_output_attributes const& path_attributes);
+  
+    private:
+        OutputIterator& output_iterator_;
+    };
+}}
+
+#endif // MAPNIK_SVG_GENERATOR_HPP
diff --git a/include/mapnik/svg/svg_output_attributes.hpp b/include/mapnik/svg/svg_output_attributes.hpp
new file mode 100644
index 0000000..8194202
--- /dev/null
+++ b/include/mapnik/svg/svg_output_attributes.hpp
@@ -0,0 +1,203 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+#ifndef MAPNIK_SVG_OUTPUT_ATTRIBUTES
+#define MAPNIK_SVG_OUTPUT_ATTRIBUTES
+
+// mapnik
+#include <mapnik/color.hpp>
+#include <mapnik/stroke.hpp>
+
+// stl
+#include <string>
+
+namespace mapnik { namespace svg {
+
+    /*!
+     * @brief SVG path tag attributes.
+     * This structure encapsulates the values needed to
+     * generate a path tag. It is meant to be filled with
+     * the values stored in line_ and polygon_ symbolizers.
+     *
+     * The values are stored using the variable types that
+     * are required for output generation, but the interface
+     * is written with the original types. "set" methods
+     * perform the necessary conversions (i.e. from color to
+     * hex string).
+     */
+    struct path_output_attributes
+    {
+        path_output_attributes() 
+            : fill_color_("none"),
+              fill_opacity_(1.0),
+              stroke_color_("none"),
+              stroke_opacity_(1.0),
+              stroke_width_(0.0),        
+              stroke_linecap_("butt"),
+              stroke_linejoin_("miter"),
+              stroke_dasharray_(),
+              stroke_dashoffset_(0.0)
+              {}
+      
+        void set_fill_color(color const& fill_color);
+        void set_fill_opacity(const double fill_opacity);
+        void set_stroke_color(color const& stroke_color);
+        void set_stroke_opacity(const double stroke_opacity);
+        void set_stroke_width(const double stroke_width);
+        void set_stroke_linecap(const line_cap_e stroke_linecap);
+        void set_stroke_linejoin(const line_join_e stroke_linejoin);
+        void set_stroke_dasharray(const dash_array stroke_dasharray);
+        void set_stroke_dashoffset(const double stroke_dashoffset);
+      
+        const std::string fill_color() const;
+        const double fill_opacity() const;
+        const std::string stroke_color() const;
+        const double stroke_opacity() const;
+        const double stroke_width() const;
+        const std::string stroke_linecap() const;
+        const std::string stroke_linejoin() const;
+        const dash_array stroke_dasharray() const;
+        const double stroke_dashoffset() const;
+      
+        /*!
+         * @brief Set members back to their default values.
+         */
+        void reset();
+      
+          //private:
+        // polygon symbolizer attributes.
+        std::string fill_color_;
+        double fill_opacity_;
+      
+        // line symbolizer attributes.
+        std::string stroke_color_;
+        double stroke_opacity_;
+        double stroke_width_;
+        std::string stroke_linecap_;
+        std::string stroke_linejoin_;  
+        dash_array stroke_dasharray_;
+        double stroke_dashoffset_;
+    };   
+
+    /*!
+     * @brief SVG rect tag attributes.
+     * This structure encapsulates the values needed to
+     * generate a rect tag. It is is meant to be used to
+     * store background color information.
+     *
+     * The values are stored using the variable types that
+     * are required for output generation, but the interface
+     * is written with the original types. "set" methods
+     * perform the necessary conversions (i.e. from color to
+     * hex string
+     */
+    struct rect_output_attributes
+    {
+        rect_output_attributes()
+            : x_(0),
+              y_(0),
+              width_(400),
+              height_(400),
+              fill_color_("#000000")
+        {}
+        
+        rect_output_attributes(const int x, const int y, const unsigned width, const unsigned height, color const& fill_color)
+            : x_(x),
+              y_(y),
+              width_(width),
+              height_(height),
+              fill_color_(fill_color.to_hex_string())
+        {}
+        
+        void set_x(const int x);
+        void set_y(const int y);
+        void set_width(const unsigned width);
+        void set_height(const unsigned height);
+        void set_fill_color(color const& fill_color);
+        
+        const int x() const;
+        const int y() const;
+        const int width() const;
+        const int height() const;
+        const std::string fill_color() const;
+        
+        /*!
+         * @brief Set members back to their default values.
+         */
+        void reset();
+        
+          //private:
+        int x_;
+        int y_;
+        unsigned width_;
+        unsigned height_;
+        std::string fill_color_;
+    };
+
+    /*!
+     * @brief SVG root tag attributes.
+     * This structure encapsulates the values needed to
+     * generate an svg (root) tag.
+     *
+     * The values are stored using the variable types that
+     * are required for output generation, but the interface
+     * is written with the original types. "set" methods
+     * perform the necessary conversions (i.e. from color to
+     * hex string
+     */
+    struct root_output_attributes
+    {
+          root_output_attributes();
+        
+          root_output_attributes(const unsigned width, const unsigned height);
+        
+          void set_width(const unsigned width);
+          void set_height(const unsigned height);
+          void set_svg_version(const double svg_version);
+          void set_svg_namespace_url(std::string const& svg_namespace_url);
+        
+          const unsigned width() const;
+          const unsigned height() const;
+          const double svg_version() const;
+          const std::string svg_namespace_url() const;
+        
+          /*!
+           * @brief Set members back to their default values.
+           */
+          void reset();
+        
+          // SVG version to which the generated document will be compliant.
+          static const double SVG_VERSION;
+          // SVG XML namespace url.
+          static const std::string SVG_NAMESPACE_URL;
+        
+            //private:
+          unsigned width_;
+          unsigned height_;
+          double svg_version_;
+          std::string svg_namespace_url_;
+    };
+}}
+
+#endif // MAPNIK_SVG_OUTPUT_ATTRIBUTES
diff --git a/include/mapnik/svg/svg_output_grammars.hpp b/include/mapnik/svg/svg_output_grammars.hpp
new file mode 100644
index 0000000..f604064
--- /dev/null
+++ b/include/mapnik/svg/svg_output_grammars.hpp
@@ -0,0 +1,255 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef SVG_OUTPUT_GRAMMARS_HPP
+#define SVG_OUTPUT_GRAMMARS_HPP
+
+// mapnik
+#include <mapnik/vertex.hpp>
+#include <mapnik/ctrans.hpp>
+#include <mapnik/geometry.hpp>
+#include <mapnik/svg/svg_path_iterator.hpp>
+#include <mapnik/svg/svg_output_attributes.hpp>
+
+// boost
+#include <boost/spirit/include/karma.hpp>
+#include <boost/spirit/include/karma_omit.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/repository/include/karma_confix.hpp>
+#include <boost/spirit/home/phoenix/bind/bind_member_function.hpp>
+#include <boost/fusion/include/std_pair.hpp>
+#include <boost/fusion/include/struct.hpp>
+#include <boost/fusion/include/boost_tuple.hpp>
+
+// std
+#include <iostream>
+
+/*!
+ * mapnik::svg::path_output_attributes is adapted as a fusion sequence
+ * in order to be used directly by the svg_path_attributes_grammar (below).
+ *
+ * This adaptation is the primary reason why the attributes are stored in
+ * this structure before being passed to the generate_path method.
+ */
+BOOST_FUSION_ADAPT_STRUCT(
+    mapnik::svg::path_output_attributes,
+    (std::string, fill_color_)
+    (double, fill_opacity_)
+    (std::string, stroke_color_)
+    (double, stroke_opacity_)
+    (double, stroke_width_)
+    (std::string, stroke_linecap_)
+    (std::string, stroke_linejoin_)
+    (double, stroke_dashoffset_)
+)
+
+/*!
+ * mapnik::svg::rect_output_attributes is adapted as a fusion sequence
+ * in order to be used directly by the svg_rect_attributes_grammar (below).
+ */
+BOOST_FUSION_ADAPT_STRUCT(
+    mapnik::svg::rect_output_attributes,
+    (int, x_)
+    (int, y_)
+    (unsigned, width_)
+    (unsigned, height_)
+    (std::string, fill_color_)
+)
+
+/*!
+ * mapnik::svg::root_output_attributes is adapted as a fusion sequence
+ * in order to be used directly by the svg_root_attributes_grammar (below).
+ */
+BOOST_FUSION_ADAPT_STRUCT(
+    mapnik::svg::root_output_attributes,
+    (unsigned, width_)
+    (unsigned, height_)
+    (double, svg_version_)
+    (std::string, svg_namespace_url_)
+)
+
+/*!
+ * mapnik::geometry_type is adapted to conform to the concepts
+ * required by Karma to be recognized as a container of
+ * attributes for output generation.
+ */
+namespace boost { namespace spirit { namespace traits {
+
+    typedef mapnik::coord_transform2<mapnik::CoordTransform, mapnik::geometry_type> path_type;
+
+    template <>
+    struct is_container<path_type const>
+      : mpl::true_ {};
+
+    template <>
+    struct container_iterator<path_type const>
+    {       
+        typedef mapnik::svg::path_iterator_type type; 
+    };
+
+    template <>
+    struct begin_container<path_type const>
+    {
+        static mapnik::svg::path_iterator_type
+        call(path_type const& path)
+        {
+            return mapnik::svg::path_iterator_type(0, path);
+        }
+    };
+
+    template <>
+    struct end_container<path_type const>
+    {
+        static mapnik::svg::path_iterator_type
+        call(path_type const& path)
+        {
+            return mapnik::svg::path_iterator_type(path);
+        }
+    };
+}}}
+
+namespace mapnik { namespace svg {
+
+    using namespace boost::spirit;
+    using namespace boost::phoenix;
+
+    template <typename OutputIterator, typename PathType>
+    struct svg_path_data_grammar : karma::grammar<OutputIterator, PathType&()>
+    {
+        typedef path_iterator_type::value_type vertex_type;
+
+        explicit svg_path_data_grammar(PathType const& path_type)
+        : svg_path_data_grammar::base_type(svg_path),
+          path_type_(path_type)
+        {
+              using karma::int_;
+              using karma::double_;
+              using repository::confix;
+              
+              svg_path = 
+                  lit("d=") 
+                  << confix('"', '"')[
+                  -(path_vertex % lit(' '))];
+              
+              path_vertex = 
+                  path_vertex_command
+                  << double_
+                  << lit(' ')
+                  << double_;
+              
+              path_vertex_command = &int_(1) << lit('M') | lit('L');
+        }
+  
+        karma::rule<OutputIterator, PathType&()> svg_path;
+        karma::rule<OutputIterator, vertex_type()> path_vertex;
+        karma::rule<OutputIterator, int()> path_vertex_command;
+      
+        PathType const& path_type_;
+    };
+
+    template <typename OutputIterator>
+    struct svg_path_attributes_grammar : karma::grammar<OutputIterator, mapnik::svg::path_output_attributes()>
+    {
+          explicit svg_path_attributes_grammar()
+              : svg_path_attributes_grammar::base_type(svg_path_attributes)
+          {
+              using karma::double_;
+              using karma::string;
+              using repository::confix;
+        
+              svg_path_attributes = 
+                  lit("fill=") << confix('"', '"')[string]
+                  << lit(" fill-opacity=") << confix('"', '"')[double_]
+                  << lit(" stroke=") << confix('"', '"')[string]
+                  << lit(" stroke-opacity=") << confix('"', '"')[double_]
+                  << lit(" stroke-width=") << confix('"', '"')[double_ << lit("px")]
+                  << lit(" stroke-linecap=") << confix('"', '"')[string]
+                  << lit(" stroke-linejoin=") << confix('"', '"')[string]
+                  << lit(" stroke-dashoffset=") << confix('"', '"')[double_ << lit("px")];
+          }
+        
+          karma::rule<OutputIterator, mapnik::svg::path_output_attributes()> svg_path_attributes;
+    };
+
+    template <typename OutputIterator>
+    struct svg_path_dash_array_grammar : karma::grammar<OutputIterator, mapnik::dash_array()>
+    {
+          explicit svg_path_dash_array_grammar()
+              : svg_path_dash_array_grammar::base_type(svg_path_dash_array)
+          {
+              using karma::double_;
+              using repository::confix;
+        
+              svg_path_dash_array = 
+                  lit("stroke-dasharray=") 
+                  << confix('"', '"')[
+                  -((double_ << lit(',') << double_) % lit(','))];
+          }
+        
+          karma::rule<OutputIterator, mapnik::dash_array()> svg_path_dash_array;
+    };
+
+    template <typename OutputIterator>
+    struct svg_rect_attributes_grammar : karma::grammar<OutputIterator, mapnik::svg::rect_output_attributes()>
+    {
+          explicit svg_rect_attributes_grammar()
+              : svg_rect_attributes_grammar::base_type(svg_rect_attributes)
+          {
+              using karma::int_;
+              using karma::string;
+              using repository::confix;
+        
+              svg_rect_attributes =    
+                  lit("x=") << confix('"', '"')[int_]
+                  << lit(" y=") << confix('"', '"')[int_]
+                  << lit(" width=") << confix('"', '"')[int_ << lit("px")]
+                  << lit(" height=") << confix('"', '"')[int_ << lit("px")]
+                  << lit(" fill=") << confix('"', '"')[string];
+          }
+        
+          karma::rule<OutputIterator, mapnik::svg::rect_output_attributes()> svg_rect_attributes;
+    };
+
+    template <typename OutputIterator>
+    struct svg_root_attributes_grammar : karma::grammar<OutputIterator, mapnik::svg::root_output_attributes()>
+    {
+        explicit svg_root_attributes_grammar()
+            : svg_root_attributes_grammar::base_type(svg_root_attributes)
+        {
+            using karma::int_;
+            using karma::string;
+            using karma::double_;
+            using repository::confix;
+      
+            svg_root_attributes = 
+                lit("width=") << confix('"', '"')[int_ << lit("px")]
+                << lit(" height=") << confix('"', '"')[int_ << lit("px")]
+                << " version=" << confix('"', '"')[double_]
+                << " xmlns=" << confix('"', '"')[string];
+        }
+      
+        karma::rule<OutputIterator, mapnik::svg::root_output_attributes()> svg_root_attributes;
+    };
+}
+}
+
+#endif // SVG_OUTPUT_GRAMMARS_HPP
diff --git a/include/mapnik/svg/svg_parser.hpp b/include/mapnik/svg/svg_parser.hpp
new file mode 100644
index 0000000..bf919f4
--- /dev/null
+++ b/include/mapnik/svg/svg_parser.hpp
@@ -0,0 +1,76 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_SVG_PARSER_HPP
+#define MAPNIK_SVG_PARSER_HPP
+
+// mapnik
+#include <mapnik/svg/svg_path_attributes.hpp>
+#include <mapnik/svg/svg_converter.hpp>
+#include <mapnik/svg/svg_path_adapter.hpp>
+#include <mapnik/gradient.hpp>
+
+// boost
+#include <boost/utility.hpp>
+#include <libxml/xmlreader.h>
+
+#include <map>
+
+namespace  mapnik { namespace svg {
+
+class svg_parser : private boost::noncopyable
+{
+public:
+    explicit svg_parser(svg_converter_type & path);
+    ~svg_parser();
+    void parse(std::string const& filename);
+private:
+    void process_node(xmlTextReaderPtr reader);
+    void start_element(xmlTextReaderPtr reader);
+    void end_element(xmlTextReaderPtr reader);
+    void parse_path(xmlTextReaderPtr reader);
+    void parse_polygon(xmlTextReaderPtr reader);
+    void parse_polyline(xmlTextReaderPtr reader);
+    void parse_line(xmlTextReaderPtr reader);
+    void parse_rect(xmlTextReaderPtr reader);
+    void parse_circle(xmlTextReaderPtr reader);
+    void parse_ellipse(xmlTextReaderPtr reader);
+    void parse_linear_gradient(xmlTextReaderPtr reader);
+    void parse_radial_gradient(xmlTextReaderPtr reader);
+    bool parse_common_gradient(xmlTextReaderPtr reader);
+    void parse_gradient_stop(xmlTextReaderPtr reader);
+    void parse_pattern(xmlTextReaderPtr reader);
+    void parse_attr(xmlTextReaderPtr reader);
+    void parse_attr(const xmlChar * name, const xmlChar * value );
+
+    
+private:
+    svg_converter_type & path_;
+    bool is_defs_;
+    std::map<std::string, gradient> gradient_map_;
+    std::pair<std::string, gradient> temporary_gradient_;
+};
+
+}}
+
+
+#endif // MAPNIK_SVG_PARSER_HPP
diff --git a/include/mapnik/svg/svg_path_adapter.hpp b/include/mapnik/svg/svg_path_adapter.hpp
new file mode 100644
index 0000000..e8d9b62
--- /dev/null
+++ b/include/mapnik/svg/svg_path_adapter.hpp
@@ -0,0 +1,951 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#ifndef MAPNIK_SVG_PATH_ADAPTER
+#define MAPNIK_SVG_PATH_ADAPTER
+
+// mapnik
+#include <boost/utility.hpp>
+// agg
+#include "agg_math.h"
+#include "agg_array.h"
+#include "agg_bezier_arc.h"
+// stl
+#include <cmath>
+#include <vector>
+
+namespace mapnik { 
+namespace svg {
+
+using namespace agg;
+
+template<class VertexContainer> class path_adapter : boost::noncopyable
+{
+public:
+    typedef VertexContainer            container_type;
+    typedef path_adapter<VertexContainer> self_type;
+    
+    //--------------------------------------------------------------------
+    path_adapter(VertexContainer & vertices) : m_vertices(vertices), m_iterator(0) {}
+    //void remove_all() { m_vertices.remove_all(); m_iterator = 0; }
+    //void free_all()   { m_vertices.free_all();   m_iterator = 0; }
+    
+    // Make path functions
+    //--------------------------------------------------------------------
+    unsigned start_new_path();
+    
+    void move_to(double x, double y);
+    void move_rel(double dx, double dy);
+    
+    void line_to(double x, double y);
+    void line_rel(double dx, double dy);
+    
+    void hline_to(double x);
+    void hline_rel(double dx);
+    
+    void vline_to(double y);
+    void vline_rel(double dy);
+    
+    void arc_to(double rx, double ry,
+                double angle,
+                bool large_arc_flag,
+                bool sweep_flag,
+                double x, double y);
+    
+    void arc_rel(double rx, double ry,
+                 double angle,
+                 bool large_arc_flag,
+                 bool sweep_flag,
+                 double dx, double dy);
+    
+    void curve3(double x_ctrl, double y_ctrl, 
+                double x_to,   double y_to);
+    
+    void curve3_rel(double dx_ctrl, double dy_ctrl, 
+                    double dx_to,   double dy_to);
+    
+    void curve3(double x_to, double y_to);
+    
+    void curve3_rel(double dx_to, double dy_to);
+    
+    void curve4(double x_ctrl1, double y_ctrl1, 
+                double x_ctrl2, double y_ctrl2, 
+                double x_to,    double y_to);
+
+    void curve4_rel(double dx_ctrl1, double dy_ctrl1, 
+                    double dx_ctrl2, double dy_ctrl2, 
+                    double dx_to,    double dy_to);
+
+    void curve4(double x_ctrl2, double y_ctrl2, 
+                double x_to,    double y_to);
+
+    void curve4_rel(double x_ctrl2, double y_ctrl2, 
+                    double x_to,    double y_to);
+
+
+    void end_poly(unsigned flags = path_flags_close);
+    void close_polygon(unsigned flags = path_flags_none);
+
+    // Accessors
+    //--------------------------------------------------------------------
+    const container_type& vertices() const { return m_vertices; } 
+    container_type& vertices()       { return m_vertices; } 
+
+    unsigned total_vertices() const;
+
+    void rel_to_abs(double* x, double* y) const;
+
+    unsigned last_vertex(double* x, double* y) const;
+    unsigned prev_vertex(double* x, double* y) const;
+
+    double last_x() const;
+    double last_y() const;
+
+    unsigned vertex(unsigned idx, double* x, double* y) const;
+    unsigned command(unsigned idx) const;
+
+    void modify_vertex(unsigned idx, double x, double y);
+    void modify_vertex(unsigned idx, double x, double y, unsigned cmd);
+    void modify_command(unsigned idx, unsigned cmd);
+
+    // VertexSource interface
+    //--------------------------------------------------------------------
+    void     rewind(unsigned path_id);
+    unsigned vertex(double* x, double* y);
+
+    // Arrange the orientation of a polygon, all polygons in a path, 
+    // or in all paths. After calling arrange_orientations() or 
+    // arrange_orientations_all_paths(), all the polygons will have 
+    // the same orientation, i.e. path_flags_cw or path_flags_ccw
+    //--------------------------------------------------------------------
+    unsigned arrange_polygon_orientation(unsigned start, path_flags_e orientation);
+    unsigned arrange_orientations(unsigned path_id, path_flags_e orientation);
+    void     arrange_orientations_all_paths(path_flags_e orientation);
+    void     invert_polygon(unsigned start);
+
+    // Flip all vertices horizontally or vertically, 
+    // between x1 and x2, or between y1 and y2 respectively
+    //--------------------------------------------------------------------
+    void flip_x(double x1, double x2);
+    void flip_y(double y1, double y2);
+
+    // Concatenate path. The path is added as is.
+    //--------------------------------------------------------------------
+    template<class VertexSource> 
+    void concat_path(VertexSource& vs, unsigned path_id = 0)
+    {
+        double x(0), y(0);
+        unsigned cmd;
+        vs.rewind(path_id);
+        while(!is_stop(cmd = vs.vertex(&x, &y)))
+        {
+            m_vertices.add_vertex(x, y, cmd);
+        }
+    }
+
+    //--------------------------------------------------------------------
+    // Join path. The path is joined with the existing one, that is, 
+    // it behaves as if the pen of a plotter was always down (drawing)
+    template<class VertexSource> 
+    void join_path(VertexSource& vs, unsigned path_id = 0)
+    {
+        double x, y;
+        unsigned cmd;
+        vs.rewind(path_id);
+        cmd = vs.vertex(&x, &y);
+        if(!is_stop(cmd))
+        {
+            if(is_vertex(cmd))
+            {
+                double x0, y0;
+                unsigned cmd0 = last_vertex(&x0, &y0);
+                if(is_vertex(cmd0))
+                {
+                    if(calc_distance(x, y, x0, y0) > vertex_dist_epsilon)
+                    {
+                        if(is_move_to(cmd)) cmd = path_cmd_line_to;
+                        m_vertices.add_vertex(x, y, cmd);
+                    }
+                }
+                else
+                {
+                    if(is_stop(cmd0))
+                    {
+                        cmd = path_cmd_move_to;
+                    }
+                    else
+                    {
+                        if(is_move_to(cmd)) cmd = path_cmd_line_to;
+                    }
+                    m_vertices.add_vertex(x, y, cmd);
+                }
+            }
+            while(!is_stop(cmd = vs.vertex(&x, &y)))
+            {
+                m_vertices.add_vertex(x, y, is_move_to(cmd) ? 
+                                      unsigned(path_cmd_line_to) : 
+                                      cmd);
+            }
+        }
+    }
+    
+    //--------------------------------------------------------------------
+    void translate(double dx, double dy, unsigned path_id=0);
+    void translate_all_paths(double dx, double dy);
+
+    //--------------------------------------------------------------------
+    template<class Trans>
+    void transform(const Trans& trans, unsigned path_id=0)
+    {
+        unsigned num_ver = m_vertices.total_vertices();
+        for(; path_id < num_ver; path_id++)
+        {
+            double x, y;
+            unsigned cmd = m_vertices.vertex(path_id, &x, &y);
+            if(is_stop(cmd)) break;
+            if(is_vertex(cmd))
+            {
+                trans.transform(&x, &y);
+                m_vertices.modify_vertex(path_id, x, y);
+            }
+        }
+    }
+
+    //--------------------------------------------------------------------
+    template<class Trans>
+    void transform_all_paths(const Trans& trans)
+    {
+        unsigned idx;
+        unsigned num_ver = m_vertices.total_vertices();
+        for(idx = 0; idx < num_ver; idx++)
+        {
+            double x, y;
+            if(is_vertex(m_vertices.vertex(idx, &x, &y)))
+            {
+                trans.transform(&x, &y);
+                m_vertices.modify_vertex(idx, x, y);
+            }
+        }
+    }
+
+
+
+private:
+    unsigned perceive_polygon_orientation(unsigned start, unsigned end);
+    void     invert_polygon(unsigned start, unsigned end);
+
+    VertexContainer & m_vertices;
+    unsigned          m_iterator;
+};
+
+//------------------------------------------------------------------------
+template<class VC> 
+unsigned path_adapter<VC>::start_new_path()
+{
+    if(!is_stop(m_vertices.last_command()))
+    {
+        m_vertices.add_vertex(0.0, 0.0, path_cmd_stop);
+    }
+    return m_vertices.total_vertices();
+}
+
+
+//------------------------------------------------------------------------
+template<class VC> 
+inline void path_adapter<VC>::rel_to_abs(double* x, double* y) const
+{
+    if(m_vertices.total_vertices())
+    {
+        double x2;
+        double y2;
+        if(is_vertex(m_vertices.last_vertex(&x2, &y2)))
+        {
+            *x += x2;
+            *y += y2;
+        }
+        else if (!is_stop(m_vertices.last_command()) && 
+                 is_vertex(m_vertices.prev_vertex(&x2, &y2)))
+        {
+            *x += x2;
+            *y += y2;
+        }
+    }
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+inline void path_adapter<VC>::move_to(double x, double y)
+{
+    m_vertices.add_vertex(x, y, path_cmd_move_to);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+inline void path_adapter<VC>::move_rel(double dx, double dy)
+{
+    rel_to_abs(&dx, &dy);
+    m_vertices.add_vertex(dx, dy, path_cmd_move_to);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+inline void path_adapter<VC>::line_to(double x, double y)
+{
+    m_vertices.add_vertex(x, y, path_cmd_line_to);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+inline void path_adapter<VC>::line_rel(double dx, double dy)
+{
+    rel_to_abs(&dx, &dy);
+    m_vertices.add_vertex(dx, dy, path_cmd_line_to);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+inline void path_adapter<VC>::hline_to(double x)
+{
+    m_vertices.add_vertex(x, last_y(), path_cmd_line_to);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+inline void path_adapter<VC>::hline_rel(double dx)
+{
+    double dy = 0;
+    rel_to_abs(&dx, &dy);
+    m_vertices.add_vertex(dx, dy, path_cmd_line_to);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+inline void path_adapter<VC>::vline_to(double y)
+{
+    m_vertices.add_vertex(last_x(), y, path_cmd_line_to);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+inline void path_adapter<VC>::vline_rel(double dy)
+{
+    double dx = 0;
+    rel_to_abs(&dx, &dy);
+    m_vertices.add_vertex(dx, dy, path_cmd_line_to);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+void path_adapter<VC>::arc_to(double rx, double ry,
+                              double angle,
+                              bool large_arc_flag,
+                              bool sweep_flag,
+                              double x, double y)
+{
+    if(m_vertices.total_vertices() && is_vertex(m_vertices.last_command()))
+    {
+        const double epsilon = 1e-30;
+        double x0 = 0.0;
+        double y0 = 0.0;
+        m_vertices.last_vertex(&x0, &y0);
+
+        rx = fabs(rx);
+        ry = fabs(ry);
+
+        // Ensure radii are valid
+        //-------------------------
+        if(rx < epsilon || ry < epsilon) 
+        {
+            line_to(x, y);
+            return;
+        }
+
+        if(calc_distance(x0, y0, x, y) < epsilon)
+        {
+            // If the endpoints (x, y) and (x0, y0) are identical, then this
+            // is equivalent to omitting the elliptical arc segment entirely.
+            return;
+        }
+        bezier_arc_svg a(x0, y0, rx, ry, angle, large_arc_flag, sweep_flag, x, y);
+        if(a.radii_ok())
+        {
+            join_path(a);
+        }
+        else
+        {
+            line_to(x, y);
+        }
+    }
+    else
+    {
+        move_to(x, y);
+    }
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+void path_adapter<VC>::arc_rel(double rx, double ry,
+                               double angle,
+                               bool large_arc_flag,
+                               bool sweep_flag,
+                               double dx, double dy)
+{
+    rel_to_abs(&dx, &dy);
+    arc_to(rx, ry, angle, large_arc_flag, sweep_flag, dx, dy);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+void path_adapter<VC>::curve3(double x_ctrl, double y_ctrl, 
+                              double x_to,   double y_to)
+{
+    m_vertices.add_vertex(x_ctrl, y_ctrl, path_cmd_curve3);
+    m_vertices.add_vertex(x_to,   y_to,   path_cmd_curve3);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+void path_adapter<VC>::curve3_rel(double dx_ctrl, double dy_ctrl, 
+                                  double dx_to,   double dy_to)
+{
+    rel_to_abs(&dx_ctrl, &dy_ctrl);
+    rel_to_abs(&dx_to,   &dy_to);
+    m_vertices.add_vertex(dx_ctrl, dy_ctrl, path_cmd_curve3);
+    m_vertices.add_vertex(dx_to,   dy_to,   path_cmd_curve3);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+void path_adapter<VC>::curve3(double x_to, double y_to)
+{
+    double x0;
+    double y0;
+    if(is_vertex(m_vertices.last_vertex(&x0, &y0)))
+    {
+        double x_ctrl;
+        double y_ctrl; 
+        unsigned cmd = m_vertices.prev_vertex(&x_ctrl, &y_ctrl);
+        if(is_curve(cmd))
+        {
+            x_ctrl = x0 + x0 - x_ctrl;
+            y_ctrl = y0 + y0 - y_ctrl;
+        }
+        else
+        {
+            x_ctrl = x0;
+            y_ctrl = y0;
+        }
+        curve3(x_ctrl, y_ctrl, x_to, y_to);
+    }
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+void path_adapter<VC>::curve3_rel(double dx_to, double dy_to)
+{
+    rel_to_abs(&dx_to, &dy_to);
+    curve3(dx_to, dy_to);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+void path_adapter<VC>::curve4(double x_ctrl1, double y_ctrl1, 
+                              double x_ctrl2, double y_ctrl2, 
+                              double x_to,    double y_to)
+{
+    m_vertices.add_vertex(x_ctrl1, y_ctrl1, path_cmd_curve4);
+    m_vertices.add_vertex(x_ctrl2, y_ctrl2, path_cmd_curve4);
+    m_vertices.add_vertex(x_to,    y_to,    path_cmd_curve4);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+void path_adapter<VC>::curve4_rel(double dx_ctrl1, double dy_ctrl1, 
+                                  double dx_ctrl2, double dy_ctrl2, 
+                                  double dx_to,    double dy_to)
+{
+    rel_to_abs(&dx_ctrl1, &dy_ctrl1);
+    rel_to_abs(&dx_ctrl2, &dy_ctrl2);
+    rel_to_abs(&dx_to,    &dy_to);
+    m_vertices.add_vertex(dx_ctrl1, dy_ctrl1, path_cmd_curve4);
+    m_vertices.add_vertex(dx_ctrl2, dy_ctrl2, path_cmd_curve4);
+    m_vertices.add_vertex(dx_to,    dy_to,    path_cmd_curve4);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+void path_adapter<VC>::curve4(double x_ctrl2, double y_ctrl2, 
+                              double x_to,    double y_to)
+{
+    double x0;
+    double y0;
+    if(is_vertex(last_vertex(&x0, &y0)))
+    {
+        double x_ctrl1;
+        double y_ctrl1; 
+        unsigned cmd = prev_vertex(&x_ctrl1, &y_ctrl1);
+        if(is_curve(cmd))
+        {
+            x_ctrl1 = x0 + x0 - x_ctrl1;
+            y_ctrl1 = y0 + y0 - y_ctrl1;
+        }
+        else
+        {
+            x_ctrl1 = x0;
+            y_ctrl1 = y0;
+        }
+        curve4(x_ctrl1, y_ctrl1, x_ctrl2, y_ctrl2, x_to, y_to);
+    }
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+void path_adapter<VC>::curve4_rel(double dx_ctrl2, double dy_ctrl2, 
+                                  double dx_to,    double dy_to)
+{
+    rel_to_abs(&dx_ctrl2, &dy_ctrl2);
+    rel_to_abs(&dx_to,    &dy_to);
+    curve4(dx_ctrl2, dy_ctrl2, dx_to, dy_to);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+inline void path_adapter<VC>::end_poly(unsigned flags)
+{
+    if(is_vertex(m_vertices.last_command()))
+    {
+        m_vertices.add_vertex(0.0, 0.0, path_cmd_end_poly | flags);
+    }
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+inline void path_adapter<VC>::close_polygon(unsigned flags)
+{
+    end_poly(path_flags_close | flags);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+inline unsigned path_adapter<VC>::total_vertices() const
+{
+    return m_vertices.total_vertices();
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+inline unsigned path_adapter<VC>::last_vertex(double* x, double* y) const
+{
+    return m_vertices.last_vertex(x, y);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+inline unsigned path_adapter<VC>::prev_vertex(double* x, double* y) const
+{
+    return m_vertices.prev_vertex(x, y);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+inline double path_adapter<VC>::last_x() const
+{
+    return m_vertices.last_x();
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+inline double path_adapter<VC>::last_y() const
+{
+    return m_vertices.last_y();
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+inline unsigned path_adapter<VC>::vertex(unsigned idx, double* x, double* y) const
+{
+    return m_vertices.vertex(idx, x, y);
+}
+ 
+//------------------------------------------------------------------------
+template<class VC> 
+inline unsigned path_adapter<VC>::command(unsigned idx) const
+{
+    return m_vertices.command(idx);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+void path_adapter<VC>::modify_vertex(unsigned idx, double x, double y)
+{
+    m_vertices.modify_vertex(idx, x, y);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+void path_adapter<VC>::modify_vertex(unsigned idx, double x, double y, unsigned cmd)
+{
+    m_vertices.modify_vertex(idx, x, y, cmd);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+void path_adapter<VC>::modify_command(unsigned idx, unsigned cmd)
+{
+    m_vertices.modify_command(idx, cmd);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+inline void path_adapter<VC>::rewind(unsigned path_id)
+{
+    m_iterator = path_id;
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+inline unsigned path_adapter<VC>::vertex(double* x, double* y)
+{
+    if(m_iterator >= m_vertices.total_vertices()) return path_cmd_stop;
+    return m_vertices.vertex(m_iterator++, x, y);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+unsigned path_adapter<VC>::perceive_polygon_orientation(unsigned start,
+                                                        unsigned end)
+{
+    // Calculate signed area (double area to be exact)
+    //---------------------
+    unsigned np = end - start;
+    double area = 0.0;
+    unsigned i;
+    for(i = 0; i < np; i++)
+    {
+        double x1, y1, x2, y2;
+        m_vertices.vertex(start + i,            &x1, &y1);
+        m_vertices.vertex(start + (i + 1) % np, &x2, &y2);
+        area += x1 * y2 - y1 * x2;
+    }
+    return (area < 0.0) ? path_flags_cw : path_flags_ccw;
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+void path_adapter<VC>::invert_polygon(unsigned start, unsigned end)
+{
+    unsigned i;
+    unsigned tmp_cmd = m_vertices.command(start);
+        
+    --end; // Make "end" inclusive
+
+    // Shift all commands to one position
+    for(i = start; i < end; i++)
+    {
+        m_vertices.modify_command(i, m_vertices.command(i + 1));
+    }
+
+    // Assign starting command to the ending command
+    m_vertices.modify_command(end, tmp_cmd);
+
+    // Reverse the polygon
+    while(end > start)
+    {
+        m_vertices.swap_vertices(start++, end--);
+    }
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+void path_adapter<VC>::invert_polygon(unsigned start)
+{
+    // Skip all non-vertices at the beginning
+    while(start < m_vertices.total_vertices() && 
+          !is_vertex(m_vertices.command(start))) ++start;
+
+    // Skip all insignificant move_to
+    while(start+1 < m_vertices.total_vertices() && 
+          is_move_to(m_vertices.command(start)) &&
+          is_move_to(m_vertices.command(start+1))) ++start;
+
+    // Find the last vertex
+    unsigned end = start + 1;
+    while(end < m_vertices.total_vertices() && 
+          !is_next_poly(m_vertices.command(end))) ++end;
+
+    invert_polygon(start, end);
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+unsigned path_adapter<VC>::arrange_polygon_orientation(unsigned start, 
+                                                       path_flags_e orientation)
+{
+    if(orientation == path_flags_none) return start;
+        
+    // Skip all non-vertices at the beginning
+    while(start < m_vertices.total_vertices() && 
+          !is_vertex(m_vertices.command(start))) ++start;
+
+    // Skip all insignificant move_to
+    while(start+1 < m_vertices.total_vertices() && 
+          is_move_to(m_vertices.command(start)) &&
+          is_move_to(m_vertices.command(start+1))) ++start;
+
+    // Find the last vertex
+    unsigned end = start + 1;
+    while(end < m_vertices.total_vertices() && 
+          !is_next_poly(m_vertices.command(end))) ++end;
+
+    if(end - start > 2)
+    {
+        if(perceive_polygon_orientation(start, end) != unsigned(orientation))
+        {
+            // Invert polygon, set orientation flag, and skip all end_poly
+            invert_polygon(start, end);
+            unsigned cmd;
+            while(end < m_vertices.total_vertices() && 
+                  is_end_poly(cmd = m_vertices.command(end)))
+            {
+                m_vertices.modify_command(end++, set_orientation(cmd, orientation));
+            }
+        }
+    }
+    return end;
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+unsigned path_adapter<VC>::arrange_orientations(unsigned start, 
+                                                path_flags_e orientation)
+{
+    if(orientation != path_flags_none)
+    {
+        while(start < m_vertices.total_vertices())
+        {
+            start = arrange_polygon_orientation(start, orientation);
+            if(is_stop(m_vertices.command(start)))
+            {
+                ++start;
+                break;
+            }
+        }
+    }
+    return start;
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+void path_adapter<VC>::arrange_orientations_all_paths(path_flags_e orientation)
+{
+    if(orientation != path_flags_none)
+    {
+        unsigned start = 0;
+        while(start < m_vertices.total_vertices())
+        {
+            start = arrange_orientations(start, orientation);
+        }
+    }
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+void path_adapter<VC>::flip_x(double x1, double x2)
+{
+    unsigned i;
+    double x, y;
+    for(i = 0; i < m_vertices.total_vertices(); i++)
+    {
+        unsigned cmd = m_vertices.vertex(i, &x, &y);
+        if(is_vertex(cmd))
+        {
+            m_vertices.modify_vertex(i, x2 - x + x1, y);
+        }
+    }
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+void path_adapter<VC>::flip_y(double y1, double y2)
+{
+    unsigned i;
+    double x, y;
+    for(i = 0; i < m_vertices.total_vertices(); i++)
+    {
+        unsigned cmd = m_vertices.vertex(i, &x, &y);
+        if(is_vertex(cmd))
+        {
+            m_vertices.modify_vertex(i, x, y2 - y + y1);
+        }
+    }
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+void path_adapter<VC>::translate(double dx, double dy, unsigned path_id)
+{
+    unsigned num_ver = m_vertices.total_vertices();
+    for(; path_id < num_ver; path_id++)
+    {
+        double x, y;
+        unsigned cmd = m_vertices.vertex(path_id, &x, &y);
+        if(is_stop(cmd)) break;
+        if(is_vertex(cmd))
+        {
+            x += dx;
+            y += dy;
+            m_vertices.modify_vertex(path_id, x, y);
+        }
+    }
+}
+
+//------------------------------------------------------------------------
+template<class VC> 
+void path_adapter<VC>::translate_all_paths(double dx, double dy)
+{
+    unsigned idx;
+    unsigned num_ver = m_vertices.total_vertices();
+    for(idx = 0; idx < num_ver; idx++)
+    {
+        double x, y;
+        if(is_vertex(m_vertices.vertex(idx, &x, &y)))
+        {
+            x += dx;
+            y += dy;
+            m_vertices.modify_vertex(idx, x, y);
+        }
+    }
+}
+
+
+template<class Container> class vertex_stl_adapter : boost::noncopyable
+{
+public:
+    
+    typedef typename Container::value_type vertex_type;
+    typedef typename vertex_type::value_type value_type;
+    
+    explicit vertex_stl_adapter(Container & vertices)
+        : m_vertices(vertices) {}
+    
+    void add_vertex(double x, double y, unsigned cmd)
+    {
+        m_vertices.push_back(vertex_type(value_type(x), 
+                                         value_type(y), 
+                                         int8u(cmd)));
+    }
+
+    void modify_vertex(unsigned idx, double x, double y)
+    {
+        vertex_type& v = m_vertices[idx];
+        v.x = value_type(x);
+        v.y = value_type(y);
+    }
+
+    void modify_vertex(unsigned idx, double x, double y, unsigned cmd)
+    {
+        vertex_type& v = m_vertices[idx];
+        v.x   = value_type(x);
+        v.y   = value_type(y);
+        v.cmd = int8u(cmd);
+    }
+
+    void modify_command(unsigned idx, unsigned cmd)
+    {
+        m_vertices[idx].cmd = int8u(cmd);
+    }
+
+    void swap_vertices(unsigned v1, unsigned v2)
+    {
+        vertex_type t = m_vertices[v1];
+        m_vertices[v1] = m_vertices[v2];
+        m_vertices[v2] = t;
+    }
+
+    unsigned last_command() const
+    {
+        return m_vertices.size() ? 
+            m_vertices[m_vertices.size() - 1].cmd : 
+            (unsigned)path_cmd_stop;
+    }
+
+    unsigned last_vertex(double* x, double* y) const
+    {
+        if(m_vertices.size() == 0)
+        {
+            *x = *y = 0.0;
+            return path_cmd_stop;
+        }
+        return vertex(m_vertices.size() - 1, x, y);
+    }
+
+    unsigned prev_vertex(double* x, double* y) const
+    {
+        if(m_vertices.size() < 2)
+        {
+            *x = *y = 0.0;
+            return path_cmd_stop;
+        }
+        return vertex(m_vertices.size() - 2, x, y);
+    }
+
+    double last_x() const
+    {
+        return m_vertices.size() ? m_vertices[m_vertices.size() - 1].x : 0.0;
+    }
+
+    double last_y() const
+    {
+        return m_vertices.size() ? m_vertices[m_vertices.size() - 1].y : 0.0;
+    }
+
+    unsigned total_vertices() const
+    {
+        return m_vertices.size();
+    }
+
+    unsigned vertex(unsigned idx, double* x, double* y) const
+    {
+        const vertex_type& v = m_vertices[idx];
+        *x = v.x;
+        *y = v.y;
+        return v.cmd;
+    }
+
+    unsigned command(unsigned idx) const
+    {
+        return m_vertices[idx].cmd;
+    }
+
+private:
+    Container & m_vertices;
+};
+
+
+typedef std::vector<vertex_d> svg_path_storage;
+
+typedef path_adapter<vertex_stl_adapter<svg_path_storage> > svg_path_adapter; 
+
+}}
+
+#endif // MAPNIK_SVG_PATH_ADAPTER
diff --git a/include/mapnik/svg/svg_path_attributes.hpp b/include/mapnik/svg/svg_path_attributes.hpp
new file mode 100644
index 0000000..a1a7250
--- /dev/null
+++ b/include/mapnik/svg/svg_path_attributes.hpp
@@ -0,0 +1,117 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+// $Id$
+
+#ifndef MAPNIK_SVG_PATH_ATTRIBUTES_HPP
+#define MAPNIK_SVG_PATH_ATTRIBUTES_HPP
+
+#include "agg_math_stroke.h"
+#include "agg_color_rgba.h"
+#include "agg_pixfmt_rgba.h"
+#include "agg_trans_affine.h"
+
+#include <mapnik/gradient.hpp>
+
+namespace mapnik {
+namespace svg {
+
+struct path_attributes
+{
+    unsigned     index;
+    agg::rgba8   fill_color;
+    agg::rgba8   stroke_color;
+    double       opacity;
+    bool         fill_flag;
+    bool         stroke_flag;
+    bool         even_odd_flag;
+    bool         visibility_flag;
+    agg::line_join_e  line_join;
+    agg::line_cap_e   line_cap;
+    double       miter_limit;
+    double       stroke_width;
+    agg::trans_affine transform;
+    mapnik::gradient fill_gradient;
+    mapnik::gradient stroke_gradient;
+    
+    // Empty constructor
+    path_attributes() :
+        index(0),
+        fill_color(agg::rgba(0,0,0)),
+        stroke_color(agg::rgba(0,0,0)),
+        opacity(1.0),
+        fill_flag(true),
+        stroke_flag(false),
+        even_odd_flag(false),
+        visibility_flag(true),
+        line_join(agg::miter_join),
+        line_cap(agg::butt_cap),
+        miter_limit(4.0),
+        stroke_width(1.0),
+        transform(),
+        fill_gradient(),
+        stroke_gradient()
+    {
+    }
+
+    // Copy constructor
+    path_attributes(const path_attributes& attr) 
+        : index(attr.index),
+          fill_color(attr.fill_color),
+          stroke_color(attr.stroke_color),
+          opacity(attr.opacity),
+          fill_flag(attr.fill_flag),
+          stroke_flag(attr.stroke_flag),
+          even_odd_flag(attr.even_odd_flag),
+          visibility_flag(attr.visibility_flag),
+          line_join(attr.line_join),
+          line_cap(attr.line_cap),
+          miter_limit(attr.miter_limit),
+          stroke_width(attr.stroke_width),
+          transform(attr.transform),
+          fill_gradient(attr.fill_gradient),
+          stroke_gradient(attr.stroke_gradient)
+    {}
+
+    // Copy constructor with new index value
+    path_attributes(path_attributes const& attr, unsigned idx) 
+        : index(idx),
+          fill_color(attr.fill_color),
+          stroke_color(attr.stroke_color),
+          opacity(attr.opacity),
+          fill_flag(attr.fill_flag),
+          stroke_flag(attr.stroke_flag),
+          even_odd_flag(attr.even_odd_flag),
+          visibility_flag(attr.visibility_flag),
+          line_join(attr.line_join),
+          line_cap(attr.line_cap),
+          miter_limit(attr.miter_limit),
+          stroke_width(attr.stroke_width),
+          transform(attr.transform),
+          fill_gradient(attr.fill_gradient),
+          stroke_gradient(attr.stroke_gradient)
+    {}
+};
+
+}}
+
+#endif // MAPNIK_SVG_PATH_ATTRIBUTES_HPP
diff --git a/include/mapnik/svg/svg_path_commands.hpp b/include/mapnik/svg/svg_path_commands.hpp
new file mode 100644
index 0000000..6d9434d
--- /dev/null
+++ b/include/mapnik/svg/svg_path_commands.hpp
@@ -0,0 +1,261 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef SVG_COMMANDS_HPP
+#define SVG_COMMANDS_HPP
+
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/phoenix_function.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+
+namespace mapnik { namespace svg {
+
+    using namespace boost::fusion;
+
+    inline double deg2rad(double deg)
+    {
+        return (M_PI * deg)/180.0;
+    }
+    
+    template <typename PathType>
+    struct move_to
+    {
+        template <typename T0, typename T1>
+        struct result
+        {
+            typedef void type; 
+        };
+    
+        explicit move_to(PathType & path)
+            : path_(path) {}
+    
+        template  <typename T0, typename T1>
+        void operator() (T0 v, T1 rel) const
+        {
+            path_.move_to(at_c<0>(v),at_c<1>(v),rel); // impl
+        }
+    
+        PathType & path_;
+    };
+
+    template <typename PathType>
+    struct hline_to
+    {
+        template <typename T0, typename T1>
+        struct result
+        {
+            typedef void type; 
+        };
+    
+        explicit hline_to(PathType & path)
+            : path_(path) {}
+    
+        template  <typename T0, typename T1>
+        void operator() (T0 const& x, T1 rel) const
+        {
+            path_.hline_to(x,rel);
+        }
+    
+        PathType & path_;
+    };
+
+
+    template <typename PathType>
+    struct vline_to
+    {
+        template <typename T0, typename T1>
+        struct result
+        {
+            typedef void type; 
+        };
+    
+        explicit vline_to(PathType & path)
+            : path_(path) {}
+    
+        template  <typename T0, typename T1>
+        void operator() (T0 const& y, T1 rel) const
+        {
+            path_.vline_to(y,rel);
+        }
+    
+        PathType & path_;
+    };
+
+    template <typename PathType>
+    struct line_to
+    {
+        template <typename T0, typename T1>
+        struct result
+        {
+            typedef void type; 
+        };
+    
+        explicit line_to(PathType & path)
+            : path_(path) {}
+    
+        template  <typename T0, typename T1>
+        void operator() (T0 const& v, T1 rel) const
+        {
+            path_.line_to(at_c<0>(v),at_c<1>(v),rel); // impl
+        }
+    
+        PathType & path_;
+    };
+
+
+    template <typename PathType>
+    struct curve4
+    {
+        template <typename T0, typename T1, typename T2, typename T3>
+        struct result
+        {
+            typedef void type; 
+        };
+    
+        explicit curve4(PathType & path)
+            : path_(path) {}
+    
+        template  <typename T0, typename T1,typename T2, typename T3>
+        void operator() (T0 const& v0, T1 const& v1, T2 const& v2, T3 rel) const
+        {
+            path_.curve4(at_c<0>(v0),at_c<1>(v0),
+                         at_c<0>(v1),at_c<1>(v1),
+                         at_c<0>(v2),at_c<1>(v2),
+                         rel); // impl
+        }
+    
+        PathType & path_;
+    };
+
+
+    template <typename PathType>
+    struct curve4_smooth
+    {
+        template <typename T0, typename T1, typename T2>
+        struct result
+        {
+            typedef void type; 
+        };
+    
+        explicit curve4_smooth(PathType & path)
+            : path_(path) {}
+    
+        template  <typename T0, typename T1,typename T2>
+        void operator() (T0 const& v0, T1 const& v1, T2 rel) const
+        {
+            path_.curve4(at_c<0>(v0),at_c<1>(v0),
+                         at_c<0>(v1),at_c<1>(v1),
+                         rel); // impl
+        }
+        PathType & path_;
+    };
+
+    template <typename PathType>
+    struct curve3
+    {
+        template <typename T0, typename T1, typename T2>
+        struct result
+        {
+            typedef void type; 
+        };
+    
+        explicit curve3(PathType & path)
+            : path_(path) {}
+    
+        template  <typename T0, typename T1,typename T2>
+        void operator() (T0 const& v0, T1 const& v1, T2 rel) const
+        {
+            path_.curve3(at_c<0>(v0),at_c<1>(v0),
+                         at_c<0>(v1),at_c<1>(v1),
+                         rel); // impl
+        }
+    
+        PathType & path_;
+    };
+
+    template <typename PathType>
+    struct curve3_smooth
+    {
+        template <typename T0, typename T1>
+        struct result
+        {
+            typedef void type; 
+        };
+    
+        explicit curve3_smooth(PathType & path)
+            : path_(path) {}
+    
+        template  <typename T0, typename T1>
+        void operator() (T0 const& v0, T1 rel) const
+        {
+            path_.curve3(at_c<0>(v0),at_c<1>(v0),
+                         rel); // impl
+        }
+    
+        PathType & path_;
+    };
+
+    template <typename PathType>
+    struct arc_to
+    {
+        template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>
+        struct result
+        {
+            typedef void type; 
+        };
+    
+        explicit arc_to(PathType & path)
+            : path_(path) {}
+    
+        template  <typename T0, typename T1,typename T2, typename T3, typename T4, typename T5>
+        void operator() (T0 const& rv, T1 const& angle, T2 large_arc_flag, T3 sweep_flag, T4 const& v, T5 rel) const
+        {
+            path_.arc_to(at_c<0>(rv),at_c<1>(rv),
+                         deg2rad(angle),large_arc_flag,sweep_flag,   
+                         at_c<0>(v),at_c<1>(v),
+                         rel); 
+        }
+    
+        PathType & path_;
+    };
+
+    template <typename PathType>
+    struct close
+    {
+        typedef void result_type;
+    
+        explicit close(PathType & path)
+            : path_(path) {}
+    
+        void operator()() const
+        {
+            path_.close_subpath();
+        }
+    
+        PathType & path_;
+    };
+
+    }}
+
+
+#endif // SVG_COMMANDS_HPP
diff --git a/include/mapnik/svg/svg_path_grammar.hpp b/include/mapnik/svg/svg_path_grammar.hpp
new file mode 100644
index 0000000..3cc078d
--- /dev/null
+++ b/include/mapnik/svg/svg_path_grammar.hpp
@@ -0,0 +1,155 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef SVG_PATH_GRAMMAR_HPP
+#define SVG_PATH_GRAMMAR_HPP
+
+// mapnik
+#include <mapnik/svg/svg_path_commands.hpp>
+// spirit
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/phoenix_function.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+
+namespace mapnik { namespace svg {
+
+    using namespace boost::spirit;
+    using namespace boost::fusion;
+    using namespace boost::phoenix;
+    
+    template <typename Iterator, typename SkipType, typename PathType>
+    struct svg_path_grammar : qi::grammar<Iterator,SkipType>
+    {
+        explicit svg_path_grammar(PathType & path)
+            : svg_path_grammar::base_type(start),
+              move_to_(move_to<PathType>(path)),
+              hline_to_(hline_to<PathType>(path)),
+              vline_to_(vline_to<PathType>(path)),
+              line_to_(line_to<PathType>(path)),
+              curve4_(curve4<PathType>(path)),
+              curve4_smooth_(curve4_smooth<PathType>(path)),
+              curve3_(curve3<PathType>(path)),
+              curve3_smooth_(curve3_smooth<PathType>(path)),
+              arc_to_(arc_to<PathType>(path)),
+              close_(close<PathType>(path))
+        {
+            using qi::_1;
+            using qi::_2;
+            using qi::_3;
+            using qi::_4;
+            using qi::_5;
+            using qi::_a;
+            using qi::lit;
+            using qi::double_;
+            using qi::int_;
+            using qi::no_case;
+        
+            start = +cmd;
+            cmd = M  >> *drawto_cmd;
+            drawto_cmd =  L | H | V | C | S | Q | T | A | Z;
+            
+            M = (lit('M')[_a = false] | lit('m')[_a = true] ) 
+                >> coord[move_to_(_1,_a)] // move_to
+                >> *(-lit(',') >> coord [ line_to_(_1,_a) ] ); // *line_to
+        
+            H = (lit('H')[_a = false] | lit('h')[_a = true])
+                >> +double_[ hline_to_(_1,_a) ] ; // +hline_to
+        
+            V = (lit('V')[_a = false] | lit('v')[_a = true])
+                >> +double_ [ vline_to_(_1,_a) ]; // +vline_to
+        
+            L = (lit('L')[_a = false] | lit('l')[_a = true])
+                >> +coord [ line_to_(_1,_a) ]; // +line_to
+        
+            C = (lit('C')[_a = false] | lit('c')[_a = true])
+                >> +(coord 
+                     >> -lit(',') 
+                     >> coord 
+                     >> -lit(',') 
+                     >> coord) [ curve4_(_1,_2,_3,_a) ]; // +curve4
+        
+            S = (lit('S')[_a = false] | lit('s')[_a = true])
+                >> +(coord 
+                     >> -lit(',') 
+                     >> coord) [ curve4_smooth_(_1,_2,_a) ]; // +curve4_smooth (smooth curveto)
+        
+            Q = (lit('Q')[_a = false] | lit('q')[_a = true])
+                >> +(coord 
+                     >> -lit(',') 
+                     >> coord) [ curve3_(_1,_2,_a) ]; // +curve3 (quadratic-bezier-curveto)
+        
+            T = (lit('T')[_a = false] | lit('t')[_a = true])
+                >> +(coord ) [ curve3_smooth_(_1,_a) ]; // +curve3_smooth (smooth-quadratic-bezier-curveto)
+        
+            A = (lit('A')[_a = false] | lit('a')[_a = true])
+                >> +(coord 
+                     >> -lit(',')
+                     >> double_ 
+                     >> -lit(',')
+                     >> int_ 
+                     >> -lit(',')
+                     >> int_ 
+                     >> -lit(',') 
+                     >> coord) [arc_to_(_1,_2,_3,_4,_5,_a)]; // arc_to;
+        
+        
+
+            Z = no_case[lit('z')] [close_()]; // close path
+        
+            coord = double_ >> -lit(',') >> double_;
+        }
+    
+        // rules
+        qi::rule<Iterator,SkipType> start;
+        qi::rule<Iterator,SkipType> cmd;
+        qi::rule<Iterator,SkipType> drawto_cmd;
+        qi::rule<Iterator,qi::locals<bool>,SkipType> M; // M,m
+        qi::rule<Iterator,qi::locals<bool>,SkipType> L; // L,l
+        qi::rule<Iterator,qi::locals<bool>,SkipType> H; // H,h
+        qi::rule<Iterator,qi::locals<bool>,SkipType> V; // V,v
+        qi::rule<Iterator,qi::locals<bool>,SkipType> C; // C,c
+        qi::rule<Iterator,qi::locals<bool>,SkipType> S; // S,s
+        qi::rule<Iterator,qi::locals<bool>,SkipType> Q; // Q,q
+        qi::rule<Iterator,qi::locals<bool>,SkipType> T; // T,t
+        qi::rule<Iterator,qi::locals<bool>,SkipType> A; // A,a
+        qi::rule<Iterator,SkipType> Z;                  // Z,z
+    
+        qi::rule<Iterator,vector2<double,double>(),SkipType> coord;
+    
+        // commands
+        function<move_to<PathType> > move_to_;
+        function<hline_to<PathType> > hline_to_;
+        function<vline_to<PathType> > vline_to_;
+        function<line_to<PathType> > line_to_;
+        function<curve4<PathType> > curve4_;
+        function<curve4_smooth<PathType> > curve4_smooth_;
+        function<curve3<PathType> > curve3_;
+        function<curve3_smooth<PathType> > curve3_smooth_;
+        function<arc_to<PathType> > arc_to_;
+        function<close<PathType> > close_;
+    };
+
+    }}
+
+
+#endif // SVG_PATH_GRAMMAR_HPP
diff --git a/include/mapnik/svg/svg_path_iterator.hpp b/include/mapnik/svg/svg_path_iterator.hpp
new file mode 100644
index 0000000..30bb847
--- /dev/null
+++ b/include/mapnik/svg/svg_path_iterator.hpp
@@ -0,0 +1,181 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef SVG_PATH_ITERATOR_HPP
+#define SVG_PATH_ITERATOR_HPP
+
+// mapnik
+#include <mapnik/geometry.hpp>
+#include <mapnik/ctrans.hpp>
+
+// boost
+#include <boost/iterator/iterator_adaptor.hpp>
+#include <boost/tuple/tuple.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/make_shared.hpp>
+
+namespace mapnik {
+namespace svg {
+
+using namespace mapnik;
+
+/*
+ * @brief Iterator class used to iterate over geometry vertexes.
+ * Since mapnik::geometry provides access to the components of 
+ * a vertex only through variables passed by reference,
+ * geometry_iterator retrieves these components (command, x coord,
+ * and y coord) and makes them available inside tuples.
+ *
+ * This iterator exposes the behavior of a forward iterator and
+ * subclasses boost::iterator_adaptor, which already implements
+ * several iterator operations, such as dereferencing.
+ *
+ * @tparam Value the type of sequence element dereferenced.
+ * @tparam Container the sequence over which it iterates.
+*/
+template <typename Value, typename Container>
+class path_iterator
+  : public boost::iterator_adaptor<path_iterator<Value, Container>,
+                                   Value*,
+                                   boost::use_default,
+                                   boost::forward_traversal_tag>
+{
+public:
+    typedef Value value_type;
+    typedef Container container_type;
+    typedef typename Container::value_type value_component_type;
+
+    /*! 
+     * @brief Constructor that initializes the reference to the current element to null.
+     * This constructor is suitable to mark the end of the iterator (analogous to 
+     * calling end_iterator() in an STL container).
+     *
+     * @param geometry the geometry that handles the vector of vertexes.
+     */
+    path_iterator(Container const& path)
+      : path_iterator::iterator_adaptor_(0),
+        path_(path),
+        first_value_(boost::make_shared<Value>(0,0,0))
+    {}
+
+    /*!
+     * This constructor receives the first element of the sequence as a pointer.
+     * Since the container type will likely be a mapnik::geometry, this 
+     * first element would need to be obtained in a similar way as the increment
+     * method below. For this reason, most of the time this constructor will
+     * be called with a null pointer. The body of the constructor makes a call
+     * to increment() in order to obtain this first element from the container.
+     *
+     * @param p pointer to the first element of the sequence.
+     * @param geometry the geometry that handles the vector of vertexes.    
+     */
+    explicit path_iterator(Value* first_element, Container const& path) 
+      : path_iterator::iterator_adaptor_(first_element),
+        path_(path),
+        first_value_(boost::make_shared<Value>(0,0,0))
+    {
+        this->increment();
+    }
+
+    struct enabler {};
+
+    /*!
+     * @brief Constructor that enables operation between const and non-const iterators.
+     * @sa http://www.boost.org/doc/libs/1_45_0/libs/iterator/doc/iterator_facade.html#interoperability
+     */
+    template <typename OtherValue>
+    path_iterator(path_iterator<OtherValue, Container> const& other,
+                      typename boost::enable_if<boost::is_convertible<OtherValue*, Value*>,
+          enabler>::type = enabler())   
+      : path_iterator::iterator_adaptor_(other.base()) {}
+
+private:
+
+    // grant access to iterator_adaptor to handle iteration properly.
+    friend class boost::iterator_core_access;
+
+    /*!
+     * @brief Advance the iterator.
+     */
+    void increment()
+    {
+        // variables used to extract vertex components.
+        geometry_type::value_type x;
+        geometry_type::value_type y;
+
+        // extract next vertex components.
+        unsigned cmd = path_.vertex(&x, &y);
+
+        if(cmd == SEG_END)
+        {
+            // if the end of the sequence is reached, set the reference
+            // to the current element to null, so it matches the value
+            // that marks the end of the sequence as defined in the 
+            // "end_iterator" constructor.
+            this->base_reference() = 0;
+        }
+        else if(this->base_reference() == 0)
+        {
+            // the first element of the container is stored in the 
+            // member variable 'first_value_' and later assigned
+            // to the reference that boost::iterator_adaptor stores
+            // to track the current element.
+            //
+            // 'first_value_' is used as intermediate storage
+            // because the compiler prohibits the assignment of the
+            // address of a temporary object (&Value(...)).
+            *first_value_ = Value(cmd, x, y);
+            this->base_reference() = first_value_.get();
+        }
+        else
+        {
+            // point the reference to the current element to the next.
+            *(this->base_reference()) = Value(cmd, x, y);
+        }
+    }
+
+    /*!
+     * @brief Test whether the current element is equal to 'other'.
+     * @tparam OtherValue the value type of the other iterator (it may be const or non-const).
+     * @param other iterator to compare to current element.
+     */
+    template <typename OtherValue>
+    bool equal(path_iterator<OtherValue, Container> const& other) const
+    {
+        return this->base_reference() == other.base();
+    }
+
+    Container const& path_;
+    boost::shared_ptr<Value> first_value_;
+};
+
+/*!
+ * @brief Specialization of geometry_iterator, as needed by mapnik::svg::svg_path_data_grammar.
+ * The Value type is a boost::tuple that holds 5 elements, the command and the x and y coordinate.
+ * Each coordinate is stored twice to match the needs of the grammar.
+ */
+typedef path_iterator<boost::tuple<unsigned, geometry_type::value_type, geometry_type::value_type>, 
+                      coord_transform2<CoordTransform, geometry_type> > path_iterator_type;
+
+}}
+
+#endif //SVG_PATH_ITERATOR_HPP
diff --git a/include/mapnik/svg/svg_path_parser.hpp b/include/mapnik/svg/svg_path_parser.hpp
new file mode 100644
index 0000000..b21e939
--- /dev/null
+++ b/include/mapnik/svg/svg_path_parser.hpp
@@ -0,0 +1,45 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef SVG_PATH_PARSER_HPP
+#define SVG_PATH_PARSER_HPP
+
+#include <string>
+
+namespace mapnik { namespace svg {
+
+template <typename PathType>
+bool parse_path(const char * wkt, PathType & p);
+
+template <typename PathType>
+bool parse_points(const char * wkt, PathType & p);
+
+template <typename TransformType>
+bool parse_transform(const char * wkt, TransformType & tr);
+
+template <typename TransformType>
+bool parse_transform(std::string const&  wkt, TransformType & tr);
+
+}}
+
+
+#endif // SVG_PATH_PARSER_HPP
diff --git a/include/mapnik/svg/svg_points_grammar.hpp b/include/mapnik/svg/svg_points_grammar.hpp
new file mode 100644
index 0000000..77e1a24
--- /dev/null
+++ b/include/mapnik/svg/svg_points_grammar.hpp
@@ -0,0 +1,72 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef SVG_POINTS_GRAMMAR_HPP
+#define SVG_POINTS_GRAMMAR_HPP
+
+// mapnik
+#include <mapnik/svg/svg_path_commands.hpp>
+// spirit
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/phoenix_function.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+
+namespace mapnik { namespace svg {
+
+    using namespace boost::spirit;
+    using namespace boost::fusion;
+    using namespace boost::phoenix;
+
+    template <typename Iterator, typename SkipType, typename PathType>
+    struct svg_points_grammar : qi::grammar<Iterator,SkipType>
+    {
+        explicit svg_points_grammar(PathType & path)
+            : svg_points_grammar::base_type(start),
+              move_to_(move_to<PathType>(path)),
+              line_to_(line_to<PathType>(path)),
+              close_(close<PathType>(path))
+        {
+            using qi::_1;
+            using qi::_2;
+            using qi::double_;
+        
+            start = coord[move_to_(_1,false)] // move_to
+                >> *(-lit(',') >> coord [ line_to_(_1,false) ] ); // *line_to
+        
+            coord = double_ >> -lit(',') >> double_;
+        }
+    
+        // rules
+        qi::rule<Iterator,SkipType> start;
+        qi::rule<Iterator,vector2<double,double>(),SkipType> coord;
+    
+        // commands
+        function<move_to<PathType> > move_to_;
+        function<line_to<PathType> > line_to_;
+        function<close<PathType> > close_;
+    };
+
+    }}
+
+
+#endif // SVG_POINTS_GRAMMAR_HPP
diff --git a/include/mapnik/svg/svg_renderer.hpp b/include/mapnik/svg/svg_renderer.hpp
new file mode 100644
index 0000000..e13e36a
--- /dev/null
+++ b/include/mapnik/svg/svg_renderer.hpp
@@ -0,0 +1,440 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_SVG_RENDERER_HPP
+#define MAPNIK_SVG_RENDERER_HPP
+
+// mapnik
+#include <mapnik/svg/svg_path_attributes.hpp>
+#include <mapnik/gradient.hpp>
+#include <mapnik/box2d.hpp>
+#include <mapnik/grid/grid_pixel.hpp>
+
+// boost
+#include <boost/utility.hpp>
+#include <boost/foreach.hpp>
+
+// agg
+#include "agg_path_storage.h"
+#include "agg_conv_transform.h"
+#include "agg_conv_stroke.h"
+#include "agg_conv_contour.h"
+#include "agg_conv_curve.h"
+#include "agg_color_rgba.h"
+#include "agg_bounding_rect.h"
+#include "agg_rendering_buffer.h"
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_scanline_u.h"
+#include "agg_scanline_p.h"
+#include "agg_scanline_bin.h"
+#include "agg_renderer_scanline.h"
+#include "agg_span_allocator.h"
+#include "agg_span_gradient.h"
+#include "agg_gradient_lut.h"
+#include "agg_gamma_lut.h"
+#include "agg_span_interpolator_linear.h"
+#include "agg_pixfmt_rgba.h"
+
+namespace mapnik  {
+namespace svg {
+
+
+/**
+ * Arbitrary linear gradient specified by two control points. Gradient
+ * value is taken as the normalised distance along the line segment
+ * represented by the two points.
+ */
+class linear_gradient_from_segment
+{
+public:
+    linear_gradient_from_segment(double x1, double y1, double x2, double y2) :
+        x1_(x1*agg::gradient_subpixel_scale),
+        y1_(y1*agg::gradient_subpixel_scale),
+        x2_(x2*agg::gradient_subpixel_scale),
+        y2_(y2*agg::gradient_subpixel_scale)
+    {
+        double dx = x2_-x1_;
+        double dy = y2_-y1_;
+        length_sqr_ = dx*dx+dy*dy;
+    }
+
+    int calculate(int x, int y, int d) const
+    {
+        if (length_sqr_ <= 0)
+            return 0;
+        double u = ((x-x1_)*(x2_-x1_) + (y-y1_)*(y2_-y1_))/length_sqr_;
+        if (u < 0)
+            u = 0;
+        else if (u > 1)
+            u = 1;
+        return u*d;
+    }
+private:
+    double x1_;
+    double y1_;
+    double x2_;
+    double y2_;
+
+    double length_sqr_;
+
+};
+
+template <typename VertexSource, typename AttributeSource, typename ScanlineRenderer, typename PixelFormat> 
+class svg_renderer : boost::noncopyable
+{
+    typedef agg::conv_curve<VertexSource>            curved_type;
+    typedef agg::conv_stroke<curved_type>            curved_stroked_type;
+    typedef agg::conv_transform<curved_stroked_type> curved_stroked_trans_type;    
+    typedef agg::conv_transform<curved_type>         curved_trans_type;
+    typedef agg::conv_contour<curved_trans_type>     curved_trans_contour_type;
+    typedef agg::renderer_base<PixelFormat> renderer_base;
+    
+public:
+    svg_renderer(VertexSource & source, AttributeSource const& attributes)
+        : source_(source),
+          curved_(source_),
+          curved_stroked_(curved_),
+          attributes_(attributes) {}
+    
+    template <typename Rasterizer, typename Scanline, typename Renderer>
+    void render_gradient(Rasterizer& ras,
+            Scanline& sl,
+            Renderer& ren,
+            const gradient &grad,
+            agg::trans_affine const& mtx,
+            double opacity,
+            const box2d<double> &symbol_bbox,
+            const box2d<double> &path_bbox)
+    {
+        typedef agg::gamma_lut<agg::int8u, agg::int8u> gamma_lut_type;
+        typedef agg::gradient_lut<agg::color_interpolator<agg::rgba8>, 1024> color_func_type;
+        typedef agg::span_interpolator_linear<> interpolator_type;
+        typedef agg::span_allocator<agg::rgba8> span_allocator_type;
+
+        span_allocator_type             m_alloc;
+        color_func_type                 m_gradient_lut;
+        gamma_lut_type                  m_gamma_lut;
+
+        double x1,x2,y1,y2,radius;
+        grad.get_control_points(x1,y1,x2,y2,radius);
+
+        m_gradient_lut.remove_all();
+        BOOST_FOREACH ( mapnik::stop_pair const& st, grad.get_stop_array() )
+        {
+            mapnik::color const& stop_color = st.second;
+            unsigned r= stop_color.red();
+            unsigned g= stop_color.green();
+            unsigned b= stop_color.blue();
+            unsigned a= stop_color.alpha();
+            //std::clog << "r: " << r << " g: " << g << " b: " << b << "a: " << a << "\n";
+            m_gradient_lut.add_color(st.first, agg::rgba8(r, g, b, int(a * opacity)));
+        }
+        m_gradient_lut.build_lut();
+
+        agg::trans_affine transform = mtx;
+        transform.invert();
+        agg::trans_affine tr;
+        tr = grad.get_transform();
+        tr.invert();
+        transform *= tr;
+
+        if (grad.get_units() != USER_SPACE_ON_USE)
+        {
+            double bx1=symbol_bbox.minx();
+            double by1=symbol_bbox.miny();
+            double bx2=symbol_bbox.maxx();
+            double by2=symbol_bbox.maxy();
+
+            if (grad.get_units() == OBJECT_BOUNDING_BOX)
+            {
+                bx1=path_bbox.minx();
+                by1=path_bbox.miny();
+                bx2=path_bbox.maxx();
+                by2=path_bbox.maxy();
+            }
+
+            transform.translate(-bx1,-by1);
+            transform.scale(1.0/(bx2-bx1),1.0/(by2-by1));
+        }
+
+
+        if (grad.get_gradient_type() == RADIAL)
+        {
+            typedef agg::gradient_radial_focus gradient_adaptor_type;
+            typedef agg::span_gradient<agg::rgba8,
+                                       interpolator_type,
+                                       gradient_adaptor_type,
+                                       color_func_type> span_gradient_type;
+
+            // the agg radial gradient assumes it is centred on 0
+            transform.translate(-x2,-y2);
+
+            // scale everything up since agg turns things into integers a bit too soon
+            int scaleup=255;
+            radius*=scaleup;
+            x1*=scaleup;
+            y1*=scaleup;
+            x2*=scaleup;
+            y2*=scaleup;
+
+            transform.scale(scaleup,scaleup);
+            interpolator_type     span_interpolator(transform);
+            gradient_adaptor_type gradient_adaptor(radius,(x1-x2),(y1-y2));
+
+            span_gradient_type    span_gradient(span_interpolator,
+                                              gradient_adaptor,
+                                              m_gradient_lut,
+                                              0, radius);
+
+            render_scanlines_aa(ras, sl, ren, m_alloc, span_gradient);
+        }
+        else
+        {
+            typedef linear_gradient_from_segment gradient_adaptor_type;
+            typedef agg::span_gradient<agg::rgba8,
+                                       interpolator_type,
+                                       gradient_adaptor_type,
+                                       color_func_type> span_gradient_type;
+
+            // scale everything up since agg turns things into integers a bit too soon
+            int scaleup=255;
+            x1*=scaleup;
+            y1*=scaleup;
+            x2*=scaleup;
+            y2*=scaleup;
+
+            transform.scale(scaleup,scaleup);
+
+            interpolator_type     span_interpolator(transform);
+            gradient_adaptor_type gradient_adaptor(x1,y1,x2,y2);
+
+            span_gradient_type    span_gradient(span_interpolator,
+                                              gradient_adaptor,
+                                              m_gradient_lut,
+                                              0, scaleup);
+
+            render_scanlines_aa(ras, sl, ren, m_alloc, span_gradient);
+        }
+    }
+
+    template <typename Rasterizer, typename Scanline, typename Renderer>
+    void render(Rasterizer& ras, 
+                Scanline& sl,
+                Renderer& ren, 
+                agg::trans_affine const& mtx, 
+                double opacity,
+                const box2d<double> &symbol_bbox)
+    
+    {
+        using namespace agg;
+        
+        trans_affine transform;
+        curved_stroked_trans_type curved_stroked_trans(curved_stroked_,transform);
+        curved_trans_type         curved_trans(curved_,transform);
+        curved_trans_contour_type curved_trans_contour(curved_trans);
+        
+        curved_trans_contour.auto_detect_orientation(true);
+        
+        for(unsigned i = 0; i < attributes_.size(); ++i)
+        {
+            mapnik::svg::path_attributes const& attr = attributes_[i];
+            if (!attr.visibility_flag)
+                continue;
+
+            transform = attr.transform;
+
+            double bx1,by1,bx2,by2;
+            bounding_rect_single(curved_trans, attr.index, &bx1, &by1, &bx2, &by2);
+            box2d<double> path_bbox(bx1,by1,bx2,by2);
+
+            transform *= mtx;
+            double scl = transform.scale();
+            //curved_.approximation_method(curve_inc);
+            curved_.approximation_scale(scl);
+            curved_.angle_tolerance(0.0);
+            
+            rgba8 color;
+
+            if (attr.fill_flag || attr.fill_gradient.get_gradient_type() != NO_GRADIENT)
+            {
+                ras.reset();
+
+                if(fabs(curved_trans_contour.width()) < 0.0001)
+                {
+                    ras.add_path(curved_trans, attr.index);
+                }
+                else
+                {
+                    curved_trans_contour.miter_limit(attr.miter_limit);
+                    ras.add_path(curved_trans_contour, attr.index);
+                }
+
+                if(attr.fill_gradient.get_gradient_type() != NO_GRADIENT)
+                {
+                    render_gradient(ras, sl, ren, attr.fill_gradient, transform, attr.opacity * opacity, symbol_bbox, path_bbox);
+                }
+                else
+                {
+                    ras.filling_rule(attr.even_odd_flag ? fill_even_odd : fill_non_zero);
+                    color = attr.fill_color;
+                    color.opacity(color.opacity() * attr.opacity * opacity);
+                    ScanlineRenderer ren_s(ren);
+                    ren_s.color(color);
+                    render_scanlines(ras, sl, ren_s);
+                }
+            }
+
+            if (attr.stroke_flag || attr.stroke_gradient.get_gradient_type() != NO_GRADIENT)
+            {
+                curved_stroked_.width(attr.stroke_width);
+                //m_curved_stroked.line_join((attr.line_join == miter_join) ? miter_join_round : attr.line_join);
+                curved_stroked_.line_join(attr.line_join);
+                curved_stroked_.line_cap(attr.line_cap);
+                curved_stroked_.miter_limit(attr.miter_limit);
+                curved_stroked_.inner_join(inner_round);
+                curved_stroked_.approximation_scale(scl);
+
+                // If the *visual* line width is considerable we 
+                // turn on processing of curve cusps.
+                //---------------------
+                if(attr.stroke_width * scl > 1.0)
+                {
+                    curved_.angle_tolerance(0.2);
+                }
+                ras.reset();
+                ras.add_path(curved_stroked_trans, attr.index);
+
+                if(attr.stroke_gradient.get_gradient_type() != NO_GRADIENT)
+                {
+                    render_gradient(ras, sl, ren, attr.stroke_gradient, transform, attr.opacity * opacity, symbol_bbox, path_bbox);
+                }
+                else
+                {
+                    ras.filling_rule(fill_non_zero);
+                    color = attr.stroke_color;
+                    color.opacity(color.opacity() * attr.opacity * opacity);
+                    ScanlineRenderer ren_s(ren);
+                    ren_s.color(color);
+                    render_scanlines(ras, sl, ren_s);
+                }
+            }
+        }
+    }
+
+    template <typename Rasterizer, typename Scanline, typename Renderer>
+    void render_id(Rasterizer& ras, 
+                Scanline& sl,
+                Renderer& ren, 
+                int feature_id,
+                agg::trans_affine const& mtx, 
+                double opacity,
+                const box2d<double> &symbol_bbox)
+    
+    {
+        using namespace agg;
+        
+        trans_affine transform;
+        curved_stroked_trans_type curved_stroked_trans(curved_stroked_,transform);
+        curved_trans_type         curved_trans(curved_,transform);
+        curved_trans_contour_type curved_trans_contour(curved_trans);
+        
+        curved_trans_contour.auto_detect_orientation(true);
+        
+        for(unsigned i = 0; i < attributes_.size(); ++i)
+        {
+            mapnik::svg::path_attributes const& attr = attributes_[i];
+            if (!attr.visibility_flag)
+                continue;
+
+            transform = attr.transform;
+
+            double bx1,by1,bx2,by2;
+            bounding_rect_single(curved_trans, attr.index, &bx1, &by1, &bx2, &by2);
+            box2d<double> path_bbox(bx1,by1,bx2,by2);
+
+            transform *= mtx;
+            double scl = transform.scale();
+            //curved_.approximation_method(curve_inc);
+            curved_.approximation_scale(scl);
+            curved_.angle_tolerance(0.0);
+            
+            mapnik::gray16 color(feature_id);
+
+            if (attr.fill_flag || attr.fill_gradient.get_gradient_type() != NO_GRADIENT)
+            {
+                ras.reset();
+
+                if(fabs(curved_trans_contour.width()) < 0.0001)
+                {
+                    ras.add_path(curved_trans, attr.index);
+                }
+                else
+                {
+                    curved_trans_contour.miter_limit(attr.miter_limit);
+                    ras.add_path(curved_trans_contour, attr.index);
+                }
+
+                ras.filling_rule(attr.even_odd_flag ? fill_even_odd : fill_non_zero);
+                ScanlineRenderer ren_s(ren);
+                ren_s.color(color);
+                render_scanlines(ras, sl, ren_s);
+            }
+
+            if (attr.stroke_flag || attr.stroke_gradient.get_gradient_type() != NO_GRADIENT)
+            {
+                curved_stroked_.width(attr.stroke_width);
+                //m_curved_stroked.line_join((attr.line_join == miter_join) ? miter_join_round : attr.line_join);
+                curved_stroked_.line_join(attr.line_join);
+                curved_stroked_.line_cap(attr.line_cap);
+                curved_stroked_.miter_limit(attr.miter_limit);
+                curved_stroked_.inner_join(inner_round);
+                curved_stroked_.approximation_scale(scl);
+
+                // If the *visual* line width is considerable we 
+                // turn on processing of curve cusps.
+                //---------------------
+                if(attr.stroke_width * scl > 1.0)
+                {
+                    curved_.angle_tolerance(0.2);
+                }
+                ras.reset();
+                ras.add_path(curved_stroked_trans, attr.index);
+
+                ras.filling_rule(fill_non_zero);
+                ScanlineRenderer ren_s(ren);
+                ren_s.color(color);
+                render_scanlines(ras, sl, ren_s);
+            }
+        }
+    }
+    
+private:
+    
+    VertexSource &  source_;
+    curved_type          curved_;
+    curved_stroked_type  curved_stroked_;
+    AttributeSource const& attributes_;
+};
+
+}}
+
+#endif //MAPNIK_SVG_RENDERER_HPP
diff --git a/include/mapnik/svg/svg_storage.hpp b/include/mapnik/svg/svg_storage.hpp
new file mode 100644
index 0000000..bd6df64
--- /dev/null
+++ b/include/mapnik/svg/svg_storage.hpp
@@ -0,0 +1,76 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+// $Id$
+
+#ifndef MAPNIK_SVG_STORAGE_HPP
+#define MAPNIK_SVG_STORAGE_HPP
+
+#include <mapnik/box2d.hpp>
+#include <boost/utility.hpp>
+
+namespace mapnik {
+namespace svg {
+
+template <typename VertexSource ,typename AttributeSource>
+class svg_storage :  boost::noncopyable
+{
+public:
+    svg_storage() {}
+    
+    VertexSource & source() // FIXME!! make const
+    {
+        return source_;
+    }
+    
+    AttributeSource & attributes() // FIXME!! make const
+    {
+        return attributes_;
+    }
+    
+    void set_bounding_box(box2d<double> const& b)
+    {
+        bounding_box_ = b;
+    }
+    
+    void set_bounding_box(double x0, double y0, double x1, double y1)
+    {
+        bounding_box_.init(x0,y0,x1,y1);
+    }
+    
+    box2d<double> const& bounding_box() const
+    {
+        return bounding_box_;
+    }
+    
+private:
+    
+    VertexSource source_;
+    AttributeSource attributes_;
+    box2d<double> bounding_box_;
+
+};
+
+}}
+
+
+#endif // MAPNIK_SVG_STORAGE_HPP
diff --git a/include/mapnik/svg/svg_transform_grammar.hpp b/include/mapnik/svg/svg_transform_grammar.hpp
new file mode 100644
index 0000000..f3c43e7
--- /dev/null
+++ b/include/mapnik/svg/svg_transform_grammar.hpp
@@ -0,0 +1,263 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+#ifndef SVG_TRANSFORM_GRAMMAR_HPP
+#define SVG_TRANSFORM_GRAMMAR_HPP
+
+
+// agg
+#include <agg_trans_affine.h>
+// spirit
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/phoenix_function.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/home/phoenix/object/construct.hpp>
+
+
+namespace mapnik { namespace svg {
+
+    using namespace boost::spirit;
+    using namespace boost::fusion;
+    using namespace boost::phoenix;
+
+    inline double deg2rad(double d)
+    {
+        return M_PI * d / 180.0;
+    }
+
+    template <typename TransformType>
+    struct process_matrix
+    {
+        template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>
+        struct result
+        {
+            typedef void type; 
+        };
+    
+        explicit process_matrix( TransformType & tr)
+            :tr_(tr) {}
+    
+        void operator () (double a, double b, double c, double d, double e, double f) const
+        {
+            tr_ = agg::trans_affine(a,b,c,d,e,f) * tr_; 
+        }
+    
+        TransformType & tr_;
+    };
+
+    template <typename TransformType>
+    struct process_rotate
+    {
+        template <typename T0, typename T1, typename T2>
+        struct result
+        {
+            typedef void type; 
+        };
+
+        explicit process_rotate( TransformType & tr)
+            :tr_(tr) {}
+    
+        template <typename T0,typename T1,typename T2>
+        void operator () (T0 a, T1 cx, T2 cy) const
+        {
+            if (cx == 0.0 && cy == 0.0)
+            {
+                tr_ = agg::trans_affine_rotation(deg2rad(a)) * tr_;
+            }
+            else
+            {
+                agg::trans_affine t = agg::trans_affine_translation(-cx,-cy);
+                t *= agg::trans_affine_rotation(deg2rad(a));
+                t *= agg::trans_affine_translation(cx, cy);
+                tr_ = t * tr_;
+            }
+        }
+    
+        TransformType & tr_;    
+    };
+
+    template <typename TransformType>
+    struct process_translate
+    {
+        template <typename T0, typename T1>
+        struct result
+        {
+            typedef void type; 
+        };
+
+        explicit process_translate( TransformType & tr)
+            :tr_(tr) {}
+    
+        template <typename T0,typename T1>
+        void operator () (T0 tx, T1 ty) const
+        {
+            if (ty) tr_ = agg::trans_affine_translation(tx,*ty) * tr_;
+            else tr_ = agg::trans_affine_translation(tx,0.0) * tr_;
+        }
+    
+        TransformType & tr_;    
+    };
+
+    template <typename TransformType>
+    struct process_scale
+    {
+        template <typename T0, typename T1>
+        struct result
+        {
+            typedef void type; 
+        };
+
+        explicit process_scale( TransformType & tr)
+            :tr_(tr) {}
+    
+        template <typename T0,typename T1>
+        void operator () (T0 sx, T1 sy) const
+        {
+            if (sy) tr_ = agg::trans_affine_scaling(sx,*sy) * tr_;
+            else tr_ = agg::trans_affine_scaling(sx,sx) * tr_;
+        }
+    
+        TransformType & tr_;    
+    };
+
+
+    template <typename TransformType>
+    struct process_skew
+    {
+        template <typename T0, typename T1>
+        struct result
+        {
+            typedef void type; 
+        };
+
+        explicit process_skew( TransformType & tr)
+            :tr_(tr) {}
+    
+        template <typename T0,typename T1>
+        void operator () (T0 skew_x, T1 skew_y) const
+        {
+            tr_ = agg::trans_affine_skewing(deg2rad(skew_x),deg2rad(skew_y)) * tr_;
+        }
+    
+        TransformType & tr_;    
+    };
+
+    // commented as this does not appear used and crashes clang when used with pch
+    /*
+    struct print_action
+    {
+        template <typename T>
+        void operator()(T const& c, qi::unused_type, qi::unused_type) const
+        {
+            std::cerr << typeid(c).name() << std::endl;
+        }
+    };
+    */
+
+    template <typename Iterator, typename SkipType, typename TransformType>
+    struct svg_transform_grammar : qi::grammar<Iterator,SkipType>
+    {
+        explicit svg_transform_grammar(TransformType & tr)
+            : svg_transform_grammar::base_type(start),
+              matrix_action(process_matrix<TransformType>(tr)),
+              rotate_action(process_rotate<TransformType>(tr)),
+              translate_action(process_translate<TransformType>(tr)),
+              scale_action(process_scale<TransformType>(tr)),
+              skew_action(process_skew<TransformType>(tr))
+        {
+            using qi::_1;
+            using qi::_2;
+            using qi::_3;
+            using qi::_4;
+            using qi::_5;
+            using qi::_6;
+            using qi::_a;
+            using qi::_b;
+            using qi::_c;
+            using qi::_val;
+            using qi::double_;
+            using qi::no_case;
+        
+            start =  +transform_ ;
+        
+            transform_ = matrix | rotate | translate | scale | rotate | skewX | skewY ;
+        
+            matrix = no_case[lit("matrix")] 
+                >> lit('(') 
+                >> ( 
+                    double_ >> -lit(',') 
+                    >> double_ >> -lit(',') 
+                    >> double_ >> -lit(',') 
+                    >> double_ >> -lit(',') 
+                    >> double_ >> -lit(',') 
+                    >> double_) [ matrix_action(_1,_2,_3,_4,_5,_6) ]
+                >>  lit(')')
+                ;
+        
+            translate = no_case[lit("translate")] 
+                >> lit('(') 
+                >> (double_ >> -lit(',') 
+                    >> -double_) [ translate_action(_1,_2) ]
+                >> lit(')');
+        
+            scale = no_case[lit("scale")] 
+                >> lit('(') 
+                >> (double_ >> -lit(',') 
+                    >> -double_ )[ scale_action(_1,_2)] 
+                >>  lit(')');
+        
+            rotate = no_case[lit("rotate")] 
+                >> lit('(') 
+                >> double_[_a = _1] >> -lit(',') 
+                >> -(double_ [_b = _1] >> -lit(',') >> double_[_c = _1]) 
+                >> lit(')') [ rotate_action(_a,_b,_c)];
+        
+            skewX = no_case[lit("skewX")] >> lit('(') >> double_ [ skew_action(_1, 0.0)] >> lit(')');
+        
+            skewY = no_case[lit("skewY")] >> lit('(') >> double_ [ skew_action(0.0, _1)] >> lit(')');
+        
+        }
+
+        // rules
+        qi::rule<Iterator,SkipType> start;
+        qi::rule<Iterator,SkipType> transform_;
+        qi::rule<Iterator,SkipType> matrix;
+        qi::rule<Iterator,SkipType> translate;
+        qi::rule<Iterator,SkipType> scale;
+        qi::rule<Iterator,qi::locals<double,double,double>, SkipType> rotate;
+        qi::rule<Iterator,SkipType> skewX;
+        qi::rule<Iterator,SkipType> skewY;
+    
+        // actions
+        function<process_matrix<TransformType> > matrix_action;
+        function<process_rotate<TransformType> > rotate_action;
+        function<process_translate<TransformType> > translate_action;
+        function<process_scale<TransformType> > scale_action;
+        function<process_skew<TransformType> > skew_action;
+    };
+
+    }}
+
+#endif // SVG_TRANSFORM_GRAMMAR_HPP
diff --git a/include/mapnik/svg_renderer.hpp b/include/mapnik/svg_renderer.hpp
new file mode 100644
index 0000000..15c7ebd
--- /dev/null
+++ b/include/mapnik/svg_renderer.hpp
@@ -0,0 +1,153 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+#ifndef SVG_RENDERER_HPP
+#define SVG_RENDERER_HPP
+
+// mapnik
+#include <mapnik/feature_style_processor.hpp>
+#include <mapnik/map.hpp>
+
+#include <mapnik/svg/svg_generator.hpp>
+#include <mapnik/svg/svg_output_attributes.hpp>
+
+// stl
+#include <string>
+
+namespace mapnik 
+{
+    // parameterized with the type of output iterator it will use for output.
+    // output iterators add more flexibility than streams, because iterators
+    // can target many other output destinations besides streams.
+    template <typename OutputIterator>
+    class MAPNIK_DECL svg_renderer : public feature_style_processor<svg_renderer<OutputIterator> >, 
+             private boost::noncopyable
+    {
+    public:
+        svg_renderer(Map const& m, OutputIterator& output_iterator, unsigned offset_x=0, unsigned offset_y=0);
+        ~svg_renderer();
+      
+        void start_map_processing(Map const& map);
+        void end_map_processing(Map const& map);
+        void start_layer_processing(layer const& lay);
+        void end_layer_processing(layer const& lay);
+      
+        /*!
+         * @brief Overloads that process each kind of symbolizer individually.
+         */
+        void process(point_symbolizer const& sym,
+               Feature const& feature,
+               proj_transform const& prj_trans);
+        void process(line_symbolizer const& sym,
+               Feature const& feature,
+               proj_transform const& prj_trans);
+        void process(line_pattern_symbolizer const& sym,
+               Feature const& feature,
+               proj_transform const& prj_trans);
+        void process(polygon_symbolizer const& sym,
+               Feature const& feature,
+               proj_transform const& prj_trans);
+        void process(polygon_pattern_symbolizer const& sym,
+               Feature const& feature,
+               proj_transform const& prj_trans);
+        void process(raster_symbolizer const& sym,
+               Feature const& feature,
+               proj_transform const& prj_trans);
+        void process(shield_symbolizer const& sym,
+               Feature const& feature,
+               proj_transform const& prj_trans);
+        void process(text_symbolizer const& sym,
+               Feature const& feature,
+               proj_transform const& prj_trans);
+        void process(building_symbolizer const& sym,
+               Feature const& feature,
+               proj_transform const& prj_trans);
+        void process(markers_symbolizer const& sym,
+               Feature const& feature,
+               proj_transform const& prj_trans);
+        void process(glyph_symbolizer const& sym,
+               Feature const& feature,
+               proj_transform const& prj_trans);
+      
+        /*!
+         * @brief Overload that process the whole set of symbolizers of a rule.
+         * @return true, meaning that this renderer can process multiple symbolizers.
+         */
+        bool process(rule::symbolizers const& syms,
+               Feature const& feature,
+               proj_transform const& prj_trans);
+        
+        void painted(bool painted)
+        {
+            // nothing to do
+        }
+
+        inline OutputIterator& get_output_iterator() 
+        {
+            return output_iterator_;
+        }
+      
+        inline const OutputIterator& get_output_iterator() const
+        {
+            return output_iterator_;
+        }
+
+    private:
+        OutputIterator& output_iterator_;
+        const int width_;
+        const int height_;
+        CoordTransform t_;
+        svg::svg_generator<OutputIterator> generator_;
+        svg::path_output_attributes path_attributes_;
+        bool painted_;
+      
+        /*!
+         * @brief Visitor that makes the calls to process each symbolizer when stored in a boost::variant.
+         * This object follows the model of that found in feature_style_processor. It appears here, because
+         * the logic that iterates over the set of symbolizer has been moved to an SVG renderer's internal
+         * method.
+         */
+        struct symbol_dispatch : public boost::static_visitor<>
+        {
+            symbol_dispatch(svg_renderer<OutputIterator>& processor,
+                Feature const& feature, 
+                proj_transform const& prj_trans)
+            : processor_(processor),
+              feature_(feature),
+              prj_trans_(prj_trans) {}
+      
+            template <typename Symbolizer>
+            void operator()(Symbolizer const& sym) const
+            {
+                processor_.process(sym, feature_, prj_trans_);
+            }
+      
+            svg_renderer<OutputIterator>& processor_;
+            Feature const& feature_;
+            proj_transform const& prj_trans_;
+        };
+    };
+}
+
+#endif //SVG_RENDERER_HPP
diff --git a/include/mapnik/symbolizer.hpp b/include/mapnik/symbolizer.hpp
index 6a416f4..c4b46cd 100644
--- a/include/mapnik/symbolizer.hpp
+++ b/include/mapnik/symbolizer.hpp
@@ -21,34 +21,88 @@
  *****************************************************************************/
 //$Id: symbolizer.hpp 39 2005-04-10 20:39:53Z pavlenko $
 
-#ifndef SYMBOLIZER_HPP
-#define SYMBOLIZER_HPP
+#ifndef MAPNIK_SYMBOLIZER_HPP
+#define MAPNIK_SYMBOLIZER_HPP
 
-#include <mapnik/graphics.hpp> 
-#include <boost/shared_ptr.hpp>
+// mapnik
+#include <mapnik/config.hpp>
+#include <mapnik/parse_path.hpp>
+#include <mapnik/metawriter.hpp>
+
+// boost
+#include <boost/array.hpp>
 
 namespace mapnik 
 {
 
-    class MAPNIK_DECL symbolizer_with_image {
-        public:
-            boost::shared_ptr<ImageData32> get_image() const;
-            const std::string & get_filename() const;
-            void set_filename(std::string const& image_filename);
-            void set_image( boost::shared_ptr<ImageData32> symbol);
-            
-        protected:
-            symbolizer_with_image(boost::shared_ptr<ImageData32> img);
-            symbolizer_with_image(std::string const& file,
-                                  std::string const& type,
-                                  unsigned width,unsigned height);
+class Map;
+
+class MAPNIK_DECL symbolizer_base {
+    public:
+        symbolizer_base():
+            properties_(),
+            properties_complete_(),
+            writer_name_(),
+            writer_ptr_() {}
             
-            symbolizer_with_image(symbolizer_with_image const& rhs);
-        
-            boost::shared_ptr<ImageData32> image_;
-            std::string image_filename_;
+        /** Add a metawriter to this symbolizer using a name. */
+        void add_metawriter(std::string const& name, metawriter_properties const& properties);
+        /** Add a metawriter to this symbolizer using a pointer.
+          * The name is only needed if you intend to call save_map() some time.
+          * You don't need to call cache_metawriters() when using this function.
+          * Call this function with an NULL writer_ptr to remove a metawriter.
+          */
+        void add_metawriter(metawriter_ptr writer_ptr,
+                            metawriter_properties const& properties = metawriter_properties(),
+                            std::string const& name = "");
+        /** Cache metawriter objects to avoid repeated lookups while processing.
+          *
+          * If the metawriter was added using a symbolic name (instead of a pointer)
+          * this function has to be called before the symbolizer is used, because
+          * the map object is not available in renderer::apply() to resolve the reference.
+          */
+        void cache_metawriters(Map const &m);
+        /** Get the metawriter associated with this symbolizer or a NULL pointer if none exists.
+          *
+          * This functions requires that cache_metawriters() was called first.
+          */
+        metawriter_with_properties get_metawriter() const;
+        /** Get metawriter properties.
+          * This functions returns the default attributes of the
+          * metawriter + symbolizer specific attributes.
+          * \note This function is a helperfunction for class attribute_collector.
+          */
+        metawriter_properties const& get_metawriter_properties() const { return properties_complete_; }
+        /** Get metawriter properties which only apply to this symbolizer.
+          */
+        metawriter_properties const& get_metawriter_properties_overrides() const { return properties_; }
+        /** Get metawriter name. */
+        std::string const& get_metawriter_name() const { return writer_name_; }
+    private:
+        metawriter_properties properties_;
+        metawriter_properties properties_complete_;
+        std::string writer_name_;
+        metawriter_ptr writer_ptr_;
+};
+
+typedef boost::array<double,6> transform_type;
 
-    };
+class MAPNIK_DECL symbolizer_with_image {
+public:
+    path_expression_ptr get_filename() const;
+    void set_filename(path_expression_ptr filename);
+    void set_transform(transform_type const& );
+    transform_type const& get_transform() const;
+    std::string const get_transform_string() const;
+    void set_opacity(float opacity);
+    float get_opacity() const;
+protected:
+    symbolizer_with_image(path_expression_ptr filename);
+    symbolizer_with_image(symbolizer_with_image const& rhs);
+    path_expression_ptr image_filename_;   
+    float opacity_;
+    transform_type matrix_;
+};
 }
 
-#endif //SYMBOLIZER_HPP
+#endif //MAPNIK_SYMBOLIZER_HPP
diff --git a/include/mapnik/text_path.hpp b/include/mapnik/text_path.hpp
index 94b2563..cd9a4c2 100644
--- a/include/mapnik/text_path.hpp
+++ b/include/mapnik/text_path.hpp
@@ -27,143 +27,157 @@
 #define __TEXT_PATH_H__
 
 #include <boost/utility.hpp>
+#include <boost/shared_ptr.hpp>
 #include <unicode/unistr.h>
 
 namespace mapnik
 {
-   struct character_info
-   { 
-         int character;
-         double width, height;
+struct character_info
+{ 
+    int character;
+    double width, height;
       
-         character_info() : character(0), width(0), height(0) {}
-         character_info(int c_, double width_, double height_) : character(c_), width(width_), height(height_) {}
-         ~character_info() {}
+    character_info() : character(0), width(0), height(0) {}
+    character_info(int c_, double width_, double height_) : character(c_), width(width_), height(height_) {}
+    ~character_info() {}
         
-         character_info(const character_info &ci)
-            : character(ci.character), width(ci.width), height(ci.height)
-         {
-         }
+    character_info(const character_info &ci)
+        : character(ci.character), width(ci.width), height(ci.height)
+    {
+    }
           
-   };
+};
     
-   class string_info : private boost::noncopyable
-   {
-      protected:
-         typedef boost::ptr_vector<character_info> characters_t;
-         characters_t characters_;
-         UnicodeString const& text_;
-         double width_;
-         double height_;
-      public:
-         string_info(UnicodeString const& text)
-            : text_(text),
-              width_(0),
-              height_(0) {}
+class string_info : private boost::noncopyable
+{
+protected:
+    typedef boost::ptr_vector<character_info> characters_t;
+    characters_t characters_;
+    UnicodeString const& text_;
+    double width_;
+    double height_;
+    bool is_rtl;
+public:
+    string_info(UnicodeString const& text)
+        : text_(text),
+          width_(0),
+          height_(0),
+          is_rtl(false) {}
 
-         void add_info(int c, double width, double height)
-         {
-            characters_.push_back(new character_info(c, width, height));
-         }
+    void add_info(int c, double width, double height)
+    {
+        characters_.push_back(new character_info(c, width, height));
+    }
       
-         unsigned num_characters() const
-         {
-            return characters_.size();
-         }
+    unsigned num_characters() const
+    {
+        return characters_.size();
+    }
+    
+    void set_rtl(bool value) {is_rtl = value;}
+    bool get_rtl() const {return is_rtl;}    
       
-         character_info at(unsigned i) const
-         {
-            return characters_[i];
-         }
+    character_info at(unsigned i) const
+    {
+        return characters_[i];
+    }
       
-         character_info operator[](unsigned i) const
-         {
-            return at(i);
-         }
+    character_info operator[](unsigned i) const
+    {
+        return at(i);
+    }
       
-         void set_dimensions(double width, double height)
-         {
-            width_ = width;
-            height_ = height;
-         }
+    void set_dimensions(double width, double height)
+    {
+        width_ = width;
+        height_ = height;
+    }
       
-         std::pair<double, double> get_dimensions() const
-         {
-            return std::pair<double, double>(width_, height_);
-         }
+    std::pair<double, double> get_dimensions() const
+    {
+        return std::pair<double, double>(width_, height_);
+    }
+
+    UnicodeString const&  get_string() const 
+    {
+        return text_;
+    }
 
-         UnicodeString const&  get_string() const 
-         {
-           return text_;
-         }
-   };
+    bool has_line_breaks() const
+    {
+       UChar break_char = '\n';
+       return (text_.indexOf(break_char) >= 0);
+    }
+};
     
-   struct text_path : boost::noncopyable
-   {
-         struct character_node
-         {
-               int c;
-               double x, y, angle;
+struct text_path : boost::noncopyable
+{
+    struct character_node
+    {
+        int c;
+        double x, y, angle;
                
-               character_node(int c_, double x_, double y_, double angle_) 
-                  : c(c_), x(x_), y(y_), angle(angle_) {}
-               ~character_node() {}
+        character_node(int c_, double x_, double y_, double angle_) 
+            : c(c_), x(x_), y(y_), angle(angle_) {}
+        ~character_node() {}
                
-               void vertex(int *c_, double *x_, double *y_, double *angle_)
-               {
-                  *c_ = c;
-                  *x_ = x;
-                  *y_ = y;
-                  *angle_ = angle;
-               }
-         };
+        void vertex(int *c_, double *x_, double *y_, double *angle_)
+        {
+            *c_ = c;
+            *x_ = x;
+            *y_ = y;
+            *angle_ = angle;
+        }
+    };
          
-         typedef std::vector<character_node> character_nodes_t;
-         double starting_x;
-         double starting_y;
-         character_nodes_t nodes_;
-         int itr_;
+    typedef std::vector<character_node> character_nodes_t;
+    double starting_x;
+    double starting_y;
+    character_nodes_t nodes_;
+    int itr_;
           
-         std::pair<unsigned,unsigned> string_dimensions;
+    std::pair<unsigned,unsigned> string_dimensions;
         
-         text_path() 
-            : starting_x(0),
-              starting_y(0),
-              itr_(0) {} 
+    text_path() 
+        : starting_x(0),
+          starting_y(0),
+          itr_(0) {} 
          
-         //text_path(text_path const& other) : 
-         //  itr_(0),
-         //  nodes_(other.nodes_),
-         //  string_dimensions(other.string_dimensions)
-         //{}
+    //text_path(text_path const& other) : 
+    //  itr_(0),
+    //  nodes_(other.nodes_),
+    //  string_dimensions(other.string_dimensions)
+    //{}
          
-         ~text_path() {}
+    ~text_path() {}
           
-         void add_node(int c, double x, double y, double angle)
-         {
-            nodes_.push_back(character_node(c, x, y, angle));
-         }
+    void add_node(int c, double x, double y, double angle)
+    {
+        nodes_.push_back(character_node(c, x, y, angle));
+    }
         
-         void vertex(int *c, double *x, double *y, double *angle)
-         {
-            nodes_[itr_++].vertex(c, x, y, angle);
-         }
+    void vertex(int *c, double *x, double *y, double *angle)
+    {
+        nodes_[itr_++].vertex(c, x, y, angle);
+    }
          
-         void rewind()
-         {
-            itr_ = 0;
-         }
+    void rewind()
+    {
+        itr_ = 0;
+    }
          
-         int num_nodes() const
-         {
-            return nodes_.size();
-         }
+    int num_nodes() const
+    {
+        return nodes_.size();
+    }
          
-         void clear()
-         {
-            nodes_.clear();
-         }
-   };
+    void clear()
+    {
+        nodes_.clear();
+    }
+};
+
+typedef boost::shared_ptr<text_path> text_path_ptr;
 }
 
 #endif
diff --git a/include/mapnik/text_placements.hpp b/include/mapnik/text_placements.hpp
new file mode 100644
index 0000000..e09f453
--- /dev/null
+++ b/include/mapnik/text_placements.hpp
@@ -0,0 +1,181 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Hermann Kraus
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+#ifndef TEXT_PLACEMENTS_HPP
+#define TEXT_PLACEMENTS_HPP
+
+//mapnik
+#include <mapnik/enumeration.hpp>
+
+//stl
+#include <vector>
+#include <string>
+
+//boost
+#include <boost/tuple/tuple.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/utility.hpp>
+
+namespace mapnik {
+
+typedef boost::tuple<double,double> position;
+
+enum label_placement_enum {
+    POINT_PLACEMENT,
+    LINE_PLACEMENT,
+    VERTEX_PLACEMENT,
+    INTERIOR_PLACEMENT,
+    label_placement_enum_MAX
+};
+
+DEFINE_ENUM( label_placement_e, label_placement_enum );
+
+enum vertical_alignment
+{
+    V_TOP = 0,
+    V_MIDDLE,
+    V_BOTTOM,
+    V_AUTO,
+    vertical_alignment_MAX
+};
+
+DEFINE_ENUM( vertical_alignment_e, vertical_alignment );
+
+enum horizontal_alignment
+{
+    H_LEFT = 0,
+    H_MIDDLE,
+    H_RIGHT,
+    H_AUTO,
+    horizontal_alignment_MAX
+};
+
+DEFINE_ENUM( horizontal_alignment_e, horizontal_alignment );
+
+enum justify_alignment
+{
+    J_LEFT = 0,
+    J_MIDDLE,
+    J_RIGHT,
+    justify_alignment_MAX
+};
+
+DEFINE_ENUM( justify_alignment_e, justify_alignment );
+
+enum text_transform
+{
+    NONE = 0,
+    UPPERCASE,
+    LOWERCASE,
+    CAPITALIZE,
+    text_transform_MAX
+};
+
+DEFINE_ENUM( text_transform_e, text_transform );
+
+class text_placements;
+
+class text_placement_info : boost::noncopyable
+{
+public:
+    text_placement_info(text_placements const* parent);
+    /** Get next placement.
+      * This function is also called before the first placement is tried. */
+    virtual bool next()=0;
+    /** Get next placement position.
+      * This function is also called before the first position is used.
+      * Each class has to return at least one position!
+      * If this functions returns false the placement data should be considered invalid!
+      */
+    virtual bool next_position_only()=0;
+    virtual ~text_placement_info() {}
+
+    /* NOTE: Values are public and non-virtual to avoid any performance problems. */
+    position displacement;
+    unsigned text_size;
+    horizontal_alignment_e halign;
+    justify_alignment_e jalign;
+    vertical_alignment_e valign;
+};
+
+typedef boost::shared_ptr<text_placement_info> text_placement_info_ptr;
+
+class text_placements
+{
+public:
+    text_placements() :
+        text_size_(10), halign_(H_MIDDLE), jalign_(J_MIDDLE), valign_(V_MIDDLE) {}
+    virtual text_placement_info_ptr get_placement_info() const =0;
+
+    virtual void set_default_text_size(unsigned size) { text_size_ = size; }
+    unsigned get_default_text_size() const { return text_size_; }
+
+    virtual void set_default_displacement(position const& displacement) { displacement_ = displacement;}
+    position const& get_default_displacement() { return displacement_; }
+
+    virtual void set_default_halign(horizontal_alignment_e const& align) { halign_ = align;}
+    horizontal_alignment_e const& get_default_halign() { return halign_; }
+
+    virtual void set_default_jalign(justify_alignment_e const& align) { jalign_ = align;}
+    justify_alignment_e const& get_default_jalign() { return jalign_; }
+
+    virtual void set_default_valign(vertical_alignment_e const& align) { valign_ = align;}
+    vertical_alignment_e const& get_default_valign() { return valign_; }
+
+    virtual ~text_placements() {}
+protected:
+    unsigned text_size_;
+    position displacement_;
+    horizontal_alignment_e halign_;
+    justify_alignment_e jalign_;
+    vertical_alignment_e valign_;
+    friend class text_placement_info;
+};
+
+typedef boost::shared_ptr<text_placements> text_placements_ptr;
+
+class text_placements_info_dummy;
+
+class text_placements_dummy: public text_placements
+{
+public:
+    text_placement_info_ptr get_placement_info() const;
+    friend class text_placement_info_dummy;
+};
+
+class text_placement_info_dummy : public text_placement_info
+{
+public:
+    text_placement_info_dummy(text_placements_dummy const* parent) : text_placement_info(parent),
+        state(0), position_state(0), parent_(parent) {}
+    bool next();
+    bool next_position_only();
+private:
+    unsigned state;
+    unsigned position_state;
+    text_placements_dummy const* parent_;
+};
+
+
+
+} //namespace
+
+#endif // TEXT_PLACEMENTS_HPP
diff --git a/include/mapnik/text_placements_simple.hpp b/include/mapnik/text_placements_simple.hpp
new file mode 100644
index 0000000..9b11c6a
--- /dev/null
+++ b/include/mapnik/text_placements_simple.hpp
@@ -0,0 +1,75 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Hermann Kraus
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+#ifndef TEXT_PLACEMENTS_SIMPLE_HPP
+#define TEXT_PLACEMENTS_SIMPLE_HPP
+#include <mapnik/text_placements.hpp>
+
+namespace mapnik {
+
+class text_placement_info_simple;
+
+typedef enum {
+    NORTH,
+    EAST,
+    SOUTH,
+    WEST,
+    NORTHEAST,
+    SOUTHEAST,
+    NORTHWEST,
+    SOUTHWEST,
+    EXACT_POSITION
+} directions_t;
+
+
+/** Automatically generates placement options from a user selected list of directions and text sizes. */
+class text_placements_simple: public text_placements
+{
+public:
+    text_placements_simple();
+    text_placements_simple(std::string positions);
+    text_placement_info_ptr get_placement_info() const;
+    void set_positions(std::string positions);
+private:
+    std::string positions_;
+    std::vector<directions_t> direction_;
+    std::vector<int> text_sizes_;
+    friend class text_placement_info_simple;
+};
+
+/** Simple placement strategy.
+  * See parent class for documentation of each function. */
+class text_placement_info_simple : public text_placement_info
+{
+public:
+    text_placement_info_simple(text_placements_simple const* parent) :
+        text_placement_info(parent), state(0), position_state(0), parent_(parent) {}
+    bool next();
+    bool next_position_only();
+private:
+    unsigned state;
+    unsigned position_state;
+    text_placements_simple const* parent_;
+};
+
+
+} //namespace
+#endif
diff --git a/include/mapnik/text_symbolizer.hpp b/include/mapnik/text_symbolizer.hpp
index 43c6d5e..f3556cb 100644
--- a/include/mapnik/text_symbolizer.hpp
+++ b/include/mapnik/text_symbolizer.hpp
@@ -22,168 +22,138 @@
 
 //$Id$
 
-#ifndef TEXT_SYMBOLIZER_HPP
-#define TEXT_SYMBOLIZER_HPP
+#ifndef MAPNIK_TEXT_SYMBOLIZER_HPP
+#define MAPNIK_TEXT_SYMBOLIZER_HPP
+
 // mapnik
-#include <mapnik/enumeration.hpp>
 #include <mapnik/color.hpp>
 #include <mapnik/font_set.hpp>
 #include <mapnik/graphics.hpp>
+#include <mapnik/filter_factory.hpp>
+#include <mapnik/symbolizer.hpp>
+#include <mapnik/text_placements.hpp>
+
 // boost
-#include <boost/tuple/tuple.hpp>
 #include <boost/shared_ptr.hpp>
+#include <boost/make_shared.hpp>
+
 // stl
 #include <string>
 
 namespace mapnik
 {
-   enum label_placement_enum {
-      POINT_PLACEMENT,
-      LINE_PLACEMENT,
-      VERTEX_PLACEMENT,
-      label_placement_enum_MAX
-   };
-
-   DEFINE_ENUM( label_placement_e, label_placement_enum );
-
-   enum vertical_alignment
-   {
-      TOP = 0,
-      MIDDLE,
-      BOTTOM,
-      vertical_alignment_MAX
-   };
-
-   DEFINE_ENUM( vertical_alignment_e, vertical_alignment );
-
-   enum horizontal_alignment
-   {
-      H_LEFT = 0,
-      H_MIDDLE,
-      H_RIGHT,
-      horizontal_alignment_MAX
-   };
-
-   DEFINE_ENUM( horizontal_alignment_e, horizontal_alignment );
 
-   enum justify_alignment
-   {
-      J_LEFT = 0,
-      J_MIDDLE,
-      J_RIGHT,
-      justify_alignment_MAX
-   };
-
-   DEFINE_ENUM( justify_alignment_e, justify_alignment );
-
-   enum text_convert
-   {
-      NONE = 0,
-      TOUPPER,
-      TOLOWER,
-      text_convert_MAX
-   };
-
-   DEFINE_ENUM( text_convert_e, text_convert );
-
-   typedef boost::tuple<double,double> position;
-
-   struct MAPNIK_DECL text_symbolizer
-   {
-         text_symbolizer(std::string const& name,std::string const& face_name,
-                         unsigned size, color const& fill);
-         text_symbolizer(std::string const& name, unsigned size, color const& fill);
-         text_symbolizer(text_symbolizer const& rhs);
-         text_symbolizer& operator=(text_symbolizer const& rhs);
-         std::string const& get_name() const;
-         void set_name(std::string name);
-         unsigned get_text_ratio() const; // target ratio for text bounding box in pixels
-         void set_text_ratio(unsigned ratio);
-         unsigned get_wrap_width() const; // width to wrap text at, or trigger ratio
-         void set_wrap_width(unsigned ratio);
-         unsigned char get_wrap_char() const; // character used to wrap lines
-         std::string get_wrap_char_string() const; // character used to wrap lines as std::string
-         void set_wrap_char(unsigned char character);
-         void set_wrap_char_from_string(std::string const& character);
-         text_convert_e get_text_convert() const; // text conversion on strings before display
-         void set_text_convert(text_convert_e convert);
-         unsigned get_line_spacing() const; // spacing between lines of text
-         void set_line_spacing(unsigned spacing);
-         unsigned get_character_spacing() const; // spacing between characters in text
-         void set_character_spacing(unsigned spacing);
-         unsigned get_label_spacing() const; // spacing between repeated labels on lines
-         void set_label_spacing(unsigned spacing);
-         unsigned get_label_position_tolerance() const; //distance the label can be moved on the line to fit, if 0 the default is used
-         void set_label_position_tolerance(unsigned tolerance);
-         bool get_force_odd_labels() const; // try render an odd amount of labels
-         void set_force_odd_labels(bool force);
-         double get_max_char_angle_delta() const; // maximum change in angle between adjacent characters
-         void set_max_char_angle_delta(double angle);
-         unsigned get_text_size() const;
-         void set_text_size(unsigned size);
-         std::string const& get_face_name() const;
-         void set_face_name(std::string face_name);
-         FontSet const& get_fontset() const;
-         void set_fontset(FontSet const& fontset);
-         color const& get_fill() const;
-         void set_fill(color const& fill);
-         void set_halo_fill(color const& fill);
-         color const& get_halo_fill() const;
-         void set_halo_radius(unsigned radius);
-         unsigned get_halo_radius() const;
-         void set_label_placement(label_placement_e label_p);
-         label_placement_e get_label_placement() const;
-         void set_vertical_alignment(vertical_alignment_e valign);
-         vertical_alignment_e get_vertical_alignment() const;
-         void set_anchor(double x, double y);
-         position const& get_anchor() const;
-         void set_displacement(double x, double y);
-         position const& get_displacement() const;
-         void set_avoid_edges(bool avoid);
-         bool get_avoid_edges() const;
-         void set_minimum_distance(double distance);
-         double get_minimum_distance() const;
-         void set_allow_overlap(bool overlap);
-         bool get_allow_overlap() const;
-         void set_opacity(double opacity);
-         double get_opacity() const;
-         bool get_wrap_before() const; // wrap text at wrap_char immediately before current work
-         void set_wrap_before(bool wrap_before);
-         void set_horizontal_alignment(horizontal_alignment_e valign);
-         horizontal_alignment_e get_horizontal_alignment() const;
-         void set_justify_alignment(justify_alignment_e valign);
-         justify_alignment_e get_justify_alignment() const;
-
-      private:
-         std::string name_;
-         std::string face_name_;
-         FontSet fontset_;
-         unsigned size_;
-         unsigned text_ratio_;
-         unsigned wrap_width_;
-         unsigned char wrap_char_;
-         text_convert_e text_convert_;
-         unsigned line_spacing_;
-         unsigned character_spacing_;
-         unsigned label_spacing_;
-         unsigned label_position_tolerance_;
-         bool force_odd_labels_;
-         double max_char_angle_delta_;
-         color fill_;
-         color halo_fill_;
-         unsigned halo_radius_;
-         label_placement_e label_p_;
-         vertical_alignment_e valign_;
-         position anchor_;
-         position displacement_;
-         bool avoid_edges_;
-         double minimum_distance_;
-         bool overlap_;
-         double opacity_;
-         bool wrap_before_;
-         horizontal_alignment_e halign_;
-         justify_alignment_e jalign_;
-   };
+struct MAPNIK_DECL text_symbolizer : public symbolizer_base
+{
+    text_symbolizer(expression_ptr name, std::string const& face_name,
+                    unsigned size, color const& fill,
+                    text_placements_ptr placements = text_placements_ptr(
+                        boost::make_shared<text_placements_dummy>())
+                    );
+    text_symbolizer(expression_ptr name, unsigned size, color const& fill,
+                    text_placements_ptr placements = text_placements_ptr(
+                        boost::make_shared<text_placements_dummy>())
+                    );
+    text_symbolizer(text_symbolizer const& rhs);
+    text_symbolizer& operator=(text_symbolizer const& rhs);
+    expression_ptr get_name() const;
+    void set_name(expression_ptr expr);
+
+    expression_ptr get_orientation() const; // orienation (rotation angle atm)
+    void set_orientation(expression_ptr expr);
+         
+    unsigned get_text_ratio() const; // target ratio for text bounding box in pixels
+    void set_text_ratio(unsigned ratio);
+    unsigned get_wrap_width() const; // width to wrap text at, or trigger ratio
+    void set_wrap_width(unsigned ratio);
+    unsigned char get_wrap_char() const; // character used to wrap lines
+    std::string get_wrap_char_string() const; // character used to wrap lines as std::string
+    void set_wrap_char(unsigned char character);
+    void set_wrap_char_from_string(std::string const& character);
+    text_transform_e get_text_transform() const; // text conversion on strings before display
+    void set_text_transform(text_transform_e convert);
+    unsigned get_line_spacing() const; // spacing between lines of text
+    void set_line_spacing(unsigned spacing);
+    unsigned get_character_spacing() const; // spacing between characters in text
+    void set_character_spacing(unsigned spacing);
+    unsigned get_label_spacing() const; // spacing between repeated labels on lines
+    void set_label_spacing(unsigned spacing);
+    unsigned get_label_position_tolerance() const; //distance the label can be moved on the line to fit, if 0 the default is used
+    void set_label_position_tolerance(unsigned tolerance);
+    bool get_force_odd_labels() const; // try render an odd amount of labels
+    void set_force_odd_labels(bool force);
+    double get_max_char_angle_delta() const; // maximum change in angle between adjacent characters
+    void set_max_char_angle_delta(double angle);
+    unsigned get_text_size() const;
+    void set_text_size(unsigned size);
+    std::string const& get_face_name() const;
+    void set_face_name(std::string face_name);
+    font_set const& get_fontset() const;
+    void set_fontset(font_set const& fset);
+    color const& get_fill() const;
+    void set_fill(color const& fill);
+    void set_halo_fill(color const& fill);
+    color const& get_halo_fill() const;
+    void set_halo_radius(double radius);
+    double get_halo_radius() const;
+    void set_label_placement(label_placement_e label_p);
+    label_placement_e get_label_placement() const;
+    void set_vertical_alignment(vertical_alignment_e valign);
+    vertical_alignment_e get_vertical_alignment() const;
+    void set_anchor(double x, double y);
+    position const& get_anchor() const;
+    void set_displacement(double x, double y);
+    position const& get_displacement() const;
+    void set_avoid_edges(bool avoid);
+    bool get_avoid_edges() const;
+    void set_minimum_distance(double distance);
+    double get_minimum_distance() const;
+    void set_minimum_padding(double distance);
+    double get_minimum_padding() const;
+    void set_minimum_path_length(double size);
+    double get_minimum_path_length() const;
+    void set_allow_overlap(bool overlap);
+    bool get_allow_overlap() const;
+    void set_text_opacity(double opacity);
+    double get_text_opacity() const;
+    bool get_wrap_before() const; // wrap text at wrap_char immediately before current work
+    void set_wrap_before(bool wrap_before);
+    void set_horizontal_alignment(horizontal_alignment_e valign);
+    horizontal_alignment_e get_horizontal_alignment() const;
+    void set_justify_alignment(justify_alignment_e valign);
+    justify_alignment_e get_justify_alignment() const;
+    text_placements_ptr get_placement_options() const;
+    void set_placement_options(text_placements_ptr placement_options);
+
+private:
+    expression_ptr name_;
+    expression_ptr orientation_;
+    std::string face_name_;
+    font_set fontset_;
+    unsigned text_ratio_;
+    unsigned wrap_width_;
+    unsigned char wrap_char_;
+    text_transform_e text_transform_;
+    unsigned line_spacing_;
+    unsigned character_spacing_;
+    unsigned label_spacing_;
+    unsigned label_position_tolerance_;
+    bool force_odd_labels_;
+    double max_char_angle_delta_;
+    color fill_;
+    color halo_fill_;
+    double halo_radius_;
+    label_placement_e label_p_;
+    position anchor_;
+    bool avoid_edges_;
+    double minimum_distance_;
+    double minimum_padding_;
+    double minimum_path_length_;
+    bool overlap_;
+    double text_opacity_;
+    bool wrap_before_;
+    text_placements_ptr placement_options_;
+};
 }
 
-#endif //TEXT_SYMBOLIZER_HPP
+#endif //MAPNIK_TEXT_SYMBOLIZER_HPP
diff --git a/include/mapnik/timer.hpp b/include/mapnik/timer.hpp
new file mode 100644
index 0000000..4791b87
--- /dev/null
+++ b/include/mapnik/timer.hpp
@@ -0,0 +1,124 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_TIMER_INCLUDED
+#define MAPNIK_TIMER_INCLUDED
+
+#include <cstdlib>
+#include <string>
+#include <sstream>
+#include <iomanip>
+#include <sys/time.h> 
+
+namespace mapnik {
+
+// Measure times in both wall clock time and CPU times. Results are returned in milliseconds.
+class timer
+{
+public:
+    timer()
+    {
+        restart();
+    }
+
+    void restart() 
+    {   
+        _stopped = false;
+        gettimeofday(&_wall_clock_start, NULL);
+        _cpu_start = clock();
+    }
+
+    virtual void stop() const
+    {
+        _stopped = true;
+        _cpu_end = clock();
+        gettimeofday(&_wall_clock_end, NULL);
+    }
+
+    double cpu_elapsed() const
+    {
+        // return elapsed CPU time in ms
+        if (!_stopped)
+            stop();
+
+        return ((double) (_cpu_end - _cpu_start)) / CLOCKS_PER_SEC * 1000.0;
+    }
+
+    double wall_clock_elapsed() const
+    {
+        // return elapsed wall clock time in ms
+        if (!_stopped)
+            stop();
+
+        long seconds  = _wall_clock_end.tv_sec  - _wall_clock_start.tv_sec;
+        long useconds = _wall_clock_end.tv_usec - _wall_clock_start.tv_usec;
+
+        return ((seconds) * 1000 + useconds / 1000.0) + 0.5;
+    }
+protected:
+    mutable timeval _wall_clock_start, _wall_clock_end;
+    mutable clock_t _cpu_start, _cpu_end;
+    mutable bool _stopped;
+};
+
+//  A progress_timer behaves like a timer except that the destructor displays
+//  an elapsed time message at an appropriate place in an appropriate form.
+class progress_timer : public timer
+{
+public:
+    progress_timer(std::ostream & os, std::string const& base_message):
+      os_(os),
+      base_message_(base_message)
+      {}
+
+    ~progress_timer()
+    {
+        if (!_stopped)
+            stop();
+    }
+    
+    void stop() const
+    {
+        timer::stop();
+        try
+        {
+            std::ostringstream s;
+            s.precision(2);
+            s << std::fixed; 
+            s << wall_clock_elapsed() << "ms (cpu " << cpu_elapsed() << "ms)";
+            s << std::setw(30 - (int)s.tellp()) << std::right << "| " << base_message_ << "\n"; 
+            os_ << s.str();
+        }
+        catch (...) {} // eat any exceptions
+    }
+
+    void discard() {
+        _stopped = true;
+    }
+
+private:
+    std::ostream & os_;
+    std::string base_message_;
+};
+    
+};
+#endif // MAPNIK_TIMER_INCLUDED
diff --git a/include/mapnik/unicode.hpp b/include/mapnik/unicode.hpp
index db9f7b5..6f79e8f 100644
--- a/include/mapnik/unicode.hpp
+++ b/include/mapnik/unicode.hpp
@@ -31,20 +31,22 @@
 #include <unicode/ucnv.h>
 // boost
 #include <boost/utility.hpp>
+#include <boost/cstdint.hpp>
 // stl
 #include <string>
 
 namespace mapnik {
-   class MAPNIK_DECL transcoder : private boost::noncopyable
-   {
-      public:
-         explicit transcoder (std::string const& encoding);
-         UnicodeString transcode(const char* data) const;  
-         ~transcoder(); 
-      private:
-         bool ok_;
-         UConverter * conv_;
-   };
+
+class MAPNIK_DECL transcoder : private boost::noncopyable
+{
+public:
+    explicit transcoder (std::string const& encoding);
+    UnicodeString transcode(const char* data, boost::int32_t length = -1) const;  
+    ~transcoder(); 
+private:
+    bool ok_;
+    UConverter * conv_;
+};
 }
 
 #endif // UNICODE_HPP
diff --git a/include/mapnik/utils.hpp b/include/mapnik/utils.hpp
index 23889a7..a6ec6fd 100644
--- a/include/mapnik/utils.hpp
+++ b/include/mapnik/utils.hpp
@@ -42,130 +42,130 @@
 namespace mapnik
 {
 #ifdef MAPNIK_THREADSAFE
-    using boost::mutex;
+using boost::mutex;
 #endif
    
-    template <typename T>
-    class CreateUsingNew
+template <typename T>
+class CreateUsingNew
+{
+public:
+    static T* create()
     {
-    public:
-        static T* create()
-        {
-            return new T;
-        }
-        static void destroy(T* obj)
-        {
-            delete obj;
-        }
-    };
+        return new T;
+    }
+    static void destroy(T* obj)
+    {
+        delete obj;
+    }
+};
 
-    template <typename T>
-    class CreateStatic
+template <typename T>
+class CreateStatic
+{
+private:
+    union MaxAlign
     {
-    private:
-        union MaxAlign
-        {
-            char t_[sizeof(T)];
-            short int shortInt_;
-            int int_;
-            long int longInt_;
-            float float_;
-            double double_;
-            long double longDouble_;
-            struct Test;
-            int Test::* pMember_;
-            int (Test::*pMemberFn_)(int);
-        };
+        char t_[sizeof(T)];
+        short int shortInt_;
+        int int_;
+        long int longInt_;
+        float float_;
+        double double_;
+        long double longDouble_;
+        struct Test;
+        int Test::* pMember_;
+        int (Test::*pMemberFn_)(int);
+    };
 
-    public:
+public:
         
-        static T* create()
-        {
-            static MaxAlign staticMemory;
-            return new(&staticMemory) T;
-        }
+    static T* create()
+    {
+        static MaxAlign staticMemory;
+        return new(&staticMemory) T;
+    }
 #ifdef __SUNPRO_CC        
-        // Sun C++ Compiler doesn't handle `volatile` keyword same as GCC.
-        static void destroy(T* obj)
+    // Sun C++ Compiler doesn't handle `volatile` keyword same as GCC.
+    static void destroy(T* obj)
 #else
         static void destroy(volatile T* obj)
 #endif
-        {
-            obj->~T();
-        }
-    };
+    {
+        obj->~T();
+    }
+};
     
-    template <typename T,
-              template <typename T> class CreatePolicy=CreateStatic> class singleton
-              {
+template <typename T,
+          template <typename U> class CreatePolicy=CreateStatic> class singleton
+{
 #ifdef __SUNPRO_CC
-		/* Sun's C++ compiler will issue the following errors if CreatePolicy<T> is used:
-		   Error: A class template name was expected instead of mapnik::CreatePolicy<mapnik::T>
-		   Error: A "friend" declaration must specify a class or function.
-		 */
-                  friend class CreatePolicy;
+    /* Sun's C++ compiler will issue the following errors if CreatePolicy<T> is used:
+       Error: A class template name was expected instead of mapnik::CreatePolicy<mapnik::T>
+       Error: A "friend" declaration must specify a class or function.
+    */
+    friend class CreatePolicy;
 #else
-		  friend class CreatePolicy<T>;
+    friend class CreatePolicy<T>;
 #endif
-                  static T* pInstance_;
-                  static bool destroyed_;
-                  singleton(const singleton &rhs);
-                  singleton& operator=(const singleton&);
-                  static void onDeadReference()
-                  {
-                      throw std::runtime_error("dead reference!");
-                  }
+    static T* pInstance_;
+    static bool destroyed_;
+    singleton(const singleton &rhs);
+    singleton& operator=(const singleton&);
+    static void onDeadReference()
+    {
+        throw std::runtime_error("dead reference!");
+    }
                   
-                  static void DestroySingleton()
-                  {
-                      CreatePolicy<T>::destroy(pInstance_);
-                      pInstance_ = 0;
-                      destroyed_=true;
+    static void DestroySingleton()
+    {
+        CreatePolicy<T>::destroy(pInstance_);
+        pInstance_ = 0;
+        destroyed_=true;
 #ifdef MAPNIK_DEBUG
-                      std::clog << " destroyed singleton \n";
+        std::clog << " destroyed singleton \n";
 #endif
-                  }
+    }
                   
-                 protected:
+protected:
 #ifdef MAPNIK_THREADSAFE
-                    static mutex mutex_;
+    static mutex mutex_;
 #endif
-                    singleton() {}
-                                  public:
-                  static  T* instance()
-                  {
-                     if (!pInstance_)
-                     {
+    singleton() {}
+public:
+    static  T* instance()
+    {
+        if (!pInstance_)
+        {
 #ifdef MAPNIK_THREADSAFE
-                        mutex::scoped_lock lock(mutex_);
+            mutex::scoped_lock lock(mutex_);
 #endif                        
-                        if (!pInstance_)
-                        {
+            if (!pInstance_)
+            {
                            
-                           if (destroyed_)
-                           {
-                              onDeadReference();
-                           }
-                           else
-                           {
-                                  pInstance_=CreatePolicy<T>::create();
-                                  // register destruction
-                                  std::atexit(&DestroySingleton);
-                           }
-                        }
-                     }
-                     return pInstance_;
-                  }
-              };
+                if (destroyed_)
+                {
+                    onDeadReference();
+                }
+                else
+                {
+                    pInstance_=CreatePolicy<T>::create();
+                    // register destruction
+                    std::atexit(&DestroySingleton);
+                }
+            }
+        }
+        return pInstance_;
+    }
+};
 #ifdef MAPNIK_THREADSAFE
-    template <typename T,
-              template <typename T> class CreatePolicy> mutex singleton<T,CreatePolicy>::mutex_;
+template <typename T,
+          template <typename U> class CreatePolicy> mutex singleton<T,CreatePolicy>::mutex_;
 #endif
     
-    template <typename T,
-              template <typename T> class CreatePolicy> T* singleton<T,CreatePolicy>::pInstance_=0;
-    template <typename T,
-              template <typename T> class CreatePolicy> bool singleton<T,CreatePolicy>::destroyed_=false;
+template <typename T,
+          template <typename U> class CreatePolicy> T* singleton<T,CreatePolicy>::pInstance_=0;
+template <typename T,
+          template <typename U> class CreatePolicy> bool singleton<T,CreatePolicy>::destroyed_=false;
    
 }
 
diff --git a/include/mapnik/value.hpp b/include/mapnik/value.hpp
index 6a84eca..95943a1 100644
--- a/include/mapnik/value.hpp
+++ b/include/mapnik/value.hpp
@@ -31,6 +31,7 @@
 #include <boost/variant.hpp>
 #include <boost/scoped_array.hpp>
 #include <boost/concept_check.hpp>
+#include <boost/lexical_cast.hpp>
 // stl
 #include <iostream>
 #include <string>
@@ -48,22 +49,22 @@ inline void to_utf8(UnicodeString const& input, std::string & target)
 {
     if (input.length() == 0) return;
       
-    const int BUF_SIZE = 256;
+    const int32_t BUF_SIZE = 256;
     char  buf [BUF_SIZE];
-    int len;
+    int32_t len;
       
     UErrorCode err = U_ZERO_ERROR;
     u_strToUTF8(buf, BUF_SIZE, &len, input.getBuffer(), input.length(), &err);
     if (err == U_BUFFER_OVERFLOW_ERROR || err == U_STRING_NOT_TERMINATED_WARNING ) 
     {
-	boost::scoped_array<char> buf_ptr(new char [len+1]);
-	err = U_ZERO_ERROR;
-	u_strToUTF8(buf_ptr.get() , len + 1, &len, input.getBuffer(), input.length(), &err);
-	target.assign(buf_ptr.get() , len);
+        boost::scoped_array<char> buf_ptr(new char [len+1]);
+        err = U_ZERO_ERROR;
+        u_strToUTF8(buf_ptr.get() , len + 1, &len, input.getBuffer(), input.length(), &err);
+        target.assign(buf_ptr.get() , len);
     }
     else
     {
-	target.assign(buf, len);
+        target.assign(buf, len);
     }
 }
    
@@ -78,35 +79,37 @@ struct equals
     template <typename T, typename U>
     bool operator() (const T &, const U &) const
     {
-	return false;
+        return false;
     }
-	
+        
     template <typename T>
     bool operator() (T lhs, T rhs) const
     {
-	return lhs == rhs;
+        return lhs == rhs;
     }
             
     bool operator() (int lhs, double rhs) const
     {
-	return  lhs == rhs;
+        return  lhs == rhs;
     }
-	
+        
     bool operator() (double lhs, int rhs) const
     {
-	return  (lhs == rhs)? true : false ;
+        return  (lhs == rhs)? true : false ;
     }
-	
+        
     bool operator() (UnicodeString const& lhs, 
-		     UnicodeString const& rhs) const
+                     UnicodeString const& rhs) const
     {
-	return  (lhs == rhs) ? true: false;
+        return  (lhs == rhs) ? true: false;
     }
 
     bool operator() (value_null, value_null) const
     {
-	return false;
+        // this changed from false to true - see http://trac.mapnik.org/ticket/794
+        return true;
     }
+
 };
       
 struct not_equals
@@ -115,46 +118,49 @@ struct not_equals
     template <typename T, typename U>
     bool operator() (const T &, const U &) const
     {
-	return true;
+        return true;
     }
-	
+        
     template <typename T>
     bool operator() (T lhs, T rhs) const
     {
-	return lhs != rhs;
+        return lhs != rhs;
     }
             
     bool operator() (int lhs, double rhs) const
     {
-	return  lhs != rhs;
+        return  lhs != rhs;
     }
-	
+        
     bool operator() (double lhs, int rhs) const
     {
-	return  lhs != rhs;
+        return  lhs != rhs;
     }
-	
+        
     bool operator() (UnicodeString const& lhs, 
-		     UnicodeString const& rhs) const
+                     UnicodeString const& rhs) const
     {
-	return  (lhs != rhs)? true : false;
+        return  (lhs != rhs)? true : false;
     }
 
     bool operator() (value_null, value_null) const
     {
-	return false;
+        // TODO - needs review http://trac.mapnik.org/ticket/794
+        return false;
     }
 
     template <typename T>
     bool operator() (value_null, const T &) const
     {
-	return false;
+        // TODO - needs review http://trac.mapnik.org/ticket/794
+        return false;
     }
 
     template <typename T>
     bool operator() (const T &, value_null) const
     {
-	return false;
+        // TODO - needs review http://trac.mapnik.org/ticket/794
+        return false;
     }
 };
 
@@ -164,143 +170,143 @@ struct greater_than
     template <typename T, typename U>
     bool operator()(const T &, const U &) const
     {
-	return false;
+        return false;
     }
-	
+        
     template <typename T>
     bool operator()(T lhs, T rhs) const
     {
-	return lhs > rhs;
+        return lhs > rhs;
     }
-	
+        
     bool operator() (int lhs, double rhs) const
     {
-	return  lhs > rhs;
+        return  lhs > rhs;
     }
-	
+        
     bool operator() (double lhs, int rhs) const
     {
-	return  lhs > rhs;
+        return  lhs > rhs;
     }
-	
+        
     bool operator() (UnicodeString const& lhs, UnicodeString const& rhs) const
     {
-	return  (lhs > rhs) ? true : false ;
+        return  (lhs > rhs) ? true : false ;
     }
 
     bool operator() (value_null, value_null) const
     {
-	return false;
+        return false;
     }
 };
     
 struct greater_or_equal
     : public boost::static_visitor<bool>
-{	
+{       
     template <typename T, typename U>
     bool operator()(const T &, const U &) const
     {
-	return false;
+        return false;
     }
-	
+        
     template <typename T>
     bool operator() (T lhs, T rhs) const
     {
-	return lhs >= rhs;
+        return lhs >= rhs;
     }
       
     bool operator() (int lhs, double rhs) const
     {
-	return  lhs >= rhs;
+        return  lhs >= rhs;
     }
-	
+        
     bool operator() (double lhs, int rhs) const
     {
-	return  lhs >= rhs;
+        return  lhs >= rhs;
     }
-	
+        
     bool operator() (UnicodeString const& lhs, UnicodeString const& rhs) const
     {
-	return ( lhs >= rhs ) ? true : false ;
+        return ( lhs >= rhs ) ? true : false ;
     }
 
     bool operator() (value_null, value_null) const
     {
-	return false;
+        return false;
     }
 };
     
 struct less_than
     : public boost::static_visitor<bool>
-{	
+{       
     template <typename T, typename U>
     bool operator()(const T &, const U &) const
     {
-	return false;
+        return false;
     }
-	
+        
     template <typename T>
     bool operator()(T lhs, T rhs) const
     {
-	return lhs < rhs;
+        return lhs < rhs;
     }
-	
+        
     bool operator() (int lhs, double rhs) const
     {
-	return  lhs < rhs;
+        return  lhs < rhs;
     }
-	   
+           
     bool operator() (double lhs, int rhs) const
     {
-	return  lhs < rhs;
+        return  lhs < rhs;
     }
-	
+        
     bool operator()(UnicodeString const& lhs, 
-		    UnicodeString const& rhs ) const
+                    UnicodeString const& rhs ) const
     {
-	return (lhs < rhs) ? true : false ;
+        return (lhs < rhs) ? true : false ;
     }
 
     bool operator() (value_null, value_null) const
     {
-	return false;
+        return false;
     }
 };
 
 struct less_or_equal
     : public boost::static_visitor<bool>
-{	
+{       
     template <typename T, typename U>
     bool operator()(const T &, const U &) const
     {
-	return false;
+        return false;
     }
-	
+        
     template <typename T>
     bool operator()(T lhs, T rhs) const
     {
-	return lhs <= rhs;
+        return lhs <= rhs;
     }
-	    
+            
     bool operator() (int lhs, double rhs) const
     {
-	return  lhs <= rhs;
+        return  lhs <= rhs;
     }
-	
+        
     bool operator() (double lhs, int rhs) const
     {
-	return  lhs <= rhs;
+        return  lhs <= rhs;
     }
-	
+        
     bool operator()(UnicodeString const& lhs, 
-		    UnicodeString const& rhs ) const
+                    UnicodeString const& rhs ) const
     {
-	return (lhs <= rhs) ? true : false ;
+        return (lhs <= rhs) ? true : false ;
     }
 
     bool operator() (value_null, value_null) const
     {
-	return false;
+        return false;
     }
 };
     
@@ -308,31 +314,49 @@ template <typename V>
 struct add : public boost::static_visitor<V>
 { 
     typedef V value_type;
-    template <typename T1, typename T2>
-    value_type operator() (T1 const& lhs, T2 const&) const
-    {
-	return lhs;
-    }
+    
     template <typename T>
     value_type operator() (T lhs, T rhs) const
     {
-	return lhs + rhs ;
+        return lhs + rhs ;
     }
-	
+        
     value_type operator() (UnicodeString const& lhs , 
-			   UnicodeString const& rhs ) const
+                           UnicodeString const& rhs ) const
     {
-	return lhs + rhs;
+        return lhs + rhs;
     }
-	
+        
     value_type operator() (double lhs, int rhs) const
     {
-	return lhs + rhs;
+        return lhs + rhs;
     }
-	
+        
     value_type operator() (int lhs, double rhs) const
     {
-	return lhs + rhs;
+        return lhs + rhs;
+    }
+
+    template <typename R>
+    value_type operator() (UnicodeString const& lhs, R const& rhs) const
+    {
+        std::basic_ostringstream<char> out;
+        out << rhs;
+        return lhs + UnicodeString(out.str().c_str());
+    }
+
+    template <typename L>
+    value_type operator() (L const& lhs , UnicodeString const& rhs) const
+    {
+        std::basic_ostringstream<char> out;
+        out << lhs;
+        return UnicodeString(out.str().c_str()) + rhs;
+    }
+     
+    template <typename T1, typename T2>
+    value_type operator() (T1 const& lhs, T2 const&) const
+    {
+        return lhs;
     }
 };
 
@@ -343,29 +367,29 @@ struct sub : public boost::static_visitor<V>
     template <typename T1, typename T2>
     value_type operator() (T1 const& lhs, T2 const&) const
     {
-	return lhs;
+        return lhs;
     }
 
     template <typename T>
     value_type operator() (T  lhs, T rhs) const
     {
-	return lhs - rhs ;
+        return lhs - rhs ;
     }
 
     value_type operator() (UnicodeString const& lhs,
-			   UnicodeString const& ) const
+                           UnicodeString const& ) const
     {
-	return lhs;
+        return lhs;
     }
-        	
+                
     value_type operator() (double lhs, int rhs) const
     {
-	return lhs - rhs;
+        return lhs - rhs;
     }
-	
+        
     value_type operator() (int lhs, double rhs) const
     {
-	return lhs - rhs;
+        return lhs - rhs;
     }
 };
     
@@ -376,28 +400,28 @@ struct mult : public boost::static_visitor<V>
     template <typename T1, typename T2>
     value_type operator() (T1 const& lhs , T2 const& ) const
     {
-	return lhs;
+        return lhs;
     }
     template <typename T>
     value_type operator() (T lhs, T rhs) const
     {
-	return lhs * rhs;
+        return lhs * rhs;
     }
-	
+        
     value_type operator() (UnicodeString const& lhs,
-			   UnicodeString const& ) const
+                           UnicodeString const& ) const
     {
-	return lhs;
-    }	
-	
+        return lhs;
+    }   
+        
     value_type operator() (double lhs, int rhs) const
     {
-	return lhs * rhs;
+        return lhs * rhs;
     }
-	
+        
     value_type operator() (int lhs, double rhs) const
     {
-	return lhs * rhs;
+        return lhs * rhs;
     }
 };
 
@@ -408,36 +432,36 @@ struct div: public boost::static_visitor<V>
     template <typename T1, typename T2>
     value_type operator() (T1 const& lhs, T2 const&) const
     {
-	return lhs;
+        return lhs;
     }
-	    
+            
     template <typename T>
     value_type operator() (T lhs, T rhs) const
     {
-	return lhs / rhs;
+        return lhs / rhs;
     }
-	
+        
     value_type operator() (bool lhs, bool rhs ) const
     {
-	boost::ignore_unused_variable_warning(lhs);
-	boost::ignore_unused_variable_warning(rhs);
-	return false;
+        boost::ignore_unused_variable_warning(lhs);
+        boost::ignore_unused_variable_warning(rhs);
+        return false;
     }
    
     value_type operator() (UnicodeString const& lhs,
-			   UnicodeString const&) const
+                           UnicodeString const&) const
     {
-	return lhs;
+        return lhs;
     }
-	
+        
     value_type operator() (double lhs, int rhs) const
     {
-	return lhs / rhs;
+        return lhs / rhs;
     }
-	
+        
     value_type operator() (int lhs, double rhs) const
     {
-	return lhs / rhs;
+        return lhs / rhs;
     }
 };
 
@@ -448,58 +472,68 @@ struct mod: public boost::static_visitor<V>
     template <typename T1, typename T2>
     value_type operator() (T1 const& lhs, T2 const&) const
     {
-	return lhs;
+        return lhs;
     }
-	    
+            
     template <typename T>
     value_type operator() (T lhs, T rhs) const
     {
-	return lhs % rhs;
+        return lhs % rhs;
     }
-	
+        
     value_type operator() (UnicodeString const& lhs,
-			   UnicodeString const&) const
+                           UnicodeString const&) const
     {
-	return lhs;
+        return lhs;
     }
-	
+        
     value_type operator() (bool lhs,
-			   bool rhs) const
+                           bool rhs) const
     {
-	boost::ignore_unused_variable_warning(lhs);
-	boost::ignore_unused_variable_warning(rhs);
-	return false;
+        boost::ignore_unused_variable_warning(lhs);
+        boost::ignore_unused_variable_warning(rhs);
+        return false;
     }
-	
+        
     value_type operator() (double lhs, int rhs) const
     {
-	return std::fmod(lhs, rhs);
+        return std::fmod(lhs, rhs);
     }
-	
+        
     value_type operator() (int lhs, double rhs) const
     {
-	return std::fmod(lhs, rhs);
+        return std::fmod(lhs, rhs);
     }
-	
+        
     value_type operator() (double lhs, double rhs) const
     {
-	return std::fmod(lhs, rhs);
+        return std::fmod(lhs, rhs);
     }
 };
         
 struct to_bool : public boost::static_visitor<bool>
 {
-                
-    template <typename T>
-    bool operator() (T val) const
+    bool operator() (bool val) const
+    {
+        return val;
+    }
+ 
+    bool operator() (UnicodeString const& ustr) const
+    {
+        boost::ignore_unused_variable_warning(ustr);
+        return true;
+    }
+    
+    bool operator() (value_null const& val) const
     {
-	boost::ignore_unused_variable_warning(val);
-	throw config_error("Boolean value expected");
+        boost::ignore_unused_variable_warning(val);
+        return false;
     }
 
-    bool operator() (bool val) const
+    template <typename T>
+    bool operator() (T val) const
     {
-	return val;
+        return bool(val);
     }
 };
 
@@ -509,29 +543,29 @@ struct to_string : public boost::static_visitor<std::string>
     template <typename T>
     std::string operator() (T val) const
     {
-	std::stringstream ss;
-	ss << val;
-	return ss.str();
+        std::stringstream ss;
+        ss << val;
+        return ss.str();
     }
     // specializations 
     std::string operator() (UnicodeString const& val) const
     {
-	std::string utf8;
-	to_utf8(val,utf8);
-	return utf8;
+        std::string utf8;
+        to_utf8(val,utf8);
+        return utf8;
     }
             
     std::string operator() (double val) const
     {
-	std::stringstream ss;
-	ss << std::setprecision(16) << val;
-	return ss.str();
+        std::stringstream ss;
+        ss << std::setprecision(16) << val;
+        return ss.str();
     }
             
     std::string operator() (value_null const& val) const
     {
-	boost::ignore_unused_variable_warning(val);
-	return "";
+        boost::ignore_unused_variable_warning(val);
+        return "";
     }
 };
 
@@ -541,28 +575,28 @@ struct to_unicode : public boost::static_visitor<UnicodeString>
     template <typename T>
     UnicodeString operator() (T val) const
     {
-	std::basic_ostringstream<char> out;
-	out << val;
-	return UnicodeString(out.str().c_str());
+        std::basic_ostringstream<char> out;
+        out << val;
+        return UnicodeString(out.str().c_str());
     }
 
     // specializations 
     UnicodeString const& operator() (UnicodeString const& val) const
     {
-	return val;
+        return val;
     }
 
     UnicodeString operator() (double val) const
     {
-	std::basic_ostringstream<char> out;
-	out << std::setprecision(16) << val;
-	return UnicodeString(out.str().c_str());
+        std::basic_ostringstream<char> out;
+        out << std::setprecision(16) << val;
+        return UnicodeString(out.str().c_str());
     }
             
     UnicodeString operator() (value_null const& val) const
     {
-	boost::ignore_unused_variable_warning(val);
-	return UnicodeString("");
+        boost::ignore_unused_variable_warning(val);
+        return UnicodeString("");
     }
 };
       
@@ -570,32 +604,98 @@ struct to_expression_string : public boost::static_visitor<std::string>
 {
     std::string operator() (UnicodeString const& val) const
     {
-	std::string utf8;
-	to_utf8(val,utf8);
-	return "'" + utf8 + "'";
+        std::string utf8;
+        to_utf8(val,utf8);
+        return "'" + utf8 + "'";
     } 
             
     std::string operator() (double val) const
     {
-	std::stringstream ss;
-	ss << std::setprecision(16) << val;
-	return ss.str();
+        std::stringstream ss;
+        ss << std::setprecision(16) << val;
+        return ss.str();
+    }
+
+    std::string operator() (bool val) const
+    {
+        return val ? "true":"false";
     }
 
     std::string operator() (value_null const& val) const
     {
-	boost::ignore_unused_variable_warning(val);
-	return "null";
+        boost::ignore_unused_variable_warning(val);
+        return "null";
     }
-	  
+          
     template <typename T>
     std::string operator() (T val) const
     {
-	std::stringstream ss;
-	ss << val;
-	return ss.str();
+        std::stringstream ss;
+        ss << val;
+        return ss.str();
     }
 };
+
+struct to_double : public boost::static_visitor<double>
+{
+    double operator() (int val) const
+    {
+        return static_cast<double>(val);
+    }
+
+    double operator() (double val) const
+    {
+        return val;
+    }
+
+    double operator() (std::string const& val) const
+    {
+        return boost::lexical_cast<double>(val);
+    } 
+    double operator() (UnicodeString const& val) const
+    {
+        std::string utf8;
+        to_utf8(val,utf8);
+        return boost::lexical_cast<double>(utf8);
+    } 
+            
+    double operator() (value_null const& val) const
+    {
+        boost::ignore_unused_variable_warning(val);
+        return 0.0;
+    }
+};
+
+struct to_int : public boost::static_visitor<double>
+{
+    int operator() (int val) const
+    {
+        return val;
+    }
+
+    int operator() (double val) const
+    {
+        return rint(val);
+    }
+
+    int operator() (std::string const& val) const
+    {
+        return boost::lexical_cast<int>(val);
+    } 
+    int operator() (UnicodeString const& val) const
+    {
+        std::string utf8;
+        to_utf8(val,utf8);
+        return boost::lexical_cast<int>(utf8);
+    } 
+            
+    int operator() (value_null const& val) const
+    {
+        boost::ignore_unused_variable_warning(val);
+        return 0;
+    }
+};
+
 }
 
 class value
@@ -609,65 +709,76 @@ class value
         
 public:
     value ()
-	: base_(value_null()) {}
-	
+        : base_(value_null()) {}
+        
     template <typename T> value(T _val_)
-	: base_(_val_) {}
+        : base_(_val_) {}
 
     bool operator==(value const& other) const
     {
-	return boost::apply_visitor(impl::equals(),base_,other.base_);
+        return boost::apply_visitor(impl::equals(),base_,other.base_);
     }
 
     bool operator!=(value const& other) const
     {
-	return boost::apply_visitor(impl::not_equals(),base_,other.base_);
+        return boost::apply_visitor(impl::not_equals(),base_,other.base_);
     }
-	
+        
     bool operator>(value const& other) const
     {
-	return boost::apply_visitor(impl::greater_than(),base_,other.base_);
+        return boost::apply_visitor(impl::greater_than(),base_,other.base_);
     }
 
     bool operator>=(value const& other) const
     {
-	return boost::apply_visitor(impl::greater_or_equal(),base_,other.base_);
+        return boost::apply_visitor(impl::greater_or_equal(),base_,other.base_);
     }
 
     bool operator<(value const& other) const
     {
-	return boost::apply_visitor(impl::less_than(),base_,other.base_);
+        return boost::apply_visitor(impl::less_than(),base_,other.base_);
     }
 
     bool operator<=(value const& other) const
     {
-	return boost::apply_visitor(impl::less_or_equal(),base_,other.base_);
+        return boost::apply_visitor(impl::less_or_equal(),base_,other.base_);
     }
          
     value_base const& base() const
     {
-	return base_;
+        return base_;
     }
 
     bool to_bool() const
     {
-	return boost::apply_visitor(impl::to_bool(),base_);
+        return boost::apply_visitor(impl::to_bool(),base_);
     }
 
     std::string to_expression_string() const
     {
-	return boost::apply_visitor(impl::to_expression_string(),base_);
+        return boost::apply_visitor(impl::to_expression_string(),base_);
     }
 
     std::string to_string() const
     {
-	return boost::apply_visitor(impl::to_string(),base_);
+        return boost::apply_visitor(impl::to_string(),base_);
     }
          
     UnicodeString to_unicode() const
     {
-	return boost::apply_visitor(impl::to_unicode(),base_);
+        return boost::apply_visitor(impl::to_unicode(),base_);
     }
+
+    double to_double() const
+    {
+        return boost::apply_visitor(impl::to_double(),base_);
+    }
+
+    double to_int() const
+    {
+        return boost::apply_visitor(impl::to_int(),base_);
+    }
+
 };
    
 inline const value operator+(value const& p1,value const& p2)
@@ -703,7 +814,7 @@ inline const value operator%(value const& p1,value const& p2)
 template <typename charT, typename traits>
 inline std::basic_ostream<charT,traits>& 
 operator << (std::basic_ostream<charT,traits>& out,
-	     value const& v)
+             value const& v)
 {
     out << v.to_string();
     return out; 
diff --git a/include/mapnik/value_error.hpp b/include/mapnik/value_error.hpp
new file mode 100644
index 0000000..a83631f
--- /dev/null
+++ b/include/mapnik/value_error.hpp
@@ -0,0 +1,57 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_VALUE_ERROR_INCLUDED
+#define MAPNIK_VALUE_ERROR_INCLUDED
+
+#include <iostream>
+#include <sstream>
+
+namespace mapnik {
+
+class value_error : public std::exception
+{
+public:
+    value_error() {}
+
+    value_error( const std::string & what ) :
+        what_( what )
+    {
+    }
+    virtual ~value_error() throw() {};
+
+    virtual const char * what() const throw()
+    {
+        return what_.c_str();    
+    }
+
+    void append_context(const std::string & ctx) const
+    {
+        what_ += " " + ctx;
+    }
+
+protected:
+    mutable std::string what_;
+};
+}
+
+#endif // MAPNIK_VALUE_ERROR_INCLUDED
diff --git a/include/mapnik/version.hpp b/include/mapnik/version.hpp
index a92ea08..defeb9d 100644
--- a/include/mapnik/version.hpp
+++ b/include/mapnik/version.hpp
@@ -24,7 +24,7 @@
 #ifndef MAPNIK_VERSION_HPP
 #define MAPNIK_VERSION_HPP
 
-#define MAPNIK_VERSION 701
+#define MAPNIK_VERSION 200000
 
 #endif //MAPNIK_VERSION_HPP
 
diff --git a/include/mapnik/vertex.hpp b/include/mapnik/vertex.hpp
index aa4a2fa..4227cd1 100644
--- a/include/mapnik/vertex.hpp
+++ b/include/mapnik/vertex.hpp
@@ -29,83 +29,83 @@
 
 namespace mapnik 
 {
-    enum CommandType {
-        SEG_END   =0,
-        SEG_MOVETO=1,
-        SEG_LINETO=2,
-        SEG_CLOSE =3
-    };
+enum CommandType {
+    SEG_END   =0,
+    SEG_MOVETO=1,
+    SEG_LINETO=2,
+    SEG_CLOSE =3
+};
     
-    template <typename T,int dim>
-    struct vertex {
-        typedef T type;
-    };
+template <typename T,int dim>
+struct vertex {
+    typedef T type;
+};
     
-    template <typename T>
-    struct vertex<T,2> 
-    {
-        typedef T type;
-        T x;
-        T y;
-        unsigned cmd;
-        vertex() 
-            : x(0),y(0),cmd(SEG_END) {}
-        vertex(T x,T y,unsigned cmd)
-            : x(x),y(y),cmd(cmd) {}
+template <typename T>
+struct vertex<T,2> 
+{
+    typedef T type;
+    T x;
+    T y;
+    unsigned cmd;
+    vertex() 
+        : x(0),y(0),cmd(SEG_END) {}
+    vertex(T x,T y,unsigned cmd)
+        : x(x),y(y),cmd(cmd) {}
 
-        template <typename T2>
-        vertex(const vertex<T2,2>& rhs)
-            : x(type(rhs.x)),
-              y(type(rhs.y)),
-              cmd(rhs.cmd) {}
-	
-        template <typename T2> vertex<T,2> operator=(const vertex<T2,2>& rhs)
+    template <typename T2>
+    vertex(const vertex<T2,2>& rhs)
+        : x(type(rhs.x)),
+          y(type(rhs.y)),
+          cmd(rhs.cmd) {}
+        
+    template <typename T2> vertex<T,2> operator=(const vertex<T2,2>& rhs)
+    {
+        if ((void*)this == (void*)&rhs)
         {
-            if ((void*)this == (void*)&rhs)
-            {
-                return *this;
-            }
-            x=type(rhs.x);
-            y=type(rhs.y);
-            cmd=rhs.cmd;
             return *this;
-        }	
-    };
+        }
+        x=type(rhs.x);
+        y=type(rhs.y);
+        cmd=rhs.cmd;
+        return *this;
+    }   
+};
     
-    typedef vertex<double,2> vertex2d;
-    typedef vertex<int,2> vertex2i;
+typedef vertex<double,2> vertex2d;
+typedef vertex<int,2> vertex2i;
 
     
-    template <class charT,class traits,class T,int dim>
-    inline std::basic_ostream<charT,traits>&
-    operator << (std::basic_ostream<charT,traits>& out,
-                 const vertex<T,dim>& c);
+template <class charT,class traits,class T,int dim>
+inline std::basic_ostream<charT,traits>&
+operator << (std::basic_ostream<charT,traits>& out,
+             const vertex<T,dim>& c);
 
-    template <class charT,class traits,class T>
-    inline std::basic_ostream<charT,traits>&
-    operator << (std::basic_ostream<charT,traits>& out,
-                 const vertex<T,2>& v)
-    {
-        std::basic_ostringstream<charT,traits> s;
-        s.copyfmt(out);
-        s.width(0);
-        s<<"vertex2("<<v.x<<","<<v.y<<",cmd="<<v.cmd<<" )";
-        out << s.str();
-        return out;
-    }
+template <class charT,class traits,class T>
+inline std::basic_ostream<charT,traits>&
+operator << (std::basic_ostream<charT,traits>& out,
+             const vertex<T,2>& v)
+{
+    std::basic_ostringstream<charT,traits> s;
+    s.copyfmt(out);
+    s.width(0);
+    s<<"vertex2("<<v.x<<","<<v.y<<",cmd="<<v.cmd<<" )";
+    out << s.str();
+    return out;
+}
 
-    template <class charT,class traits,class T>
-    inline std::basic_ostream<charT,traits>&
-    operator << (std::basic_ostream<charT,traits>& out,
-                 const vertex<T,3>& v)
-    {
-        std::basic_ostringstream<charT,traits> s;
-        s.copyfmt(out);
-        s.width(0);
-        s<<"vertex3("<<v.x<<","<<v.y<<","<<v.z<<",cmd="<<v.cmd<<")";
-        out << s.str();
-        return out;
-    } 
+template <class charT,class traits,class T>
+inline std::basic_ostream<charT,traits>&
+operator << (std::basic_ostream<charT,traits>& out,
+             const vertex<T,3>& v)
+{
+    std::basic_ostringstream<charT,traits> s;
+    s.copyfmt(out);
+    s.width(0);
+    s<<"vertex3("<<v.x<<","<<v.y<<","<<v.z<<",cmd="<<v.cmd<<")";
+    out << s.str();
+    return out;
+} 
 
 }
 
diff --git a/include/mapnik/vertex_transform.hpp b/include/mapnik/vertex_transform.hpp
index 6f7469d..3a333bd 100644
--- a/include/mapnik/vertex_transform.hpp
+++ b/include/mapnik/vertex_transform.hpp
@@ -25,69 +25,69 @@
 #define VERTEX_TRANSFORM_HPP
 
 // mapnik
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 #include <mapnik/vertex.hpp>
 
 namespace mapnik
 {
-    template <typename T0 ,typename T1,int shift=8>
-    struct Shift
+template <typename T0 ,typename T1,int shift=8>
+struct Shift
+{
+    typedef T0 value_type;
+    typedef T1 return_type;
+    static return_type apply(value_type val)
     {
-        typedef T0 value_type;
-        typedef T1 return_type;
-        static return_type apply(value_type val)
-        {
-            return static_cast<return_type>(val*(1<<shift));
-        }
-    };
+        return static_cast<return_type>(val*(1<<shift));
+    }
+};
 
-    template <typename T0,typename T1>
-    struct Shift<T0,T1,0> 
+template <typename T0,typename T1>
+struct Shift<T0,T1,0> 
+{
+    typedef T0 value_type;
+    typedef T1 return_type;
+    static return_type apply(value_type val)
     {
-        typedef T0 value_type;
-        typedef T1 return_type;
-        static return_type apply(value_type val)
-        {
-            return static_cast<return_type>(val);
-        }
-    };
+        return static_cast<return_type>(val);
+    }
+};
 
-    template <typename T>
-    struct Shift<T,T,0>
+template <typename T>
+struct Shift<T,T,0>
+{
+    typedef T value_type;
+    typedef T return_type;
+    static T& apply(T& val)
     {
-        typedef T value_type;
-        typedef T return_type;
-        static T& apply(T& val)
-        {
-            return val;
-        }
-    };
+        return val;
+    }
+};
 
-    typedef Shift<double,double,0> NO_SHIFT;
-    typedef Shift<double,int,0> SHIFT0;
-    typedef Shift<double,int,8> SHIFT8;
+typedef Shift<double,double,0> NO_SHIFT;
+typedef Shift<double,int,0> SHIFT0;
+typedef Shift<double,int,8> SHIFT8;
     
     
-    template <typename T0,typename T1,typename Trans>
-    struct view_transform;
+template <typename T0,typename T1,typename Trans>
+struct view_transform;
     
-    template <typename Trans>
-    struct view_transform <vertex2d,vertex2d,Trans>   
-    {
-	
-    };
+template <typename Trans>
+struct view_transform <vertex2d,vertex2d,Trans>   
+{
+        
+};
     
-    template <typename Trans>
-    struct view_transform <vertex2d,vertex2i,Trans>   
-    {
-	
-    };
+template <typename Trans>
+struct view_transform <vertex2d,vertex2i,Trans>   
+{
+        
+};
 
-    template <typename Trans>
-    struct view_transform<Envelope<double>,Envelope<double>,Trans>
-    {
-	
-    };
+template <typename Trans>
+struct view_transform<box2d<double>,box2d<double>,Trans>
+{
+        
+};
 }
 
 #endif //VERTEX_TRANSFORM_HPP
diff --git a/include/mapnik/vertex_vector.hpp b/include/mapnik/vertex_vector.hpp
index 8144d51..72f7e1d 100644
--- a/include/mapnik/vertex_vector.hpp
+++ b/include/mapnik/vertex_vector.hpp
@@ -41,146 +41,106 @@
 
 namespace mapnik
 {
-    template <typename T>
-    class vertex_vector : private boost::noncopyable
-    {
-        typedef typename T::type value_type;
-        typedef vertex<value_type,2> vertex_type;
-        enum block_e {
-            block_shift = 8,
-            block_size  = 1<<block_shift,
-            block_mask  = block_size - 1,
-            grow_by     = 256
-        };
+template <typename T>
+class vertex_vector : private boost::noncopyable
+{
+    typedef typename T::type value_type;
+    typedef vertex<value_type,2> vertex_type;
+    enum block_e {
+        block_shift = 8,
+        block_size  = 1<<block_shift,
+        block_mask  = block_size - 1,
+        grow_by     = 256
+    };
 
-    private:
-        unsigned num_blocks_;
-        unsigned max_blocks_;
-        value_type** vertexs_;
-        unsigned char** commands_;
-        unsigned pos_;
-    public:
-	
-        vertex_vector() 
-            : num_blocks_(0),
-              max_blocks_(0),
-              vertexs_(0),
-              commands_(0),
-              pos_(0) {}
+private:
+    unsigned num_blocks_;
+    unsigned max_blocks_;
+    value_type** vertexs_;
+    unsigned char** commands_;
+    unsigned pos_;
+public:
+        
+    vertex_vector() 
+        : num_blocks_(0),
+          max_blocks_(0),
+          vertexs_(0),
+          commands_(0),
+          pos_(0) {}
 
-        ~vertex_vector()
-        {
-            if ( num_blocks_ )
-            {
-                value_type** vertexs=vertexs_ + num_blocks_ - 1;
-                while ( num_blocks_-- )
-                {
-                    delete [] *vertexs;
-                    --vertexs;
-                }
-                delete [] vertexs_;
-            }
-        }
-        unsigned size() const 
-        {
-            return pos_;
-        }
-	
-        void push_back (value_type x,value_type y,unsigned command)
+    ~vertex_vector()
+    {
+        if ( num_blocks_ )
         {
-            unsigned block = pos_ >> block_shift;
-            if (block >= num_blocks_)
+            value_type** vertexs=vertexs_ + num_blocks_ - 1;
+            while ( num_blocks_-- )
             {
-                allocate_block(block);
+                ::operator delete(*vertexs);
+                --vertexs;
             }
-            value_type* vertex = vertexs_[block] + ((pos_ & block_mask) << 1);
-            unsigned char* cmd= commands_[block] + (pos_ & block_mask);
-	    
-            *cmd = static_cast<unsigned char>(command);
-            *vertex++ = x;
-            *vertex   = y;
-            ++pos_;
-        }
-        unsigned get_vertex(unsigned pos,value_type* x,value_type* y) const
-        {
-            if (pos >= pos_) return SEG_END;
-            unsigned block = pos >> block_shift;
-            const value_type* vertex = vertexs_[block] + (( pos & block_mask) << 1);
-            *x = (*vertex++);
-            *y = (*vertex);
-            return commands_[block] [pos & block_mask];
-        }
-        	
-        void set_capacity(size_t)
-        {
-            //do nothing
+            ::operator delete(vertexs_);
         }
+    }
+    unsigned size() const 
+    {
+        return pos_;
+    }
         
-    private:
-        void allocate_block(unsigned block)
-        {
-            if (block >= max_blocks_)
-            {
-                value_type** new_vertexs = new value_type* [(max_blocks_ + grow_by) * 2];
-                unsigned char** new_commands = (unsigned char**)(new_vertexs + max_blocks_ + grow_by);
-                if (vertexs_)
-                {
-                    std::memcpy(new_vertexs,vertexs_,max_blocks_ * sizeof(value_type*));
-                    std::memcpy(new_commands,commands_,max_blocks_ * sizeof(unsigned char*));
-                    delete [] vertexs_;
-                }
-                vertexs_ = new_vertexs;
-                commands_ = new_commands;
-                max_blocks_ += grow_by;
-            }
-            vertexs_[block] = new value_type [block_size * 2 + block_size / (sizeof(value_type))];
-            commands_[block] = (unsigned char*)(vertexs_[block] + block_size*2);
-            ++num_blocks_;
-        }
-    };
-
-    template <typename T>
-    struct vertex_vector2 : boost::noncopyable
+    void push_back (value_type x,value_type y,unsigned command)
     {
-        typedef typename T::type value_type;
-        typedef boost::tuple<value_type,value_type,char> vertex_type;
-        typedef typename std::vector<vertex_type>::const_iterator const_iterator;
-        vertex_vector2() {}
-        unsigned size() const 
+        unsigned block = pos_ >> block_shift;
+        if (block >= num_blocks_)
         {
-            return cont_.size();
-        }
-
-        void push_back (value_type x,value_type y,unsigned command)
-        {
-            cont_.push_back(vertex_type(x,y,command));
-        }
-        unsigned get_vertex(unsigned pos,value_type* x,value_type* y) const
-        {
-            if (pos >= cont_.size()) return SEG_END;
-            vertex_type const& c = cont_[pos];
-            *x = boost::get<0>(c);
-            *y = boost::get<1>(c);
-            return boost::get<2>(c);
+            allocate_block(block);
         }
+        value_type* vertex = vertexs_[block] + ((pos_ & block_mask) << 1);
+        unsigned char* cmd= commands_[block] + (pos_ & block_mask);
+            
+        *cmd = static_cast<unsigned char>(command);
+        *vertex++ = x;
+        *vertex   = y;
+        ++pos_;
+    }
+    unsigned get_vertex(unsigned pos,value_type* x,value_type* y) const
+    {
+        if (pos >= pos_) return SEG_END;
+        unsigned block = pos >> block_shift;
+        const value_type* vertex = vertexs_[block] + (( pos & block_mask) << 1);
+        *x = (*vertex++);
+        *y = (*vertex);
+        return commands_[block] [pos & block_mask];
+    }
+                
+    void set_capacity(size_t)
+    {
+        //do nothing
+    }
         
-        const_iterator begin() const
+private:
+    void allocate_block(unsigned block)
+    {
+        if (block >= max_blocks_)
         {
-            return cont_.begin();
+            value_type** new_vertexs = 
+                static_cast<value_type**>(::operator new (sizeof(value_type*)*((max_blocks_ + grow_by) * 2)));
+            unsigned char** new_commands = (unsigned char**)(new_vertexs + max_blocks_ + grow_by);
+            if (vertexs_)
+            {
+                std::memcpy(new_vertexs,vertexs_,max_blocks_ * sizeof(value_type*));
+                std::memcpy(new_commands,commands_,max_blocks_ * sizeof(unsigned char*));
+                ::operator delete(vertexs_);
+            }
+            vertexs_ = new_vertexs;
+            commands_ = new_commands;
+            max_blocks_ += grow_by;
         }
+        vertexs_[block] = static_cast<value_type*>(::operator new(sizeof(value_type)*(block_size * 2 + block_size / (sizeof(value_type)))));
         
-        const_iterator end() const
-        {
-            return cont_.end();
-        }
+        commands_[block] = (unsigned char*)(vertexs_[block] + block_size*2);
+        ++num_blocks_;
+    }
+};
 
-        void set_capacity(size_t size)
-        {
-            cont_.reserve(size);
-        }
-    private:
-        std::vector<vertex_type> cont_;
-    };
 }
 
 #endif //VERTEX_VECTOR_HPP
diff --git a/include/mapnik/wall_clock_timer.hpp b/include/mapnik/wall_clock_timer.hpp
deleted file mode 100644
index bd471b9..0000000
--- a/include/mapnik/wall_clock_timer.hpp
+++ /dev/null
@@ -1,95 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-
-
-#ifndef MAPNIK_WALL_CLOCK_TIMER_INCLUDED
-#define MAPNIK_WALL_CLOCK_TIMER_INCLUDED
-
-/*
-#include <sys/time.h>
-
-namespace mapnik {
-
-    // This is a class with a similar signature to boost::timer, but which measures
-    // times in wall clock time. Results are returned in milliseconds.
-    class wall_clock_timer
-    {
-    public:
-        wall_clock_timer()
-        { 
-            gettimeofday(&_start_time, NULL);
-        }
-
-        void restart() 
-        {   
-            gettimeofday(&_start_time, NULL);
-        }
-
-        double elapsed() const
-        { 
-            timeval end;
-            gettimeofday(&end, NULL);
-
-            long seconds  = end.tv_sec  - _start_time.tv_sec;
-            long useconds = end.tv_usec - _start_time.tv_usec;
-
-            return ((seconds) * 1000 + useconds / 1000.0) + 0.5;
-        }
-    private:
-        timeval _start_time;
-    };
-
-    //  A progress_timer behaves like a timer except that the destructor displays
-    //  an elapsed time message at an appropriate place in an appropriate form.
-    class wall_clock_progress_timer : public wall_clock_timer
-    {
-    public:
-        wall_clock_progress_timer(std::ostream & os = std::cout, const char * base_message = "") : _os(os), _base_message(base_message) {}
-        ~wall_clock_progress_timer()
-        {
-            //  A) Throwing an exception from a destructor is a Bad Thing.
-            //  B) The progress_timer destructor does output which may throw.
-            //  C) A progress_timer is usually not critical to the application.
-            //  Therefore, wrap the I/O in a try block, catch and ignore all exceptions.
-            try
-            {
-                // use istream instead of ios_base to workaround GNU problem (Greg Chicares)
-                std::istream::fmtflags old_flags = _os.setf( std::istream::fixed,
-                                                             std::istream::floatfield );
-                std::streamsize old_prec = _os.precision( 2 );
-                _os << _base_message << elapsed() << " ms\n" // "s" is System International d'Unites std
-                                  << std::endl;
-                _os.flags( old_flags );
-                _os.precision( old_prec );
-            }
-            catch (...) {} // eat any exceptions
-      }
-
-    private:
-        std::ostream & _os;
-        const char * _base_message;
-    };
-    
-};
-
-*/
-#endif // MAPNIK_WALL_CLOCK_TIMER_INCLUDED
diff --git a/include/mapnik/warp.hpp b/include/mapnik/warp.hpp
new file mode 100644
index 0000000..32ea744
--- /dev/null
+++ b/include/mapnik/warp.hpp
@@ -0,0 +1,41 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006-2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#ifndef WARP_HPP
+#define WARP_HPP
+
+#include <mapnik/raster.hpp>
+#include <mapnik/proj_transform.hpp>
+
+namespace mapnik {
+
+void reproject_raster(raster &target, raster const& source,
+                      proj_transform const& prj_trans,
+                      double offset_x, double offset_y,
+                      unsigned mesh_size,
+                      double filter_radius,
+                      double scale_factor,
+                      std::string scaling_method_name);
+
+}
+#endif //WARP_HPP
diff --git a/include/mapnik/wkb.hpp b/include/mapnik/wkb.hpp
index 3e206a0..fdd4fa1 100644
--- a/include/mapnik/wkb.hpp
+++ b/include/mapnik/wkb.hpp
@@ -32,37 +32,37 @@
 namespace mapnik
 {
 
-    /*!
-     * From wikipedia.com:
-     *
-     * Well-known text (WKT) is a text markup language for representing vector 
-     * geometry objects on a map, spatial reference systems of spatial objects 
-     * and transformations between spatial reference systems. A binary equivalent,
-     * known as well-known binary (WKB) is used to transfer and store the same 
-     * information on databases, such as PostGIS. The formats are regulated by 
-     * the Open Geospatial Consortium (OGC) and described in their Simple Feature 
-     * Access and Coordinate Transformation Service specifications.
-     */
-    enum wkbFormat
-    {
-        wkbGeneric=1,
-        wkbSpatiaLite=2
-    };
+/*!
+ * From wikipedia.com:
+ *
+ * Well-known text (WKT) is a text markup language for representing vector 
+ * geometry objects on a map, spatial reference systems of spatial objects 
+ * and transformations between spatial reference systems. A binary equivalent,
+ * known as well-known binary (WKB) is used to transfer and store the same 
+ * information on databases, such as PostGIS. The formats are regulated by 
+ * the Open Geospatial Consortium (OGC) and described in their Simple Feature 
+ * Access and Coordinate Transformation Service specifications.
+ */
+enum wkbFormat
+{
+    wkbGeneric=1,
+    wkbSpatiaLite=2
+};
 
-    class MAPNIK_DECL geometry_utils 
-    {
-    public:
+class MAPNIK_DECL geometry_utils 
+{
+public:
 
-       static void from_wkb (Feature & feature,
-                             const char* wkb,
-                             unsigned size,
-                             bool multiple_geometries = false,
-                             wkbFormat format = wkbGeneric);
-    private:
-       geometry_utils();
-       geometry_utils(geometry_utils const&);
-       geometry_utils& operator=(const geometry_utils&);
-    };
+    static void from_wkb (boost::ptr_vector<geometry_type>& paths,
+                          const char* wkb,
+                          unsigned size,
+                          bool multiple_geometries = false,
+                          wkbFormat format = wkbGeneric);
+private:
+    geometry_utils();
+    geometry_utils(geometry_utils const&);
+    geometry_utils& operator=(const geometry_utils&);
+};
 }
 
 #endif //WKB_HPP
diff --git a/include/mapnik/wkt/wkt_factory.hpp b/include/mapnik/wkt/wkt_factory.hpp
new file mode 100644
index 0000000..f4c9c23
--- /dev/null
+++ b/include/mapnik/wkt/wkt_factory.hpp
@@ -0,0 +1,37 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_WKT_FACTORY_HPP
+#define MAPNIK_WKT_FACTORY_HPP
+
+#include <string>
+#include <mapnik/geometry.hpp>
+#include <boost/ptr_container/ptr_vector.hpp>
+
+namespace mapnik { 
+
+bool from_wkt(std::string const& wkt, boost::ptr_vector<geometry_type> & paths);
+
+}
+
+
+#endif // MAPNIK_WKT_FACTORY_HPP
diff --git a/include/mapnik/wkt/wkt_grammar.hpp b/include/mapnik/wkt/wkt_grammar.hpp
new file mode 100644
index 0000000..1c7bc4b
--- /dev/null
+++ b/include/mapnik/wkt/wkt_grammar.hpp
@@ -0,0 +1,231 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_WKT_GRAMMAR_HPP
+#define MAPNIK_WKT_GRAMMAR_HPP
+
+#include <boost/assert.hpp>
+#include <boost/ptr_container/ptr_vector.hpp>
+// spirit::qi
+#include <boost/spirit/include/qi.hpp>
+// spirit::phoenix
+#include <boost/spirit/include/phoenix_function.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_fusion.hpp>
+#include <boost/spirit/home/phoenix/object/new.hpp>
+#include <boost/spirit/include/phoenix_stl.hpp>
+// mapnik
+#include <mapnik/geometry.hpp>
+
+namespace mapnik { namespace wkt {
+
+using namespace boost::spirit;
+using namespace boost::fusion;
+using namespace boost::phoenix;
+
+struct push_vertex
+{
+    template <typename T0,typename T1, typename T2, typename T3>
+    struct result
+    {
+        typedef void type;
+    };
+    
+    template <typename T0,typename T1, typename T2, typename T3>
+    void operator() (T0 c, T1 path, T2 x, T3 y) const
+    {
+        BOOST_ASSERT( path!=0 );
+        path->push_vertex(x,y,c);        
+    }
+};
+
+struct cleanup
+{
+    template <typename T0>
+    struct result
+    {
+        typedef void type;
+    };
+    
+    template <typename T0>
+    void operator() (T0 & path) const
+    {        
+        if (path)  delete path,path=0;
+    }
+};
+
+template <typename Iterator>
+struct wkt_grammar : qi::grammar<Iterator,  boost::ptr_vector<mapnik::geometry_type>() , ascii::space_type>
+{
+    wkt_grammar()
+        : wkt_grammar::base_type(geometry_tagged_text)
+    {       
+        using qi::no_case;   
+        using boost::phoenix::push_back;
+        
+        geometry_tagged_text = point_tagged_text
+            | linestring_tagged_text
+            | polygon_tagged_text
+            | multipoint_tagged_text 
+            | multilinestring_tagged_text 
+            | multipolygon_tagged_text 
+            ;
+        
+        // <point tagged text> ::= point <point text>
+        point_tagged_text = no_case[lit("POINT")] [ _a = new_<geometry_type>(Point) ]
+            >> ( point_text(_a) [push_back(_val,_a)] 
+                 | eps[cleanup_(_a)][_pass = false])
+            ;
+        
+        // <point text> ::= <empty set> | <left paren> <point> <right paren>
+        point_text = (lit("(") >> point(SEG_MOVETO,_r1) >> lit(')')) 
+            | empty_set
+            ;
+        
+        // <linestring tagged text> ::= linestring <linestring text>
+        linestring_tagged_text = no_case[lit("LINESTRING")] [ _a = new_<geometry_type>(LineString) ]  
+            >> (linestring_text(_a)[push_back(_val,_a)] 
+                | eps[cleanup_(_a)][_pass = false])
+            ;
+                
+        // <linestring text> ::= <empty set> | <left paren> <point> {<comma> <point>}* <right paren>
+        linestring_text = points(_r1) | empty_set
+            ;
+        
+        // <polygon tagged text> ::= polygon <polygon text>
+        polygon_tagged_text = no_case[lit("POLYGON")] [ _a = new_<geometry_type>(Polygon) ]
+            >> ( polygon_text(_a)[push_back(_val,_a)] 
+                 | eps[cleanup_(_a)][_pass = false])
+            ;
+        
+        // <polygon text> ::= <empty set> | <left paren> <linestring text> {<comma> <linestring text>}* <right paren>
+        polygon_text = (lit('(') >> linestring_text(_r1) % lit(',') >> lit(')')) | empty_set;
+        
+        
+        //<multipoint tagged text> ::= multipoint <multipoint text>
+        multipoint_tagged_text = no_case[lit("MULTIPOINT")] 
+            >>  multipoint_text
+            ;
+        
+        // <multipoint text> ::= <empty set> | <left paren> <point text> {<comma> <point text>}* <right paren>
+        multipoint_text = (lit('(') 
+                           >> ((eps[_a = new_<geometry_type>(Point)] 
+                                >> (point_text(_a) | empty_set) [push_back(_val,_a)] 
+                                | eps[cleanup_(_a)][_pass = false]) % lit(',')) 
+                           >> lit(')')) | empty_set
+            ;
+        
+        // <multilinestring tagged text> ::= multilinestring <multilinestring text>
+        multilinestring_tagged_text = no_case[lit("MULTILINESTRING")] 
+            >> multilinestring_text ;
+        
+        // <multilinestring text> ::= <empty set> | <left paren> <linestring text> {<comma> <linestring text>}* <right paren>
+        multilinestring_text = (lit('(') 
+                                >> ((eps[_a = new_<geometry_type>(LineString)] 
+                                    >> ( points(_a)[push_back(_val,_a)] 
+                                         | eps[cleanup_(_a)][_pass = false]))
+                                    % lit(',')) 
+                                >> lit(')')) | empty_set;
+        
+        // <multipolygon tagged text> ::= multipolygon <multipolygon text>
+        multipolygon_tagged_text = no_case[lit("MULTIPOLYGON")] 
+            >> multipolygon_text ;
+        
+        // <multipolygon text> ::= <empty set> | <left paren> <polygon text> {<comma> <polygon text>}* <right paren>
+        
+        multipolygon_text = (lit('(') 
+                             >> ((eps[_a = new_<geometry_type>(Polygon)] 
+                                 >> ( polygon_text(_a)[push_back(_val,_a)] 
+                                      | eps[cleanup_(_a)][_pass = false]))
+                                 % lit(',')) 
+                             >> lit(')')) | empty_set;
+        
+        // points
+        points = lit('(')[_a = SEG_MOVETO] >> point (_a,_r1) % lit(',') [_a = SEG_LINETO]  >> lit(')');
+        // point 
+        point = (double_ >> double_) [push_vertex_(_r1,_r2,_1,_2)];
+        
+        // <empty set>
+        empty_set = no_case[lit("EMPTY")];
+
+    }
+
+    // start
+    qi::rule<Iterator,boost::ptr_vector<geometry_type>(),ascii::space_type> geometry_tagged_text;
+    
+    qi::rule<Iterator,qi::locals<geometry_type*>,boost::ptr_vector<geometry_type>(),ascii::space_type> point_tagged_text;
+    qi::rule<Iterator,qi::locals<geometry_type*>,boost::ptr_vector<geometry_type>(),ascii::space_type> linestring_tagged_text;
+    qi::rule<Iterator,qi::locals<geometry_type*>,boost::ptr_vector<geometry_type>(),ascii::space_type> polygon_tagged_text;
+    qi::rule<Iterator,boost::ptr_vector<geometry_type>(),ascii::space_type> multipoint_tagged_text;
+    qi::rule<Iterator,boost::ptr_vector<geometry_type>(),ascii::space_type> multilinestring_tagged_text;
+    qi::rule<Iterator,boost::ptr_vector<geometry_type>(),ascii::space_type> multipolygon_tagged_text;
+    // 
+    qi::rule<Iterator,void(geometry_type*),ascii::space_type> point_text;
+    qi::rule<Iterator,void(geometry_type*),ascii::space_type> linestring_text;
+    qi::rule<Iterator,void(geometry_type*),ascii::space_type> polygon_text;
+    qi::rule<Iterator, qi::locals<geometry_type*>, boost::ptr_vector<geometry_type>(),ascii::space_type> multipoint_text;
+    qi::rule<Iterator, qi::locals<geometry_type*>, boost::ptr_vector<geometry_type>(),ascii::space_type> multilinestring_text;
+    qi::rule<Iterator, qi::locals<geometry_type*>, boost::ptr_vector<geometry_type>(),ascii::space_type> multipolygon_text;
+    //
+    qi::rule<Iterator,void(CommandType,geometry_type*),ascii::space_type> point;
+    qi::rule<Iterator,qi::locals<CommandType>,void(geometry_type*),ascii::space_type> points;
+    qi::rule<Iterator,ascii::space_type> empty_set;
+    boost::phoenix::function<push_vertex> push_vertex_;
+    boost::phoenix::function<cleanup> cleanup_;
+};
+
+
+template <typename Iterator>
+struct wkt_collection_grammar : qi::grammar<Iterator, boost::ptr_vector<mapnik::geometry_type>(), ascii::space_type>
+{
+    wkt_collection_grammar()
+        :  wkt_collection_grammar::base_type(start)
+    {
+        using qi::_1;   
+        using qi::_val;
+        using qi::no_case;
+        using boost::phoenix::push_back;
+        start = wkt | no_case[lit("GEOMETRYCOLLECTION")] 
+            >> (lit("(") >> wkt % lit(",") >> lit(")"));
+    }
+    
+    qi::rule<Iterator,boost::ptr_vector<mapnik::geometry_type>(),ascii::space_type> start;
+    wkt_grammar<Iterator> wkt;
+};
+
+template <typename Iterator>
+struct wkt_stream_grammar : qi::grammar<Iterator, boost::ptr_vector<mapnik::geometry_type>(), ascii::space_type>
+{
+    wkt_stream_grammar()
+        :  wkt_stream_grammar::base_type(start)
+    {
+        start = *wkt_collection;
+    }
+    
+    qi::rule<Iterator,boost::ptr_vector<mapnik::geometry_type>(),ascii::space_type> start;
+    wkt_collection_grammar<Iterator> wkt_collection;
+};
+
+}}
+
+#endif // MAPNIK_WKT_GRAMMAR_HPP
diff --git a/osx/Info.plist b/osx/Info.plist
new file mode 100644
index 0000000..b195d8a
--- /dev/null
+++ b/osx/Info.plist
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>Mapnik</string>
+	<key>CFBundleGetInfoString</key>
+	<string>Mapnik 2.0.0-1</string>
+	<key>CFBundleIdentifier</key>
+	<string>org.mapnik</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>2.0</string>
+	<key>CFBundleName</key>
+	<string>Mapnik</string>
+	<key>CFBundlePackageType</key>
+	<string>FMWK</string>
+	<key>CFBundleShortVersionString</key>
+	<string>0.2.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>Mapnik 2.0.0-1</string>
+</dict>
+</plist>
diff --git a/osx/README.txt b/osx/README.txt
new file mode 100644
index 0000000..3aba10d
--- /dev/null
+++ b/osx/README.txt
@@ -0,0 +1,7 @@
+A few scripts to assist with building a Mapnik.framework for OS X.
+
+It is not currently meant for others to use, but eventually I may
+add docs and instructions such that others can build their own
+framework packages.
+
+Contact Dane (dane at dbsgeo.com) with any questions.
diff --git a/osx/config.py b/osx/config.py
new file mode 100644
index 0000000..a9f6628
--- /dev/null
+++ b/osx/config.py
@@ -0,0 +1,29 @@
+CXX = 'clang++'
+CC = 'clang'
+CUSTOM_CXXFLAGS = '-arch i386 -arch x86_64 -mmacosx-version-min=10.6 -isysroot /Developer/SDKs/MacOSX10.6.sdk -isystem osx/sources/include'
+CUSTOM_LDFLAGS = '-arch i386 -arch x86_64 -Wl,-search_paths_first -Wl,-syslibroot,/Developer/SDKs/MacOSX10.6.sdk -Losx/sources/lib '
+RUNTIME_LINK = 'static'
+INPUT_PLUGINS = 'gdal,ogr,postgis,shape,sqlite'
+DESTDIR = './osx/sources/'
+PATH_INSERT = './osx/sources/bin/'
+BOOST_INCLUDES = 'osx/sources/include'
+BOOST_LIBS = 'osx/sources/lib'
+FREETYPE_CONFIG = './osx/sources/bin/freetype-config'
+ICU_INCLUDES = './osx/sources/include'
+ICU_LIB_NAME = 'icucore'
+PNG_INCLUDES = './osx/sources/include'
+PNG_LIBS = './osx/sources/lib'
+JPEG_INCLUDES = './osx/sources/include'
+JPEG_LIBS = './osx/sources/lib'
+TIFF_INCLUDES = './osx/sources/include'
+TIFF_LIBS = './osx/sources/lib'
+PROJ_INCLUDES = './osx/sources/include'
+PROJ_LIBS = './osx/sources/lib'
+PKG_CONFIG_PATH = './osx/sources/lib/pkgconfig'
+CAIRO_INCLUDES = './osx/sources/include/'
+CAIRO_LIBS = './osx/sources/lib'
+SQLITE_INCLUDES = './osx/sources/include'
+SQLITE_LIBS = './osx/sources/lib'
+BINDINGS = 'none'
+DEMO = True
+PGSQL2SQLITE = True
diff --git a/osx/config_framework.py b/osx/config_framework.py
new file mode 100644
index 0000000..99c8dda
--- /dev/null
+++ b/osx/config_framework.py
@@ -0,0 +1,29 @@
+CXX = 'clang++'
+CC = 'clang'
+CUSTOM_CXXFLAGS = '-arch i386 -arch x86_64 -mmacosx-version-min=10.6 -isysroot /Developer/SDKs/MacOSX10.6.sdk -isystem osx/sources/include'
+CUSTOM_LDFLAGS = '-arch i386 -arch x86_64 -headerpad_max_install_names -Wl,-search_paths_first -Wl,-syslibroot,/Developer/SDKs/MacOSX10.6.sdk -Losx/sources/lib '
+INPUT_PLUGINS = 'gdal,geos,ogr,osm,postgis,raster,shape,sqlite'
+PREFIX = '/Library/Frameworks/Mapnik.framework/Versions/2.0/unix'
+PYTHON_PREFIX = '/Library/Frameworks/Mapnik.framework/Versions/2.0/unix'
+DESTDIR = '/Users/dane/projects/mapnik-dev/trunk-build/osx/'
+PATH_INSERT = './osx/sources/bin/'
+BOOST_INCLUDES = 'osx/sources/include'
+BOOST_LIBS = 'osx/sources/lib'
+BOOST_PYTHON_LIB = 'boost_python32'
+PNG_INCLUDES = '/Library/Frameworks/UnixImageIO.framework/unix/include'
+PNG_LIBS = '/Library/Frameworks/UnixImageIO.framework/unix/lib'
+JPEG_INCLUDES = '/Library/Frameworks/UnixImageIO.framework/unix/include'
+JPEG_LIBS = '/Library/Frameworks/UnixImageIO.framework/unix/lib'
+TIFF_INCLUDES = '/Library/Frameworks/UnixImageIO.framework/unix/include'
+TIFF_LIBS = '/Library/Frameworks/UnixImageIO.framework/unix/lib'
+PROJ_INCLUDES = '/Library/Frameworks/PROJ.framework/unix/include'
+PROJ_LIBS = '/Library/Frameworks/PROJ.framework/unix/lib'
+PKG_CONFIG_PATH = './osx/sources/lib/pkgconfig'
+GEOS_CONFIG = '/Library/Frameworks/GEOS.framework/unix/bin/geos-config'
+SQLITE_INCLUDES = './osx/sources/include'
+SQLITE_LIBS = './osx/sources/lib'
+PYTHON = '/Library/Frameworks/Python.framework/Versions/3.2/bin/python3.2m'
+PYTHON_DYNAMIC_LOOKUP = True
+BINDINGS = 'all'
+DEMO = True
+PGSQL2SQLITE = True
diff --git a/osx/installer/media/finish_up.rtf b/osx/installer/media/finish_up.rtf
new file mode 100644
index 0000000..5b33fc4
--- /dev/null
+++ b/osx/installer/media/finish_up.rtf
@@ -0,0 +1,17 @@
+{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\margl1440\margr1440\vieww9000\viewh8400\viewkind0
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\f0\b\fs24 \cf0 Learning Mapnik\
+\
+
+\b0 Find documentation at: {\field{\*\fldinst{HYPERLINK "http://mapnik.org/documentation/"}}{\fldrslt mapnik.org}}\
+
+\b \
+
+\b0 Join Mapnik IRC (chat): at {\field{\*\fldinst{HYPERLINK "irc://irc.freenode.net#mapnik"}}{\fldrslt irc.freenode.net}}\
+\
+Sign up and post to the community mailing list: {\field{\*\fldinst{HYPERLINK "http://lists.berlios.de/mailman/listinfo/mapnik-users"}}{\fldrslt Mapnik users}}\
+}
\ No newline at end of file
diff --git a/osx/installer/media/intro.rtf b/osx/installer/media/intro.rtf
new file mode 100644
index 0000000..d9de751
--- /dev/null
+++ b/osx/installer/media/intro.rtf
@@ -0,0 +1,28 @@
+{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf350
+{\fonttbl\f0\fnil\fcharset0 LucidaGrande;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue153;}
+\margl1440\margr1440\vieww18660\viewh8460\viewkind0
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\f0\b\fs28 \cf0 Mapnik 
+\b0 is an OpenSource C++/Python toolkit for developing mapping applications. 
+\fs26 \
+
+\fs24 \
+At the core is a C++ shared library providing algorithms/patterns for spatial data access and visualization.\
+\
+Essentially a collection of geographic objects (map, layer, datasource, feature, geometry), the library doesn't rely on "windowing systems" and can be deployed in any server environment. \
+\
+It is intended to play fair in a multi-threaded environment and is aimed primarily, but not exclusively, at web-based development.\
+\
+High-level Python bindings (boost.python) facilitate rapid application development, targeting zope3, django etc.\
+\
+Mapnik is a free software and is released under LGPL (GNU Lesser General Public Licence) (see COPYING)\
+\
+For further information see:\
+ \'95 {\field{\*\fldinst{HYPERLINK "http://mapnik.org"}}{\fldrslt \cf2 \expnd0\expndtw0\kerning0
+\ul \ulc2 http://mapnik.org}}\
+ \'95 {\field{\*\fldinst{HYPERLINK "http://trac.mapnik.org"}}{\fldrslt \cf2 \expnd0\expndtw0\kerning0
+\ul \ulc2 http://trac.mapnik.org}}\
+ \'95 {\field{\*\fldinst{HYPERLINK "http://ohloh.net/p/mapnik"}}{\fldrslt \cf2 \expnd0\expndtw0\kerning0
+\ul \ulc2 http://ohloh.net/p/mapnik}}}
\ No newline at end of file
diff --git a/osx/installer/media/license.rtf b/osx/installer/media/license.rtf
new file mode 100644
index 0000000..cd7d970
--- /dev/null
+++ b/osx/installer/media/license.rtf
@@ -0,0 +1,177 @@
+{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fnil\fcharset0 LucidaGrande;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue153;}
+\margl1440\margr1440\vieww9000\viewh8400\viewkind0
+\deftab720
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ql\qnatural\pardirnatural
+
+\f0\b\fs22 \cf0 \expnd0\expndtw0\kerning0
+GNU LESSER GENERAL PUBLIC LICENSE
+\b0 \
+
+\b Version 3, 29 June 2007
+\b0 \
+\
+ Copyright (C) 2007 Free Software Foundation, Inc. <{\field{\*\fldinst{HYPERLINK "http://fsf.org"}}{\fldrslt \cf2 \expnd0\expndtw0\kerning0
+\ul \ulc2 http://fsf.org/}}>\
+ Everyone is permitted to copy and distribute verbatim copies\
+ of this license document, but changing it is not allowed.\
+\
+\
+  This version of the GNU Lesser General Public License incorporates\
+the terms and conditions of version 3 of the GNU General Public\
+License, supplemented by the additional permissions listed below.\
+\
+  0. Additional Definitions.\
+\
+  As used herein, "this License" refers to version 3 of the GNU Lesser\
+General Public License, and the "GNU GPL" refers to version 3 of the GNU\
+General Public License.\
+\
+  "The Library" refers to a covered work governed by this License,\
+other than an Application or a Combined Work as defined below.\
+\
+  An "Application" is any work that makes use of an interface provided\
+by the Library, but which is not otherwise based on the Library.\
+Defining a subclass of a class defined by the Library is deemed a mode\
+of using an interface provided by the Library.\
+\
+  A "Combined Work" is a work produced by combining or linking an\
+Application with the Library.  The particular version of the Library\
+with which the Combined Work was made is also called the "Linked\
+Version".\
+\
+  The "Minimal Corresponding Source" for a Combined Work means the\
+Corresponding Source for the Combined Work, excluding any source code\
+for portions of the Combined Work that, considered in isolation, are\
+based on the Application, and not on the Linked Version.\
+\
+  The "Corresponding Application Code" for a Combined Work means the\
+object code and/or source code for the Application, including any data\
+and utility programs needed for reproducing the Combined Work from the\
+Application, but excluding the System Libraries of the Combined Work.\
+\
+  1. Exception to Section 3 of the GNU GPL.\
+\
+  You may convey a covered work under sections 3 and 4 of this License\
+without being bound by section 3 of the GNU GPL.\
+\
+  2. Conveying Modified Versions.\
+\
+  If you modify a copy of the Library, and, in your modifications, a\
+facility refers to a function or data to be supplied by an Application\
+that uses the facility (other than as an argument passed when the\
+facility is invoked), then you may convey a copy of the modified\
+version:\
+\
+   a) under this License, provided that you make a good faith effort to\
+   ensure that, in the event an Application does not supply the\
+   function or data, the facility still operates, and performs\
+   whatever part of its purpose remains meaningful, or\
+\
+   b) under the GNU GPL, with none of the additional permissions of\
+   this License applicable to that copy.\
+\
+  3. Object Code Incorporating Material from Library Header Files.\
+\
+  The object code form of an Application may incorporate material from\
+a header file that is part of the Library.  You may convey such object\
+code under terms of your choice, provided that, if the incorporated\
+material is not limited to numerical parameters, data structure\
+layouts and accessors, or small macros, inline functions and templates\
+(ten or fewer lines in length), you do both of the following:\
+\
+   a) Give prominent notice with each copy of the object code that the\
+   Library is used in it and that the Library and its use are\
+   covered by this License.\
+\
+   b) Accompany the object code with a copy of the GNU GPL and this license\
+   document.\
+\
+  4. Combined Works.\
+\
+  You may convey a Combined Work under terms of your choice that,\
+taken together, effectively do not restrict modification of the\
+portions of the Library contained in the Combined Work and reverse\
+engineering for debugging such modifications, if you also do each of\
+the following:\
+\
+   a) Give prominent notice with each copy of the Combined Work that\
+   the Library is used in it and that the Library and its use are\
+   covered by this License.\
+\
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license\
+   document.\
+\
+   c) For a Combined Work that displays copyright notices during\
+   execution, include the copyright notice for the Library among\
+   these notices, as well as a reference directing the user to the\
+   copies of the GNU GPL and this license document.\
+\
+   d) Do one of the following:\
+\
+       0) Convey the Minimal Corresponding Source under the terms of this\
+       License, and the Corresponding Application Code in a form\
+       suitable for, and under terms that permit, the user to\
+       recombine or relink the Application with a modified version of\
+       the Linked Version to produce a modified Combined Work, in the\
+       manner specified by section 6 of the GNU GPL for conveying\
+       Corresponding Source.\
+\
+       1) Use a suitable shared library mechanism for linking with the\
+       Library.  A suitable mechanism is one that (a) uses at run time\
+       a copy of the Library already present on the user's computer\
+       system, and (b) will operate properly with a modified version\
+       of the Library that is interface-compatible with the Linked\
+       Version.\
+\
+   e) Provide Installation Information, but only if you would otherwise\
+   be required to provide such information under section 6 of the\
+   GNU GPL, and only to the extent that such information is\
+   necessary to install and execute a modified version of the\
+   Combined Work produced by recombining or relinking the\
+   Application with a modified version of the Linked Version. (If\
+   you use option 4d0, the Installation Information must accompany\
+   the Minimal Corresponding Source and Corresponding Application\
+   Code. If you use option 4d1, you must provide the Installation\
+   Information in the manner specified by section 6 of the GNU GPL\
+   for conveying Corresponding Source.)\
+\
+  5. Combined Libraries.\
+\
+  You may place library facilities that are a work based on the\
+Library side by side in a single library together with other library\
+facilities that are not Applications and are not covered by this\
+License, and convey such a combined library under terms of your\
+choice, if you do both of the following:\
+\
+   a) Accompany the combined library with a copy of the same work based\
+   on the Library, uncombined with any other library facilities,\
+   conveyed under the terms of this License.\
+\
+   b) Give prominent notice with the combined library that part of it\
+   is a work based on the Library, and explaining where to find the\
+   accompanying uncombined form of the same work.\
+\
+  6. Revised Versions of the GNU Lesser General Public License.\
+\
+  The Free Software Foundation may publish revised and/or new versions\
+of the GNU Lesser General Public License from time to time. Such new\
+versions will be similar in spirit to the present version, but may\
+differ in detail to address new problems or concerns.\
+\
+  Each version is given a distinguishing version number. If the\
+Library as you received it specifies that a certain numbered version\
+of the GNU Lesser General Public License "or any later version"\
+applies to it, you have the option of following the terms and\
+conditions either of that published version or of any later version\
+published by the Free Software Foundation. If the Library as you\
+received it does not specify a version number of the GNU Lesser\
+General Public License, you may choose any version of the GNU Lesser\
+General Public License ever published by the Free Software Foundation.\
+\
+  If the Library as you received it specifies that a proxy can decide\
+whether future versions of the GNU Lesser General Public License shall\
+apply, that proxy's public statement of acceptance of any version is\
+permanent authorization for you to choose that version for the\
+Library.}
\ No newline at end of file
diff --git a/osx/installer/media/mapnik.png b/osx/installer/media/mapnik.png
new file mode 100644
index 0000000..32265f9
Binary files /dev/null and b/osx/installer/media/mapnik.png differ
diff --git a/osx/installer/pkg/readme.rtf b/osx/installer/pkg/readme.rtf
new file mode 100644
index 0000000..eb322f5
--- /dev/null
+++ b/osx/installer/pkg/readme.rtf
@@ -0,0 +1,150 @@
+{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf350
+{\fonttbl\f0\fnil\fcharset0 LucidaGrande;\f1\fnil\fcharset0 AndaleMono;}
+{\colortbl;\red255\green255\blue255;}
+\margl1440\margr1440\vieww11580\viewh11940\viewkind0
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\f0\fs32 \cf0 Welcome to Mapnik!
+\fs34 \
+
+\fs24 \
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\b\fs28 \cf0 Quickstart
+\b0\fs22 \
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\fs24 \cf0 \
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\b \cf0 \'95 
+\b0 Install the "Mapnik.pkg".\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\b\fs22 \cf0 \
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\fs24 \cf0 \'95 
+\b0 Test your installation via Python:\
+\
+   Open the Terminal.app and confirm that below command returns 'True':\
+\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\f1 \cf0   $ python -c "import mapnik2; print 'Mapnik.framework' in mapnik2.__file__"
+\f0 \
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\fs26 \cf0 \
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\fs24 \cf0    If it does then Mapnik is installed correctly! You can now head along to {\field{\*\fldinst{HYPERLINK "http://mapnik.org"}}{\fldrslt http://mapnik.org}} for documentation.
+\b\fs22 \
+
+\b0\fs24 \
+   If it does not then you may need to add this line to your environment settings:\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\f1 \cf0 \
+    export PYTHONPATH=/Library/Frameworks/Mapnik.framework/Python:$PYTHONPATH\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\f0 \cf0 \
+\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\b\fs28 \cf0 Details\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\b0\fs24 \cf0 \
+This installer only works for Snow Leopard (10.6).\
+\
+This install should play nicely with any existing installations of Mapnik.\
+\
+It automatically puts the following lines in your ~/.bash_profile to enable Mapnik:\
+\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\f1 \cf0   export PATH=/Library/Frameworks/Mapnik.framework/Programs:$PATH\
+  export PYTHONPATH=/Library/Frameworks/Mapnik.framework/Python:$PYTHONPATH\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\f0 \cf0 \
+It also enables the Mapnik python bindings for QGIS/Python2.6 by putting a 'mapnik2.pth' file in:\
+\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\f1 \cf0   /Library/Python/2.6/site-packages\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\f0 \cf0 \
+This Mapnik installer includes:\
+\
+ * 
+\b Mapnik Core
+\b0  (mapnik library)\
+ * 
+\b Python bindings
+\b0  compatible with versions:\
+    - 2.5, 2.6, 2.7, and 3.1\
+ * 
+\b Datasources
+\b0  (aka "input plugins"):\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\fs22 \cf0     - Shapefile, PostGIS, Raster, GDAL, OGR,\
+       GEOS, SQLite, Rasterlite, OSM, Kismet \
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\fs24 \cf0  * 
+\b Dependencies:
+\b0  Boost, ICU, Cairo, Freetype2 and other minor libraries\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\fs26 \cf0  * 
+\b GDAL_Complete-1.8.dmg
+\b0  from:\
+    
+\fs24 - http://www.kyngchaos.com/software/frameworks
+\fs26 \
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\fs24 \cf0 \
+\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\b\fs28 \cf0 Uninstalling\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\b0\fs24 \cf0 \
+To disable this installation remove the lines including '
+\f1 /Library/Frameworks/Mapnik.framework'
+\f0  from your ~/.bash_profile\
+\
+And remove this file\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\f1 \cf0 \
+  /Library/Python/2.6/site-packages/mapnik2.pth\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\f0 \cf0 \
+To fully remove the Installation remove this folder:\
+\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\f1 \cf0   /Library/Frameworks/Mapnik.framework\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\f0 \cf0 \
+\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\b\fs28 \cf0 Issues?\
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
+
+\b0\fs24 \cf0 \
+Any questions or problems with the installer please get in touch with Dane (
+\b dane at dbsgeo.com
+\b0 ).\
+}
\ No newline at end of file
diff --git a/osx/installer/scripts/setup.sh b/osx/installer/scripts/setup.sh
new file mode 100755
index 0000000..ea887d4
--- /dev/null
+++ b/osx/installer/scripts/setup.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+# TODO
+# - find safer way to do this: http://trac.mapnik.org/ticket/776
+# - check for ~/.profile so that adding a new bash_profile does not override
+
+# backup bash_profile
+cp ~/.bash_profile ~/.bash_profile.mapnik.backup
+
+# add installer Programs to PATH
+# by appending new entries to bash_profile
+echo '' >> ~/.bash_profile
+echo '# Settings for Mapnik.framework Installer to enable Mapnik programs and python bindings' >> ~/.bash_profile
+echo 'export PATH=/Library/Frameworks/Mapnik.framework/Programs:$PATH' >> ~/.bash_profile
+echo 'export PYTHONPATH=/Library/Frameworks/Mapnik.framework/Python:$PYTHONPATH' >> ~/.bash_profile
\ No newline at end of file
diff --git a/osx/patches/boost_python1_46_1_for_3.2.diff b/osx/patches/boost_python1_46_1_for_3.2.diff
new file mode 100644
index 0000000..46c33cb
--- /dev/null
+++ b/osx/patches/boost_python1_46_1_for_3.2.diff
@@ -0,0 +1,14 @@
+Index: libs/python/src/converter/builtin_converters.cpp
+===================================================================
+--- libs/python/src/converter/builtin_converters.cpp	(revision 56305)
++++ libs/python/src/converter/builtin_converters.cpp	(revision 71050)
+@@ -432,5 +432,8 @@
+           {
+               int err = PyUnicode_AsWideChar(
+-                  (PyUnicodeObject *)intermediate
++#if PY_VERSION_HEX < 0x03020000
++                  (PyUnicodeObject *)
++#endif
++                    intermediate
+                 , &result[0]
+                 , result.size());
diff --git a/osx/patches/boost_python3k_bytes.diff b/osx/patches/boost_python3k_bytes.diff
new file mode 100644
index 0000000..8c6450c
--- /dev/null
+++ b/osx/patches/boost_python3k_bytes.diff
@@ -0,0 +1,14 @@
+Index: libs/python/src/converter/builtin_converters.cpp
+===================================================================
+--- libs/python/src/converter/builtin_converters.cpp	(revision 67415)
++++ libs/python/src/converter/builtin_converters.cpp	(working copy)
+@@ -375,7 +375,8 @@
+       static unaryfunc* get_slot(PyObject* obj)
+       {
+ #if PY_VERSION_HEX >= 0x03000000
+-          return (PyUnicode_Check(obj)) ? &py_unicode_as_string_unaryfunc : 0;
++          return (PyUnicode_Check(obj)) ? &py_unicode_as_string_unaryfunc : 
++                  PyBytes_Check(obj) ? &py_object_identity : 0;
+ #else
+           return (PyString_Check(obj)) ? &obj->ob_type->tp_str : 0;
+ 
diff --git a/osx/patches/mapnik-config.diff b/osx/patches/mapnik-config.diff
new file mode 100644
index 0000000..776f485
--- /dev/null
+++ b/osx/patches/mapnik-config.diff
@@ -0,0 +1,15 @@
+Index: utils/mapnik-config/SConscript
+===================================================================
+--- utils/mapnik-config/SConscript	(revision 2594)
++++ utils/mapnik-config/SConscript	(working copy)
+@@ -64,8 +64,8 @@
+ version='%(version)s'
+ mapnik_libname=%(mapnik_libname)s
+ private_libs='%(private_libs)s'
+-other_libs='%(other_libs)s'
+-other_includes='%(other_includes)s'
++other_libs='-arch i386 -arch x86_64 -headerpad_max_install_names -L/Library/Frameworks/Mapnik.framework/unix/lib -L/Library/Frameworks/UnixImageIO.framework/unix/lib -L/Library/Frameworks/PROJ.framework/unix/lib -lfreetype -licuuc -lboost_filesystem -lboost_regex -lboost_thread -lboost_system -lcairomm-1.0 -lcairo'
++other_includes='-arch i386 -arch x86_64 -I/Library/Frameworks/Mapnik.framework/unix/include -I/Library/Frameworks/Mapnik.framework/unix/include/cairo -I/Library/Frameworks/Mapnik.framework/unix/include/cairomm-1.0 -I/Library/Frameworks/Mapnik.framework/unix/include/sigc++-2.0 -I/Library/Frameworks/Mapnik.framework/unix/lib/sigc++-2.0/include/ -I/Library/Frameworks/Mapnik.framework/unix/include/freetype2 -I/Library/Frameworks/UnixImageIO.framework/unix/include -I/Library/Frameworks/PROJ.framework/unix/include -I/usr/include/libxml2'
+ fonts='%(fonts)s'
+ input_plugins='%(input_plugins)s'
+ svn_revision='%(svn_revision)s'
diff --git a/osx/patches/postgis_static.diff b/osx/patches/postgis_static.diff
new file mode 100644
index 0000000..97e72a6
--- /dev/null
+++ b/osx/patches/postgis_static.diff
@@ -0,0 +1,26 @@
+Index: plugins/input/postgis/SConscript
+===================================================================
+--- plugins/input/postgis/SConscript	(revision 2476)
++++ plugins/input/postgis/SConscript	(working copy)
+@@ -33,7 +33,11 @@
+ 	"""
+         )
+ 
+-libraries = ['pq']
++static = '-lintl -liconv -lxml2 -lpam -lssl -lcrypto -lkrb5 -lldap -lreadline -lz'
++libraries = ['pq_s']
++libraries.extend(static.split(' '))
++ldflags = env['CUSTOM_LDFLAGS']
++ldflags += ' -framework CoreFoundation'
+ 
+ if env['PLATFORM'] == 'Darwin':
+     libraries.append('mapnik2')
+@@ -41,7 +45,7 @@
+     if env['THREADING'] == 'multi':
+         libraries.append('boost_thread%s' % env['BOOST_APPEND'])
+ 
+-input_plugin = plugin_env.SharedLibrary('../postgis', source=postgis_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS'])
++input_plugin = plugin_env.SharedLibrary('../postgis', source=postgis_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries, LINKFLAGS=ldflags)
+ 
+ if env['PLATFORM'] == 'Darwin':
+     # if the plugin links to libmapnik2 ensure it is built first
diff --git a/osx/patches/tests.diff b/osx/patches/tests.diff
new file mode 100644
index 0000000..7c4a4f7
--- /dev/null
+++ b/osx/patches/tests.diff
@@ -0,0 +1,14 @@
+Index: tests/run_tests.py
+===================================================================
+--- tests/run_tests.py	(revision 2488)
++++ tests/run_tests.py	(working copy)
+@@ -46,7 +46,8 @@
+ 
+     if not quiet:
+         print "- mapnik2 path: %s" % mapnik2.__file__
+-        print "- _mapnik2.so path: %s" % mapnik2._mapnik2.__file__
++        if hasattr(mapnik2,'_mapnik2'):
++           print "- _mapnik2.so path: %s" % mapnik2._mapnik2.__file__
+         print "- Input plugins path: %s" % mapnik2.inputpluginspath
+         print "- Font path: %s" % mapnik2.fontscollectionpath
+         print
diff --git a/osx/patches/viewer.diff b/osx/patches/viewer.diff
new file mode 100644
index 0000000..d43dc38
--- /dev/null
+++ b/osx/patches/viewer.diff
@@ -0,0 +1,82 @@
+Index: demo/viewer/viewer.pro
+===================================================================
+--- demo/viewer/viewer.pro	(revision 2594)
++++ demo/viewer/viewer.pro	(working copy)
+@@ -5,14 +5,33 @@
+ TEMPLATE = app
+ 
+ INCLUDEPATH += /usr/local/include/
+-INCLUDEPATH += /usr/boost/include/
+-INCLUDEPATH += /usr/X11/include/
+-INCLUDEPATH += /usr/X11/include/freetype2
++INCLUDEPATH += /Library/Frameworks/Mapnik.framework/unix/include
++INCLUDEPATH += /Library/Frameworks/Mapnik.framework/unix/include/cairo
++INCLUDEPATH += /Library/Frameworks/Mapnik.framework/unix/include/cairomm-1.0
++INCLUDEPATH += /Library/Frameworks/Mapnik.framework/unix/include/sigc++-2.0
++INCLUDEPATH += /Library/Frameworks/Mapnik.framework/unix/lib/sigc++-2.0/include/
++INCLUDEPATH += /Library/Frameworks/Mapnik.framework/unix/include/freetype2
++INCLUDEPATH += /Library/Frameworks/UnixImageIO.framework/unix/include
++INCLUDEPATH += /Library/Frameworks/PROJ.framework/unix/include
++INCLUDEPATH += /usr/include/libxml2
+ INCLUDEPATH += .
+ 
+-QMAKE_CXXFLAGS +=' -DDARWIN -Wno-missing-field-initializers -ansi'
+-unix:LIBS =  -L/usr/local/lib -L/usr/X11/lib -lmapnik2 -lfreetype
+-unix:LIBS += -lboost_system -licuuc -lboost_filesystem -lboost_regex
++QMAKE_CXXFLAGS +=' -arch i386 -arch x86_64 -DDARWIN -Wno-missing-field-initializers -ansi'
++unix:LIBS =  -arch i386
++unix:LIBS += -arch x86_64
++unix:LIBS += -headerpad_max_install_names
++unix:LIBS += -L/Library/Frameworks/Mapnik.framework/unix/lib
++unix:LIBS += -lmapnik2
++unix:LIBS += -L/Library/Frameworks/UnixImageIO.framework/unix/lib
++unix:LIBS += -L/Library/Frameworks/PROJ.framework/unix/lib
++unix:LIBS += -lfreetype
++unix:LIBS += -licuuc
++unix:LIBS += -lboost_filesystem
++unix:LIBS += -lboost_regex
++unix:LIBS += -lboost_thread
++unix:LIBS += -lboost_system
++unix:LIBS += -lcairomm-1.0
++unix:LIBS += -lcairo
+ 
+ # Input
+ 
+Index: demo/viewer/main.cpp
+===================================================================
+--- demo/viewer/main.cpp	(revision 2594)
++++ demo/viewer/main.cpp	(working copy)
+@@ -43,22 +43,24 @@
+     
+     // register input plug-ins
+     QString plugins_dir = settings.value("mapnik/plugins_dir",
+-                                         QVariant("/usr/local/lib/mapnik2/input/")).toString();
++                                         QVariant("/Library/Frameworks/Mapnik.framework/Versions/2.0/unix/lib/mapnik2/input/")).toString();
+     datasource_cache::instance()->register_datasources(plugins_dir.toStdString());
+     // register fonts
+-    int count = settings.beginReadArray("mapnik/fonts");
+-    for (int index=0; index < count; ++index)
+-    {
+-        settings.setArrayIndex(index);
+-        QString font_dir = settings.value("dir").toString();
+-        freetype_engine::register_fonts(font_dir.toStdString());
+-    }
++    //int count = settings.beginReadArray("mapnik/fonts");
++    //for (int index=0; index < count; ++index)
++    //{
++    //    settings.setArrayIndex(index);
++     //   QString font_dir = settings.value("dir").toString();
++        freetype_engine::register_fonts("/Library/Frameworks/Mapnik.framework/Versions/2.0/unix/lib/mapnik2/fonts");
++    //}
+     settings.endArray();
+     
+     QApplication app( argc, argv ); 
+     MainWindow window;
+     window.show();
+-    if (argc > 1) window.open(argv[1]);
++    if (argc > 1) {
++        window.open(argv[1]);
++    }
+     if (argc >= 3)
+     {
+         QStringList list = QString(argv[2]).split(",");
diff --git a/osx/python/cairo.py b/osx/python/cairo.py
new file mode 100644
index 0000000..1c55276
--- /dev/null
+++ b/osx/python/cairo.py
@@ -0,0 +1,17 @@
+import sys
+
+ver_int = int('%s%s' % (sys.version_info[0],sys.version_info[1]))
+ver_str = '%s.%s' % (sys.version_info[0],sys.version_info[1])
+
+path_insert = '/Library/Frameworks/Mapnik.framework/Versions/2.0/unix/lib/python%s/site-packages/'
+
+if ver_int < 26:
+    raise ImportError('Cairo bindings are only available for python versions >= 2.6')
+elif ver_int in (26,27,31):
+    sys.path.insert(0, path_insert % ver_str)
+    from cairo import *
+elif ver_int > 31:
+    raise ImportError('Cairo bindings are only available for python versions <= 3.1')
+else:
+    raise ImportError('Cairo bindings are only available for python versions 2.6, 2.7, and 3.1')
+
diff --git a/osx/python/mapnik.py b/osx/python/mapnik.py
new file mode 100644
index 0000000..c10775b
--- /dev/null
+++ b/osx/python/mapnik.py
@@ -0,0 +1,779 @@
+#
+# This file is part of Mapnik (C++/Python mapping toolkit)
+# Copyright (C) 2009 Artem Pavlenko, Dane Springmeyer
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+
+"""Mapnik Python module.
+
+Boost Python bindings to the Mapnik C++ shared library.
+
+Several things happen when you do:
+
+    >>> import mapnik
+
+ 1) Mapnik C++ objects are imported via the '__init__.py' from the '_mapnik.so' shared object
+    (_mapnik.pyd on win) which references libmapnik.so (linux), libmapnik.dylib (mac), or
+    mapnik.dll (win32).
+
+ 2) The paths to the input plugins and font directories are imported from the 'paths.py'
+    file which was constructed and installed during SCons installation.
+
+ 3) All available input plugins and TrueType fonts are automatically registered.
+
+ 4) Boost Python metaclass injectors are used in the '__init__.py' to extend several
+    objects adding extra convenience when accessed via Python.
+
+"""
+
+import os
+import sys
+import warnings
+
+try:
+    from ctypes import RTLD_NOW, RTLD_GLOBAL
+except ImportError:
+    try:
+        from DLFCN import RTLD_NOW, RTLD_GLOBAL
+    except ImportError:
+        RTLD_NOW = 2
+        RTLD_GLOBAL = 256
+
+flags = sys.getdlopenflags()
+sys.setdlopenflags(RTLD_NOW | RTLD_GLOBAL)
+
+ver_int = int('%s%s' % (sys.version_info[0],sys.version_info[1]))
+ver_str = '%s.%s' % (sys.version_info[0],sys.version_info[1])
+
+path_insert = '/Library/Frameworks/Mapnik.framework/Versions/2.0/unix/lib/python%s/site-packages/mapnik2'
+
+if ver_int < 25:
+    raise ImportError('Mapnik bindings are only available for python versions >= 2.5')
+elif ver_int in (25,26,27,31,32):
+    sys.path.insert(0, path_insert % ver_str)
+    from _mapnik2 import *
+elif ver_int > 32:
+    raise ImportError('Mapnik bindings are only available for python versions <= 3.1')
+else:
+    raise ImportError('Mapnik bindings are only available for python versions 2.5, 2.6, 2.7, and 3.1')
+
+from paths import inputpluginspath, fontscollectionpath
+
+#import printing
+#printing.renderer = render
+
+# The base Boost.Python class
+BoostPythonMetaclass = Coord.__class__
+
+class _MapnikMetaclass(BoostPythonMetaclass):
+    def __init__(self, name, bases, dict):
+        for b in bases:
+            if type(b) not in (self, type):
+                for k,v in list(dict.items()):
+                    if hasattr(b, k):
+                        setattr(b, '_c_'+k, getattr(b, k))
+                    setattr(b,k,v)
+        return type.__init__(self, name, bases, dict)
+
+# metaclass injector compatible with both python 2 and 3
+# http://mikewatkins.ca/2008/11/29/python-2-and-3-metaclasses/
+_injector = _MapnikMetaclass('_injector', (object, ), {})
+
+def render_grid(m,layer,key,resolution=4,fields=[]):
+    return render_grid_(m,layer,key,resolution,fields)
+
+def Filter(*args,**kwargs):
+    warnings.warn("'Filter' is deprecated and will be removed in Mapnik 2.0.1, use 'Expression' instead",
+    DeprecationWarning, 2)
+    return Expression(*args, **kwargs)
+
+class Envelope(Box2d):
+    def __init__(self, *args, **kwargs):
+        warnings.warn("'Envelope' is deprecated and will be removed in Mapnik 2.0.1, use 'Box2d' instead",
+        DeprecationWarning, 2)
+        Box2d.__init__(self, *args, **kwargs)
+
+class _Coord(Coord,_injector):
+    """
+    Represents a point with two coordinates (either lon/lat or x/y).
+
+    Following operators are defined for Coord:
+
+    Addition and subtraction of Coord objects:
+
+    >>> Coord(10, 10) + Coord(20, 20)
+    Coord(30.0, 30.0)
+    >>> Coord(10, 10) - Coord(20, 20)
+    Coord(-10.0, -10.0)
+
+    Addition, subtraction, multiplication and division between
+    a Coord and a float:
+
+    >>> Coord(10, 10) + 1
+    Coord(11.0, 11.0)
+    >>> Coord(10, 10) - 1
+    Coord(-9.0, -9.0)
+    >>> Coord(10, 10) * 2
+    Coord(20.0, 20.0)
+    >>> Coord(10, 10) / 2
+    Coord(5.0, 5.0)
+
+    Equality of coords (as pairwise equality of components):
+    >>> Coord(10, 10) is Coord(10, 10)
+    False
+    >>> Coord(10, 10) == Coord(10, 10)
+    True
+    """
+    def __repr__(self):
+        return 'Coord(%s,%s)' % (self.x, self.y)
+
+    def forward(self, projection):
+        """
+        Projects the point from the geographic coordinate 
+        space  into the cartesian space. The x component is 
+        considered to be longitude, the y component the 
+        latitude.
+
+        Returns the easting (x) and northing (y) as a 
+        coordinate pair.
+        
+        Example: Project the geographic coordinates of the 
+                 city center of Stuttgart into the local
+                 map projection (GK Zone 3/DHDN, EPSG 31467)  
+        >>> p = Projection('+init=epsg:31467') 
+        >>> Coord(9.1, 48.7).forward(p)
+        Coord(3507360.12813,5395719.2749)
+        """
+        return forward_(self, projection)
+
+    def inverse(self, projection):
+        """
+        Projects the point from the cartesian space 
+        into the geographic space. The x component is 
+        considered to be the easting, the y component 
+        to be the northing.
+        
+        Returns the longitude (x) and latitude (y) as a 
+        coordinate pair.
+
+        Example: Project the cartesian coordinates of the 
+                 city center of Stuttgart in the local
+                 map projection (GK Zone 3/DHDN, EPSG 31467)
+                 into geographic coordinates:
+        >>> p = Projection('+init=epsg:31467') 
+        >>> Coord(3507360.12813,5395719.2749).inverse(p)
+        Coord(9.1, 48.7)
+        """
+        return inverse_(self, projection)
+
+class _Box2d(Box2d,_injector):
+    """
+    Represents a spatial envelope (i.e. bounding box). 
+    
+    
+    Following operators are defined for Box2d:
+
+    Addition:
+    e1 + e2 is equvalent to e1.expand_to_include(e2) but yields 
+    a new envelope instead of modifying e1
+
+    Subtraction:
+    Currently e1 - e2 returns e1.
+
+    Multiplication and division with floats:
+    Multiplication and division change the width and height of the envelope
+    by the given factor without modifying its center..
+
+    That is, e1 * x is equivalent to: 
+           e1.width(x * e1.width())
+           e1.height(x * e1.height()),
+    except that a new envelope is created instead of modifying e1.
+
+    e1 / x is equivalent to e1 * (1.0/x).
+
+    Equality: two envelopes are equal if their corner points are equal.
+    """
+
+    def __repr__(self):
+        return 'Box2d(%s,%s,%s,%s)' % \
+            (self.minx,self.miny,self.maxx,self.maxy)
+
+    def forward(self, projection):
+        """
+        Projects the envelope from the geographic space 
+        into the cartesian space by projecting its corner 
+        points.
+
+        See also:
+           Coord.forward(self, projection)
+        """
+        return forward_(self, projection)
+
+    def inverse(self, projection):
+        """
+        Projects the envelope from the cartesian space 
+        into the geographic space by projecting its corner 
+        points.
+
+        See also:
+          Coord.inverse(self, projection).
+        """
+        return inverse_(self, projection)
+
+class _Projection(Projection,_injector):
+
+    def __repr__(self):
+        return "Projection('%s')" % self.params()
+
+    def forward(self,obj):
+        """
+        Projects the given object (Box2d or Coord) 
+        from the geographic space into the cartesian space.
+
+        See also:
+          Box2d.forward(self, projection),
+          Coord.forward(self, projection).
+        """
+        return forward_(obj,self)
+
+    def inverse(self,obj):
+        """
+        Projects the given object (Box2d or Coord) 
+        from the cartesian space into the geographic space.
+
+        See also:
+          Box2d.inverse(self, projection),
+          Coord.inverse(self, projection).
+        """
+        return inverse_(obj,self)
+
+def get_types(num):
+    dispatch = {1: int,
+                2: float,
+                3: float,
+                4: str,
+                5: Geometry2d,
+                6: object}
+    return dispatch.get(num)
+
+class _Datasource(Datasource,_injector):
+
+    def describe(self):
+        return Describe(self)
+
+    def field_types(self):
+        return map(get_types,self._field_types())
+
+    def all_features(self,fields=None):
+        query = Query(self.envelope())
+        attributes = fields or self.fields()
+        for fld in attributes:
+            query.add_property_name(fld)
+        return self.features(query).features
+
+    def featureset(self,fields=None):
+        query = Query(self.envelope())
+        attributes = fields or self.fields()
+        for fld in attributes:
+            query.add_property_name(fld)
+        return self.features(query)
+
+class _DeprecatedFeatureProperties(object):
+
+    def __init__(self, feature):
+        self._feature = feature
+
+    def __getitem__(self, name):
+        warnings.warn("indexing feature.properties is deprecated, index the "
+             "feature object itself for the same effect", DeprecationWarning, 2)
+        return self._feature[name]
+
+    def __iter__(self):
+        warnings.warn("iterating feature.properties is deprecated, iterate the "
+             "feature object itself for the same effect", DeprecationWarning, 2)
+        return iter(self._feature)
+
+class _Feature(Feature, _injector):
+    """
+    A Feature.
+
+    TODO: docs
+    """
+    @property
+    def properties(self):
+        return _DeprecatedFeatureProperties(self)
+
+    @property
+    def attributes(self):
+        #XXX Returns a copy! changes to it won't affect feat.'s attrs.
+        #    maybe deprecate?
+        return dict(self)
+    
+    @property
+    def geometries(self):
+        return [self.get_geometry(i) for i in xrange(self.num_geometries())]
+
+    def __init__(self, id, geometry=None, **properties):
+        Feature._c___init__(self, id)
+        if geometry is not None:
+            self.add_geometry(geometry)
+        for k, v in properties.iteritems():
+            self[k] = v
+    
+class _Color(Color,_injector):
+
+    def __repr__(self):
+        return "Color(%r)" % self.to_hex_string()
+
+class _Symbolizers(Symbolizers,_injector):
+
+    def __getitem__(self, idx):
+        sym = Symbolizers._c___getitem__(self, idx)
+        return sym.symbol()
+
+def _add_symbol_method_to_symbolizers(vars=globals()):
+
+    def symbol_for_subcls(self):
+        return self
+
+    def symbol_for_cls(self):
+        return getattr(self,self.type())()
+
+    for name, obj in vars.items():
+        if name.endswith('Symbolizer') and not name.startswith('_'):
+            if name == 'Symbolizer':
+                symbol = symbol_for_cls
+            else:
+                symbol = symbol_for_subcls
+            type('dummy', (obj,_injector), {'symbol': symbol})
+_add_symbol_method_to_symbolizers()
+
+def Datasource(**keywords):
+    """Wrapper around CreateDatasource.
+
+    Create a Mapnik Datasource using a dictionary of parameters.
+
+    Keywords must include:
+    
+      type='plugin_name' # e.g. type='gdal'
+    
+    See the convenience factory methods of each input plugin for
+    details on additional required keyword arguments.
+    
+    """
+
+    return CreateDatasource(keywords)
+
+# convenience factory methods
+
+def Shapefile(**keywords):
+    """Create a Shapefile Datasource.
+
+    Required keyword arguments:
+      file -- path to shapefile without extension
+
+    Optional keyword arguments:
+      base -- path prefix (default None)
+      encoding -- file encoding (default 'utf-8')
+
+    >>> from mapnik import Shapefile, Layer
+    >>> shp = Shapefile(base='/home/mapnik/data',file='world_borders') 
+    >>> lyr = Layer('Shapefile Layer')
+    >>> lyr.datasource = shp
+
+    """
+    keywords['type'] = 'shape'
+    return CreateDatasource(keywords)
+
+def PostGIS(**keywords):
+    """Create a PostGIS Datasource.
+
+    Required keyword arguments:
+      dbname -- database name to connect to
+      table -- table name or subselect query
+      
+      *Note: if using subselects for the 'table' value consider also 
+       passing the 'geometry_field' and 'srid' and 'extent_from_subquery'
+       options and/or specifying the 'geometry_table' option.
+
+    Optional db connection keyword arguments:
+      user -- database user to connect as (default: see postgres docs)
+      password -- password for database user (default: see postgres docs)
+      host -- portgres hostname (default: see postgres docs)
+      port -- postgres port (default: see postgres docs)
+      initial_size -- integer size of connection pool (default: 1)
+      max_size -- integer max of connection pool (default: 10)
+      persist_connection -- keep connection open (default: True)
+
+    Optional table-level keyword arguments:
+      extent -- manually specified data extent (comma delimited string, default: None)
+      estimate_extent -- boolean, direct PostGIS to use the faster, less accurate `estimate_extent` over `extent` (default: False)
+      extent_from_subquery -- boolean, direct Mapnik to query Postgis for the extent of the raw 'table' value (default: uses 'geometry_table')
+      geometry_table -- specify geometry table to use to look up metadata (default: automatically parsed from 'table' value)
+      geometry_field -- specify geometry field to use (default: first entry in geometry_columns)
+      srid -- specify srid to use (default: auto-detected from geometry_field)
+      row_limit -- integer limit of rows to return (default: 0)
+      cursor_size -- integer size of binary cursor to use (default: 0, no binary cursor is used)
+      multiple_geometries -- boolean, direct the Mapnik wkb reader to interpret as multigeometries (default False)
+
+    >>> from mapnik import PostGIS, Layer
+    >>> params = dict(dbname='mapnik',table='osm',user='postgres',password='gis')
+    >>> params['estimate_extent'] = False
+    >>> params['extent'] = '-20037508,-19929239,20037508,19929239'
+    >>> postgis = PostGIS(**params)
+    >>> lyr = Layer('PostGIS Layer')
+    >>> lyr.datasource = postgis
+
+    """
+    keywords['type'] = 'postgis'
+    return CreateDatasource(keywords)
+
+
+def Raster(**keywords):
+    """Create a Raster (Tiff) Datasource.
+
+    Required keyword arguments:
+      file -- path to stripped or tiled tiff
+      lox -- lowest (min) x/longitude of tiff extent
+      loy -- lowest (min) y/latitude of tiff extent
+      hix -- highest (max) x/longitude of tiff extent
+      hiy -- highest (max) y/latitude of tiff extent
+
+    Hint: lox,loy,hix,hiy make a Mapnik Box2d
+
+    Optional keyword arguments:
+      base -- path prefix (default None)
+
+    >>> from mapnik import Raster, Layer
+    >>> raster = Raster(base='/home/mapnik/data',file='elevation.tif',lox=-122.8,loy=48.5,hix=-122.7,hiy=48.6) 
+    >>> lyr = Layer('Tiff Layer')
+    >>> lyr.datasource = raster
+
+    """
+    keywords['type'] = 'raster'
+    return CreateDatasource(keywords)
+
+def Gdal(**keywords):
+    """Create a GDAL Raster Datasource.
+
+    Required keyword arguments:
+      file -- path to GDAL supported dataset
+
+    Optional keyword arguments:
+      base -- path prefix (default None)
+      shared -- boolean, open GdalDataset in shared mode (default: False)
+      bbox -- tuple (minx, miny, maxx, maxy). If specified, overrides the bbox detected by GDAL.
+
+    >>> from mapnik import Gdal, Layer
+    >>> dataset = Gdal(base='/home/mapnik/data',file='elevation.tif')
+    >>> lyr = Layer('GDAL Layer from TIFF file')
+    >>> lyr.datasource = dataset
+
+    """
+    keywords['type'] = 'gdal'
+    if 'bbox' in keywords:
+        if isinstance(keywords['bbox'], (tuple, list)):
+            keywords['bbox'] = ','.join([str(item) for item in keywords['bbox']])
+    return CreateDatasource(keywords)
+
+def Occi(**keywords):
+    """Create a Oracle Spatial (10g) Vector Datasource.
+
+    Required keyword arguments:
+      user -- database user to connect as
+      password -- password for database user
+      host -- oracle host to connect to (does not refer to SID in tsnames.ora)
+      table -- table name or subselect query
+
+    Optional keyword arguments:
+      initial_size -- integer size of connection pool (default 1)
+      max_size -- integer max of connection pool (default 10)
+      extent -- manually specified data extent (comma delimited string, default None)
+      estimate_extent -- boolean, direct Oracle to use the faster, less accurate estimate_extent() over extent() (default False)
+      encoding -- file encoding (default 'utf-8')
+      geometry_field -- specify geometry field (default 'GEOLOC')
+      use_spatial_index -- boolean, force the use of the spatial index (default True)
+      multiple_geometries -- boolean, direct the Mapnik wkb reader to interpret as multigeometries (default False)
+
+    >>> from mapnik import Occi, Layer
+    >>> params = dict(host='myoracle',user='scott',password='tiger',table='test')
+    >>> params['estimate_extent'] = False
+    >>> params['extent'] = '-20037508,-19929239,20037508,19929239'
+    >>> oracle = Occi(**params)
+    >>> lyr = Layer('Oracle Spatial Layer')
+    >>> lyr.datasource = oracle
+    """
+    keywords['type'] = 'occi'
+    return CreateDatasource(keywords)
+
+def Ogr(**keywords):
+    """Create a OGR Vector Datasource.
+
+    Required keyword arguments:
+      file -- path to OGR supported dataset
+      layer -- name of layer to use within datasource (optional if layer_by_index is used)
+
+    Optional keyword arguments:
+      layer_by_index -- choose layer by index number instead of by layer name.
+      base -- path prefix (default None)
+      encoding -- file encoding (default 'utf-8')
+      multiple_geometries -- boolean, direct the Mapnik wkb reader to interpret as multigeometries (default False)
+
+    >>> from mapnik import Ogr, Layer
+    >>> datasource = Ogr(base='/home/mapnik/data',file='rivers.geojson',layer='OGRGeoJSON') 
+    >>> lyr = Layer('OGR Layer from GeoJSON file')
+    >>> lyr.datasource = datasource
+
+    """
+    keywords['type'] = 'ogr'
+    return CreateDatasource(keywords)
+
+def SQLite(**keywords):
+    """Create a SQLite Datasource.
+
+    Required keyword arguments:
+      file -- path to SQLite database file
+      table -- table name or subselect query
+
+    Optional keyword arguments:
+      base -- path prefix (default None)
+      encoding -- file encoding (default 'utf-8')
+      extent -- manually specified data extent (comma delimited string, default None)
+      metadata -- name of auxillary table containing record for table with xmin, ymin, xmax, ymax, and f_table_name
+      geometry_field -- name of geometry field (default 'the_geom')
+      key_field -- name of primary key field (default 'OGC_FID')
+      row_offset -- specify a custom integer row offset (default 0)
+      row_limit -- specify a custom integer row limit (default 0)
+      wkb_format -- specify a wkb type of 'spatialite' (default None)
+      multiple_geometries -- boolean, direct the Mapnik wkb reader to interpret as multigeometries (default False)
+      use_spatial_index -- boolean, instruct sqlite plugin to use Rtree spatial index (default True)
+
+    >>> from mapnik import SQLite, Layer
+    >>> sqlite = SQLite(base='/home/mapnik/data',file='osm.db',table='osm',extent='-20037508,-19929239,20037508,19929239') 
+    >>> lyr = Layer('SQLite Layer')
+    >>> lyr.datasource = sqlite
+
+    """
+    keywords['type'] = 'sqlite'
+    return CreateDatasource(keywords)
+
+def Rasterlite(**keywords):
+    """Create a Rasterlite Datasource.
+
+    Required keyword arguments:
+      file -- path to Rasterlite database file
+      table -- table name or subselect query
+
+    Optional keyword arguments:
+      base -- path prefix (default None)
+      extent -- manually specified data extent (comma delimited string, default None)
+
+    >>> from mapnik import Rasterlite, Layer
+    >>> rasterlite = Rasterlite(base='/home/mapnik/data',file='osm.db',table='osm',extent='-20037508,-19929239,20037508,19929239') 
+    >>> lyr = Layer('Rasterlite Layer')
+    >>> lyr.datasource = rasterlite
+
+    """
+    keywords['type'] = 'rasterlite'
+    return CreateDatasource(keywords)
+
+def Osm(**keywords):
+    """Create a Osm Datasource.
+
+    Required keyword arguments:
+      file -- path to OSM file
+
+    Optional keyword arguments:
+      encoding -- file encoding (default 'utf-8')
+      url -- url to fetch data (default None)
+      bbox -- data bounding box for fetching data (default None)
+
+    >>> from mapnik import Osm, Layer
+    >>> datasource = Osm(file='test.osm') 
+    >>> lyr = Layer('Osm Layer')
+    >>> lyr.datasource = datasource
+
+    """
+    # note: parser only supports libxml2 so not exposing option
+    # parser -- xml parser to use (default libxml2)
+    keywords['type'] = 'osm'
+    return CreateDatasource(keywords)
+
+def Kismet(**keywords):
+    """Create a Kismet Datasource.
+
+    Required keyword arguments:
+      host -- kismet hostname
+      port -- kismet port
+
+    Optional keyword arguments:
+      encoding -- file encoding (default 'utf-8')
+      extent -- manually specified data extent (comma delimited string, default None)
+
+    >>> from mapnik import Kismet, Layer
+    >>> datasource = Kismet(host='localhost',port=2501,extent='-179,-85,179,85') 
+    >>> lyr = Layer('Kismet Server Layer')
+    >>> lyr.datasource = datasource
+
+    """
+    keywords['type'] = 'kismet'
+    return CreateDatasource(keywords)
+
+def Geos(**keywords):
+    """Create a GEOS Vector Datasource.
+
+    Required keyword arguments:
+      wkt -- inline WKT text of the geometry
+
+    Optional keyword arguments:
+      multiple_geometries -- boolean, direct the GEOS wkt reader to interpret as multigeometries (default False)
+      extent -- manually specified data extent (comma delimited string, default None)
+
+    >>> from mapnik import Geos, Layer
+    >>> datasource = Geos(wkt='MULTIPOINT(100 100, 50 50, 0 0)') 
+    >>> lyr = Layer('GEOS Layer from WKT string')
+    >>> lyr.datasource = datasource
+
+    """
+    keywords['type'] = 'geos'
+    return CreateDatasource(keywords)
+
+def mapnik_version_string(version=mapnik_version()):
+    """Return the Mapnik version as a string."""
+    patch_level = version % 100
+    minor_version = version / 100 % 1000
+    major_version = version / 100000
+    return '%s.%s.%s' % ( major_version, minor_version,patch_level)
+
+def mapnik_version_from_string(version_string):
+    """Return the Mapnik version from a string."""
+    n = version_string.split('.')
+    return (int(n[0]) * 100000) + (int(n[1]) * 100) + (int(n[2]));
+
+def register_plugins(path=inputpluginspath):
+    """Register plugins located by specified path"""
+    DatasourceCache.instance().register_datasources(path)
+
+def register_fonts(path=fontscollectionpath,valid_extensions=['.ttf','.otf','.ttc','.pfa','.pfb','.ttc','.dfont']):
+    """Recursively register fonts using path argument as base directory"""
+    for dirpath, _, filenames in os.walk(path):
+        for filename in filenames:
+            if os.path.splitext(filename)[1] in valid_extensions:
+                FontEngine.instance().register_font(os.path.join(dirpath, filename))
+
+# auto-register known plugins and fonts
+register_plugins()
+register_fonts()
+
+#set dlopen flags back to the original
+sys.setdlopenflags(flags)
+
+# Explicitly export API members to avoid namespace pollution
+# and ensure correct documentation processing
+__all__ = [
+    # classes
+    'Color',
+    'Coord',
+    #'ColorBand',
+    'CompositeOp',
+    'DatasourceCache',
+    'Box2d',
+    'Feature',
+    'Featureset',
+    'FontEngine',
+    'Geometry2d',
+    'GlyphSymbolizer',
+    'Image',
+    'ImageView',
+    'Layer',
+    'Layers',
+    'LinePatternSymbolizer',
+    'LineSymbolizer',
+    'Map',
+    'MarkersSymbolizer',
+    'Names',
+    'Parameter',
+    'Parameters',
+    'PointDatasource',
+    'PointSymbolizer',
+    'PolygonPatternSymbolizer',
+    'PolygonSymbolizer',
+    'ProjTransform',
+    'Projection',
+    'Query',
+    'RasterSymbolizer',
+    'RasterColorizer',
+    'Rule', 'Rules',
+    'ShieldSymbolizer',
+    'Singleton',
+    'Stroke',
+    'Style',
+    'Symbolizer',
+    'Symbolizers',
+    'TextSymbolizer',
+    'ViewTransform',
+    # enums
+    'aspect_fix_mode',
+    'point_placement',
+    'label_placement',
+    'line_cap',
+    'line_join',
+    'text_transform',
+    'vertical_alignment',
+    'horizontal_alignment',
+    'justify_alignment',
+    'pattern_alignment',
+    'filter_mode',
+    # functions
+    # datasources
+    'Datasource',
+    'CreateDatasource',
+    'Shapefile',
+    'PostGIS',
+    'Raster',
+    'Gdal',
+    'Occi',
+    'Ogr',
+    'SQLite',
+    'Osm',
+    'Kismet',
+    'Describe',
+    #   version and environment
+    'mapnik_version_string',
+    'mapnik_version',
+    'mapnik_svn_revision',
+    'has_cairo',
+    'has_pycairo',
+    #   factory methods
+    'Expression',
+    'PathExpression',
+    #   load/save/render
+    'load_map',
+    'load_map_from_string',
+    'save_map',
+    'save_map_to_string',
+    'render',
+    'render_grid',
+    'render_tile_to_file',
+    'render_to_file',
+    #   other
+    'register_plugins',
+    'register_fonts',
+    'scale_denominator',
+    # deprecated
+    'Filter',
+    'Envelope',
+    ]
diff --git a/osx/scripts/build_boost_pythons.py b/osx/scripts/build_boost_pythons.py
new file mode 100644
index 0000000..df68524
--- /dev/null
+++ b/osx/scripts/build_boost_pythons.py
@@ -0,0 +1,43 @@
+# script to build boost python versions
+# this should be run with the boost source directory as the cwd
+
+import os
+import sys
+
+USER_JAM = """
+import option ;
+import feature ;
+if ! darwin in [ feature.values <toolset> ]
+{
+    using darwin ; 
+}
+project : default-build <toolset>darwin ;
+using python
+     : %(ver)s # version
+     : %(system)s/Library/Frameworks/Python.framework/Versions/%(ver)s/bin/python%(ver)s%(variant)s # cmd-or-prefix
+     : %(system)s/Library/Frameworks/Python.framework/Versions/%(ver)s/include/python%(ver)s%(variant)s # includes
+     : %(system)s/Library/Frameworks/Python.framework/Versions/%(ver)s/lib/python%(ver)s/config%(variant)s # a lib actually symlink
+     : <toolset>darwin # condition
+     ;
+libraries = --with-python ;
+"""
+
+def compile_lib(ver,arch='32_64'):
+    if ver in ('3.2'):
+        open('user-config.jam','w').write(USER_JAM % {'ver':ver,'system':'','variant':'m'})
+    elif ver in ('2.5','2.6'):
+        # build against system pythons so we can reliably link against FAT binaries
+        open('user-config.jam','w').write(USER_JAM % {'ver':ver,'system':'/System','variant':''})
+    else:
+        # for 2.7 and above hope that python.org provides 64 bit ready binaries...
+        open('user-config.jam','w').write(USER_JAM % {'ver':ver,'system':'','variant':''})    
+    cmd = "./bjam -q --with-python -a -j2 --ignore-site-config --user-config=user-config.jam link=shared toolset=darwin -d2 address-model=%s architecture=x86 variant=release stage" % arch#linkflags=-search_paths_first
+    print cmd
+    os.system(cmd)
+
+if __name__ == '__main__':
+    if not len(sys.argv) > 2:
+        sys.exit('usage: %s <ver> <arch>' % os.path.basename(sys.argv[0]))
+    compile_lib(sys.argv[1],sys.argv[2])
+    
+    
\ No newline at end of file
diff --git a/osx/scripts/fetch_py_releases.sh b/osx/scripts/fetch_py_releases.sh
new file mode 100755
index 0000000..3e92410
--- /dev/null
+++ b/osx/scripts/fetch_py_releases.sh
@@ -0,0 +1,18 @@
+# http://www.python.org/download/releases/
+# http://www.python.org/ftp/python/
+
+# 2.5.4 (2.5.5 did not provide binaries)
+wget http://www.python.org/ftp/python/2.5.4/python-2.5.4-macosx.dmg
+
+# 2.6.6
+wget http://www.python.org/ftp/python/2.6.6/python-2.6.6-macosx10.3.dmg
+
+# 2.7
+wget http://www.python.org/ftp/python/2.7.2/python-2.7.2-macosx10.6.dmg
+
+# 3.1.x does not provide 64 bit versions for some reasons, so skip...
+#wget http://www.python.org/ftp/python/3.1.3/python-3.1.3-macosx10.3.dmg
+#wget http://www.python.org/ftp/python/3.1.2/Python-3.1.2.tar.bz2
+
+# 3.2
+wget http://www.python.org/ftp/python/3.2.1/python-3.2.1-macosx10.6.dmg
\ No newline at end of file
diff --git a/osx/scripts/package.py b/osx/scripts/package.py
new file mode 100644
index 0000000..0691353
--- /dev/null
+++ b/osx/scripts/package.py
@@ -0,0 +1,68 @@
+import os
+import re
+import sys
+import datetime
+from subprocess import PIPE, Popen, call as subcall
+
+now = datetime.datetime.now()
+date = now.strftime('%Y_%m_%d') # year, mon, day
+
+INSTALL = False
+
+plat = 'snow_leopard'
+arch = 'intel'
+version = '2.0.0'#-dev
+
+def get(cmd):
+    try:
+        sub = cmd.split(' ')
+        response = Popen(sub, stdin=PIPE, stdout=PIPE, stderr=PIPE)
+        cm = response.communicate()
+        return cm[0]
+        if not cm[0]:
+            sys.exit(cm[1])
+    except OSError, E:
+        sys.exit(E)
+
+if plat == 'snow_leopard':
+    short_plat = 'snow'
+else:
+    short_plat = plat
+
+def get_svn():
+    pattern = r'(\d+)(.*)'
+    svn_version = get('svnversion ../')
+    return re.match(pattern,svn_version).groups()[0]
+
+svn = get_svn()
+
+identifier = '''mapnik build log
+----------------
+version: %(version)s
+os: %(plat)s
+arch: %(arch)s
+date: %(date)s
+svn revision: %(svn)s
+
+''' % locals()
+
+if __name__ == '__main__':
+    
+    
+    if not os.path.exists('installer'):
+        sys.exit("must be run from directory below 'installer' dir")
+    
+    print 'removing old files'
+    #os.system('rm installer/pkg/Mapnik.pkg')
+    os.system('rm installer/*dmg')
+    
+    print 'writing build log'
+    open('installer/pkg/build_log.txt','w').write(identifier)
+
+    cmd = 'packagemaker --doc installer/mapnik.pmdoc --out installer/pkg/Mapnik.pkg'
+    print cmd
+    #os.system(cmd)
+
+    cmd = 'hdiutil create "installer/mapnik_%s_%s_%s_%s_%s.dmg" -volname "Mapnik %s" -fs HFS+ -srcfolder installer/pkg' % (version,short_plat,arch,date,svn,version)
+    print cmd
+    os.system(cmd)
diff --git a/osx/scripts/setup.sh b/osx/scripts/setup.sh
new file mode 100644
index 0000000..59e5ac7
--- /dev/null
+++ b/osx/scripts/setup.sh
@@ -0,0 +1,421 @@
+
+# start here
+cd osx/sources
+
+# build icu and boost for packaging up within Mapnik Framework
+
+# local install location
+PREFIX=/Users/dane/projects/mapnik-dev/trunk-build/osx/sources
+mkdir -p $PREFIX
+export DYLD_LIBRARY_PATH=$PREFIX/lib
+# final resting place
+INSTALL=/Library/Frameworks/Mapnik.framework/unix/lib
+export DYLD_LIBRARY_PATH=$PREFIX/lib
+export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig
+export CFLAGS="-O3 -arch i386 -arch x86_64"
+export CXXFLAGS="-O3 -arch i386 -arch x86_64"
+export LDFLAGS="-arch i386 -arch x86_64 -headerpad_max_install_names"
+# universal flags
+export CFLAGS="-O3 -arch i386 -arch x86_64"
+export CXXFLAGS="-O3 -arch i386 -arch x86_64"
+export LDFLAGS="-arch i386 -arch x86_64 -headerpad_max_install_names"
+
+
+# make a directory to hold icu and boost
+mkdir -p ../deps
+cd ../deps
+
+# ICU
+wget http://download.icu-project.org/files/icu4c/4.6/icu4c-4_6-src.tgz
+tar xvf icu4c-4_6-src.tgz
+cd icu/source
+
+# universal flags
+#./runConfigureICU MacOSX --prefix=$PREFIX --disable-static --enable-shared --disable-samples --disable-icuio --disable-layout --disable-tests --disable-extras --with-library-bits=64
+./runConfigureICU MacOSX --prefix=$PREFIX --disable-static --enable-shared --with-library-bits=64
+make install -j4
+# note -R is needed to preserve the symlinks
+#cp -R lib/libicuuc.* ../../../sources/lib/
+#cp -R lib/libicudata.* ../../../sources/lib/
+cd ../../../sources/lib/
+
+
+# libicuuc
+install_name_tool -id $INSTALL/libicuuc.46.dylib libicuuc.46.0.dylib
+# --enable-layout
+#install_name_tool -change ../lib/libicudata.46.0.dylib $INSTALL/libicudata.46.dylib libicuuc.46.0.dylib
+#--disable-layout
+install_name_tool -change libicudata.46.dylib $INSTALL/libicudata.46.dylib libicuuc.46.0.dylib
+# libicudata
+install_name_tool -id $INSTALL/libicudata.46.dylib libicudata.46.0.dylib
+# libicui18n - needed by boost_regex
+install_name_tool -id $INSTALL/libicui18n.46.dylib libicui18n.46.0.dylib
+# --enable-layout
+#install_name_tool -change ../lib/libicudata.46.0.dylib $INSTALL/libicudata.46.dylib libicui18n.46.0.dylib
+#--disable-layout
+install_name_tool -change libicudata.46.dylib $INSTALL/libicudata.46.dylib libicui18n.46.0.dylib
+install_name_tool -change libicuuc.46.dylib $INSTALL/libicuuc.46.dylib libicui18n.46.0.dylib
+cd ../
+
+
+# freetype2
+wget http://download.savannah.gnu.org/releases/freetype/freetype-2.4.4.tar.gz
+tar xvf freetype-2.4.4.tar.gz
+export CFLAGS="-O3 -arch i386 -arch x86_64"
+export LDFLAGS="-arch i386 -arch x86_64 -headerpad_max_install_names"
+cd freetype-2.4.4
+./configure --prefix=$PREFIX
+make -j4
+make install
+install_name_tool -id $INSTALL/libfreetype.6.dylib ../../sources/lib/libfreetype.6.dylib
+cd ../
+
+# pkg-config so we get cairo and friends configured correctly
+wget http://pkgconfig.freedesktop.org/releases/pkg-config-0.26.tar.gz
+tar xvf pkg-config-0.26.tar.gz
+cd pkg-config-0.26
+./configure --disable-dependency-tracking --prefix=$PREFIX
+make -j4
+make install
+
+# pixman
+wget http://cairographics.org/releases/pixman-0.22.2.tar.gz
+tar xvf pixman-0.22.2.tar.gz
+cd pixman-0.22.2
+./configure --disable-dependency-tracking --prefix=$PREFIX
+make -j4
+make install
+cd ../../sources/lib/
+install_name_tool -id $INSTALL/libpixman-1.0.dylib ../../sources/lib/libpixman-1.0.dylib
+cd ../
+
+# fontconfig
+wget http://www.freedesktop.org/software/fontconfig/release/fontconfig-2.8.0.tar.gz
+tar xvf fontconfig-2.8.0.tar.gz
+cd fontconfig-2.8.0
+./configure --disable-dependency-tracking --prefix=$PREFIX \
+    --with-freetype-config=$PREFIX/bin/freetype-config
+make -j4
+make install
+install_name_tool -id $INSTALL/libfontconfig.1.dylib ../../sources/lib/libfontconfig.1.dylib
+cd ../
+
+# Cairo
+wget http://cairographics.org/releases/cairo-1.10.2.tar.gz
+tar xvf cairo-1.10.2.tar.gz
+cd cairo-1.10.2
+# NOTE: PKG_CONFIG_PATH must be correctly set by this point
+export LDFLAGS="-L/Library/Frameworks/UnixImageIO.framework/unix/lib "$LDFLAGS
+export CFLAGS="-I/Library/Frameworks/UnixImageIO.framework/unix/include "$CFLAGS
+export png_CFLAGS="-I/Library/Frameworks/UnixImageIO.framework/unix/include"
+export png_LIBS="-I/Library/Frameworks/UnixImageIO.framework/unix/lib -lpng15"
+./configure \
+  --disable-valgrind \
+  --enable-gobject=no \
+  --enable-static=no \
+  --enable-xlib=no \
+  --enable-xlib-xrender=no \
+  --enable-xcb=no \
+  --enable-xlib-xcb=no \
+  --enable-xcb-shm=no \
+  --enable-xcb-drm=no \
+  --disable-dependency-tracking \
+  --prefix=$PREFIX
+  
+make -j4
+make install
+install_name_tool -id $INSTALL/libcairo.2.dylib ../../sources/lib/libcairo.2.dylib
+cd ../
+
+# since linking to libpng framework (which does not provide a pkg-config) fake it:
+# match to /Library/Frameworks/UnixImageIO.framework/unix/
+# vim ../sources/lib/pkgconfig/libpng.pc
+
+prefix=/Library/Frameworks/UnixImageIO.framework/unix
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+includedir=${prefix}/include/libpng15
+
+Name: libpng
+Description: Loads and saves PNG files
+Version: 1.5
+Libs: -L${libdir} -lpng15
+Libs.private: -lz 
+Cflags: -I${includedir} 
+
+
+# libsigcxx
+wget http://ftp.gnome.org/pub/GNOME/sources/libsigc++/2.2/libsigc++-2.2.10.tar.bz2
+tar xvf libsigc++-2.2.10.tar.bz2
+cd libsigc++-2.2.10
+./configure --disable-dependency-tracking --prefix=$PREFIX
+make -j4
+make install
+install_name_tool -id $INSTALL/libsigc-2.0.dylib ../../sources/lib/libsigc-2.0.dylib
+cd ../
+
+wget http://cairographics.org/releases/cairomm-1.9.8.tar.gz
+tar xvf cairomm-1.9.8.tar.gz
+cd cairomm-1.9.8
+# NOTE: PKG_CONFIG_PATH must be correctly set by this point
+export LDFLAGS="-L$PREFIX/lib -lcairo -lsigc-2.0 "$LDFLAGS
+export CFLAGS="-I$PREFIX/include -I$PREFIX/include/cairo -I$PREFIX/include/freetype2 -I$PREFIX/lib/sigc++-2.0/include -I$PREFIX/include/sigc++-2.0 -I$PREFIX/include/sigc++-2.0/sigc++ "$CFLAGS
+export CXXFLAGS="-I$PREFIX/include "$CFLAGS
+
+./configure --disable-dependency-tracking --prefix=$PREFIX
+make -j4
+make install
+
+install_name_tool -id $INSTALL/libcairomm-1.0.1.dylib ../../sources/lib/libcairomm-1.0.1.dylib
+
+# also make sure cairo and friends did not link against anything in /opt/local or /usr/local
+otool -L ../../sources/lib/*dylib | grep local
+
+# ensure we're linking to the right image libs
+otool -L ../../sources/lib/*dylib | grep UnixImageIO
+
+# pycairo
+# >= python 3.1
+#wget http://cairographics.org/releases/pycairo-1.8.10.tar.bz2
+#tar xvf pycairo-1.8.10.tar.bz2
+#./waf configure
+
+#wget http://cairographics.org/releases/pycairo-1.8.8.tar.gz
+#tar xvf pycairo-1.8.8.tar.gz
+#cd pycairo-1.8.8
+
+# py25
+# line 35 of configure.ac AM_PATH_PYTHON(2.5)
+#export PATH=/Library/Frameworks/Python.framework/Versions/2.5/bin/:$PATH
+#./configure --prefix=$PREFIX
+#make -j4 install
+
+# py26
+#export PATH=/Library/Frameworks/Python.framework/Versions/2.6/bin/:$PATH
+#./configure --prefix=$PREFIX
+#make -j4 install
+
+#py27
+#export PATH=/Library/Frameworks/Python.framework/Versions/2.7/bin/:$PATH
+#make clean
+#./configure --prefix=$PREFIX
+#make -j4 install
+
+
+# boost
+cd ../../deps
+wget http://voxel.dl.sourceforge.net/project/boost/boost/1.47.0/boost_1_47_0.tar.bz2
+tar xjvf boost_1_47_0.tar.bz2
+cd boost_1_47_0
+
+# edit tools/build/v2/tools/python.jam, line 980, replace with:
+    if $(target-os) in windows cygwin
+    {
+        alias python_for_extensions : python : $(target-requirements) ;
+    }
+    else if $(target-os) = darwin
+    {
+        alias python_for_extensions
+            :
+            : $(target-requirements)
+            :
+            : $(usage-requirements) <linkflags>"-undefined dynamic_lookup"
+            ;
+    }
+
+./bootstrap.sh
+./bjam --prefix=$PREFIX --with-thread --with-filesystem \
+  --with-regex --with-program_options --with-system --with-chrono \
+  -sHAVE_ICU=1 -sICU_PATH=$PREFIX \
+  toolset=darwin \
+  address-model=32_64 \
+  architecture=x86 \
+  link=shared \
+  variant=release \
+  stage
+
+./bjam --prefix=$PREFIX --with-thread --with-filesystem \
+  --with-regex --with-program_options --with-system --with-chrono \
+  -sHAVE_ICU=1 -sICU_PATH=$PREFIX \
+  toolset=darwin \
+  address-model=32_64 \
+  architecture=x86 \
+  link=shared \
+  variant=release \
+  install
+
+# if needed, rebuild regex without icu..
+./bjam --prefix=$PREFIX --with-regex \
+  --disable-icu -a \
+  toolset=darwin \
+  address-model=32_64 \
+  architecture=x86 \
+  link=shared \
+  variant=release \
+  install
+
+# toolset=clang-darwin cxxflags="-fPIC" linkflags="-undefined dynamic_lookup"
+
+# boost python for various versions are done in python script
+python ../../scripts/build_boost_pythons.py 2.5 32_64
+mv stage/lib/libboost_python.dylib stage/lib/libboost_python25.dylib
+cp stage/lib/libboost_python25.dylib ../../sources/lib/libboost_python25.dylib
+
+python ../../scripts/build_boost_pythons.py 2.6 32_64
+mv stage/lib/libboost_python.dylib stage/lib/libboost_python26.dylib
+cp stage/lib/libboost_python26.dylib ../../sources/lib/libboost_python26.dylib
+
+python ../../scripts/build_boost_pythons.py 2.7 32_64
+mv stage/lib/libboost_python.dylib stage/lib/libboost_python27.dylib
+cp stage/lib/libboost_python27.dylib ../../sources/lib/libboost_python27.dylib
+
+python ../../scripts/build_boost_pythons.py 3.1 32_64
+mv stage/lib/libboost_python3.dylib stage/lib/libboost_python31.dylib
+cp stage/lib/libboost_python31.dylib ../../sources/lib/libboost_python31.dylib
+
+python ../../scripts/build_boost_pythons.py 3.2 32_64
+mv stage/lib/libboost_python3.dylib stage/lib/libboost_python32.dylib
+cp stage/lib/libboost_python32.dylib ../../sources/lib/libboost_python32.dylib
+
+
+#cp stage/lib/libboost_*dylib ../../sources/lib/
+
+cd ../../sources/lib
+
+# fix boost pythons
+install_name_tool -id $INSTALL/libboost_python25.dylib libboost_python25.dylib
+install_name_tool -id $INSTALL/libboost_python26.dylib libboost_python26.dylib
+install_name_tool -id $INSTALL/libboost_python27.dylib libboost_python27.dylib
+install_name_tool -id $INSTALL/libboost_python31.dylib libboost_python31.dylib
+install_name_tool -id $INSTALL/libboost_python32.dylib libboost_python32.dylib
+
+# fix boost libs
+install_name_tool -id $INSTALL/libboost_system.dylib libboost_system.dylib
+install_name_tool -id $INSTALL/libboost_filesystem.dylib libboost_filesystem.dylib
+install_name_tool -id $INSTALL/libboost_regex.dylib libboost_regex.dylib
+install_name_tool -id $INSTALL/libboost_program_options.dylib libboost_program_options.dylib
+install_name_tool -id $INSTALL/libboost_thread.dylib libboost_thread.dylib
+install_name_tool -change libboost_system.dylib $INSTALL/libboost_system.dylib libboost_filesystem.dylib
+#install_name_tool -change libicui18n.46.dylib $INSTALL/libicui18n.46.dylib libboost_regex.dylib
+
+# currently broken, waiting on http://www.gaia-gis.it/rasterlite2/
+# rasterlite we must bundle as it is not available in the SQLite.framework
+#cd ../../deps
+#svn co https://www.gaia-gis.it/svn/librasterlite
+#export LDFLAGS="-arch i386 -arch x86_64 -headerpad_max_install_names -L/Library/Frameworks/SQLite3.framework/unix/lib -L/Library/Frameworks/UnixImageIO.framework/unix/lib -L/Library/Frameworks/PROJ.framework/unix/lib"
+#export CFLAGS="-Os -arch i386 -arch x86_64 -I/Library/Frameworks/SQLite3.framework/unix/include -I/Library/Frameworks/UnixImageIO.framework/unix/include -I/Library/Frameworks/PROJ.framework/unix/include"
+#export CXXFLAGS=$CFLAGS
+#cd librasterlite
+#./configure --disable-dependency-tracking --prefix=$PREFIX
+#make clean
+#make -j4
+#make install
+#cd ../../sources/lib
+#install_name_tool -id $INSTALL/librasterlite.0.dylib librasterlite.0.dylib
+
+# sqlite with rtree
+cd ../../deps
+wget http://www.sqlite.org/sqlite-autoconf-3070701.tar.gz
+tar xvf sqlite-autoconf-3070701.tar.gz
+cd sqlite-autoconf-3070701
+export CFLAGS="-DSQLITE_ENABLE_RTREE=1 -O3 "$CFLAGS
+./configure --prefix=$PREFIX --enable-static=yes --enable-shared=no --disable-dependency-tracking
+make -j4 && make install
+
+
+### MAPNIK ###
+
+# make sure we set DYLD path so we can link to libs without installing
+export DYLD_LIBRARY_PATH=$PREFIX/lib
+
+# compile mapnik using osx/config.py
+scons PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig -j2 install BINDINGS=''
+
+# then compile each python version..
+
+# 2.5
+rm bindings/python/*os
+rm bindings/python/mapnik/_mapnik2.so
+scons configure BINDINGS=python PYTHON=/usr/bin/python2.5 BOOST_PYTHON_LIB=boost_python25
+scons -j2 install
+cp bindings/python/mapnik/_mapnik2.so osx/python/_mapnik2_25.so
+
+# 2.6
+rm bindings/python/*os
+rm bindings/python/mapnik/_mapnik2.so
+scons configure BINDINGS=python PYTHON=/usr/bin/python2.6 BOOST_PYTHON_LIB=boost_python26
+scons -j2 install
+cp bindings/python/mapnik/_mapnik2.so osx/python/_mapnik2_26.so
+
+# 2.7
+rm bindings/python/*os
+rm bindings/python/mapnik/_mapnik2.so
+scons configure BINDINGS=python PYTHON=/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 BOOST_PYTHON_LIB=boost_python27
+scons -j2 install
+cp bindings/python/mapnik/_mapnik2.so osx/python/_mapnik2_27.so
+
+
+# 3.1
+# needs patch: http://trac.mapnik.org/wiki/Python3k
+rm bindings/python/*os
+rm bindings/python/mapnik/_mapnik2.so
+scons configure BINDINGS=python PYTHON=/Library/Frameworks/Python.framework/Versions/3.1/bin/python3.1 BOOST_PYTHON_LIB=boost_python31
+scons -j2 install
+cp bindings/python/mapnik/_mapnik2.so osx/python/_mapnik2_31.so
+
+# 3.2
+rm bindings/python/*os
+rm bindings/python/mapnik/_mapnik2.so
+scons configure BINDINGS=python PYTHON=/Library/Frameworks/Python.framework/Versions/3.2/bin/python3.2m BOOST_PYTHON_LIB=boost_python32
+scons -j2 install
+cp bindings/python/mapnik/_mapnik2.so osx/python/_mapnik2_32.so
+
+
+
+
+# build a ton of versions of node (just to be safe about ABI)
+cd ../../deps
+
+for VER in {"0.2.4","0.2.5","0.2.6","0.3.0","0.3.1","0.3.2","0.3.3","0.3.4","0.3.5","0.3.6","0.3.7"}
+do
+  wget http://nodejs.org/dist/node-v$VER.tar.gz
+  tar xvf node-v$VER.tar.gz
+  cd node-v$VER
+  ./configure --prefix=$PREFIX/node$VER
+  make
+  make install
+  cd ../
+done
+
+# node-mapnik
+cd ../../deps
+git clone git://github.com/mapnik/node-mapnik.git
+cd node-mapnik
+#export PATH=../../Library/Frameworks/Mapnik.framework/Programs:$PATH
+export PATH=/Library/Frameworks/Mapnik.framework/Programs:$PATH
+
+# TODO - needs work
+# only 64 bit
+# versioned module
+# all targets
+# custom node prefix
+# cairo support
+
+#CXXFLAGS=" -g -DNDEBUG -O3 -Wall -DBOOST_SPIRIT_THREADSAFE -DMAPNIK_THREADSAFE -ansi -finline-functions -Wno-inline -fPIC -arch x86_64 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -DEV_MULTIPLICITY=0 -I/Library/Frameworks/Mapnik.framework/Versions/2.0/unix/include -I/Library/Frameworks/Mapnik.framework/Versions/2.0/unix/include/freetype2 "
+
+#for VER in {"0.2.4","0.2.5","0.2.6","0.3.0","0.3.1","0.3.2","0.3.3","0.3.4"}
+#for VER in {"0.3.4","0.3.5","0.3.6","0.3.7"}
+#do
+#  mkdir build/default/src/$VER
+#  mkdir lib/$VER
+#  NODE_PREFIX="$PREFIX/node$VER"
+#  export PATH=$NODE_PREFIX/bin:$PATH
+#  OBJ="build/default/src/$VER/_mapnik_1.o"
+#  TARGET="lib/$VER/_mapnik.node"
+#  g++ $CXXFLAGS -I$NODE_PREFIX/include/node src/_mapnik.cc -c -o $OBJ
+#  LDFLAGS="-L/Library/Frameworks/Mapnik.framework/Versions/2.0/unix/lib -lmapnik2 -bundle -#undefined dynamic_lookup"
+#  g++ $OBJ -o $TARGET $LDFLAGS
+#done
+
+
+# then re-run wrap.py
\ No newline at end of file
diff --git a/osx/scripts/static-universal.sh b/osx/scripts/static-universal.sh
new file mode 100644
index 0000000..d5a3d28
--- /dev/null
+++ b/osx/scripts/static-universal.sh
@@ -0,0 +1,340 @@
+# build notes for compiling mapnik deps statically
+# and "FAT" (aka. universal) in order to allow
+# linking a fully standalone libmapnik.a
+
+PREFIX=`pwd`/osx/sources
+mkdir -p $PREFIX
+export DYLD_LIBRARY_PATH=$PREFIX/lib
+export DYLD_LIBRARY_PATH=$PREFIX/lib
+export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig
+export PATH=$PREFIX/bin:$PATH
+export CORE_CFLAGS="-O3 -arch x86_64 -arch i386 -mmacosx-version-min=10.6 -isysroot /Developer/SDKs/MacOSX10.6.sdk"
+export CORE_CXXFLAGS=$CORE_CFLAGS
+export CORE_LDFLAGS="-Wl,-search_paths_first -arch x86_64 -arch i386 -Wl,-syslibroot,/Developer/SDKs/MacOSX10.6.sdk"
+export ARCHFLAGS="-arch x86_64 -arch i386"
+
+
+cd osx
+mkdir -p deps
+cd deps
+
+
+# icucore headers - temporary workaround until I can get more recent icu versions working
+wget http://www.opensource.apple.com/tarballs/ICU/ICU-400.38.tar.gz
+tar xvf ICU-400.38.tar.gz
+cd ICU-400.38
+make install
+cp -R build/usr/local/include/unicode/ ../../sources/include/unicode
+cd ../
+
+# boost
+wget http://voxel.dl.sourceforge.net/project/boost/boost/1.47.0/boost_1_47_0.tar.bz2
+tar xjvf boost_1_47_0.tar.bz2
+cd boost_1_47_0
+./bootstrap.sh
+
+# no icu variant
+./bjam --prefix=$PREFIX -j2 -d2 \
+  --with-thread \
+  --with-filesystem \
+  --with-program_options --with-system --with-chrono \
+  --with-regex --disable-icu \
+  toolset=darwin \
+  macosx-version=10.6 \
+  address-model=32_64 \
+  architecture=x86 \
+  link=static \
+  variant=release \
+  stage
+
+./bjam --prefix=$PREFIX -j2 -d2 \
+  --with-thread \
+  --with-filesystem \
+  --with-program_options --with-system --with-chrono \
+  --with-regex --disable-icu \
+  toolset=darwin \
+  macosx-version=10.6 \
+  address-model=32_64 \
+  architecture=x86 \
+  link=static \
+  variant=release \
+  install
+
+cd ../
+
+# universal flags
+export CFLAGS=$CORE_CFLAGS
+export CXXFLAGS=$CORE_CXXFLAGS
+export LDFLAGS=$CORE_LDFLAGS
+
+# sqlite
+wget http://www.sqlite.org/sqlite-autoconf-3070701.tar.gz
+tar xvf sqlite-autoconf-3070701.tar.gz
+cd sqlite-autoconf-3070701
+export CFLAGS="-DSQLITE_ENABLE_RTREE=1 -O3 "$CFLAGS
+./configure --prefix=$PREFIX --enable-static --disable-shared --disable-dependency-tracking
+make -j4
+make install
+cd ../
+
+
+# freetype
+wget http://download.savannah.gnu.org/releases/freetype/freetype-2.4.6.tar.bz2
+tar xvf freetype-2.4.6.tar.bz2
+cd freetype-2.4.6
+./configure --prefix=$PREFIX --enable-static --disable-shared --disable-dependency-tracking
+make -j4
+make install
+cd ../
+
+# proj4
+wget http://download.osgeo.org/proj/proj-datumgrid-1.5.zip
+#wget http://download.osgeo.org/proj/proj-4.7.0.tar.gz
+#tar xvf proj-4.7.0.tar.gz
+#cd proj-4.7.0
+# we use trunk instead for better threading support
+svn co http://svn.osgeo.org/metacrs/proj/trunk/proj proj-trunk # at the time pre-release 4.8.0
+cd proj-trunk/nad
+unzip ../../proj-datumgrid-1.5.zip
+cd ../
+./configure --prefix=$PREFIX --enable-static --disable-shared --disable-dependency-tracking
+make -j4
+make install
+cd ../
+
+# libpng
+wget ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng-1.5.4.tar.gz
+tar xvf libpng-1.5.4.tar.gz
+cd libpng-1.5.4
+./configure --prefix=$PREFIX --enable-static --disable-shared --disable-dependency-tracking
+make -j4
+make install
+cd ../
+
+# libjpeg
+wget http://www.ijg.org/files/jpegsrc.v8c.tar.gz
+tar xvf jpegsrc.v8c.tar.gz
+cd jpeg-8c
+./configure --prefix=$PREFIX --enable-static --disable-shared --disable-dependency-tracking
+make -j4
+make install
+cd ../
+
+# libtiff
+wget http://download.osgeo.org/libtiff/tiff-3.9.5.tar.gz
+tar xvf tiff-3.9.5.tar.gz
+cd tiff-3.9.5
+./configure --prefix=$PREFIX --enable-static --disable-shared --disable-dependency-tracking
+make -j4
+make install
+cd ../
+
+# gettext which provides libintl for libpq
+wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.18.1.1.tar.gz
+tar xvf gettext-0.18.1.1.tar.gz
+cd gettext-0.18.1.1
+export CC=gcc
+export CXX=g++
+./configure --prefix=$PREFIX --enable-static --disable-shared --disable-dependency-tracking \
+--without-included-gettext --disable-debug --without-included-glib \
+--without-included-libcroco  --without-included-libxml \
+--without-emacs --without-git --without-cvs
+make -j4
+make install
+cd ../
+
+
+# postgis
+# install postgres 9.x client from somewhere. 
+# http://www.kyngchaos.com/software/postgres works nicely
+# then copy the clients static libpq.a to a prioritized directory:
+cp /usr/local/pgsql/lib/libpq.a osx/sources/lib/libpq.a
+# then edit plugins/input/postgis/SConscript adding more libs to link to
+
+
+# gdal 1.8.1
+wget http://download.osgeo.org/gdal/gdal-1.8.1.tar.gz
+tar xvf gdal-1.8.1.tar.gz
+cd gdal-1.8.1
+./configure --prefix=$PREFIX --enable-static --disable-shared --disable-dependency-tracking \
+--with-libtiff=$PREFIX \
+--with-jpeg=$PREFIX \
+--with-png=$PREFIX \
+--with-static-proj4=$PREFIX \
+--with-sqlite3=no \
+--with-spatialite=no \
+--with-curl=no \
+--with-geos=no \
+--with-pcraster=no \
+--with-cfitsio=no \
+--with-odbc=no \
+--with-libkml=no \
+--with-pcidsk=no \
+--with-jasper=no \
+--with-gif=no \
+--with-pg=no \
+--with-hide-internal-symbols=yes \
+--with-vfk=no \
+--with-grib=no
+
+make -j4
+make install
+cd ../
+
+
+# cairo and friends
+
+# pkg-config so we get cairo and friends configured correctly
+# note: we use 0.25 because >= 0.26 no long bundles glib and we don't
+# want to have to depend on an external glib dep
+wget http://pkgconfig.freedesktop.org/releases/pkg-config-0.25.tar.gz
+tar xvf pkg-config-0.25.tar.gz
+cd pkg-config-0.25
+# patch glib.h
+# change line 198 to:
+#      ifndef G_INLINE_FUNC inline
+./configure --disable-debug --disable-dependency-tracking --prefix=$PREFIX
+make -j4
+make install
+cd ../
+
+# pixman
+wget http://cairographics.org/releases/pixman-0.22.2.tar.gz
+tar xvf pixman-0.22.2.tar.gz
+cd pixman-0.22.2
+./configure --enable-static --disable-shared --disable-dependency-tracking --prefix=$PREFIX
+make -j4
+make install
+cd ../
+
+# fontconfig
+wget http://www.freedesktop.org/software/fontconfig/release/fontconfig-2.8.0.tar.gz
+tar xvf fontconfig-2.8.0.tar.gz
+cd fontconfig-2.8.0
+./configure --enable-static --disable-shared --disable-dependency-tracking --prefix=$PREFIX \
+    --with-freetype-config=$PREFIX/bin/freetype-config
+make -j4
+make install
+cd ../
+
+
+# cairo
+wget http://cairographics.org/releases/cairo-1.10.2.tar.gz
+tar xvf cairo-1.10.2.tar.gz
+cd cairo-1.10.2
+# NOTE: PKG_CONFIG_PATH must be correctly set by this point
+export LDFLAGS="-L$PREFIX/lib "$CORE_LDFLAGS
+export CFLAGS="-I$PREFIX/include "$CORE_CFLAGS
+export png_CFLAGS="-I$PREFIX/include"
+export png_LIBS="-I$PREFIX/lib -lpng"
+./configure \
+  --enable-static --disable-shared \
+  --enable-pdf=yes \
+  --enable-ft=yes \
+  --enable-png=yes \
+  --enable-svg=yes \
+  --enable-ps=yes \
+  --enable-fc=yes \
+  --enable-trace=no \
+  --enable-gtk-doc=no \
+  --enable-qt=no \
+  --enable-quartz=no \
+  --enable-quartz-font=no \
+  --enable-quartz-image=no \
+  --enable-win32=no \
+  --enable-win32-font=no \
+  --enable-skia=no \
+  --enable-os2=no \
+  --enable-beos=no \
+  --enable-drm=no \
+  --enable-drm-xr=no \
+  --enable-gallium=no \
+  --enable-gl=no \
+  --enable-directfb=no \
+  --enable-vg=no \
+  --enable-egl=no \
+  --enable-glx=no \
+  --enable-wgl=no \
+  --enable-test-surfaces=no \
+  --enable-tee=no \
+  --enable-xml=no \
+  --enable-interpreter=no \
+  --disable-valgrind \
+  --enable-gobject=no \
+  --enable-static=no \
+  --enable-xlib=no \
+  --enable-xlib-xrender=no \
+  --enable-xcb=no \
+  --enable-xlib-xcb=no \
+  --enable-xcb-shm=no \
+  --enable-xcb-drm=no \
+  --disable-dependency-tracking \
+  --prefix=$PREFIX
+make -j4
+make install
+cd ../
+
+
+# libsigcxx
+wget http://ftp.gnome.org/pub/GNOME/sources/libsigc++/2.2/libsigc++-2.2.10.tar.bz2
+tar xvf libsigc++-2.2.10.tar.bz2
+cd libsigc++-2.2.10
+export CFLAGS=$CORE_CFLAGS
+export CXXFLAGS=$CORE_CXXFLAGS
+export LDFLAGS=$CORE_LDFLAGS
+./configure --enable-static --disable-shared --disable-dependency-tracking --prefix=$PREFIX
+make -j4
+make install
+cd ../
+
+# cairomm
+wget http://cairographics.org/releases/cairomm-1.10.0.tar.gz
+tar xvf cairomm-1.10.0.tar.gz
+cd cairomm-1.10.0
+# NOTE: PKG_CONFIG_PATH must be correctly set by this point
+export LDFLAGS="-L$PREFIX/lib -lcairo -lfontconfig -lsigc-2.0 "$CORE_LDFLAGS
+export CFLAGS="-I$PREFIX/include -I$PREFIX/include/cairo -I$PREFIX/include/freetype2 -I$PREFIX/include/fontconfig -I$PREFIX/lib/sigc++-2.0/include -I$PREFIX/include/sigc++-2.0 -I$PREFIX/include/sigc++-2.0/sigc++ "$CORE_CFLAGS
+export CXXFLAGS="-I$PREFIX/include "$CFLAGS
+
+./configure --enable-static --disable-shared \
+    --disable-dependency-tracking --prefix=$PREFIX
+make -j4
+make install
+cd ../
+
+# mapnik
+
+# config.py
+
+CXX = 'clang++'
+CC = 'clang++'
+CUSTOM_CXXFLAGS = '-arch x86_64 -arch i386 -mmacosx-version-min=10.6 -isysroot /Developer/SDKs/MacOSX10.6.sdk'
+CUSTOM_LDFLAGS = '-Wl,-search_paths_first -arch x86_64 -arch i386 -Wl,-syslibroot,/Developer/SDKs/MacOSX10.6.sdk'
+INPUT_PLUGINS = 'gdal,ogr,postgis,shape'
+DESTDIR = './osx/sources/'
+BOOST_INCLUDES = './osx/sources/include'
+BOOST_LIBS = './osx/sources/lib'
+FREETYPE_CONFIG = './osx/sources/bin/freetype-config'
+ICU_INCLUDES = './osx/sources/include'
+ICU_LIB_NAME = 'icucore'
+PNG_INCLUDES = './osx/sources/include'
+PNG_LIBS = './osx/sources/lib'
+JPEG_INCLUDES = './osx/sources/include'
+JPEG_LIBS = './osx/sources/lib'
+TIFF_INCLUDES = './osx/sources/include'
+TIFF_LIBS = './osx/sources/lib'
+PROJ_INCLUDES = './osx/sources/include'
+PROJ_LIBS = './osx/sources/lib'
+PKG_CONFIG_PATH = './osx/sources/lib/pkgconfig'
+SQLITE_INCLUDES = './osx/sources/include'
+SQLITE_LIBS = './osx/sources/lib'
+BINDINGS = 'none'
+
+
+# fixup the mapnik-config
+# we need to remove the local paths so that 'other-libs' and 'other-includes' look something like:
+
+other_libs='-Wl,-search_paths_first -arch x86_64 -arch i386 -Wl,-syslibroot,/Developer/SDKs/MacOSX10.6.sdk -L/usr/lib -lfreetype -licucore -lboost_filesystem -lboost_regex -lcairomm-1.0 -lcairo -lboost_thread -lboost_system'
+
+other_includes='-arch x86_64 -arch i386 -mmacosx-version-min=10.6 -isysroot /Developer/SDKs/MacOSX10.6.sdk -arch x86_64 -arch i386 -mmacosx-version-min=10.6 -isysroot /Developer/SDKs/MacOSX10.6.sdk -DU_HIDE_DRAFT_API -DUDISABLE_RENAMING -DHAVE_JPEG -ansi -Wall -ftemplate-depth-200 -DDARWIN -DBOOST_SPIRIT_THREADSAFE -DMAPNIK_THREADSAFE -O3 -finline-functions -Wno-inline -DNDEBUG -DHAVE_CAIRO -I/usr/include/libxml2 -DHAVE_CAIRO -DLIBTOOL_SUPPORTS_ADVISE'
+
diff --git a/osx/scripts/static.sh b/osx/scripts/static.sh
new file mode 100644
index 0000000..861e7d7
--- /dev/null
+++ b/osx/scripts/static.sh
@@ -0,0 +1,286 @@
+
+PREFIX=/Users/dane/projects/mapnik-dev/trunk-build-static/osx/sources
+mkdir -p $PREFIX
+export DYLD_LIBRARY_PATH=$PREFIX/lib
+# final resting place
+INSTALL=/Library/Frameworks/Mapnik.framework/unix/lib
+export DYLD_LIBRARY_PATH=$PREFIX/lib
+export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig
+export PATH=$PREFIX/bin:$PATH
+export CFLAGS="-O3 -arch x86_64"
+export CXXFLAGS="-O3 -arch x86_64"
+export LDFLAGS="-arch x86_64"
+
+
+cd osx
+mkdir -p deps
+cd deps
+
+
+wget http://download.icu-project.org/files/icu4c/4.6.1/icu4c-4_6_1-src.tgz
+tar xvf icu4c-4_6_1-src.tgz
+cd icu/source
+
+# universal flags
+export CFLAGS="-O3 -arch x86_64"
+export CXXFLAGS="-O3 -arch x86_64"
+export LDFLAGS="-arch x86_64"
+./runConfigureICU MacOSX --prefix=$PREFIX --enable-static --disable-shared \
+--with-library-bits=64 --enable-release \
+--with-data-packaging=static
+
+#Data Packaging: archive
+# This means: ICU data will be stored in a single .dat file.
+# To locate data: ICU will look in /Users/dane/projects/mapnik-dev/trunk-build-static/osx/sources/share/icu/4.6 which is the #installation location. Call u_setDataDirectory() or use the ICU_DATA environment variable to override.
+
+make install -j4
+
+ln -s `pwd`/../sources/lib `pwd`/../sources/lib64
+
+
+
+wget http://voxel.dl.sourceforge.net/project/boost/boost/1.47.0/boost_1_47_0.tar.bz2
+tar xjvf boost_1_47_0.tar.bz2
+cd boost_1_47_0
+./bootstrap.sh
+#--prefix-dir
+
+#   architecture=x86  prevents icu link test from working?
+l
+./bjam --prefix=$PREFIX --with-python \
+  --with-thread \
+  --with-filesystem \
+  --with-program_options --with-system --with-chrono \
+  --with-regex define=U_STATIC_IMPLEMENTATION=1 \
+  -sHAVE_ICU=1 -sICU_PATH=$PREFIX \
+  toolset=darwin \
+  address-model=64 \
+  link=static \
+  variant=release \
+  stage
+
+./bjam --prefix=$PREFIX --with-python \
+  --with-thread \
+  --with-filesystem \
+  --with-program_options --with-system --with-chrono \
+  --with-regex define=U_STATIC_IMPLEMENTATION=1 \
+  -sHAVE_ICU=1 -sICU_PATH=$PREFIX \
+  toolset=darwin \
+  address-model=64 \
+  link=static \
+  variant=release \
+  install
+
+# no icu variant
+./bjam --prefix=$PREFIX --with-python \
+  --with-thread \
+  --with-filesystem \
+  --with-program_options --with-system --with-chrono \
+  --with-regex --disable-icu \
+  toolset=darwin \
+  address-model=64 \
+  link=static \
+  variant=release \
+  install
+
+
+./bjam --prefix=$PREFIX -a \
+  --with-regex define=U_STATIC_IMPLEMENTATION=1 \
+  -sHAVE_ICU=1 -sICU_PATH=$PREFIX \
+  toolset=darwin \
+  address-model=64 \
+  link=static \
+  variant=release \
+  stage
+
+cp stage/lib/libboost_regex.a ../../sources/lib/
+
+
+tar xvf ../deps/freetype-2.4.4.tar.gz
+export CFLAGS="-O3 -arch x86_64"
+export LDFLAGS="-arch x86_64"
+cd freetype-2.4.4
+./configure --prefix=$PREFIX \
+--enable-static \
+--disable-shared
+make -j4
+make install
+
+
+
+wget http://download.osgeo.org/proj/proj-4.7.0.tar.gz
+tar xvf proj-4.7.0.tar.gz
+cd proj-4.7.0
+export CFLAGS="-O3 -arch x86_64"
+export CXXFLAGS="-O3 -arch x86_64"
+export LDFLAGS="-arch x86_64"
+./configure --prefix=$PREFIX --enable-static --disable-shared --disable-dependency-tracking
+make
+make install
+
+
+wget http://downloads.sourceforge.net/project/libpng/libpng12/1.2.44/libpng-1.2.44.tar.bz2
+tar xvf libpng-1.2.44.tar.bz2
+./configure --prefix=$PREFIX --enable-static --disable-shared --disable-dependency-tracking
+make -j4
+make install
+
+wget http://www.ijg.org/files/jpegsrc.v8c.tar.gz
+tar xvf jpegsrc.v8c.tar.gz
+cd jpeg-8c
+export CFLAGS="-O3 -arch x86_64"
+export CXXFLAGS="-O3 -arch x86_64"
+export LDFLAGS="-arch x86_64"
+./configure --prefix=$PREFIX --enable-static --disable-shared --disable-dependency-tracking
+make -j4
+make install
+
+wget http://download.osgeo.org/libtiff/tiff-3.9.4.zip
+tar xvf tiff-3.9.4.zip
+export CFLAGS="-O3 -arch x86_64"
+export CXXFLAGS="-O3 -arch x86_64"
+export LDFLAGS="-arch x86_64"
+cd tiff-3.9.4
+./configure --prefix=$PREFIX --enable-static --disable-shared --disable-dependency-tracking
+make -j4
+make install
+
+
+# gdal 1.8
+./configure --prefix=$PREFIX --disable-static --enable-shared --disable-dependency-tracking \
+
+export CFLAGS="-O3 -arch x86_64"
+export CXXFLAGS="-O3 -arch x86_64"
+export LDFLAGS="-arch x86_64"
+./configure --prefix=$PREFIX --enable-static --disable-shared --disable-dependency-tracking \
+--with-libtiff=$PREFIX \
+--with-jpeg=$PREFIX \
+--with-png=$PREFIX \
+--with-geos=no \
+--with-pcraster=no \
+--with-libkml=no \
+--with-pcidsk=no \
+--with-jasper=no \
+--with-gif=no \
+--with-pg=no 
+
+make -j4
+
+file ../../sources/lib/libgdal.a
+
+ldd ../../sources/lib/libgdal.dylib
+
+
+# cairo and friends
+
+# pkg-config so we get cairo and friends configured correctly
+wget http://pkgconfig.freedesktop.org/releases/pkg-config-0.26.tar.gz
+tar xvf pkg-config-0.26.tar.gz
+cd pkg-config-0.26
+./configure --disable-dependency-tracking --prefix=$PREFIX
+make -j4
+make install
+cd ../
+
+wget http://cairographics.org/releases/pixman-0.22.2.tar.gz
+tar xvf pixman-0.22.2.tar.gz
+cd pixman-0.22.2
+./configure --enable-static --disable-shared --disable-dependency-tracking --prefix=$PREFIX
+make -j4
+make install
+cd ../
+
+wget http://www.freedesktop.org/software/fontconfig/release/fontconfig-2.8.0.tar.gz
+tar xvf fontconfig-2.8.0.tar.gz
+cd fontconfig-2.8.0
+./configure --enable-static --disable-shared --disable-dependency-tracking --prefix=$PREFIX \
+    --with-freetype-config=$PREFIX/bin/freetype-config
+make -j4
+make install
+cd ../
+
+
+# Cairo
+wget http://cairographics.org/releases/cairo-1.10.2.tar.gz
+tar xvf cairo-1.10.2.tar.gz
+cd cairo-1.10.2
+# NOTE: PKG_CONFIG_PATH must be correctly set by this point
+export LDFLAGS="-L$PREFIX/lib "$LDFLAGS
+export CFLAGS="-I$PREFIX/include "$CFLAGS
+export png_CFLAGS="-I$PREFIX/include"
+export png_LIBS="-I$PREFIX/lib -lpng12"
+./configure \
+  --enable-static --disable-shared \
+  --enable-pdf=yes \
+  --enable-ft=yes \
+  --enable-png=yes \
+  --enable-svg=yes \
+  --enable-ps=yes \
+  --enable-fc=yes \
+  --enable-trace=no \
+  --enable-gtk-doc=no \
+  --enable-qt=no \
+  --enable-quartz=no \
+  --enable-quartz-font=no \
+  --enable-quartz-image=no \
+  --enable-win32=no \
+  --enable-win32-font=no \
+  --enable-skia=no \
+  --enable-os2=no \
+  --enable-beos=no \
+  --enable-drm=no \
+  --enable-drm-xr=no \
+  --enable-gallium=no \
+  --enable-gl=no \
+  --enable-directfb=no \
+  --enable-vg=no \
+  --enable-egl=no \
+  --enable-glx=no \
+  --enable-wgl=no \
+  --enable-test-surfaces=no \
+  --enable-tee=no \
+  --enable-xml=no \
+  --enable-interpreter=no \
+  --disable-valgrind \
+  --enable-gobject=no \
+  --enable-static=no \
+  --enable-xlib=no \
+  --enable-xlib-xrender=no \
+  --enable-xcb=no \
+  --enable-xlib-xcb=no \
+  --enable-xcb-shm=no \
+  --enable-xcb-drm=no \
+  --disable-dependency-tracking \
+  --prefix=$PREFIX
+make -j4
+make install
+cd ../
+
+
+# libsigcxx
+wget http://ftp.gnome.org/pub/GNOME/sources/libsigc++/2.2/libsigc++-2.2.10.tar.bz2
+tar xvf libsigc++-2.2.10.tar.bz2
+cd libsigc++-2.2.10
+./configure --enable-static --disable-shared --disable-dependency-tracking --prefix=$PREFIX
+make -j4
+make install
+cd ../
+
+wget http://cairographics.org/releases/cairomm-1.10.0.tar.gz
+tar xvf cairomm-1.10.0.tar.gz
+cd cairomm-1.10.0
+# NOTE: PKG_CONFIG_PATH must be correctly set by this point
+export CFLAGS="-O3 -arch x86_64"
+export CXXFLAGS="-O3 -arch x86_64"
+export LDFLAGS="-arch x86_64"
+export LDFLAGS="-L$PREFIX/lib -lcairo -lfontconfig -lsigc-2.0 "$LDFLAGS
+export CFLAGS="-I$PREFIX/include -I$PREFIX/include/cairo -I$PREFIX/include/freetype2 -I$PREFIX/include/fontconfig -I$PREFIX/lib/sigc++-2.0/include -I$PREFIX/include/sigc++-2.0 -I$PREFIX/include/sigc++-2.0/sigc++ "$CFLAGS
+# undef CAIRO_HAS_FT_FONT in include/cairo/cairo-features.h
+#mv ../../sources/lib/pkgconfig/cairo-ft.pc ../../sources/lib/pkgconfig/_cairo-ft.pc
+#export CFLAGS="-DNCAIRO_HAS_FT_FONT -I$PREFIX/include -I$PREFIX/include/cairo -I$PREFIX/lib/sigc++-2.0/include -I$PREFIX/include/sigc++-2.0 -I$PREFIX/include/sigc++-2.0/sigc++ "
+export CXXFLAGS="-I$PREFIX/include "$CFLAGS
+
+./configure --enable-static --disable-shared \
+    --disable-dependency-tracking --prefix=$PREFIX
+make -j4
+make install
diff --git a/osx/wrap.py b/osx/wrap.py
new file mode 100644
index 0000000..032a044
--- /dev/null
+++ b/osx/wrap.py
@@ -0,0 +1,257 @@
+#!/usr/bin/env python 
+
+import os
+import glob
+import shutil
+from os.path import join
+import sys
+
+def sym(target,link):
+    relative = os.path.relpath(target,link)
+    if relative.startswith('../'):
+        relative = relative.replace('../','',1)
+    try:
+        if os.path.exists(link):
+            os.unlink(link)
+        os.symlink(relative,link)
+    except OSError, e:
+        raise OSError('%s: %s' % (e,link))
+
+def copy_all_items(pattern,place,recursive=True):
+    items = glob.glob(pattern)
+    for i in items:
+       if recursive:
+           # -R is needed to preserve symlinks
+           os.system('cp -R %s %s' % (i,place))
+       else:
+           shutil.copy(i,place)
+
+def drop(path):
+    if os.path.islink(path) or os.path.lexists(path):
+        if os.path.isabs(path):
+            print 'not deleting item as it is an absolute path: %' % path
+        else:
+            os.system('rm -r %s' % path)
+
+if __name__ == "__main__":
+
+    
+    # include headers for a full SDK?
+    INCLUDE_HEADERS = True
+    
+    INCLUDE_NODE = False
+
+    INCLUDE_PYTHON = True
+    
+    INCLUDE_CAIRO = True
+    
+    INCLUDE_PYCAIRO = False
+    
+    # final resting place
+    install_path = '/Library/Frameworks'
+
+    # move to this dir
+    here = os.path.dirname(os.path.realpath(__file__))
+    os.chdir(here)
+       
+    # relative path to DESTDIR output
+    framework = 'Library/Frameworks/Mapnik.framework'
+   
+    # Framework version, likely should be 2.0.0..
+    version = '2.0'
+    
+    # Versions/Current symlink
+    current = join(framework,'Versions',version)
+
+    # HERE WE GO...
+    
+    # set up symlinks
+    # from existing directory, to link
+    active = join(framework,'Versions/Current')
+    #drop('rm -rf %s' % active)
+    sym(current,active)
+    
+    # point top level 'unix' to active one
+    sym(join(active,'unix'),join(framework,'unix'))
+
+    # create headers directory if needed
+    if INCLUDE_HEADERS:
+        if not os.path.exists(join(active,'unix/include')):
+            os.mkdir(join(active,'unix/include'))
+
+    # Mapnik Headers
+    if INCLUDE_HEADERS:
+        sym(join(active,'unix/include'),join(active,'Headers'))
+        sym(join(active,'Headers'),join(framework,'Headers'))
+    else:
+        # purge the installed headers of mapnik
+        drop('rm -rf %s' % join(active,'unix/include'))
+    
+    if INCLUDE_CAIRO:
+        
+        # install cairo libs and deps
+        copy_all_items('sources/lib/libcairo*dylib',join(active,'unix/lib'),recursive=True)
+        copy_all_items('sources/lib/libfontconfig*dylib',join(active,'unix/lib'),recursive=True)
+        copy_all_items('sources/lib/libsigc-2.0*dylib',join(active,'unix/lib'),recursive=True)
+        copy_all_items('sources/lib/libpixman*dylib',join(active,'unix/lib'),recursive=True)
+    
+        # install cairo includes
+        if INCLUDE_HEADERS:
+            # what is layout?
+            for group in ['cairo','cairomm-1.0','fontconfig','pixman-1','pycairo','sigc++-2.0','layout']:
+                if not os.path.exists(join(active,'unix/include/%s' % group)):
+                    os.mkdir(join(active,'unix/include/%s' % group))
+                copy_all_items('sources/include/%s/*' % group,join(active,'unix/include/%s' % group),recursive=True)
+            
+            if not INCLUDE_PYCAIRO:
+                drop('rm -rf %s' % join(active,'unix/include/pycairo'))
+
+            # likely uneeded
+            if not os.path.exists(join(active,'unix/lib/sigc++-2.0')):
+                os.mkdir(join(active,'unix/lib/sigc++-2.0'))
+            copy_all_items('sources/lib/sigc++-2.0/*',join(active,'unix/lib/sigc++-2.0'),recursive=True)
+            
+    
+    # install icu libs
+    copy_all_items('sources/lib/libicuu*dylib',join(active,'unix/lib'),recursive=True)
+    copy_all_items('sources/lib/libicud*dylib',join(active,'unix/lib'),recursive=True)
+    copy_all_items('sources/lib/libicui1*dylib',join(active,'unix/lib'),recursive=True)
+
+    # install icu includes
+    if INCLUDE_HEADERS:
+        if not os.path.exists(join(active,'unix/include/unicode')):
+            os.mkdir(join(active,'unix/include/unicode'))
+        copy_all_items('sources/include/unicode/*',join(active,'unix/include/unicode'),recursive=True)
+
+    # install boost libs
+    copy_all_items('sources/lib/libboost*dylib',join(active,'unix/lib'),recursive=True)
+
+    # install boost includes
+    if INCLUDE_HEADERS:
+        if not os.path.exists(join(active,'unix/include/boost')):
+            os.mkdir(join(active,'unix/include/boost'))
+        copy_all_items('sources/include/boost/*',join(active,'unix/include/boost'),recursive=True)
+
+    # install rasterlite lib
+    copy_all_items('sources/lib/librasterlite*dylib',join(active,'unix/lib'),recursive=True)
+
+    # install freetype2 libs
+    copy_all_items('sources/lib/libfreetype*dylib',join(active,'unix/lib'),recursive=True)
+
+    # install freetype2 includes
+    if INCLUDE_HEADERS:
+        if not os.path.exists(join(active,'unix/include/freetype2')):
+            os.mkdir(join(active,'unix/include/freetype2'))
+        copy_all_items('sources/include/freetype2/*',join(active,'unix/include/freetype2'),recursive=True)
+        copy_all_items('sources/include/ft2build.h',join(active,'unix/include/'),recursive=True)
+    
+    # Node-mapnik bindings location
+    if INCLUDE_NODE:
+        if not os.path.exists(join(active,'unix/lib/node')):
+            os.mkdir(join(active,'unix/lib/node'))
+            os.mkdir(join(active,'unix/lib/node/mapnik'))
+        sym(join(active,'unix/lib/node'),join(active,'Node'))
+        sym(join(active,'Node'),join(framework,'Node'))
+    
+        # do this later...
+        copy_all_items('deps/node-mapnik/mapnik/*',join(active,'unix/lib/node/mapnik/'),recursive=True)
+    else:
+        drop('rm -r %s' % join(active,'Node'))
+        drop('rm -r %s' % join(framework,'Node'))
+        drop('rm -r %s' % join(active,'unix/lib/node/'))
+    
+    # Resources
+    if not os.path.exists(join(active,'Resources')):
+        os.mkdir(join(active,'Resources'))
+    # TODO - put docs and other stuff here...
+    # or link to /share
+    sym(join(active,'Resources'),join(framework,'Resources'))
+    shutil.copy('Info.plist',join(active,'Resources'))
+        
+    # Programs
+    sym(join(active,'unix/bin'),join(active,'Programs'))
+    sym(join(active,'Programs'),join(framework,'Programs'))
+    
+    # Datasources
+    sym(join(active,'unix/lib/mapnik2/input'),join(active,'Datasources'))
+    sym(join(active,'Datasources'),join(framework,'Datasources'))
+    
+    # Fonts
+    # TODO - move fonts to main level...
+    sym(join(active,'unix/lib/mapnik2/fonts'),join(active,'Fonts'))
+    sym(join(active,'Fonts'),join(framework,'Fonts'))
+    
+    # symlinks to user and system font directories.
+    # TODO - NEED TO BENCHMARK performance hit of extra loading time and memory usage
+    #sym('/Library/Fonts', join(fonts,'Library'))
+    #sym('/System/Library/Fonts', join(fonts,'System'))
+    
+    # symlink the lib
+    sym(join(active,'unix/lib/libmapnik2.dylib'),join(active,'Mapnik'))
+    sym(join(active,'Mapnik'),join(framework,'Mapnik'))
+    
+    # Python
+    if INCLUDE_PYTHON:
+        #python_versions =  glob.glob('unix/lib/python*')
+        #for py in python_versions:
+        #    py_dir = join(active,'%s/site-packages' % py)
+        if not os.path.exists(join(active,'Python')):
+            os.mkdir(join(active,'Python'))
+            os.mkdir(join(active,'Python/mapnik2'))
+            if INCLUDE_PYCAIRO:
+                os.mkdir(join(active,'Python/cairo'))
+        shutil.copy('python/mapnik.py',join(active,'Python/mapnik2/__init__.py'))
+        if INCLUDE_PYCAIRO:
+            if not os.path.exists(join(active,'Python/cairo/')):
+                os.mkdir(join(active,'Python/cairo/'))
+            shutil.copy('python/cairo.py',join(active,'Python/cairo/__init__.py'))
+        else:
+            drop('rm -rf %s' % join(active,'Python/cairo'))
+            
+        #sym(py_dir,join(active,'Python'))
+        sym(join(active,'Python'),join(framework,'Python'))
+                    
+
+        # pycairo module
+        for pyver in glob.glob('sources/lib/python*'):
+            ver = os.path.basename(pyver)
+            to = join(active,'unix/lib/%s/site-packages/cairo/' % ver)
+            if INCLUDE_PYCAIRO:
+                assert os.path.exists(join(active,'unix/lib/%s' % ver))
+                assert os.path.exists(join(active,'unix/lib/%s/site-packages' % ver))
+                if not os.path.exists(to):
+                    os.mkdir(to)
+                copy_all_items('sources/lib/%s/site-packages/cairo/*' % ver,to,recursive=True)
+            else:
+                drop('rm -r %s' % to)
+        
+        # try to start using relative paths..
+        #paths_py = '''
+        #import os
+        #inputpluginspath = os.path.normpath(os.path.join(os.path.dirname(__file__),'../../../../Datasources'))
+        #fontscollectionpath = os.path.normpath(os.path.join(os.path.dirname(__file__),'../../../../Fonts'))
+        #'''
+        
+        #paths_py = '''
+        #inputpluginspath = '%(install_path)s/Mapnik.framework/Datasources'
+        #fontscollectionpath = '%(install_path)s/Mapnik.framework/Fonts'
+        #'''
+        
+        # TODO - consider making _mapnik.so import dependent on version
+        # so we can simplify install..
+        
+        # done via scons install...
+        #mapnik_module = join(py_dir,'mapnik2')
+        #open(mapnik_module+'/paths.py','w').write(paths_py % locals())
+        #shutil.copy('../bindings/python/mapnik/__init__.py',mapnik_module)
+        
+        # pth file
+        pth ='''import sys; sys.path.insert(0,'%(install_path)s/Mapnik.framework/Python')
+        ''' % locals()
+        
+        # TODO - testing hack, will add this local python binding to sys path for snow leopard
+        #open('/Library/Python/2.6/site-packages/mapnik.pth','w').write(pth)
+    
+        # Stash in resources as well
+        open(join(active,'Resources/mapnik2.pth'),'w').write(pth)
+    
\ No newline at end of file
diff --git a/plugins/input/gdal/SConscript b/plugins/input/gdal/SConscript
deleted file mode 100644
index f9bb572..0000000
--- a/plugins/input/gdal/SConscript
+++ /dev/null
@@ -1,42 +0,0 @@
-#
-# This file is part of Mapnik (c++ mapping toolkit)
-#
-# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-# $Id$
-
-Import ('env')
-
-prefix = env['PREFIX']
-install_prefix = env['DESTDIR'] + '/' + prefix
-
-gdal_src = Split(
-	"""
-	gdal_datasource.cpp
-	gdal_featureset.cpp      
-	"""
-        )
-
-libraries = [env['PLUGINS']['gdal']['lib']]
-if env['PLATFORM'] == 'Darwin':
-    libraries.append('mapnik')
-    libraries.append(env['ICU_LIB_NAME'])
-
-gdal_inputdriver = env.SharedLibrary('gdal', source=gdal_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries)
-
-env.Install(install_prefix + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME'] + '/input', gdal_inputdriver)
-env.Alias('install', install_prefix + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME'] + '/input')
diff --git a/plugins/input/gdal/build.py b/plugins/input/gdal/build.py
new file mode 100644
index 0000000..2f81d98
--- /dev/null
+++ b/plugins/input/gdal/build.py
@@ -0,0 +1,53 @@
+#
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+Import ('env')
+
+prefix = env['PREFIX']
+
+plugin_env = env.Clone()
+
+gdal_src = Split(
+  """
+  gdal_datasource.cpp
+  gdal_featureset.cpp      
+  """
+        )
+
+# clear out and rebuild libs
+plugin_env['LIBS'] = [env['PLUGINS']['gdal']['lib']]
+
+# Link Library to Dependencies
+plugin_env['LIBS'].append('mapnik2')
+plugin_env['LIBS'].append(env['ICU_LIB_NAME'])
+
+if env['RUNTIME_LINK'] == 'static':
+    cmd = 'gdal-config --dep-libs'
+    plugin_env.ParseConfig(cmd)
+
+input_plugin = plugin_env.SharedLibrary('../gdal', source=gdal_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LINKFLAGS=env['CUSTOM_LDFLAGS'])
+
+# if the plugin links to libmapnik2 ensure it is built first
+Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME']))
+
+if 'uninstall' not in COMMAND_LINE_TARGETS:
+    env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin)
+    env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST'])
diff --git a/plugins/input/gdal/gdal_datasource.cpp b/plugins/input/gdal/gdal_datasource.cpp
index 1a46800..f9ec487 100644
--- a/plugins/input/gdal/gdal_datasource.cpp
+++ b/plugins/input/gdal/gdal_datasource.cpp
@@ -33,7 +33,7 @@ using mapnik::parameters;
 
 DATASOURCE_PLUGIN(gdal_datasource)
 
-using mapnik::Envelope;
+using mapnik::box2d;
 using mapnik::coord2d;
 using mapnik::query;
 using mapnik::featureset_ptr;
@@ -41,104 +41,181 @@ using mapnik::layer_descriptor;
 using mapnik::datasource_exception;
 
 
-
 /*
  * Opens a GDALDataset and returns a pointer to it.
  * Caller is responsible for calling GDALClose on it
  */
 inline GDALDataset *gdal_datasource::open_dataset() const
 {
-   GDALDataset *dataset;
+
+#ifdef MAPNIK_DEBUG
+    std::clog << "GDAL Plugin: opening: " << dataset_name_ << std::endl;
+#endif
+
+    GDALDataset *dataset;
 #if GDAL_VERSION_NUM >= 1600
-   if (shared_dataset_)
-       dataset = reinterpret_cast<GDALDataset*>(GDALOpenShared((dataset_name_).c_str(),GA_ReadOnly));
-   else
+    if (shared_dataset_)
+        dataset = reinterpret_cast<GDALDataset*>(GDALOpenShared((dataset_name_).c_str(),GA_ReadOnly));
+    else
 #endif
-       dataset = reinterpret_cast<GDALDataset*>(GDALOpen((dataset_name_).c_str(),GA_ReadOnly));
+        dataset = reinterpret_cast<GDALDataset*>(GDALOpen((dataset_name_).c_str(),GA_ReadOnly));
 
-   if (! dataset) throw datasource_exception(CPLGetLastErrorMsg());
-   return dataset;
+    if (! dataset) throw datasource_exception(CPLGetLastErrorMsg());
+    return dataset;
 }
 
 
 
-gdal_datasource::gdal_datasource(parameters const& params)
-   : datasource(params),
-     desc_(*params.get<std::string>("type"),"utf-8")
+gdal_datasource::gdal_datasource(parameters const& params, bool bind)
+    : datasource(params),
+      desc_(*params.get<std::string>("type"),"utf-8"),
+      filter_factor_(*params_.get<double>("filter_factor",0.0))
 {
-
 #ifdef MAPNIK_DEBUG
-   std::clog << "\nGDAL Plugin: Initializing...\n";
+    std::clog << "GDAL Plugin: Initializing..." << std::endl;
 #endif
 
-   GDALAllRegister();
+    GDALAllRegister();
 
-   boost::optional<std::string> file = params.get<std::string>("file");
-   if (!file) throw datasource_exception("missing <file> parameter");
+    boost::optional<std::string> file = params.get<std::string>("file");
+    if (!file) throw datasource_exception("missing <file> parameter");
 
-   boost::optional<std::string> base = params.get<std::string>("base");
-   if (base)
-      dataset_name_ = *base + "/" + *file;
-   else
-      dataset_name_ = *file;
+    boost::optional<std::string> base = params_.get<std::string>("base");
+    if (base)
+        dataset_name_ = *base + "/" + *file;
+    else
+        dataset_name_ = *file;
+   
+    if (bind)
+    {
+        this->bind();
+    }
+}
 
-   shared_dataset_ = *params_.get<mapnik::boolean>("shared",false);
-   band_ = *params_.get<int>("band", -1);
+void gdal_datasource::bind() const
+{
+    if (is_bound_) return;
+    
+    shared_dataset_ = *params_.get<mapnik::boolean>("shared",false);
+    band_ = *params_.get<int>("band", -1);
 
-   GDALDataset *dataset = open_dataset();
+    GDALDataset *dataset = open_dataset();
    
-   // TODO: Make more class attributes from geotransform...
-   width_ = dataset->GetRasterXSize();
-   height_ = dataset->GetRasterYSize();
-
-   double tr[6];
-   dataset->GetGeoTransform(tr);
-   double dx = tr[1];
-   double dy = tr[5];
-   double x0 = tr[0];
-   double y0 = tr[3];
-   double x1 = tr[0] + width_ * dx + height_ *tr[2];
-   double y1 = tr[3] + width_ *tr[4] + height_ * dy;
-   extent_.init(x0,y0,x1,y1);
-   GDALClose(dataset);
+    nbands_ = dataset->GetRasterCount();
+    width_ = dataset->GetRasterXSize();
+    height_ = dataset->GetRasterYSize();
+
+
+    double tr[6];
+    bool bbox_override = false;
+    boost::optional<std::string> bbox_s = params_.get<std::string>("bbox");
+    if (bbox_s)
+    {
+#ifdef MAPNIK_DEBUG
+        std::clog << "GDAL Plugin: bbox parameter=" << *bbox_s << std::endl;
+#endif
+        bbox_override = extent_.from_string(*bbox_s);
+        if (!bbox_override)
+        {
+            throw datasource_exception("GDAL Plugin: bbox parameter '" + *bbox_s + "' invalid");
+        }
+    }
+    
+    if (bbox_override)
+    {
+        tr[0] = extent_.minx();
+        tr[1] = extent_.width() / (double)width_;
+        tr[2] = 0;
+        tr[3] = extent_.maxy();
+        tr[4] = 0;
+        tr[5] = -extent_.height() / (double)height_;
+    }
+    else
+    {
+        dataset->GetGeoTransform(tr);
+    }
+    
+#ifdef MAPNIK_DEBUG
+    std::clog << "GDAL Plugin: geotransform=" << tr[0] << "," << tr[1] << ","
+                                              << tr[2] << "," << tr[3] << ","
+                                              << tr[4] << "," << tr[5] << std::endl;
+#endif
+    
+    if (tr[2] !=0 || tr[4] != 0)
+    {
+        throw datasource_exception("GDAL Plugin: only 'north up' images are supported");
+    }
+
+    dx_ = tr[1];
+    dy_ = tr[5];
+    
+    if (!bbox_override)
+    {
+        double x0 = tr[0];
+        double y0 = tr[3];
+        double x1 = tr[0] + width_ * dx_ + height_ *tr[2];
+        double y1 = tr[3] + width_ *tr[4] + height_ * dy_;
+         
+        /*
+        double x0 = tr[0] + (height_) * tr[2]; // minx
+        double y0 = tr[3] + (height_) * tr[5]; // miny
+        
+        double x1 = tr[0] + (width_) * tr[1]; // maxx
+        double y1 = tr[3] + (width_) * tr[4]; // maxy
+        */
+        
+        extent_.init(x0,y0,x1,y1);
+    }
+    GDALClose(dataset);
    
 #ifdef MAPNIK_DEBUG
-   std::clog << "GDAL Plugin: Raster Size=" << width_ << "," << height_ << "\n";
-   std::clog << "GDAL Plugin: Raster Extent=" << extent_ << "\n";
+    std::clog << "GDAL Plugin: Raster Size=" << width_ << "," << height_ << std::endl;
+    std::clog << "GDAL Plugin: Raster Extent=" << extent_ << std::endl;
 #endif
 
+    is_bound_ = true;
 }
 
-gdal_datasource::~gdal_datasource() {}
+gdal_datasource::~gdal_datasource()
+{
+}
 
 int gdal_datasource::type() const
 {
-   return datasource::Raster;
+    return datasource::Raster;
 }
 
 std::string gdal_datasource::name()
 {
-   return "gdal";
+    return "gdal";
 }
 
-Envelope<double> gdal_datasource::envelope() const
+box2d<double> gdal_datasource::envelope() const
 {
-   return extent_;
+    if (!is_bound_) bind();
+    
+    return extent_;
 }
 
 layer_descriptor gdal_datasource::get_descriptor() const
 {
-   return desc_;
+    return desc_;
 }
 
 featureset_ptr gdal_datasource::features(query const& q) const
 {
-   gdal_query gq = q;
-   return featureset_ptr(new gdal_featureset(*open_dataset(), band_, gq));
+    if (!is_bound_) bind();
+
+    gdal_query gq = q;
+    // TODO - move to boost::make_shared, but must reduce # of args to <= 9
+    return featureset_ptr(new gdal_featureset(*open_dataset(), band_, gq, extent_, width_, height_, nbands_, dx_, dy_, filter_factor_));
 }
 
 featureset_ptr gdal_datasource::features_at_point(coord2d const& pt) const
 {
-   gdal_query gq = pt;
-   return featureset_ptr(new gdal_featureset(*open_dataset(), band_, gq));
+    if (!is_bound_) bind();
+
+    gdal_query gq = pt;
+    return featureset_ptr(new gdal_featureset(*open_dataset(), band_, gq, extent_, width_, height_, nbands_, dx_, dy_,  filter_factor_));
 }
+
diff --git a/plugins/input/gdal/gdal_datasource.hpp b/plugins/input/gdal/gdal_datasource.hpp
index e3d957d..e3c778c 100644
--- a/plugins/input/gdal/gdal_datasource.hpp
+++ b/plugins/input/gdal/gdal_datasource.hpp
@@ -24,30 +24,40 @@
 #ifndef GDAL_DATASOURCE_HPP
 #define GDAL_DATASOURCE_HPP
 
+// mapnik
 #include <mapnik/datasource.hpp>
+
+// boost
 #include <boost/shared_ptr.hpp>
+
+// gdal
 #include <gdal_priv.h>
 
 class gdal_datasource : public mapnik::datasource 
 {
-   public:
-      gdal_datasource(mapnik::parameters const& params);
-      virtual ~gdal_datasource ();
-      int type() const;
-      static std::string name();
-      mapnik::featureset_ptr features( mapnik::query const& q) const;
-      mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt) const;
-      mapnik::Envelope<double> envelope() const;
-      mapnik::layer_descriptor get_descriptor() const;
-   private:
-      mapnik::Envelope<double> extent_;
-      std::string dataset_name_;
-      int band_;
-      mapnik::layer_descriptor desc_;
-      unsigned width_;
-      unsigned height_;
-      bool shared_dataset_;
-      inline GDALDataset *open_dataset() const;
+    public:
+        gdal_datasource(mapnik::parameters const& params, bool bind=true);
+        virtual ~gdal_datasource ();
+        int type() const;
+        static std::string name();
+        mapnik::featureset_ptr features( mapnik::query const& q) const;
+        mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt) const;
+        mapnik::box2d<double> envelope() const;
+        mapnik::layer_descriptor get_descriptor() const;
+        void bind() const;
+    private:
+        mutable mapnik::box2d<double> extent_;
+        std::string dataset_name_;
+        mutable int band_;
+        mapnik::layer_descriptor desc_;
+        mutable unsigned width_;
+        mutable unsigned height_;
+        mutable double dx_;
+        mutable double dy_;
+        mutable int nbands_;
+        mutable bool shared_dataset_;
+        double filter_factor_;
+        inline GDALDataset *open_dataset() const;
 };
 
 
diff --git a/plugins/input/gdal/gdal_featureset.cpp b/plugins/input/gdal/gdal_featureset.cpp
index 7c9aaf3..648da2e 100644
--- a/plugins/input/gdal/gdal_featureset.cpp
+++ b/plugins/input/gdal/gdal_featureset.cpp
@@ -21,6 +21,9 @@
  *****************************************************************************/
 //$Id$
 
+// mapnik
+#include <mapnik/feature_factory.hpp>
+
 #include "gdal_featureset.hpp"
 #include <gdal_priv.h>
 
@@ -29,345 +32,456 @@
 
 using mapnik::query;
 using mapnik::coord2d;
-using mapnik::Envelope;
+using mapnik::box2d;
 using mapnik::Feature;
 using mapnik::feature_ptr;
 using mapnik::CoordTransform;
-using mapnik::point_impl;
-using mapnik::geometry2d;
+using mapnik::geometry_type;
+using mapnik::datasource_exception;
+using mapnik::feature_factory;
 
 
-gdal_featureset::gdal_featureset(GDALDataset & dataset, int band, gdal_query q)
-   : dataset_(dataset),
-     band_(band),
-     gquery_(q),
-     first_(true) {}
+gdal_featureset::gdal_featureset(GDALDataset & dataset, int band, gdal_query q, 
+      mapnik::box2d<double> extent, double width, double height, int nbands, 
+      double dx, double dy, double filter_factor)
+    : dataset_(dataset),
+      band_(band),
+      gquery_(q),
+      raster_extent_(extent),
+      raster_width_(width),
+      raster_height_(height),
+      dx_(dx),
+      dy_(dy),
+      nbands_(nbands),
+      filter_factor_(filter_factor),
+      first_(true)
+{
+}
 
 gdal_featureset::~gdal_featureset()
 {
 #ifdef MAPNIK_DEBUG
-   std::clog << "GDAL Plugin: closing dataset = " << &dataset_ << "\n";
+    std::clog << "GDAL Plugin: closing dataset = " << &dataset_ << std::endl;
 #endif
-   GDALClose(&dataset_);
+    GDALClose(&dataset_);
 }
 
 feature_ptr gdal_featureset::next()
 {
-   if (first_)
-   {
-      first_ = false;
+    if (first_)
+    {
+        first_ = false;
 #ifdef MAPNIK_DEBUG
-      std::clog << "GDAL Plugin: featureset, dataset = " << &dataset_ << "\n";
+        std::clog << "GDAL Plugin: featureset, dataset = " << &dataset_ << std::endl;
 #endif
 
-      query *q = boost::get<query>(&gquery_);
-      if(q) {
-          return get_feature(*q);
-      } else {
-          coord2d *p = boost::get<coord2d>(&gquery_);
-          if(p) {
-              return get_feature_at_point(*p);
-          }
-      }
-      // should never reach here
-   }
-   return feature_ptr();
+        query *q = boost::get<query>(&gquery_);
+        if(q) {
+            return get_feature(*q);
+        } else {
+            coord2d *p = boost::get<coord2d>(&gquery_);
+            if(p) {
+                return get_feature_at_point(*p);
+            }
+        }
+        // should never reach here
+    }
+    return feature_ptr();
 }
 
 feature_ptr gdal_featureset::get_feature(mapnik::query const& q)
 {
-   feature_ptr feature(new Feature(1));
-
-   GDALRasterBand * red = 0;
-   GDALRasterBand * green = 0;
-   GDALRasterBand * blue = 0;
-   GDALRasterBand * alpha = 0;
-   GDALRasterBand * grey = 0; 
+    feature_ptr feature(feature_factory::create(1));
 
-   int nbands = dataset_.GetRasterCount();
+    GDALRasterBand * red = 0;
+    GDALRasterBand * green = 0;
+    GDALRasterBand * blue = 0;
+    GDALRasterBand * alpha = 0;
+    GDALRasterBand * grey = 0; 
    
-   unsigned raster_width = dataset_.GetRasterXSize();
-   unsigned raster_height = dataset_.GetRasterYSize();
-   
-   // TODO - pull from class attributes...
-   double tr[6];
-   dataset_.GetGeoTransform(tr);
-   double dx = tr[1];
-   double dy = tr[5];
-   double x0 = tr[0]; // minx
-   double y0 = tr[3]; // miny
-   double x1 = tr[0] + raster_width * dx + raster_height * tr[2]; // maxx
-   double y1 = tr[3] + raster_width * tr[4] + raster_height * dy; // maxy
-   Envelope<double> raster_extent(x0,y0,x1,y1); 
-   
-   CoordTransform t(raster_width,raster_height,raster_extent,0,0);
-   Envelope<double> intersect = raster_extent.intersect(q.get_bbox());
-   Envelope<double> box = t.forward(intersect);
-
-   //size of resized output pixel in source image domain
-   double margin_x = 1.0/(fabs(dx)*q.resolution());
-   double margin_y = 1.0/(fabs(dy)*q.resolution());
-   if (margin_x < 1)
-      margin_x = 1.0;
-   if (margin_y < 1)
-      margin_y = 1.0;
-   //select minimum raster containing whole box
-   int x_off = rint(box.minx() - margin_x);
-   int y_off = rint(box.miny() - margin_y);
-   int end_x = rint(box.maxx() + margin_x);
-   int end_y = rint(box.maxy() + margin_y);
-   //clip to available data
-   if (x_off < 0)
-      x_off = 0;
-   if (y_off < 0)
-      y_off = 0;
-   if (end_x > (int)raster_width)
-      end_x = raster_width;
-   if (end_y > (int)raster_height)
-      end_y = raster_height;
-   int width = end_x - x_off;
-   int height = end_y - y_off;
-   // don't process almost invisible data
-   if (box.width() < 0.5)
-      width = 0;
-   if (box.height() < 0.5)
-      height = 0;
-   //calculate actual envelope of returned raster
-   Envelope<double> feature_raster_extent(x_off, y_off, x_off+width, y_off+height); 
-   intersect = t.backward(feature_raster_extent);
+    /*
+    double tr[6];
+    dataset_.GetGeoTransform(tr);
+    
+    double dx = tr[1];
+    double dy = tr[5];
+    std::clog << "dx_: " << dx_ << " dx: " << dx << " dy_: " << dy_ << "dy: " << dy << "\n";
+    */
+          
+    CoordTransform t(raster_width_,raster_height_,raster_extent_,0,0);
+    box2d<double> intersect = raster_extent_.intersect(q.get_bbox());
+    box2d<double> box = t.forward(intersect);
+
+    //size of resized output pixel in source image domain
+    double margin_x = 1.0/(fabs(dx_)*boost::get<0>(q.resolution()));
+    double margin_y = 1.0/(fabs(dy_)*boost::get<1>(q.resolution()));
+    if (margin_x < 1)
+        margin_x = 1.0;
+    if (margin_y < 1)
+        margin_y = 1.0;
+    //select minimum raster containing whole box
+    int x_off = rint(box.minx() - margin_x);
+    int y_off = rint(box.miny() - margin_y);
+    int end_x = rint(box.maxx() + margin_x);
+    int end_y = rint(box.maxy() + margin_y);
+    //clip to available data
+    if (x_off < 0)
+        x_off = 0;
+    if (y_off < 0)
+        y_off = 0;
+    if (end_x > (int)raster_width_)
+        end_x = raster_width_;
+    if (end_y > (int)raster_height_)
+        end_y = raster_height_;
+    int width = end_x - x_off;
+    int height = end_y - y_off;
+    // don't process almost invisible data
+    if (box.width() < 0.5)
+        width = 0;
+    if (box.height() < 0.5)
+        height = 0;
+    //calculate actual box2d of returned raster
+    box2d<double> feature_raster_extent(x_off, y_off, x_off+width, y_off+height); 
+    intersect = t.backward(feature_raster_extent);
     
 #ifdef MAPNIK_DEBUG         
-   std::clog << "GDAL Plugin: Raster extent=" << raster_extent << "\n";
-   std::clog << "GDAL Plugin: View extent=" << intersect << "\n";
-   std::clog << "GDAL Plugin: Query resolution=" << q.resolution() << "\n";
-   std::clog << boost::format("GDAL Plugin: StartX=%d StartY=%d Width=%d Height=%d \n") % x_off % y_off % width % height;
+    std::clog << "GDAL Plugin: Raster extent=" << raster_extent_ << std::endl;
+    std::clog << "GDAL Plugin: View extent=" << intersect << std::endl;
+    std::clog << "GDAL Plugin: Query resolution=" << boost::get<0>(q.resolution()) << "," << boost::get<1>(q.resolution()) << std::endl;
+    std::clog << boost::format("GDAL Plugin: StartX=%d StartY=%d Width=%d Height=%d") % x_off % y_off % width % height << std::endl;
 #endif
+   
+    if (width > 0 && height > 0)
+    {
+        double width_res = boost::get<0>(q.resolution());
+        double height_res = boost::get<1>(q.resolution());
+        int im_width = int(width_res * intersect.width() + 0.5);
+        int im_height = int(height_res * intersect.height() + 0.5);
+        
+        // if layer-level filter_factor is set, apply it
+        if (filter_factor_)
+        {
+            im_width *= filter_factor_;
+            im_height *= filter_factor_;
+#ifdef MAPNIK_DEBUG
+            std::clog << "GDAL Plugin: applying layer filter_factor: " << filter_factor_ << "\n";
+#endif
+        }
+        // otherwise respect symbolizer level factor applied to query, default of 1.0
+        else
+        {
+            double sym_downsample_factor = q.get_filter_factor();
+            im_width *= sym_downsample_factor;
+            im_height *= sym_downsample_factor;
+        }
+
+        // case where we need to avoid upsampling so that the
+        // image can be later scaled within raster_symbolizer 
+        if (im_width >= width || im_height >= height)
+        {
+            im_width = width;
+            im_height = height;
+        }
 
-   if (width > 0 && height > 0)
-   {
-      int im_width = int(q.resolution() * intersect.width() + 0.5);
-      int im_height = int(q.resolution() * intersect.height() + 0.5);
-
-      // case where we need to avoid upsampling so that the
-      // image can be later scaled within raster_symbolizer
-      if (im_width >= width || im_height >= height)
-      {
-          im_width = width;
-          im_height = height;
-      }
-
-      if (im_width > 0 && im_height > 0)
-      {
-          mapnik::ImageData32 image(im_width, im_height);
-          image.set(0xffffffff);
+        if (im_width > 0 && im_height > 0)
+        {
+            mapnik::image_data_32 image(im_width, im_height);
+            image.set(0xffffffff); 
              
-    #ifdef MAPNIK_DEBUG
-          std::clog << "GDAL Plugin: Image Size=(" << im_width << "," << im_height << ")\n";
-          std::clog << "GDAL Plugin: Reading band " << band_ << "\n";
-    #endif
-
-          if (band_>0) // we are querying a single band
-          {
-             float *imageData = (float*)image.getBytes();
-             GDALRasterBand * band = dataset_.GetRasterBand(band_);
-             band->RasterIO(GF_Read, x_off, y_off, width, height,
-                            imageData, image.width(), image.height(),
-                            GDT_Float32, 0, 0);
-
-             feature->set_raster(mapnik::raster_ptr(new mapnik::raster(intersect,image)));
-          }
+#ifdef MAPNIK_DEBUG
+            std::clog << "GDAL Plugin: Image Size=(" << im_width << "," << im_height << ")" << std::endl;
+            std::clog << "GDAL Plugin: Reading band " << band_ << std::endl;
+#endif
+            typedef std::vector<int,int> pallete;
+        
+            if (band_ > 0) // we are querying a single band
+            {
+                if (band_ > nbands_)
+                    throw datasource_exception((boost::format("GDAL Plugin: '%d' is an invalid band, dataset only has '%d' bands\n") % band_ % nbands_).str());
+
+                float *imageData = (float*)image.getBytes();
+                GDALRasterBand * band = dataset_.GetRasterBand(band_);
+                int hasNoData;
+                double nodata = band->GetNoDataValue(&hasNoData);
+                band->RasterIO(GF_Read, x_off, y_off, width, height,
+                               imageData, image.width(), image.height(),
+                               GDT_Float32, 0, 0);
+    
+                feature->set_raster(mapnik::raster_ptr(boost::make_shared<mapnik::raster>(intersect,image)));
+                if (hasNoData)
+                    feature->props()["NODATA"]=nodata;
+            }
           
-          else // working with all bands
-          {
-             for (int i = 0; i < nbands; ++i)
-             {
-                GDALRasterBand * band = dataset_.GetRasterBand(i+1);
+            else // working with all bands
+            {
+                for (int i = 0; i < nbands_; ++i)
+                {
+                    GDALRasterBand * band = dataset_.GetRasterBand(i+1);
              
-    #ifdef MAPNIK_DEBUG
-                get_overview_meta(band);  
-    #endif
+#ifdef MAPNIK_DEBUG
+                    get_overview_meta(band);  
+#endif
+    
+                    GDALColorInterp color_interp = band->GetColorInterpretation();
+                    switch (color_interp)
+                    {
+                    case GCI_RedBand:
+                        red = band;
+#ifdef MAPNIK_DEBUG
+                        std::clog << "GDAL Plugin: Found red band" << std::endl;
+#endif
+                        break;
+                    case GCI_GreenBand:
+                        green = band;
+#ifdef MAPNIK_DEBUG
+                        std::clog << "GDAL Plugin: Found green band" << std::endl;
+#endif
+                        break;
+                    case GCI_BlueBand:
+                        blue = band;
+#ifdef MAPNIK_DEBUG
+                        std::clog << "GDAL Plugin: Found blue band" << std::endl;
+#endif
+                        break;
+                    case GCI_AlphaBand:
+                        alpha = band;
+#ifdef MAPNIK_DEBUG
+                        std::clog << "GDAL Plugin: Found alpha band" << std::endl;
+#endif
+                        break;
+                    case GCI_GrayIndex:
+                        grey = band;
+#ifdef MAPNIK_DEBUG
+                        std::clog << "GDAL Plugin: Found gray band" << std::endl;
+#endif
+                        break;
+                    case GCI_PaletteIndex:
+                    {
+                        grey = band;
+#ifdef MAPNIK_DEBUG
+                        std::clog << "GDAL Plugin: Found gray band, and colortable..." << std::endl;
+#endif
+                        GDALColorTable *color_table = band->GetColorTable();
+                
+                        if ( color_table)
+                        {
+                            int count = color_table->GetColorEntryCount();
+#ifdef MAPNIK_DEBUG
+                            std::clog << "GDAL Plugin: Color Table count = " << count << std::endl;
+#endif 
+                            for (int j = 0; j < count; j++)
+                            {
+                                const GDALColorEntry *ce = color_table->GetColorEntry (j);
+                                if (! ce) continue;
+#ifdef MAPNIK_DEBUG
+                                std::clog << "GDAL Plugin: Color entry RGB (" << ce->c1 << "," <<ce->c2 << "," << ce->c3 << ")" << std::endl; 
+#endif
+                            }
+                        }
+                        break;
+                    }
+                    case GCI_Undefined:
+#ifdef MAPNIK_DEBUG
+                        std::clog << "GDAL Plugin: Found undefined band (assumming gray band)" << std::endl;
+#endif
+                        grey = band;
+                        break;
+                    default:
+#ifdef MAPNIK_DEBUG
+                        std::clog << "GDAL Plugin: band type unknown!" << std::endl;
+#endif
+                        break;
+                    }
+                }
+    
+                if (red && green && blue)
+                {
+#ifdef MAPNIK_DEBUG
+                    std::clog << "GDAL Plugin: processing rgb bands..." << std::endl;
+#endif
+                    int hasNoData;
+                    float nodata = red->GetNoDataValue(&hasNoData);
+                    GDALColorTable *color_table = red->GetColorTable();
+
+                    if (!alpha && hasNoData && !color_table)
+                    {
+                        // first read the data in and create an alpha channel from the nodata values
+                        float *imageData = (float*)image.getBytes();
+                        red->RasterIO(GF_Read, x_off, y_off, width, height,
+                                imageData, image.width(), image.height(),
+                                GDT_Float32, 0, 0);
+
+                        int len = image.width() * image.height();
+
+                        for (int i=0; i<len; ++i)
+                        {
+                            if (nodata == imageData[i])
+                                *reinterpret_cast<unsigned *> (&imageData[i]) = 0;
+                            else
+                                *reinterpret_cast<unsigned *> (&imageData[i]) = 0xFFFFFFFF;
+                        }
+
+                    }
+
+                    red->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 0,
+                                  image.width(),image.height(),GDT_Byte,4,4*image.width());
+                    green->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 1,
+                                    image.width(),image.height(),GDT_Byte,4,4*image.width());
+                    blue->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 2,
+                                   image.width(),image.height(),GDT_Byte,4,4*image.width());
 
-                GDALColorInterp color_interp = band->GetColorInterpretation();
-                switch (color_interp)
+                }
+                else if (grey)
                 {
-                   case GCI_RedBand:
-                      red = band;
-    #ifdef MAPNIK_DEBUG
-                      std::clog << "GDAL Plugin: Found red band" << "\n";
-    #endif
-                      break;
-                   case GCI_GreenBand:
-                      green = band;
-    #ifdef MAPNIK_DEBUG
-                      std::clog << "GDAL Plugin: Found green band" << "\n";
-    #endif
-                      break;
-                   case GCI_BlueBand:
-                      blue = band;
-    #ifdef MAPNIK_DEBUG
-                      std::clog << "GDAL Plugin: Found blue band" << "\n";
-    #endif
-                      break;
-                   case GCI_AlphaBand:
-                      alpha = band;
-    #ifdef MAPNIK_DEBUG
-                      std::clog << "GDAL Plugin: Found alpha band" << "\n";
-    #endif
-                      break;
-                   case GCI_GrayIndex:
-                      grey = band;
-    #ifdef MAPNIK_DEBUG
-                      std::clog << "GDAL Plugin: Found gray band" << "\n";
-    #endif
-                      break;
-                   case GCI_PaletteIndex:
-                   {
-                      grey = band;
-    #ifdef MAPNIK_DEBUG
-                      std::clog << "GDAL Plugin: Found gray band, and colortable..." << "\n";
-    #endif
-                      GDALColorTable *color_table = band->GetColorTable();
-                
-                      if ( color_table)
-                      {
-                         int count = color_table->GetColorEntryCount();
-    #ifdef MAPNIK_DEBUG
-                         std::clog << "GDAL Plugin: Color Table count = " << count << "\n";
-    #endif 
-                         for ( int i = 0; i < count; i++ )
-                         {
-                            const GDALColorEntry *ce = color_table->GetColorEntry ( i );
-                            if (!ce ) continue;
-    #ifdef MAPNIK_DEBUG
-                            std::clog << "GDAL Plugin: Color entry RGB (" << ce->c1 << "," <<ce->c2 << "," << ce->c3 << ")\n"; 
-    #endif
-                         }
-                      }
-                      break;
-                   }
-                   case GCI_Undefined:
-    #ifdef MAPNIK_DEBUG
-                      std::clog << "GDAL Plugin: Found undefined band (assumming gray band)" << "\n";
-    #endif
-                      grey = band;
-                      break;
-                   default:
-    #ifdef MAPNIK_DEBUG
-                      std::clog << "GDAL Plugin: band type unknown!" << "\n";
-    #endif
-                      break;
+#ifdef MAPNIK_DEBUG
+                    std::clog << "GDAL Plugin: processing gray band..." << std::endl;
+#endif
+                    int hasNoData;
+                    float nodata = grey->GetNoDataValue(&hasNoData);
+                    GDALColorTable *color_table = grey->GetColorTable();
+
+                    if (hasNoData && !color_table)
+                    {
+#ifdef MAPNIK_DEBUG
+                        std::clog << "\tno data value for layer: " << nodata << std::endl;
+#endif
+                        // first read the data in and create an alpha channel from the nodata values
+                        float *imageData = (float*)image.getBytes();
+                        grey->RasterIO(GF_Read, x_off, y_off, width, height,
+                                imageData, image.width(), image.height(),
+                                GDT_Float32, 0, 0);
+
+                        int len = image.width() * image.height();
+
+                        for (int i=0; i<len; ++i)
+                        {
+                            if (nodata == imageData[i])
+                                *reinterpret_cast<unsigned *> (&imageData[i]) = 0;
+                            else
+                                *reinterpret_cast<unsigned *> (&imageData[i]) = 0xFFFFFFFF;
+                        }
+                    }
+
+                    grey->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 0,
+                                   image.width(),image.height(),GDT_Byte, 4, 4 * image.width());
+                    grey->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 1,
+                                   image.width(),image.height(),GDT_Byte, 4, 4 * image.width());
+                    grey->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 2,
+                                   image.width(),image.height(),GDT_Byte, 4, 4 * image.width());
+
+                    if (color_table)
+                    {
+#ifdef MAPNIK_DEBUG
+                        std::clog << "GDAL Plugin: Loading colour table..." << std::endl;
+#endif
+                        for (unsigned y = 0; y < image.height(); ++y)
+                        {
+                            unsigned int* row = image.getRow(y);
+                            for (unsigned x = 0; x < image.width(); ++x)
+                            {
+                                unsigned value = row[x] & 0xff;
+                                const GDALColorEntry *ce = color_table->GetColorEntry ( value );
+                                if (ce ){
+                                    // TODO - big endian support
+                                    row[x] = (ce->c4 << 24)| (ce->c3 << 16) |  (ce->c2 << 8) | (ce->c1) ;
+                                }
+                            }
+                        }
+                    }
+                }
+    
+                if (alpha)
+                {
+#ifdef MAPNIK_DEBUG
+                    std::clog << "GDAL Plugin: processing alpha band..." << std::endl;
+#endif
+                    alpha->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 3,
+                                    image.width(),image.height(),GDT_Byte,4,4*image.width());
                 }
-             }
-
-              if (red && green && blue)
-             {
-    #ifdef MAPNIK_DEBUG
-                std::clog << "GDAL Plugin: processing rgb bands..." << "\n";
-    #endif
-                red->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 0,
-                    image.width(),image.height(),GDT_Byte,4,4*image.width());
-                green->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 1,
-                    image.width(),image.height(),GDT_Byte,4,4*image.width());
-                blue->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 2,
-                    image.width(),image.height(),GDT_Byte,4,4*image.width());
-             }
-             else if (grey)
-             {
-    #ifdef MAPNIK_DEBUG
-                std::clog << "GDAL Plugin: processing gray band..." << "\n";
-    #endif
-                grey->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 0,
-                    image.width(),image.height(),GDT_Byte, 4, 4 * image.width());
-                grey->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 1,
-                    image.width(),image.height(),GDT_Byte, 4, 4 * image.width());
-                grey->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 2,
-                    image.width(),image.height(),GDT_Byte, 4, 4 * image.width());
-             }
-
-             if (alpha)
-             {
-    #ifdef MAPNIK_DEBUG
-                std::clog << "GDAL Plugin: processing alpha band..." << "\n";
-    #endif
-                alpha->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 3,
-                    image.width(),image.height(),GDT_Byte,4,4*image.width());
-             }
-
-             feature->set_raster(mapnik::raster_ptr(new mapnik::raster(intersect,image)));
-          }
-          return feature;
-      }
-   }
-   return feature_ptr();
+    
+                feature->set_raster(mapnik::raster_ptr(new mapnik::raster(intersect,image)));
+            }
+            return feature;
+        }
+    }
+    return feature_ptr();
 }
 
 
 feature_ptr gdal_featureset::get_feature_at_point(mapnik::coord2d const& pt)
 {
-   if (band_>0) {
-
-      unsigned raster_xsize = dataset_.GetRasterXSize();
-      unsigned raster_ysize = dataset_.GetRasterYSize();
+    if (band_ > 0)
+    {
+        unsigned raster_xsize = dataset_.GetRasterXSize();
+        unsigned raster_ysize = dataset_.GetRasterYSize();
 
-      double gt[6];
-      dataset_.GetGeoTransform(gt);
+        double gt[6];
+        dataset_.GetGeoTransform(gt);
 
-      double det = gt[1]*gt[5] - gt[2]*gt[4];
-      // subtract half a pixel width & height because gdal coord reference
-      // is the top-left corner of a pixel, not the center.
-      double X = pt.x - gt[0] - gt[1]/2;
-      double Y = pt.y - gt[3] - gt[5]/2;
-      double det1 = gt[1]*Y + gt[4]*X;
-      double det2 = gt[2]*Y + gt[5]*X;
-      unsigned x = det2/det, y = det1/det;
+        double det = gt[1]*gt[5] - gt[2]*gt[4];
+        // subtract half a pixel width & height because gdal coord reference
+        // is the top-left corner of a pixel, not the center.
+        double X = pt.x - gt[0] - gt[1]/2;
+        double Y = pt.y - gt[3] - gt[5]/2;
+        double det1 = gt[1]*Y + gt[4]*X;
+        double det2 = gt[2]*Y + gt[5]*X;
+        unsigned x = det2/det, y = det1/det;
 
-      if(0<=x && x<raster_xsize && 0<=y && y<raster_ysize) {
-#ifdef MAPNIK_DEBUG         
-         std::clog << boost::format("GDAL Plugin: pt.x=%f pt.y=%f\n") % pt.x % pt.y;
-         std::clog << boost::format("GDAL Plugin: x=%f y=%f\n") % x % y;
+        if (x < raster_xsize && y < raster_ysize)
+        {
+#ifdef MAPNIK_DEBUG
+            std::clog << boost::format("GDAL Plugin: pt.x=%f pt.y=%f") % pt.x % pt.y << std::endl;
+            std::clog << boost::format("GDAL Plugin: x=%f y=%f") % x % y << std::endl;
 #endif
-         GDALRasterBand * band = dataset_.GetRasterBand(band_);
-         int hasNoData;
-         double nodata = band->GetNoDataValue(&hasNoData);
-         double value;
-         band->RasterIO(GF_Read, x, y, 1, 1, &value, 1, 1, GDT_Float64, 0, 0);
-         if(!hasNoData || value!=nodata) {
-            // construct feature
-            feature_ptr feature(new Feature(1));
-            geometry2d * point = new point_impl;
-            point->move_to(pt.x, pt.y);
-            feature->add_geometry(point);
-            (*feature)["value"] = value;
-            return feature;
-         }
-      }
-   }
-   return feature_ptr();
+            GDALRasterBand * band = dataset_.GetRasterBand(band_);
+            int hasNoData;
+            double nodata = band->GetNoDataValue(&hasNoData);
+            double value;
+            band->RasterIO(GF_Read, x, y, 1, 1, &value, 1, 1, GDT_Float64, 0, 0);
+
+            if (! hasNoData || value != nodata)
+            {
+                // construct feature
+                feature_ptr feature(new Feature(1));
+                geometry_type * point = new geometry_type(mapnik::Point);
+                point->move_to(pt.x, pt.y);
+                feature->add_geometry(point);
+                (*feature)["value"] = value;
+                return feature;
+            }
+        }
+    }
+    return feature_ptr();
 }
 
+#ifdef MAPNIK_DEBUG
 void gdal_featureset::get_overview_meta(GDALRasterBand * band)
 {
     int band_overviews = band->GetOverviewCount();    
     if (band_overviews > 0)
     {
-        std::clog << "GDAL Plugin: "<< band_overviews << " overviews found!" << "\n";
+        std::clog << "GDAL Plugin: "<< band_overviews << " overviews found!" << std::endl;
+
         for (int b = 0; b < band_overviews; b++)
         {
             GDALRasterBand * overview = band->GetOverview (b);
-            std::clog << boost::format("GDAL Plugin: Overview=%d Width=%d Height=%d \n")
-                                   % b % overview->GetXSize() % overview->GetYSize();
+            std::clog << boost::format("GDAL Plugin: Overview=%d Width=%d Height=%d")
+                % b % overview->GetXSize() % overview->GetYSize() << std::endl;
         }
     }
     else
     {
-        std::clog << "GDAL Plugin: No overviews found!" << "\n";
+        std::clog << "GDAL Plugin: No overviews found!" << std::endl; 
     }
     
     int bsx,bsy;
     double scale;
     band->GetBlockSize(&bsx,&bsy);
     scale = band->GetScale();
-    std::clog << boost::format("GDAL Plugin: Block=%dx%d Scale=%f Type=%s Color=%s \n") % bsx % bsy % scale
-       % GDALGetDataTypeName(band->GetRasterDataType())
-       % GDALGetColorInterpretationName(band->GetColorInterpretation()); 
+
+    std::clog << boost::format("GDAL Plugin: Block=%dx%d Scale=%f Type=%s Color=%s") % bsx % bsy % scale
+        % GDALGetDataTypeName(band->GetRasterDataType())
+        % GDALGetColorInterpretationName(band->GetColorInterpretation()) << std::endl; 
 }
+#endif
+
diff --git a/plugins/input/gdal/gdal_featureset.hpp b/plugins/input/gdal/gdal_featureset.hpp
index ce0bfba..9926177 100644
--- a/plugins/input/gdal/gdal_featureset.hpp
+++ b/plugins/input/gdal/gdal_featureset.hpp
@@ -24,7 +24,10 @@
 #ifndef GDAL_FEATURESET_HPP
 #define GDAL_FEATURESET_HPP
 
+// mapnik
 #include <mapnik/datasource.hpp>
+
+// boost
 #include <boost/variant.hpp>
 
 class GDALDataset;
@@ -34,19 +37,29 @@ typedef boost::variant<mapnik::query,mapnik::coord2d> gdal_query;
 
 class gdal_featureset : public mapnik::Featureset
 {
-   public:
-      
-      gdal_featureset(GDALDataset & dataset, int band, gdal_query q);
-      virtual ~gdal_featureset();
-      mapnik::feature_ptr next();
-   private:
-      mapnik::feature_ptr get_feature(mapnik::query const& q);
-      mapnik::feature_ptr get_feature_at_point(mapnik::coord2d const& p);
-      void get_overview_meta(GDALRasterBand * band);
-      GDALDataset & dataset_;
-      int band_;
-      gdal_query gquery_;
-      bool first_;
+    public:
+        gdal_featureset(GDALDataset & dataset, int band, gdal_query q, 
+        mapnik::box2d<double> extent, double width, double height, int nbands, 
+        double dx, double dy, double filter_factor);
+        virtual ~gdal_featureset();
+        mapnik::feature_ptr next();
+    private:
+        mapnik::feature_ptr get_feature(mapnik::query const& q);
+        mapnik::feature_ptr get_feature_at_point(mapnik::coord2d const& p);
+#ifdef MAPNIK_DEBUG
+        void get_overview_meta(GDALRasterBand * band);
+#endif
+        GDALDataset & dataset_;
+        int band_;
+        gdal_query gquery_;
+        mapnik::box2d<double> raster_extent_;
+        unsigned raster_width_;
+        unsigned raster_height_;
+        double dx_;
+        double dy_;
+        int nbands_;
+        double filter_factor_;
+        bool first_;
 };
 
 #endif // GDAL_FEATURESET_HPP
diff --git a/plugins/input/geos/build.py b/plugins/input/geos/build.py
new file mode 100644
index 0000000..490b5b6
--- /dev/null
+++ b/plugins/input/geos/build.py
@@ -0,0 +1,51 @@
+#
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+
+Import ('env')
+
+prefix = env['PREFIX']
+
+plugin_env = env.Clone()
+
+geos_src = Split(
+  """
+      geos_datasource.cpp
+      geos_featureset.cpp      
+  """
+        )
+
+libraries = [env['PLUGINS']['geos']['lib']]
+
+# Link Library to Dependencies
+libraries.append('mapnik2')
+libraries.append(env['ICU_LIB_NAME'])
+libraries.append('boost_system%s' % env['BOOST_APPEND'])
+libraries.append('boost_filesystem%s' % env['BOOST_APPEND'])
+
+input_plugin = plugin_env.SharedLibrary('../geos', source=geos_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS'])
+
+# if the plugin links to libmapnik2 ensure it is built first
+Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME']))
+
+if 'uninstall' not in COMMAND_LINE_TARGETS:
+    env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin)
+    env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST'])
diff --git a/plugins/input/geos/geos_datasource.cpp b/plugins/input/geos/geos_datasource.cpp
new file mode 100644
index 0000000..5270ab1
--- /dev/null
+++ b/plugins/input/geos/geos_datasource.cpp
@@ -0,0 +1,299 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+// $Id$
+
+#include <iostream>
+#include <fstream>
+#include <stdexcept>
+#include <cstdarg>
+
+#include "geos_datasource.hpp"
+#include "geos_featureset.hpp"
+
+// mapnik
+#include <mapnik/ptree_helpers.hpp>
+#include <mapnik/geom_util.hpp>
+
+// boost
+#include <boost/algorithm/string.hpp>
+#include <boost/limits.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/tokenizer.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <boost/make_shared.hpp>
+
+// geos
+#include <geos_c.h>
+
+using std::clog;
+using std::endl;
+
+using boost::lexical_cast;
+using boost::bad_lexical_cast;
+
+using mapnik::datasource;
+using mapnik::parameters;
+
+DATASOURCE_PLUGIN(geos_datasource)
+
+using mapnik::box2d;
+using mapnik::coord2d;
+using mapnik::query;
+using mapnik::featureset_ptr;
+using mapnik::layer_descriptor;
+using mapnik::attribute_descriptor;
+using mapnik::datasource_exception;
+using mapnik::filter_in_box;
+using mapnik::filter_at_point;
+
+
+void geos_notice(const char* fmt, ...)
+{
+    va_list ap;
+    fprintf( stdout, "GEOS Plugin: (GEOS NOTICE) ");
+    
+    va_start (ap, fmt);
+    vfprintf( stdout, fmt, ap);
+    va_end(ap);
+    fprintf( stdout, "\n" );
+}
+
+void geos_error(const char* fmt, ...)
+{
+    va_list ap;
+    fprintf( stdout, "GEOS Plugin: (GEOS ERROR) ");
+
+    va_start (ap, fmt);
+    vfprintf( stdout, fmt, ap);
+    va_end(ap);
+    fprintf( stdout, "\n" );
+}
+
+
+geos_datasource::geos_datasource(parameters const& params, bool bind)
+   : datasource(params),
+     extent_(),
+     extent_initialized_(false),
+     type_(datasource::Vector),
+     desc_(*params.get<std::string>("type"), *params.get<std::string>("encoding","utf-8")),
+     geometry_data_(""),
+     geometry_data_name_("name"),
+     geometry_id_(1)
+{
+    boost::optional<std::string> geometry = params.get<std::string>("wkt");
+    if (!geometry) throw datasource_exception("missing <wkt> parameter");
+    geometry_string_ = *geometry;
+
+    multiple_geometries_ = *params_.get<mapnik::boolean>("multiple_geometries",false);
+
+    boost::optional<std::string> ext = params_.get<std::string>("extent");
+    if (ext) extent_initialized_ = extent_.from_string(*ext);
+
+    boost::optional<int> id = params_.get<int>("gid");
+    if (id) geometry_id_ = *id;
+
+    boost::optional<std::string> gdata = params_.get<std::string>("field_data");
+    if (gdata) geometry_data_ = *gdata;
+
+    boost::optional<std::string> gdata_name = params_.get<std::string>("field_name");
+    if (gdata_name) geometry_data_name_ = *gdata_name;
+
+    desc_.add_descriptor(attribute_descriptor(geometry_data_name_, mapnik::String));
+
+    if (bind)
+    {
+        this->bind();
+    }
+}
+
+geos_datasource::~geos_datasource()
+{
+    if (is_bound_) 
+    {
+        geometry_.set_feature(0);
+
+        finishGEOS();
+    }
+}
+
+void geos_datasource::bind() const
+{
+    if (is_bound_) return;   
+
+    // open geos driver
+    initGEOS(geos_notice, geos_error);
+
+    // parse the string into geometry
+    geometry_.set_feature(GEOSGeomFromWKT(geometry_string_.c_str()));
+    if (*geometry_ == NULL || ! GEOSisValid(*geometry_))
+    {
+        throw datasource_exception("GEOS Plugin: invalid <wkt> geometry specified");
+    }
+
+    // try to obtain the extent from the geometry itself
+    if (! extent_initialized_)
+    {
+#ifdef MAPNIK_DEBUG
+        clog << "GEOS Plugin: initializing extent from geometry" << endl;
+#endif
+
+        if (GEOSGeomTypeId(*geometry_) == GEOS_POINT)
+        {
+            double x, y;
+            unsigned int size;
+
+            const GEOSCoordSequence* cs = GEOSGeom_getCoordSeq(*geometry_);
+
+            GEOSCoordSeq_getSize(cs, &size);
+            GEOSCoordSeq_getX(cs, 0, &x);
+            GEOSCoordSeq_getY(cs, 0, &y);
+        
+            extent_.init(x,y,x,y);
+            extent_initialized_ = true;
+        }
+        else
+        {
+            geos_feature_ptr envelope (GEOSEnvelope(*geometry_));
+            if (*envelope != NULL && GEOSisValid(*envelope))
+            {
+#ifdef MAPNIK_DEBUG
+                char* wkt = GEOSGeomToWKT(*envelope);
+                clog << "GEOS Plugin: getting coord sequence from: " << wkt << endl;
+                GEOSFree(wkt);
+#endif
+
+                const GEOSGeometry* exterior = GEOSGetExteriorRing(*envelope);
+                if (exterior != NULL && GEOSisValid(exterior))
+                {
+                    const GEOSCoordSequence* cs = GEOSGeom_getCoordSeq(exterior);
+                    if (cs != NULL)
+                    {
+#ifdef MAPNIK_DEBUG
+                        clog << "GEOS Plugin: iterating boundary points" << endl;
+#endif
+
+                        double x, y;
+                        double minx = std::numeric_limits<float>::max(),
+                               miny = std::numeric_limits<float>::max(),
+                               maxx = -std::numeric_limits<float>::max(),
+                               maxy = -std::numeric_limits<float>::max();
+                        unsigned int num_points;
+
+                        GEOSCoordSeq_getSize(cs, &num_points);
+
+                        for (unsigned int i = 0; i < num_points; ++i)
+                        {
+                            GEOSCoordSeq_getX(cs, i, &x);
+                            GEOSCoordSeq_getY(cs, i, &y);
+                            
+                            if (x < minx) minx = x;
+                            if (x > maxx) maxx = x;
+                            if (y < miny) miny = y;
+                            if (y > maxy) maxy = y;
+                        }
+
+                        extent_.init(minx,miny,maxx,maxy);
+                        extent_initialized_ = true;
+                    }
+                }
+            }
+        }
+    }
+
+    if (! extent_initialized_)
+        throw datasource_exception("GEOS Plugin: cannot determine extent for <wkt> geometry");
+   
+    is_bound_ = true;
+}
+
+std::string geos_datasource::name()
+{
+    return "geos";
+}
+
+int geos_datasource::type() const
+{
+    return type_;
+}
+
+box2d<double> geos_datasource::envelope() const
+{
+    if (!is_bound_) bind();
+    
+    return extent_;
+}
+
+layer_descriptor geos_datasource::get_descriptor() const
+{
+    if (!is_bound_) bind();
+    
+    return desc_;
+}
+
+featureset_ptr geos_datasource::features(query const& q) const
+{
+    if (!is_bound_) bind();
+
+    const mapnik::box2d<double> extent = q.get_bbox();
+
+    std::ostringstream s;
+    s << "POLYGON(("
+      << extent.minx() << " " << extent.miny() << ","
+      << extent.maxx() << " " << extent.miny() << ","
+      << extent.maxx() << " " << extent.maxy() << ","
+      << extent.minx() << " " << extent.maxy() << ","
+      << extent.minx() << " " << extent.miny()
+      << "))";
+
+#ifdef MAPNIK_DEBUG
+    clog << "GEOS Plugin: using extent: " << s.str() << endl;
+#endif
+
+    return boost::make_shared<geos_featureset>(*geometry_,
+                                               GEOSGeomFromWKT(s.str().c_str()),
+                                               geometry_id_,
+                                               geometry_data_,
+                                               geometry_data_name_,
+                                               desc_.get_encoding(),
+                                               multiple_geometries_);
+}
+
+featureset_ptr geos_datasource::features_at_point(coord2d const& pt) const
+{
+    if (!is_bound_) bind();
+
+    std::ostringstream s;
+    s << "POINT(" << pt.x << " " << pt.y << ")";
+
+#ifdef MAPNIK_DEBUG
+    clog << "GEOS Plugin: using point: " << s.str() << endl;
+#endif
+
+    return boost::make_shared<geos_featureset>(*geometry_,
+                                               GEOSGeomFromWKT(s.str().c_str()),
+                                               geometry_id_,
+                                               geometry_data_,
+                                               geometry_data_name_,
+                                               desc_.get_encoding(),
+                                               multiple_geometries_);
+}
+
diff --git a/plugins/input/geos/geos_datasource.hpp b/plugins/input/geos/geos_datasource.hpp
new file mode 100644
index 0000000..b675b89
--- /dev/null
+++ b/plugins/input/geos/geos_datasource.hpp
@@ -0,0 +1,63 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#ifndef GEOS_DATASOURCE_HPP
+#define GEOS_DATASOURCE_HPP
+
+// mapnik
+#include <mapnik/datasource.hpp>
+#include <mapnik/feature.hpp>
+#include <mapnik/feature_layer_desc.hpp>
+
+// boost
+#include <boost/shared_ptr.hpp>
+
+#include "geos_feature_ptr.hpp"
+
+class geos_datasource : public mapnik::datasource 
+{
+    public:
+        geos_datasource(mapnik::parameters const& params, bool bind=true);
+        virtual ~geos_datasource ();
+        int type() const;
+        static std::string name();
+        mapnik::featureset_ptr features(mapnik::query const& q) const;
+        mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt) const;
+        mapnik::box2d<double> envelope() const;
+        mapnik::layer_descriptor get_descriptor() const;
+        void bind() const;
+    private:
+        mutable mapnik::box2d<double> extent_;
+        mutable bool extent_initialized_;
+        int type_;
+        mutable mapnik::layer_descriptor desc_;
+        mutable geos_feature_ptr geometry_;
+        mutable std::string geometry_data_;
+        mutable std::string geometry_data_name_;
+        mutable int geometry_id_;
+        std::string geometry_string_;
+        bool multiple_geometries_;
+};
+
+
+#endif // GEOS_DATASOURCE_HPP
diff --git a/plugins/input/geos/geos_feature_ptr.hpp b/plugins/input/geos/geos_feature_ptr.hpp
new file mode 100644
index 0000000..377436f
--- /dev/null
+++ b/plugins/input/geos/geos_feature_ptr.hpp
@@ -0,0 +1,105 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#ifndef GEOS_FEATURE_PTR_HPP
+#define GEOS_FEATURE_PTR_HPP
+
+// geos
+#include <geos_c.h>
+
+class geos_feature_ptr
+{
+public:
+    geos_feature_ptr ()
+        : feat_ (NULL)
+    {
+    }
+
+    explicit geos_feature_ptr (GEOSGeometry* const feat)
+        : feat_ (feat)
+    {
+    }
+    
+    ~geos_feature_ptr ()
+    {
+        if (feat_ != NULL)
+            GEOSGeom_destroy(feat_);
+    }
+
+    void set_feature (GEOSGeometry* const feat)
+    {
+        if (feat_ != NULL)
+            GEOSGeom_destroy(feat_);
+            
+        feat_ = feat;
+    }
+
+    GEOSGeometry* operator*()
+    {
+        return feat_;
+    }
+
+private:
+    GEOSGeometry* feat_;
+};
+
+
+class geos_wkb_ptr
+{
+public:
+    geos_wkb_ptr (GEOSGeometry* const geometry)
+        : data_ (NULL),
+          size_ (0)
+    {
+        data_ = GEOSGeomToWKB_buf(geometry, &size_);
+    }
+
+    ~geos_wkb_ptr ()
+    {
+        if (data_ != NULL)
+            GEOSFree(data_);
+    }
+
+    bool is_valid() const
+    {
+        return (data_ != NULL) && (size_ > 0);
+    }
+
+    unsigned int size() const
+    {
+        return (unsigned int) size_;
+    }
+
+    const char* data()
+    {
+        return reinterpret_cast<const char*>(data_);
+    }
+
+private:
+    unsigned char* data_;
+    size_t size_;
+};
+
+
+#endif // GEOS_FEATURE_PTR_HPP
+
diff --git a/plugins/input/geos/geos_featureset.cpp b/plugins/input/geos/geos_featureset.cpp
new file mode 100644
index 0000000..4d961bc
--- /dev/null
+++ b/plugins/input/geos/geos_featureset.cpp
@@ -0,0 +1,141 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#include <iostream>
+#include <fstream>
+
+// mapnik
+#include <mapnik/global.hpp>
+#include <mapnik/datasource.hpp>
+#include <mapnik/box2d.hpp>
+#include <mapnik/geometry.hpp>
+#include <mapnik/feature.hpp>
+#include <mapnik/feature_layer_desc.hpp>
+#include <mapnik/wkb.hpp>
+#include <mapnik/unicode.hpp>
+#include <mapnik/feature_factory.hpp>
+
+// ogr
+#include "geos_featureset.hpp"
+
+using std::clog;
+using std::endl;
+
+using mapnik::query;
+using mapnik::box2d;
+using mapnik::coord2d;
+using mapnik::CoordTransform;
+using mapnik::Feature;
+using mapnik::feature_ptr;
+using mapnik::geometry_utils;
+using mapnik::transcoder;
+using mapnik::feature_factory;
+
+
+geos_featureset::geos_featureset(GEOSGeometry* geometry,
+                                 GEOSGeometry* extent,
+                                 int identifier,
+                                 const std::string& field,
+                                 const std::string& field_name,
+                                 const std::string& encoding,
+                                 bool multiple_geometries)
+   : geometry_(geometry),
+     tr_(new transcoder(encoding)),
+     extent_(extent),
+     identifier_(identifier),
+     field_(field),
+     field_name_(field_name),
+     multiple_geometries_(multiple_geometries),
+     already_rendered_(false)
+{
+}
+
+geos_featureset::~geos_featureset() 
+{
+}
+
+feature_ptr geos_featureset::next()
+{
+    if (! already_rendered_)
+    {
+        already_rendered_ = true;
+        
+        if (GEOSisValid(geometry_) && ! GEOSisEmpty(geometry_))
+        {
+            bool render_geometry = true;
+            
+            if (*extent_ != NULL && GEOSisValid(*extent_) && !GEOSisEmpty(*extent_))
+            {
+                const int type = GEOSGeomTypeId(*extent_);
+                render_geometry = false;
+
+                switch ( type )
+                {
+                case GEOS_POINT:
+                    if (GEOSIntersects(*extent_, geometry_))
+                    {
+                        render_geometry = true;
+                    }
+                    break;
+                case GEOS_POLYGON:
+                    if (GEOSContains(*extent_, geometry_)
+                        || GEOSWithin(geometry_, *extent_)
+                        || GEOSEquals(geometry_, *extent_))
+                    {
+                        render_geometry = true;
+                    }
+                    break;
+               default:
+#ifdef MAPNIK_DEBUG
+                    clog << "GEOS Plugin: unknown extent geometry_type=" << type << endl;
+#endif
+                    break;
+               }
+            }
+
+            if (render_geometry)
+            {
+                geos_wkb_ptr wkb(geometry_);
+                if (wkb.is_valid())
+                {
+                    feature_ptr feature(feature_factory::create(identifier_));
+
+                    geometry_utils::from_wkb(feature->paths(),
+                                             wkb.data(),
+                                             wkb.size(),
+                                             multiple_geometries_);
+
+                    if (field_ != "")
+                    {
+                        boost::put(*feature, field_name_, tr_->transcode(field_.c_str()));
+                    }
+                    
+                    return feature;
+                }
+            }
+        }
+    }
+
+    return feature_ptr();
+}
+
diff --git a/plugins/input/geos/geos_featureset.hpp b/plugins/input/geos/geos_featureset.hpp
new file mode 100644
index 0000000..3b284a9
--- /dev/null
+++ b/plugins/input/geos/geos_featureset.hpp
@@ -0,0 +1,67 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#ifndef GEOS_FEATURESET_HPP
+#define GEOS_FEATURESET_HPP
+
+// mapnik
+#include <mapnik/datasource.hpp>
+#include <mapnik/unicode.hpp> 
+#include <mapnik/geom_util.hpp>
+
+// boost
+#include <boost/scoped_ptr.hpp>
+
+// geos
+#include <geos_c.h>
+
+#include "geos_feature_ptr.hpp"
+  
+class geos_featureset : public mapnik::Featureset
+{
+public:
+      geos_featureset(GEOSGeometry* geometry,
+                      GEOSGeometry* extent,
+                      int identifier,
+                      const std::string& field,
+                      const std::string& field_name,
+                      const std::string& encoding,
+                      bool multiple_geometries);
+      virtual ~geos_featureset();
+      mapnik::feature_ptr next();
+
+private:
+      GEOSGeometry* geometry_;
+      boost::scoped_ptr<mapnik::transcoder> tr_;
+      geos_feature_ptr extent_;
+      int identifier_;
+      std::string field_;
+      std::string field_name_;
+      bool multiple_geometries_;
+      bool already_rendered_;
+
+      geos_featureset(const geos_featureset&);
+      const geos_featureset& operator=(const geos_featureset&);
+};
+
+#endif // GEOS_FEATURESET_HPP
diff --git a/plugins/input/kismet/SConscript b/plugins/input/kismet/SConscript
deleted file mode 100644
index 5490232..0000000
--- a/plugins/input/kismet/SConscript
+++ /dev/null
@@ -1,43 +0,0 @@
-#
-# This file is part of Mapnik (c++ mapping toolkit)
-#
-# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-# $Id$
-
-Import ('env')
-
-prefix = env['PREFIX']
-install_prefix = env['DESTDIR'] + '/' + prefix
-
-kismet_src = Split(
-	"""
-	kismet_datasource.cpp
-	kismet_featureset.cpp      
-	"""
-        )
-
-libraries = []
-if env['PLATFORM'] == 'Darwin':
-    libraries.append('mapnik')
-    libraries.append(env['ICU_LIB_NAME'])
-    libraries.append('boost_thread%s' % env['BOOST_APPEND'])
-
-kismet_inputdriver = env.SharedLibrary('kismet', source=kismet_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries)
-
-env.Install(install_prefix + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME'] + '/input', kismet_inputdriver)
-env.Alias('install', install_prefix + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME'] + '/input')
diff --git a/plugins/input/kismet/build.py b/plugins/input/kismet/build.py
new file mode 100644
index 0000000..7a91069
--- /dev/null
+++ b/plugins/input/kismet/build.py
@@ -0,0 +1,48 @@
+#
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+Import ('env')
+
+prefix = env['PREFIX']
+
+plugin_env = env.Clone()
+
+kismet_src = Split(
+  """
+  kismet_datasource.cpp
+  kismet_featureset.cpp      
+  """
+        )
+
+libraries = []
+# Link Library to Dependencies
+libraries.append('mapnik2')
+libraries.append(env['ICU_LIB_NAME'])
+libraries.append('boost_thread%s' % env['BOOST_APPEND'])
+
+input_plugin = plugin_env.SharedLibrary('../kismet', source=kismet_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS'])
+
+# if the plugin links to libmapnik2 ensure it is built first
+Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME']))
+
+if 'uninstall' not in COMMAND_LINE_TARGETS:
+    env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin)
+    env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST'])
diff --git a/plugins/input/kismet/kismet_datasource.cpp b/plugins/input/kismet/kismet_datasource.cpp
index 9c9262c..02a18d0 100644
--- a/plugins/input/kismet/kismet_datasource.cpp
+++ b/plugins/input/kismet/kismet_datasource.cpp
@@ -21,9 +21,6 @@
  *****************************************************************************/
 // $Id$
 
-#include "kismet_datasource.hpp"
-#include "kismet_featureset.hpp"
-
 // network
 #include  <netdb.h>
 #include  <arpa/inet.h>
@@ -43,11 +40,16 @@
 #include <boost/lexical_cast.hpp>
 #include <boost/tokenizer.hpp>
 #include <boost/bind.hpp>
+#include <boost/make_shared.hpp>
+
+#include "kismet_datasource.hpp"
+#include "kismet_featureset.hpp"
 
 #define MAX_TCP_BUFFER 4096 // maximum accepted TCP data block size
 
-// If you change this also change the according sscanf line!
+// If you change this also change the according kismet command length !
 #define MAX_KISMET_LINE 1024 // maximum length of a kismet command (assumed)
+#define KISMET_COMMAND  "*NETWORK: \001%1024[^\001]\001 %1024s %d %lf %lf"
 
 using boost::lexical_cast;
 using boost::bad_lexical_cast;
@@ -57,7 +59,7 @@ using mapnik::parameters;
 
 DATASOURCE_PLUGIN(kismet_datasource)
 
-using mapnik::Envelope;
+using mapnik::box2d;
 using mapnik::coord2d;
 using mapnik::query;
 using mapnik::featureset_ptr;
@@ -65,102 +67,81 @@ using mapnik::layer_descriptor;
 using mapnik::attribute_descriptor;
 using mapnik::datasource_exception;
 
-using namespace std;
-
 boost::mutex knd_list_mutex;
 std::list<kismet_network_data> knd_list;
 const unsigned int queue_size = 20;
 
-kismet_datasource::kismet_datasource(parameters const& params)
-   : datasource(params),
-     extent_(),
-     extent_initialized_(false),
-     type_(datasource::Vector),
-     desc_(*params.get<std::string>("type"), 
-     *params.get<std::string>("encoding","utf-8"))
+kismet_datasource::kismet_datasource(parameters const& params, bool bind)
+    : datasource(params),
+      extent_(),
+      extent_initialized_(false),
+      type_(datasource::Vector),
+      desc_(*params.get<std::string>("type"), *params.get<std::string>("encoding","utf-8"))
 {
-    //cout << "kismet_datasource::kismet_datasource()" << endl;
-  
-    boost::optional<std::string> host = params.get<std::string>("host");
-    if (!host) throw datasource_exception("missing <host> parameter");
-  
-    boost::optional<std::string> port = params.get<std::string>("port");
-    if (!port) throw datasource_exception("missing <port> parameter");
+    boost::optional<std::string> host = params_.get<std::string>("host");
+    if (host) {
+        host_ = *host;
+    } else {
+        throw datasource_exception("Kismet Plugin: missing <host> parameter");
+    }
   
-    unsigned int portnr = atoi ((*port).c_str () );
-    kismet_thread.reset (new boost::thread (boost::bind (&kismet_datasource::run, this, *host, portnr)));
+    boost::optional<unsigned int> port = params_.get<unsigned int>("port", 2501);
+    if (port) port_ = *port;
+
+    boost::optional<std::string> ext = params_.get<std::string>("extent");
+    if (ext) extent_initialized_ = extent_.from_string(*ext);
+
+    kismet_thread.reset (new boost::thread (boost::bind (&kismet_datasource::run, this, host_, port_)));
 
-    boost::optional<std::string> ext  = params_.get<std::string>("extent");
-    if (ext)
+    if (bind)
     {
-        boost::char_separator<char> sep(",");
-        boost::tokenizer<boost::char_separator<char> > tok(*ext,sep);
-        unsigned i = 0;
-        bool success = false;
-        double d[4];
-        for (boost::tokenizer<boost::char_separator<char> >::iterator beg=tok.begin(); 
-             beg!=tok.end();++beg)
-        {
-           try 
-           {
-               d[i] = boost::lexical_cast<double>(*beg);
-           }
-           catch (boost::bad_lexical_cast & ex)
-           {
-              std::clog << ex.what() << "\n";
-              break;
-           }
-           if (i==3) 
-           {
-              success = true;
-              break;
-           }
-           ++i;
-        }
-        if (success)
-        {
-           extent_.init(d[0],d[1],d[2],d[3]);
-           extent_initialized_ = true;
-        }
+        this->bind();
     }
 }
 
-kismet_datasource::~kismet_datasource()
+void kismet_datasource::bind() const
 {
+    if (is_bound_) return;
+       
+    is_bound_ = true;
 }
 
-std::string const kismet_datasource::name_="kismet";
+kismet_datasource::~kismet_datasource()
+{
+}
 
 std::string kismet_datasource::name()
 {
-   return name_;
+    return "kismet";
 }
 
 int kismet_datasource::type() const
 {
-   return type_;
+    return type_;
 }
 
-Envelope<double> kismet_datasource::envelope() const
+box2d<double> kismet_datasource::envelope() const
 {
-   //cout << "kismet_datasource::envelope()" << endl;
-   return extent_;
+    if (!is_bound_) bind();
+    return extent_;
 }
 
 layer_descriptor kismet_datasource::get_descriptor() const
 {
-   return desc_;
+    return desc_;
 }
 
 featureset_ptr kismet_datasource::features(query const& q) const
 {
+    if (!is_bound_) bind();
+    
     //cout << "kismet_datasource::features()" << endl;
     
-    // TODO: use Envelope to filter bbox before adding to featureset_ptr
-    //mapnik::Envelope<double> const& e = q.get_bbox();
+    // TODO: use box2d to filter bbox before adding to featureset_ptr
+    //mapnik::box2d<double> const& e = q.get_bbox();
 
     boost::mutex::scoped_lock lock(knd_list_mutex);
-    return featureset_ptr (new kismet_featureset(knd_list, desc_.get_encoding()));
+    return boost::make_shared<kismet_featureset>(knd_list, desc_.get_encoding());
 
     // TODO: if illegal:
     // return featureset_ptr();
@@ -168,141 +149,147 @@ featureset_ptr kismet_datasource::features(query const& q) const
 
 featureset_ptr kismet_datasource::features_at_point(coord2d const& pt) const
 {
+    if (!is_bound_) bind();
+    
     //cout << "kismet_datasource::features_at_point()" << endl;
 
-#if 0
-   if (dataset_ && layer_)
-   {
-        OGRPoint point;
-        point.setX (pt.x);
-        point.setY (pt.y);
-        
-        layer_->SetSpatialFilter (&point);
-        
-        return featureset_ptr(new ogr_featureset(*dataset_, *layer_, desc_.get_encoding()));
-   }
-#endif
-
-   return featureset_ptr();
+    return featureset_ptr();
 }
 
 void kismet_datasource::run (const std::string &ip_host, const unsigned int port)
 {
-  //cout << "+run" << endl;
+#ifdef MAPNIK_DEBUG
+    std::clog << "Kismet Plugin: enter run" << std::endl;
+#endif
   
-  int                 sockfd, n;
-  struct sockaddr_in  sock_addr;
-  struct in_addr      inadr;
-  struct hostent      *host;
-  char                buffer[MAX_TCP_BUFFER]; // TCP data send from kismet_server
-  string command;
-
-  if (inet_aton(ip_host.c_str (), &inadr))
-  {
-    host = gethostbyaddr((char *) &inadr, sizeof(inadr), AF_INET);
-  }  
-  else
-  {
-    host = gethostbyname(ip_host.c_str ());
-  }
-
-  if (host == NULL)
-  {
-    herror ("plugins/input/kismet: Error while searching host");
-    return;
-  }
-
-  sock_addr.sin_family = AF_INET;
-  sock_addr.sin_port   = htons(port);
-  memcpy(&sock_addr.sin_addr, host->h_addr_list[0],
-         sizeof(sock_addr.sin_addr));
-
-  if ( (sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
-  {
-    cerr << "plugins/input/kismet: Error while creating socket" << endl;
-    return;
-  }
-
-  if (connect(sockfd, (struct sockaddr *) &sock_addr, sizeof(sock_addr)))
-  {
-    cerr << "plugins/input/kismet: Error while connecting" << endl;
-    return;
-  }
-
-  command = "!1 ENABLE NETWORK ssid,bssid,wep,bestlat,bestlon\n";
-
-  if (write(sockfd, command.c_str (), command.length ()) != (signed) command.length ())
-  {
-    cerr << "plugins/input/kismet: Error sending command to " << ip_host << endl;
-    close(sockfd);
-    return;
-  }
-
-  char ssid[MAX_KISMET_LINE] = {};
-  char bssid[MAX_KISMET_LINE] = {};
-  double bestlat = 0;
-  double bestlon = 0;
-  int crypt = crypt_none;
+    int sockfd, n;
+    struct sockaddr_in sock_addr;
+    struct in_addr inadr;
+    struct hostent* host;
+    char buffer[MAX_TCP_BUFFER]; // TCP data send from kismet_server
+    std::string command;
+
+    if (inet_aton(ip_host.c_str (), &inadr))
+    {
+        host = gethostbyaddr((char *) &inadr, sizeof(inadr), AF_INET);
+    }  
+    else
+    {
+        host = gethostbyname(ip_host.c_str ());
+    }
+
+    if (host == NULL)
+    {
+        herror ("Kismet Plugin: Error while searching host");
+        return;
+    }
+
+    sock_addr.sin_family = AF_INET;
+    sock_addr.sin_port = htons(port);
+    memcpy(&sock_addr.sin_addr, host->h_addr_list[0], sizeof(sock_addr.sin_addr));
+
+    if ( (sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
+    {
+        std::cerr << "Kismet Plugin: error while creating socket" << std::endl;
+        return;
+    }
+
+    if (connect(sockfd, (struct sockaddr *) &sock_addr, sizeof(sock_addr)))
+    {
+        std::cerr << "KISMET Plugin: Error while connecting" << std::endl;
+        return;
+    }
+
+    command = "!1 ENABLE NETWORK ssid,bssid,wep,bestlat,bestlon\n";
+
+    if (write(sockfd, command.c_str (), command.length ()) != (signed) command.length ())
+    {
+        std::cerr << "KISMET Plugin: Error sending command to " << ip_host << std::endl;
+        close(sockfd);
+        return;
+    }
+
+    char ssid[MAX_KISMET_LINE] = {};
+    char bssid[MAX_KISMET_LINE] = {};
+    double bestlat = 0;
+    double bestlon = 0;
+    int crypt = crypt_none;
   
-  // BUG: if kismet_server is active sending after mapnik was killed and then restarted the 
-  // assert is called. Needs to be analyzed!
-  while ( (n = read(sockfd, buffer, sizeof(buffer))) > 0)
-  {
-    assert (n < MAX_TCP_BUFFER);
+    // BUG: if kismet_server is active sending after mapnik was killed and then restarted the 
+    // assert is called. Needs to be analyzed!
+    while ((n = read(sockfd, buffer, sizeof(buffer))) > 0)
+    {
+        assert (n < MAX_TCP_BUFFER);
     
-    buffer[n] = '\0';
-    string bufferObj (buffer); // TCP data send from kismet_server as STL string
+        buffer[n] = '\0';
+        std::string bufferObj (buffer); // TCP data send from kismet_server as STL string
     
-    //cout << "BufferObj: " << endl << bufferObj << "[END]" << endl;
+#ifdef MAPNIK_DEBUG
+        std::clog << "Kismet Plugin: buffer_obj=" << bufferObj << "[END]" << std::endl;
+#endif
     
-    string::size_type found = 0;
-    string::size_type search_start = 0;
-    string kismet_line; // contains a line from kismet_server
-    do 
-    {
-      found = bufferObj.find ('\n', search_start);
-      if (found != string::npos)
-      {
-        kismet_line.assign (bufferObj, search_start, found - search_start);
-        
-        //cout << "Line: " << kismet_line << "[ENDL]" << endl;
+        std::string::size_type found = 0;
+        std::string::size_type search_start = 0;
+        std::string kismet_line; // contains a line from kismet_server
+        do 
+        {
+            found = bufferObj.find ('\n', search_start);
+            if (found != std::string::npos)
+            {
+                kismet_line.assign (bufferObj, search_start, found - search_start);
+
+#ifdef MAPNIK_DEBUG
+                std::clog << "Kismet Plugin: line=" << kismet_line << " [ENDL]" << std::endl;
+#endif
         
-        int param_number = 5; // the number of parameters to parse
+                int param_number = 5; // the number of parameters to parse
         
-        // Attention: string length specified to the constant!
-        if (sscanf (kismet_line.c_str (), "*NETWORK: \001%1024[^\001]\001 %1024s %d %lf %lf", ssid, bssid, &crypt, &bestlat, &bestlon) == param_number)
-        {
-          //printf ("ssid=%s, bssid=%s, crypt=%d, bestlat=%f, bestlon=%f\n", ssid, bssid, crypt, bestlat, bestlon);
+                // Attention: string length specified to the constant!
+                if (sscanf (kismet_line.c_str (),
+                            KISMET_COMMAND,
+                            ssid,
+                            bssid,
+                            &crypt,
+                            &bestlat,
+                            &bestlon) == param_number)
+                {
+#ifdef MAPNIK_DEBUG
+                    std::clog << "Kismet Plugin: ssid=" << ssid << ", bssid=" << bssid
+                        << ", crypt=" << crypt << ", bestlat=" << bestlat << ", bestlon=" << bestlon << std::endl;
+#endif
 
-          kismet_network_data knd (ssid, bssid, bestlat, bestlon, crypt);
+                    kismet_network_data knd (ssid, bssid, bestlat, bestlon, crypt);
           
-          boost::mutex::scoped_lock lock(knd_list_mutex);
+                    boost::mutex::scoped_lock lock(knd_list_mutex);
                       
-          // the queue only grows to a max size
-          if (knd_list.size () >= queue_size)
-          {
-            knd_list.pop_front ();
-          }
+                    // the queue only grows to a max size
+                    if (knd_list.size () >= queue_size)
+                    {
+                        knd_list.pop_front ();
+                    }
           
-          knd_list.push_back (knd);
-        }  
-        else
-        {
-          // do nothing if not matched!
+                    knd_list.push_back (knd);
+                }  
+                else
+                {
+                    // do nothing if not matched!
+                }
+
+                search_start = found + 1;      
+            }
         }
-        
-        search_start = found + 1;      
-      }
+        while (found != std::string::npos);
     }
-    while (found != string::npos);
-  }
 
-  if (n < 0)
-  {
-    cerr << "plugins/input/kismet: Error while reading from socket" << endl;
-  }
+    if (n < 0)
+    {
+        std::cerr << "Kismet Plugin: error while reading from socket" << std::endl;
+    }
 
-  close(sockfd);
-  
-  //cout << "-run" << endl;
+    close(sockfd);
+
+#ifdef MAPNIK_DEBUG
+    std::clog << "Kismet Plugin: exit run" << std::endl;
+#endif
 }
+
diff --git a/plugins/input/kismet/kismet_datasource.hpp b/plugins/input/kismet/kismet_datasource.hpp
index dc3b521..e5f1694 100644
--- a/plugins/input/kismet/kismet_datasource.hpp
+++ b/plugins/input/kismet/kismet_datasource.hpp
@@ -44,21 +44,22 @@
 class kismet_datasource : public mapnik::datasource 
 {
    public:
-      kismet_datasource(mapnik::parameters const& params);
+      kismet_datasource(mapnik::parameters const& params, bool bind=true);
       virtual ~kismet_datasource ();
       int type() const;
       static std::string name();
       mapnik::featureset_ptr features(mapnik::query const& q) const;
       mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt) const;
-      mapnik::Envelope<double> envelope() const;
+      mapnik::box2d<double> envelope() const;
       mapnik::layer_descriptor get_descriptor() const;
-    
+      void bind() const;
    private:
       void run (const std::string &host, const unsigned int port);
-  
-      static const std::string name_;
-      mapnik::Envelope<double> extent_;
-      mutable bool extent_initialized_;
+
+      mapnik::box2d<double> extent_;
+      bool extent_initialized_;
+      std::string host_;
+      unsigned int port_;
       int type_;
       mapnik::layer_descriptor desc_;
       boost::shared_ptr<boost::thread> kismet_thread;
diff --git a/plugins/input/kismet/kismet_featureset.cpp b/plugins/input/kismet/kismet_featureset.cpp
index 41df4cc..387ec41 100644
--- a/plugins/input/kismet/kismet_featureset.cpp
+++ b/plugins/input/kismet/kismet_featureset.cpp
@@ -21,70 +21,75 @@
  *****************************************************************************/
 //$Id$
 
+// mapnik
 #include <mapnik/global.hpp>
 #include <mapnik/datasource.hpp>
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 #include <mapnik/geometry.hpp>
 #include <mapnik/feature.hpp>
 #include <mapnik/feature_layer_desc.hpp>
 #include <mapnik/wkb.hpp>
 #include <mapnik/unicode.hpp>
+#include <mapnik/feature_factory.hpp>
 
 #include "kismet_featureset.hpp"
 
-using namespace std;
-using namespace mapnik;
+using mapnik::Feature;
+using mapnik::feature_ptr;
+using mapnik::geometry_type;
+using mapnik::geometry_utils;
+using mapnik::transcoder;
+using mapnik::feature_factory;
 
 kismet_featureset::kismet_featureset(const std::list<kismet_network_data> &knd_list,
                                      std::string const& encoding)
-   : knd_list_(knd_list),
-     tr_(new transcoder(encoding)),
-     feature_id (0),
-     knd_list_it(knd_list_.begin ()),
-     source_("+proj=latlong +datum=WGS84")
+    : knd_list_(knd_list),
+      tr_(new transcoder(encoding)),
+      feature_id_(1),
+      knd_list_it(knd_list_.begin ()),
+      source_("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
 {
-    //cout << "kismet_featureset::kismet_featureset()" << endl;
 }
 
-kismet_featureset::~kismet_featureset() {}
+kismet_featureset::~kismet_featureset()
+{
+}
 
 feature_ptr kismet_featureset::next()
 {
-    //cout << "kismet_featureset::next()" << endl;
-  
     if (knd_list_it != knd_list_.end ())
     {
-      const kismet_network_data &knd = *knd_list_it;
+        const kismet_network_data& knd = *knd_list_it;
+        const std::string key = "internet_access";
+
+        std::string value;
+        if (knd.crypt_ == crypt_none)
+        {
+            value = "wlan_uncrypted";
+        }
+        else if (knd.crypt_ == crypt_wep)
+        {
+            value = "wlan_wep";
+        }
+        else
+        {
+            value = "wlan_crypted";
+        }
+
+        feature_ptr feature(feature_factory::create(feature_id_));
+        ++feature_id_;
       
-      feature_ptr feature(new Feature(feature_id));
-      string key = "internet_access";
-      string value;
+        geometry_type* pt = new geometry_type(mapnik::Point);
+        pt->move_to(knd.bestlon_, knd.bestlat_);
+        feature->add_geometry(pt);
       
-      if (knd.crypt_ == crypt_none)
-      {
-        value = "wlan_uncrypted";
-      }
-      else if (knd.crypt_ == crypt_wep)
-      {
-        value = "wlan_wep";
-      }
-      else
-      {
-        value = "wlan_crypted";
-      }      
-
-      mapnik::geometry2d * pt = new mapnik::point_impl;
-      pt->move_to(knd.bestlon_, knd.bestlat_);
-      feature->add_geometry(pt);
-      (*feature)[key] = tr_->transcode(value.c_str ());
+        boost::put(*feature, key, tr_->transcode(value.c_str()));
       
-      ++feature_id;
-      ++knd_list_it;
+        ++knd_list_it;
         
-      return feature;
+        return feature;
     }
     
-    // returns empty object to mark end
     return feature_ptr();
 }
 
diff --git a/plugins/input/kismet/kismet_featureset.hpp b/plugins/input/kismet/kismet_featureset.hpp
index c2ec4d1..8ad5659 100644
--- a/plugins/input/kismet/kismet_featureset.hpp
+++ b/plugins/input/kismet/kismet_featureset.hpp
@@ -38,7 +38,6 @@
 
 #include "kismet_types.hpp"
   
-  
 class kismet_featureset : public mapnik::Featureset
 {
    public:
@@ -52,7 +51,7 @@ class kismet_featureset : public mapnik::Featureset
       boost::scoped_ptr<mapnik::transcoder> tr_;
       mapnik::wkbFormat format_;
       bool multiple_geometries_;
-      int feature_id;
+      int feature_id_;
       std::list<kismet_network_data>::const_iterator knd_list_it;
       mapnik::projection source_;
 };
diff --git a/plugins/input/occi/README b/plugins/input/occi/README
index 726ef27..a36411c 100644
--- a/plugins/input/occi/README
+++ b/plugins/input/occi/README
@@ -1,7 +1,11 @@
 #
 # To regenerate C++ class declarations & implementations for the Spatial
-# object types of your database you should execute OTT
+# object types of your database you should execute OTT in your server !
 #
+
+echo "TYPE MDSYS.SDO_POINT_TYPE AS SDOPointType" > spatial_types.typ
+echo "TYPE MDSYS.SDO_GEOMETRY AS SDOGeometry" >> spatial_types.typ
+
 ott userid=scott/tiger attraccess=private intype=spatial_types.typ code=cpp \
      cppfile=spatial_classeso.cpp hfile=spatial_classesh.h mapfile=spatial_classesm.cpp \
      mapfunc=RegisterClasses
diff --git a/plugins/input/occi/SConscript b/plugins/input/occi/SConscript
deleted file mode 100644
index 9d48cef..0000000
--- a/plugins/input/occi/SConscript
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# This file is part of Mapnik (c++ mapping toolkit)
-#
-# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-# $Id$
-
-Import ('env')
-
-prefix = env['PREFIX']
-install_prefix = env['DESTDIR'] + '/' + prefix
-
-occi_src = Split(
-	"""
-	occi_types.cpp
-	occi_datasource.cpp
-	occi_featureset.cpp      
-	spatial_classesm.cpp      
-	spatial_classeso.cpp      
-	"""
-        )
-
-libraries = [ 'occi', 'ociei' ]
-if env['PLATFORM'] == 'Darwin':
-    libraries.append('mapnik')
-    libraries.append(env['ICU_LIB_NAME'])
-
-occi_inputdriver = env.SharedLibrary('occi', source=occi_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries)
-
-env.Install(install_prefix + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME'] + '/input', occi_inputdriver)
-env.Alias('install', install_prefix + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME'] + '/input')
diff --git a/plugins/input/occi/build.py b/plugins/input/occi/build.py
new file mode 100644
index 0000000..b2c5f6c
--- /dev/null
+++ b/plugins/input/occi/build.py
@@ -0,0 +1,49 @@
+#
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+Import ('env')
+
+prefix = env['PREFIX']
+
+plugin_env = env.Clone()
+
+occi_src = Split(
+  """
+  occi_types.cpp
+  occi_datasource.cpp
+  occi_featureset.cpp      
+  spatial_classesm.cpp      
+  spatial_classeso.cpp      
+  """
+        )
+
+libraries = [ 'occi', 'ociei' ]
+libraries.append('mapnik2')
+libraries.append(env['ICU_LIB_NAME'])
+
+input_plugin = plugin_env.SharedLibrary('../occi', source=occi_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS'])
+
+# if the plugin links to libmapnik2 ensure it is built first
+Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME']))
+
+if 'uninstall' not in COMMAND_LINE_TARGETS:
+    env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin)
+    env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST'])
diff --git a/plugins/input/occi/occi_datasource.cpp b/plugins/input/occi/occi_datasource.cpp
index 15d1dea..f2609b1 100644
--- a/plugins/input/occi/occi_datasource.cpp
+++ b/plugins/input/occi/occi_datasource.cpp
@@ -26,11 +26,13 @@
 
 // mapnik
 #include <mapnik/ptree_helpers.hpp>
+#include <mapnik/sql_utils.hpp>
 
 // boost
 #include <boost/algorithm/string.hpp>
 #include <boost/lexical_cast.hpp>
 #include <boost/tokenizer.hpp>
+#include <boost/make_shared.hpp>
 
 // stl
 #include <string>
@@ -39,10 +41,6 @@
 #include <sstream>
 #include <iomanip>
 
-using std::clog;
-using std::endl;
-using std::vector;
-
 using boost::lexical_cast;
 using boost::bad_lexical_cast;
 
@@ -53,7 +51,7 @@ using mapnik::featureset_ptr;
 using mapnik::layer_descriptor;
 using mapnik::attribute_descriptor;
 using mapnik::datasource_exception;
-using mapnik::Envelope;
+using mapnik::box2d;
 using mapnik::coord2d;
 
 using oracle::occi::Environment;
@@ -65,224 +63,285 @@ using oracle::occi::SQLException;
 using oracle::occi::Type;
 using oracle::occi::StatelessConnectionPool;
 
+const std::string occi_datasource::METADATA_TABLE="USER_SDO_GEOM_METADATA";
+
 DATASOURCE_PLUGIN(occi_datasource)
 
 
-std::string table_from_sql(std::string const& sql)
+occi_datasource::occi_datasource(parameters const& params, bool bind)
+    : datasource (params),
+      type_(datasource::Vector),
+      fields_(*params_.get<std::string>("fields","*")),
+      geometry_field_(*params_.get<std::string>("geometry_field","")),
+      srid_initialized_(false),
+      extent_initialized_(false),
+      desc_(*params_.get<std::string>("type"), *params_.get<std::string>("encoding","utf-8")),
+      row_limit_(*params_.get<int>("row_limit",0)),
+      row_prefetch_(*params_.get<int>("row_prefetch",100)),
+      pool_(0),
+      conn_(0)
 {
-   std::string table_name = boost::algorithm::to_lower_copy(sql);
-   boost::algorithm::replace_all(table_name,"\n"," ");
-   
-   std::string::size_type idx = table_name.rfind("from");
-   if (idx!=std::string::npos)
-   {
-      
-      idx=table_name.find_first_not_of(" ",idx+4);
-      if (idx != std::string::npos)
-      {
-         table_name=table_name.substr(idx);
-      }
-      idx=table_name.find_first_of(" ),");
-      if (idx != std::string::npos)
-      {
-         table_name = table_name.substr(0,idx);
-      }
-   }
-   return table_name;
+    if (! params_.get<std::string>("user")) throw datasource_exception("OCCI Plugin: no <user> specified");
+    if (! params_.get<std::string>("password")) throw datasource_exception("OCCI Plugin: no <password> specified");
+    if (! params_.get<std::string>("host")) throw datasource_exception("OCCI Plugin: no <host> string specified");
+
+    boost::optional<std::string> table = params_.get<std::string>("table");
+    if (!table)
+    {
+        throw datasource_exception("OCCI Plugin: no <table> parameter specified");
+    }
+    else
+    {
+        table_ = *table;
+    }
+    
+    multiple_geometries_ = *params_.get<mapnik::boolean>("multiple_geometries",false);
+    use_spatial_index_ = *params_.get<mapnik::boolean>("use_spatial_index",true);
+    use_connection_pool_ = *params_.get<mapnik::boolean>("use_connection_pool",true);
+    
+    boost::optional<std::string> ext = params_.get<std::string>("extent");
+    if (ext) extent_initialized_ = extent_.from_string(*ext);
+
+    boost::optional<int> srid = params_.get<int>("srid");
+    if (srid)
+    {
+        srid_ = *srid;
+        srid_initialized_ = true;
+    }
+
+    if (bind)
+    {
+        this->bind();
+    }
 }
 
-occi_datasource::occi_datasource(parameters const& params)
-   : datasource (params),
-     table_(*params.get<std::string>("table","")),
-     geometry_field_(*params.get<std::string>("geometry_field","GEOLOC")),
-     type_(datasource::Vector),
-     extent_initialized_(false),
-     row_limit_(*params_.get<int>("row_limit",0)),
-     row_prefetch_(*params_.get<int>("row_prefetch",100)),
-     desc_(*params.get<std::string>("type"), *params.get<std::string>("encoding","utf-8")),
-     pool_(0)
+occi_datasource::~occi_datasource()
 {
-   boost::optional<int> initial_size = params_.get<int>("inital_size",1);
-   boost::optional<int> max_size = params_.get<int>("max_size",10);
-
-   multiple_geometries_ = *params_.get<mapnik::boolean>("multiple_geometries",false);
-   use_spatial_index_ = *params_.get<mapnik::boolean>("use_spatial_index",true);
-
-   boost::optional<std::string> ext = params_.get<std::string>("extent");
-   if (ext)
-   {
-      boost::char_separator<char> sep(",");
-      boost::tokenizer<boost::char_separator<char> > tok(*ext,sep);
-      unsigned i = 0;
-      bool success = false;
-      double d[4];
-      for (boost::tokenizer<boost::char_separator<char> >::iterator beg=tok.begin(); 
-           beg!=tok.end();++beg)
-      {
-         try 
-         {
-             d[i] = boost::lexical_cast<double>(*beg);
-         }
-         catch (boost::bad_lexical_cast & ex)
-         {
-            std::clog << ex.what() << "\n";
-            break;
-         }
-         if (i==3) 
-         {
-            success = true;
-            break;
-         }
-         ++i;
-      }
-      if (success)
-      {
-         extent_.init(d[0],d[1],d[2],d[3]);
-         extent_initialized_ = true;
-      }
-   } 
-
-   // connect to environment
-   try
-   {
+    if (is_bound_)
+    {
         Environment* env = occi_environment::get_environment();
 
-        pool_ = env->createStatelessConnectionPool(
-                    *params.get<std::string>("user"),
-                    *params.get<std::string>("password"),
-                    *params.get<std::string>("host"),
-                    *max_size,
-                    *initial_size,
-                    1,
-                    StatelessConnectionPool::HOMOGENEOUS);
-   }
-   catch (SQLException &ex)
-   {
-       throw datasource_exception(ex.getMessage());
-   }
-
-   std::string table_name = table_from_sql(table_);
-
-   // get SRID from geometry metadata
-   {
-       occi_connection_ptr conn (pool_);
-
-       std::ostringstream s;
-       s << "select srid from " << SDO_GEOMETRY_METADATA_TABLE << " where";
-       s << " lower(table_name) = lower('" << table_name << "') and";
-       s << " lower(column_name) = lower('" << geometry_field_ << "')";
-
-       try
-       {
-           ResultSet* rs = conn.execute_query (s.str());
-           if (rs && rs->next ())
-           {
-               srid_ = rs->getInt(1);
-           }
-       }
-       catch (SQLException &ex)
-       {
-           throw datasource_exception(ex.getMessage());
-       }
-   }
-
-   // get columns description
-   {
-       std::string::size_type idx = table_.find(table_name);
-       std::ostringstream s;
-       s << "select * from (" << table_.substr(0,idx + table_name.length()) << ") where rownum < 1";
-
-       occi_connection_ptr conn (pool_);
-
-       try
-       {
-           ResultSet* rs = conn.execute_query (s.str());
-           if (rs)
-           {
-               std::vector<MetaData> listOfColumns = rs->getColumnListMetaData();
-
-               for (unsigned int i=0;i<listOfColumns.size();++i)
-               {
-                   MetaData columnObj = listOfColumns[i];
-
-                   std::string fld_name = columnObj.getString(MetaData::ATTR_NAME);
-                   int type_oid = columnObj.getInt(MetaData::ATTR_DATA_TYPE);
-
-#if 0
-                   int type_code = columnObj.getInt(MetaData::ATTR_TYPECODE);
-                   if (type_code == OCCI_TYPECODE_OBJECT)
-                   {
-                       desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Object));
-                       continue;
-                   }
+        if (use_connection_pool_)
+        {
+            if (pool_ != 0)
+                env->terminateStatelessConnectionPool (pool_, StatelessConnectionPool::SPD_FORCE);
+        }
+        else
+        {
+            if (conn_ != 0)
+                env->terminateConnection(conn_);
+        }
+    }
+}
+
+void occi_datasource::bind() const
+{
+    if (is_bound_) return;
+
+    // connect to environment
+    if (use_connection_pool_)
+    {
+        try
+        {
+            Environment* env = occi_environment::get_environment();
+
+            pool_ = env->createStatelessConnectionPool(
+                        *params_.get<std::string>("user"),
+                        *params_.get<std::string>("password"),
+                        *params_.get<std::string>("host"),
+                        *params_.get<int>("max_size",10),
+                        *params_.get<int>("initial_size",1),
+                        1,
+                        StatelessConnectionPool::HOMOGENEOUS);
+        }
+        catch (SQLException &ex)
+        {
+            throw datasource_exception("OCCI Plugin: " + ex.getMessage());
+        }
+    }
+    else
+    {
+        try
+        {
+            Environment* env = occi_environment::get_environment();
+            
+            conn_ = env->createConnection(
+                        *params_.get<std::string>("user"),
+                        *params_.get<std::string>("password"),
+                        *params_.get<std::string>("host"));
+        }
+        catch (SQLException &ex)
+        {
+            throw datasource_exception("OCCI Plugin: " + ex.getMessage());
+        }
+    }
+
+    std::string table_name = mapnik::table_from_sql(table_);
+
+    // get SRID and/or GEOMETRY_FIELD from metadata table only if we need to
+    if (! srid_initialized_ || geometry_field_ == "")
+    {
+        std::ostringstream s;
+        s << "SELECT srid, column_name FROM " << METADATA_TABLE << " WHERE";
+        s << " LOWER(table_name) = LOWER('" << table_name << "')";
+        
+        if (geometry_field_ != "")
+            s << " AND LOWER(column_name) = LOWER('" << geometry_field_ << "')";
+
+#ifdef MAPNIK_DEBUG
+        std::clog << "OCCI Plugin: " << s.str() << std::endl;
+#endif
+
+        try
+        {
+            occi_connection_ptr conn;
+            if (use_connection_pool_) conn.set_pool(pool_);
+            else                      conn.set_connection(conn_, false);
+
+            ResultSet* rs = conn.execute_query (s.str());
+            if (rs && rs->next ())
+            {
+                if (! srid_initialized_)
+                {
+                    srid_ = rs->getInt(1);
+                    srid_initialized_ = true;
+                }
+                
+                if (geometry_field_ == "")
+                {
+                    geometry_field_ = rs->getString(2);
+                }
+            }
+        }
+        catch (SQLException &ex)
+        {
+            throw datasource_exception("OCCI Plugin: " + ex.getMessage());
+        }
+    }
+
+    // get columns description
+    {
+        std::ostringstream s;
+        s << "SELECT " << fields_ << " FROM (" << table_name << ") WHERE rownum < 1";
+
+#ifdef MAPNIK_DEBUG
+        std::clog << "OCCI Plugin: " << s.str() << std::endl;
 #endif
 
-                   switch (type_oid)
-                   {
-                   case oracle::occi::OCCIINT:
-                   case oracle::occi::OCCIUNSIGNED_INT:
-                      desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Integer));
-                      break;
-                   case oracle::occi::OCCIFLOAT:
-                   case oracle::occi::OCCIBFLOAT:
-                   case oracle::occi::OCCIDOUBLE:
-                   case oracle::occi::OCCIBDOUBLE:
-                   case oracle::occi::OCCINUMBER:
-                   case oracle::occi::OCCI_SQLT_NUM:
-                      desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Double));
-                      break;
-                   case oracle::occi::OCCICHAR:
-                   case oracle::occi::OCCISTRING:
-                   case oracle::occi::OCCI_SQLT_AFC:
-                   case oracle::occi::OCCI_SQLT_AVC:
-                   case oracle::occi::OCCI_SQLT_CHR:
-                   case oracle::occi::OCCI_SQLT_LVC:
-                   case oracle::occi::OCCI_SQLT_STR:
-                   case oracle::occi::OCCI_SQLT_VCS:
-                   case oracle::occi::OCCI_SQLT_VNU:
-                   case oracle::occi::OCCI_SQLT_VBI:
-                   case oracle::occi::OCCI_SQLT_VST:
-                   case oracle::occi::OCCI_SQLT_RDD:
-                      desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::String));
-                      break;
-                   case oracle::occi::OCCIDATE:
-                   case oracle::occi::OCCITIMESTAMP:
-                   case oracle::occi::OCCI_SQLT_DAT:
-                   case oracle::occi::OCCI_SQLT_TIMESTAMP:
-                   case oracle::occi::OCCI_SQLT_TIMESTAMP_LTZ:
-                   case oracle::occi::OCCI_SQLT_TIMESTAMP_TZ:
-                   case oracle::occi::OCCIPOBJECT:
+        try
+        {
+            occi_connection_ptr conn;
+            if (use_connection_pool_) conn.set_pool(pool_);
+            else                      conn.set_connection(conn_, false);
+
+            ResultSet* rs = conn.execute_query (s.str());
+            if (rs)
+            {
+                std::vector<MetaData> listOfColumns = rs->getColumnListMetaData();
+
+                for (unsigned int i = 0; i < listOfColumns.size(); ++i)
+                {
+                    MetaData columnObj = listOfColumns[i];
+
+                    std::string fld_name = columnObj.getString(MetaData::ATTR_NAME);
+                    int type_oid = columnObj.getInt(MetaData::ATTR_DATA_TYPE);
+
+                    /*
+                    int type_code = columnObj.getInt(MetaData::ATTR_TYPECODE);
+                    if (type_code == OCCI_TYPECODE_OBJECT)
+                    {
+                        desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Object));
+                        continue;
+                    }
+                    */
+
+                    switch (type_oid)
+                    {
+                    case oracle::occi::OCCIBOOL:
+                    case oracle::occi::OCCIINT:
+                    case oracle::occi::OCCIUNSIGNED_INT:
+                    case oracle::occi::OCCIROWID:
+                        desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Integer));
+                        break;
+                    case oracle::occi::OCCIFLOAT:
+                    case oracle::occi::OCCIBFLOAT:
+                    case oracle::occi::OCCIDOUBLE:
+                    case oracle::occi::OCCIBDOUBLE:
+                    case oracle::occi::OCCINUMBER:
+                    case oracle::occi::OCCI_SQLT_NUM:
+                        desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Double));
+                        break;
+                    case oracle::occi::OCCICHAR:
+                    case oracle::occi::OCCISTRING:
+                    case oracle::occi::OCCI_SQLT_AFC:
+                    case oracle::occi::OCCI_SQLT_AVC:
+                    case oracle::occi::OCCI_SQLT_CHR:
+                    case oracle::occi::OCCI_SQLT_LVC:
+                    case oracle::occi::OCCI_SQLT_RDD:
+                    case oracle::occi::OCCI_SQLT_STR:
+                    case oracle::occi::OCCI_SQLT_VCS:
+                    case oracle::occi::OCCI_SQLT_VNU:
+                    case oracle::occi::OCCI_SQLT_VBI:
+                    case oracle::occi::OCCI_SQLT_VST:
+                        desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::String));
+                        break;
+                    case oracle::occi::OCCIDATE:
+                    case oracle::occi::OCCITIMESTAMP:
+                    case oracle::occi::OCCIINTERVALDS:
+                    case oracle::occi::OCCIINTERVALYM:
+                    case oracle::occi::OCCI_SQLT_DAT:
+                    case oracle::occi::OCCI_SQLT_DATE:
+                    case oracle::occi::OCCI_SQLT_TIME:
+                    case oracle::occi::OCCI_SQLT_TIME_TZ:
+                    case oracle::occi::OCCI_SQLT_TIMESTAMP:
+                    case oracle::occi::OCCI_SQLT_TIMESTAMP_LTZ:
+                    case oracle::occi::OCCI_SQLT_TIMESTAMP_TZ:
+                    case oracle::occi::OCCI_SQLT_INTERVAL_YM:
+                    case oracle::occi::OCCI_SQLT_INTERVAL_DS:
+                    case oracle::occi::OCCIANYDATA:
+                    case oracle::occi::OCCIBLOB:
+                    case oracle::occi::OCCIBFILE:
+                    case oracle::occi::OCCIBYTES:
+                    case oracle::occi::OCCICLOB:
+                    case oracle::occi::OCCIVECTOR:
+                    case oracle::occi::OCCIMETADATA:
+                    case oracle::occi::OCCIPOBJECT:
+                    case oracle::occi::OCCIREF:
+                    case oracle::occi::OCCIREFANY:
+                    case oracle::occi::OCCISTREAM:
+                    case oracle::occi::OCCICURSOR:
+                    case oracle::occi::OCCI_SQLT_FILE:
+                    case oracle::occi::OCCI_SQLT_CFILE:
+                    case oracle::occi::OCCI_SQLT_REF:
+                    case oracle::occi::OCCI_SQLT_CLOB:
+                    case oracle::occi::OCCI_SQLT_BLOB:
+                    case oracle::occi::OCCI_SQLT_RSET:
 #ifdef MAPNIK_DEBUG
-                      clog << "unsupported type_oid="<<type_oid<<endl;
+                        std::clog << "OCCI Plugin: unsupported datatype " << occi_enums::resolve_datatype(type_oid)
+                             << " (type_oid=" << type_oid << ")" << std::endl;
 #endif
-                      break;
-                   default: // shouldn't get here
+                        break;
+                    default:
 #ifdef MAPNIK_DEBUG
-                      clog << "unknown type_oid="<<type_oid<<endl;
+                        std::clog << "OCCI Plugin: unknown datatype (type_oid=" << type_oid << ")" << std::endl;
 #endif
-                      break;
-                   }	  
-               }
-           }
-       }
-       catch (SQLException &ex)
-       {
-           throw datasource_exception(ex.getMessage());
-       }
-   }        
-}
+                        break;
+                    }
+                }
+            }
+        }
+        catch (SQLException &ex)
+        {
+            throw datasource_exception(ex.getMessage());
+        }
+    }
 
-occi_datasource::~occi_datasource()
-{
-    Environment* env = occi_environment::get_environment();
-    env->terminateStatelessConnectionPool (pool_);
+    is_bound_ = true;
 }
 
-std::string const occi_datasource::name_="occi";
-
 std::string occi_datasource::name()
 {
-    return name_;
+    return "occi";
 }
 
 int occi_datasource::type() const
@@ -290,259 +349,295 @@ int occi_datasource::type() const
     return type_;
 }
 
-Envelope<double> occi_datasource::envelope() const
+box2d<double> occi_datasource::envelope() const
 {
     if (extent_initialized_) return extent_;
+    if (!is_bound_) bind();
 
-    double lox, loy, hix, hiy;
-    occi_connection_ptr conn (pool_);
+    double lox = 0.0, loy = 0.0, hix = 0.0, hiy = 0.0;
 
     boost::optional<mapnik::boolean> estimate_extent = params_.get<mapnik::boolean>("estimate_extent",false);
-         
+
     if (estimate_extent && *estimate_extent)
     {
         std::ostringstream s;
-        s << "select min(c.x), min(c.y), max(c.x), max(c.y) from ";
-        s << " (select sdo_aggr_mbr(" << geometry_field_ << ") shape from " << table_ << ") a, ";
-        s << " table (sdo_util.getvertices(a.shape)) c";
+        s << "SELECT MIN(c.x), MIN(c.y), MAX(c.x), MAX(c.y) FROM ";
+        s << " (SELECT SDO_AGGR_MBR(" << geometry_field_ << ") shape FROM " << table_ << ") a, ";
+        s << " TABLE(SDO_UTIL.GETVERTICES(a.shape)) c";
+
+#ifdef MAPNIK_DEBUG
+        std::clog << "OCCI Plugin: " << s.str() << std::endl;
+#endif
 
         try
         {
+            occi_connection_ptr conn;
+            if (use_connection_pool_) conn.set_pool(pool_);
+            else                      conn.set_connection(conn_, false);
+
             ResultSet* rs = conn.execute_query (s.str());
             if (rs && rs->next ())
             {
-                try 
+                try
                 {
                     lox = lexical_cast<double>(rs->getDouble(1));
                     loy = lexical_cast<double>(rs->getDouble(2));
                     hix = lexical_cast<double>(rs->getDouble(3));
-                    hiy = lexical_cast<double>(rs->getDouble(4));		    
+                    hiy = lexical_cast<double>(rs->getDouble(4));
                     extent_.init (lox,loy,hix,hiy);
                     extent_initialized_ = true;
                 }
                 catch (bad_lexical_cast &ex)
                 {
-                    clog << ex.what() << endl;
+                    std::clog << "OCCI Plugin: " << ex.what() << std::endl;
                 }
             }
         }
         catch (SQLException &ex)
         {
-            throw datasource_exception(ex.getMessage());
+            throw datasource_exception("OCCI Plugin: " + ex.getMessage());
         }
     }
     else if (use_spatial_index_)
     {
-        std::string table_name = table_from_sql(table_);
+        std::string table_name = mapnik::table_from_sql(table_);
 
+        std::ostringstream s;
+        s << "SELECT dim.sdo_lb, dim.sdo_ub FROM ";
+        s << METADATA_TABLE << " m, TABLE(m.diminfo) dim ";
+        s << " WHERE LOWER(m.table_name) = LOWER('" << table_name << "') AND dim.sdo_dimname = 'X'";
+        s << " UNION ";
+        s << "SELECT dim.sdo_lb, dim.sdo_ub FROM ";
+        s << METADATA_TABLE << " m, TABLE(m.diminfo) dim ";
+        s << " WHERE LOWER(m.table_name) = LOWER('" << table_name << "') AND dim.sdo_dimname = 'Y'";
+
+#ifdef MAPNIK_DEBUG
+        std::clog << "OCCI Plugin: " << s.str() << std::endl;
+#endif
+
+        try
         {
-            std::ostringstream s;
-            s << "select dim.sdo_lb as lx, dim.sdo_ub as ux from ";
-            s << SDO_GEOMETRY_METADATA_TABLE << " m, table(m.diminfo) dim ";
-            s << " where lower(m.table_name) = '" << table_name << "' and dim.sdo_dimname = 'X'";
-        
-            try
+            occi_connection_ptr conn;
+            if (use_connection_pool_) conn.set_pool(pool_);
+            else                      conn.set_connection(conn_, false);
+
+            ResultSet* rs = conn.execute_query (s.str());
+            if (rs)
             {
-                ResultSet* rs = conn.execute_query (s.str());
-                if (rs && rs->next ())
+                if (rs->next ())
                 {
-                    try 
+                    try
                     {
                         lox = lexical_cast<double>(rs->getDouble(1));
                         hix = lexical_cast<double>(rs->getDouble(2));
                     }
                     catch (bad_lexical_cast &ex)
                     {
-                        clog << ex.what() << endl;
+                        std::clog << "OCCI Plugin: " << ex.what() << std::endl;
                     }
                 }
-            }
-            catch (SQLException &ex)
-            {
-                throw datasource_exception(ex.getMessage());
-            }
-        }
-
-        {
-            std::ostringstream s;
-            s << "select dim.sdo_lb as ly, dim.sdo_ub as uy from ";
-            s << SDO_GEOMETRY_METADATA_TABLE << " m, table(m.diminfo) dim ";
-            s << " where lower(m.table_name) = '" << table_name << "' and dim.sdo_dimname = 'Y'";
-        
-            try
-            {
-                ResultSet* rs = conn.execute_query (s.str());
-                if (rs && rs->next ())
+                
+                if (rs->next ())
                 {
-                    try 
+                    try
                     {
                         loy = lexical_cast<double>(rs->getDouble(1));
                         hiy = lexical_cast<double>(rs->getDouble(2));
                     }
                     catch (bad_lexical_cast &ex)
                     {
-                        clog << ex.what() << endl;
+                        std::clog << "OCCI Plugin: " << ex.what() << std::endl;
                     }
                 }
-            }
-            catch (SQLException &ex)
-            {
-                throw datasource_exception(ex.getMessage());
+
+                extent_.init (lox,loy,hix,hiy);
+                extent_initialized_ = true;
             }
         }
-
-        extent_.init (lox,loy,hix,hiy);
-        extent_initialized_ = true;
+        catch (SQLException &ex)
+        {
+            throw datasource_exception("OCCI Plugin: " + ex.getMessage());
+        }
     }
 
+    if (! extent_initialized_)
+        throw datasource_exception("OCCI Plugin: unable to determine the extent of a <occi> table");
+
     return extent_;
 }
 
 layer_descriptor occi_datasource::get_descriptor() const
 {
+    if (!is_bound_) bind();
+    
     return desc_;
 }
 
 featureset_ptr occi_datasource::features(query const& q) const
 {
-    if (pool_)
+    if (!is_bound_) bind();
+
+    box2d<double> const& box=q.get_bbox();
+
+    std::ostringstream s;
+    s << "SELECT " << geometry_field_;
+    std::set<std::string> const& props = q.property_names();
+    std::set<std::string>::const_iterator pos = props.begin();
+    std::set<std::string>::const_iterator end = props.end();
+    while (pos != end)
     {
-        Envelope<double> const& box=q.get_bbox();
-    
-        std::ostringstream s;
-        s << "select " << geometry_field_ << " as geom";
-        std::set<std::string> const& props=q.property_names();
-        std::set<std::string>::const_iterator pos=props.begin();
-        std::set<std::string>::const_iterator end=props.end();
-        while (pos != end)
-        {
-           s <<",\""<<*pos<<"\"";
-           ++pos;
-        }	 
+        s << ", " << *pos;
+        ++pos;
+    }
 
-        s << " from ";
+    s << " FROM ";
 
-        std::string query (table_); 
-        std::string table_name = table_from_sql(query);
+    std::string query (table_);
+    std::string table_name = mapnik::table_from_sql(query);
 
-        if (use_spatial_index_)
+    if (use_spatial_index_)
+    {
+        std::ostringstream spatial_sql;
+        spatial_sql << std::setprecision(16);
+        spatial_sql << " WHERE SDO_FILTER(" << geometry_field_ << ",";
+        spatial_sql << "  MDSYS.SDO_GEOMETRY(" << SDO_GTYPE_2DPOLYGON << "," << srid_ << ",NULL,";
+        spatial_sql << "  MDSYS.SDO_ELEM_INFO_ARRAY(1," << SDO_ETYPE_POLYGON << "," << SDO_INTERPRETATION_RECTANGLE << "),";
+        spatial_sql << "  MDSYS.SDO_ORDINATE_ARRAY(";
+        spatial_sql << box.minx() << "," << box.miny() << ", ";
+        spatial_sql << box.maxx() << "," << box.maxy() << ")), 'querytype=WINDOW') = 'TRUE'";
+
+        if (boost::algorithm::ifind_first(query, "WHERE"))
         {
-           std::ostringstream spatial_sql;
-           spatial_sql << std::setprecision(16);
-           spatial_sql << " where sdo_filter(" << geometry_field_ << ",";
-           spatial_sql << " mdsys.sdo_geometry(" << SDO_GTYPE_2DPOLYGON << "," << srid_ << ",NULL,";
-           spatial_sql << " mdsys.sdo_elem_info_array(1," << SDO_ETYPE_POLYGON << "," << SDO_INTERPRETATION_RECTANGLE << "),";
-           spatial_sql << " mdsys.sdo_ordinate_array(";
-           spatial_sql << box.minx() << "," << box.miny() << ", ";
-           spatial_sql << box.maxx() << "," << box.maxy() << ")), 'querytype=WINDOW') = 'TRUE'";      
-
-           if (boost::algorithm::ifind_first(query,"where"))
-           {
-              boost::algorithm::ireplace_first(query, "where", spatial_sql.str() + " and");
-           }
-           else if (boost::algorithm::find_first(query,table_name))  
-           {
-              boost::algorithm::ireplace_first(query, table_name , table_name + " " + spatial_sql.str());
-           }
+            boost::algorithm::ireplace_first(query, "WHERE", spatial_sql.str() + " AND ");
         }
-        
-        if (row_limit_ > 0)
+        else if (boost::algorithm::ifind_first(query, table_name))
         {
-           std::string row_limit_string = "rownum < " + row_limit_;
-
-           if (boost::algorithm::ifind_first(query,"where"))
-           {
-              boost::algorithm::ireplace_first(query, "where", row_limit_string + " and");
-           }
-           else if (boost::algorithm::find_first(query,table_name))  
-           {
-              boost::algorithm::ireplace_first(query, table_name , table_name + " " + row_limit_string);
-           }
+            boost::algorithm::ireplace_first(query, table_name, table_name + " " + spatial_sql.str());
         }
-        
-        s << query;
+        else
+        {
+#ifdef MAPNIK_DEBUG
+            std::clog << "OCCI Plugin: cannot determine where to add the spatial filter declaration" << std::endl;
+#endif
+        }
+    }
+
+    if (row_limit_ > 0)
+    {
+        std::string row_limit_string = "rownum < " + row_limit_;
 
+        if (boost::algorithm::ifind_first(query, "WHERE"))
+        {
+            boost::algorithm::ireplace_first(query, "WHERE", row_limit_string + " AND ");
+        }
+        else if (boost::algorithm::ifind_first(query, table_name))
+        {
+            boost::algorithm::ireplace_first(query, table_name, table_name + " " + row_limit_string);
+        }
+        else
+        {
 #ifdef MAPNIK_DEBUG
-        clog << s.str() << endl;
+            std::clog << "OCCI Plugin: cannot determine where to add the row limit declaration" << std::endl;
 #endif
-        
-        return featureset_ptr (new occi_featureset (pool_,
-                                                    s.str(),
-                                                    desc_.get_encoding(),
-                                                    multiple_geometries_,
-                                                    row_prefetch_,
-                                                    props.size()));
+        }
     }
-    
-    return featureset_ptr();
+
+    s << query;
+
+#ifdef MAPNIK_DEBUG
+    std::clog << "OCCI Plugin: " << s.str() << std::endl;
+#endif
+
+    return boost::make_shared<occi_featureset>(pool_,
+                                                conn_,
+                                                s.str(),
+                                                desc_.get_encoding(),
+                                                multiple_geometries_,
+                                                use_connection_pool_,
+                                                row_prefetch_,
+                                                props.size());
 }
 
 featureset_ptr occi_datasource::features_at_point(coord2d const& pt) const
 {
-    if (pool_)
+    if (!is_bound_) bind();
+
+    std::ostringstream s;
+    s << "SELECT " << geometry_field_;
+    std::vector<attribute_descriptor>::const_iterator itr = desc_.get_descriptors().begin();
+    std::vector<attribute_descriptor>::const_iterator end = desc_.get_descriptors().end();
+    unsigned size=0;
+    while (itr != end)
     {
-        std::ostringstream s;
-        s << "select " << geometry_field_ << " as geom";
-        std::vector<attribute_descriptor>::const_iterator itr = desc_.get_descriptors().begin();
-        std::vector<attribute_descriptor>::const_iterator end = desc_.get_descriptors().end();
-        unsigned size=0;
-        while (itr != end)
-        {
-           s <<",\""<< itr->get_name() << "\"";
-           ++itr;
-           ++size;
-        }
+        s << ", " << itr->get_name();
+        ++itr;
+        ++size;
+    }
 
-        s << " from ";
+    s << " FROM ";
 
-        std::string query (table_); 
-        std::string table_name = table_from_sql(query);
+    std::string query (table_);
+    std::string table_name = mapnik::table_from_sql(query);
 
+    if (use_spatial_index_)
+    {
         std::ostringstream spatial_sql;
         spatial_sql << std::setprecision(16);
-        spatial_sql << " where sdo_filter(" << geometry_field_ << ",";
-        spatial_sql << " mdsys.sdo_geometry(" << SDO_GTYPE_2DPOINT << "," << srid_ << ",NULL,";
-        spatial_sql << " mdsys.sdo_elem_info_array(1," << SDO_ETYPE_POINT << "," << SDO_INTERPRETATION_POINT << "),";
-        spatial_sql << " mdsys.sdo_ordinate_array(";
-        spatial_sql << pt.x << "," << pt.y << ")), 'querytype=WINDOW') = 'TRUE'";      
+        spatial_sql << " WHERE SDO_FILTER(" << geometry_field_ << ",";
+        spatial_sql << "  MDSYS.SDO_GEOMETRY(" << SDO_GTYPE_2DPOINT << "," << srid_ << ",NULL,";
+        spatial_sql << "  MDSYS.SDO_ELEM_INFO_ARRAY(1," << SDO_ETYPE_POINT << "," << SDO_INTERPRETATION_POINT << "),";
+        spatial_sql << "  MDSYS.SDO_ORDINATE_ARRAY(";
+        spatial_sql << pt.x << "," << pt.y << ")), 'querytype=WINDOW') = 'TRUE'";
 
-        if (boost::algorithm::ifind_first(query,"where"))
+        if (boost::algorithm::ifind_first(query, "WHERE"))
         {
-           boost::algorithm::ireplace_first(query, "where", spatial_sql.str() + " and");
+            boost::algorithm::ireplace_first(query, "WHERE", spatial_sql.str() + " AND ");
         }
-        else if (boost::algorithm::find_first(query,table_name))  
+        else if (boost::algorithm::ifind_first(query,table_name))
         {
-           boost::algorithm::ireplace_first(query, table_name , table_name + " " + spatial_sql.str());
+            boost::algorithm::ireplace_first(query, table_name, table_name + " " + spatial_sql.str());
         }
-
-        if (row_limit_ > 0)
+        else
         {
-           std::string row_limit_string = "rownum < " + row_limit_;
-
-           if (boost::algorithm::ifind_first(query,"where"))
-           {
-              boost::algorithm::ireplace_first(query, "where", row_limit_string + " and");
-           }
-           else if (boost::algorithm::find_first(query,table_name))  
-           {
-              boost::algorithm::ireplace_first(query, table_name , table_name + " " + row_limit_string);
-           }
+#ifdef MAPNIK_DEBUG
+            std::clog << "OCCI Plugin: cannot determine where to add the spatial filter declaration" << std::endl;
+#endif
         }
-        
-        s << query;
+    }
+
+    if (row_limit_ > 0)
+    {
+        std::string row_limit_string = "rownum < " + row_limit_;
 
+        if (boost::algorithm::ifind_first(query, "WHERE"))
+        {
+            boost::algorithm::ireplace_first(query, "WHERE", row_limit_string + " AND ");
+        }
+        else if (boost::algorithm::ifind_first(query, table_name))
+        {
+            boost::algorithm::ireplace_first(query, table_name, table_name + " " + row_limit_string);
+        }
+        else
+        {
 #ifdef MAPNIK_DEBUG
-        clog << s.str() << endl;
+            std::clog << "OCCI Plugin: cannot determine where to add the row limit declaration" << std::endl;
 #endif
-        
-        return featureset_ptr (new occi_featureset (pool_,
-                                                    s.str(),
-                                                    desc_.get_encoding(),
-                                                    multiple_geometries_,
-                                                    row_prefetch_,
-                                                    size));
+        }
     }
 
-    return featureset_ptr();
+    s << query;
+
+#ifdef MAPNIK_DEBUG
+    std::clog << "OCCI Plugin: " << s.str() << std::endl;
+#endif
+
+    return boost::make_shared<occi_featureset>(pool_,
+                                                conn_,
+                                                s.str(),
+                                                desc_.get_encoding(),
+                                                multiple_geometries_,
+                                                use_connection_pool_,
+                                                row_prefetch_,
+                                                size);
 }
 
diff --git a/plugins/input/occi/occi_datasource.hpp b/plugins/input/occi/occi_datasource.hpp
index 1c04728..53badc2 100644
--- a/plugins/input/occi/occi_datasource.hpp
+++ b/plugins/input/occi/occi_datasource.hpp
@@ -26,7 +26,7 @@
 
 // mapnik
 #include <mapnik/datasource.hpp>
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 #include <mapnik/feature.hpp>
 #include <mapnik/feature_layer_desc.hpp>
 
@@ -39,32 +39,33 @@
 class occi_datasource : public mapnik::datasource 
 {
    public:
-      occi_datasource(mapnik::parameters const& params);
+      occi_datasource(mapnik::parameters const& params, bool bind=true);
       virtual ~occi_datasource ();
       int type() const;
       static std::string name();
       mapnik::featureset_ptr features(mapnik::query const& q) const;
       mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt) const;
-      mapnik::Envelope<double> envelope() const;
+      mapnik::box2d<double> envelope() const;
       mapnik::layer_descriptor get_descriptor() const;
+      void bind() const;
    private:
-      const std::string uri_;
-      const std::string username_;
-      const std::string password_;
-      const std::string table_;
-      const std::string geometry_field_;
-      std::string geometryColumn_;
       int type_;
-      int srid_;
+      mutable std::string table_;
+      mutable std::string fields_;
+      mutable std::string geometry_field_;
+      mutable int srid_;
+      mutable bool srid_initialized_;
       mutable bool extent_initialized_;
-      mutable mapnik::Envelope<double> extent_;
-      const int row_limit_;
-      const int row_prefetch_;
-      mapnik::layer_descriptor desc_;
-      oracle::occi::StatelessConnectionPool* pool_;
+      mutable mapnik::box2d<double> extent_;
+      mutable mapnik::layer_descriptor desc_;
+      int row_limit_;
+      int row_prefetch_;
+      mutable oracle::occi::StatelessConnectionPool* pool_;
+      mutable oracle::occi::Connection* conn_;
+      bool use_connection_pool_;
       bool multiple_geometries_;
       bool use_spatial_index_;
-      static const std::string name_;
+      static const std::string METADATA_TABLE;
 };
 
 
diff --git a/plugins/input/occi/occi_featureset.cpp b/plugins/input/occi/occi_featureset.cpp
index f4d02fd..1eb89a6 100644
--- a/plugins/input/occi/occi_featureset.cpp
+++ b/plugins/input/occi/occi_featureset.cpp
@@ -21,33 +21,30 @@
  *****************************************************************************/
 //$Id$
 
+// mapnik
 #include <mapnik/global.hpp>
 #include <mapnik/datasource.hpp>
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 #include <mapnik/geometry.hpp>
 #include <mapnik/feature.hpp>
 #include <mapnik/feature_layer_desc.hpp>
 #include <mapnik/wkb.hpp>
 #include <mapnik/unicode.hpp>
+#include <mapnik/feature_factory.hpp>
 
 // ogr
 #include "occi_featureset.hpp"
 
-using std::clog;
-using std::endl;
-
 using mapnik::query;
-using mapnik::Envelope;
+using mapnik::box2d;
 using mapnik::CoordTransform;
 using mapnik::Feature;
 using mapnik::feature_ptr;
-using mapnik::point_impl;
-using mapnik::line_string_impl;
-using mapnik::polygon_impl;
-using mapnik::geometry2d;
+using mapnik::geometry_type;
 using mapnik::geometry_utils;
 using mapnik::transcoder;
 using mapnik::datasource_exception;
+using mapnik::feature_factory;
 
 using oracle::occi::Connection;
 using oracle::occi::Statement;
@@ -57,26 +54,33 @@ using oracle::occi::MetaData;
 using oracle::occi::SQLException;
 using oracle::occi::Type;
 using oracle::occi::Number;
+using oracle::occi::Blob;
 
-occi_featureset::occi_featureset(StatelessConnectionPool * pool,
+occi_featureset::occi_featureset(StatelessConnectionPool* pool,
+                                 Connection* conn,
                                  std::string const& sqlstring,
                                  std::string const& encoding,
                                  bool multiple_geometries,
+                                 bool use_connection_pool,
                                  unsigned prefetch_rows,
                                  unsigned num_attrs)
-   : conn_(pool),
-     tr_(new transcoder(encoding)),
+   : tr_(new transcoder(encoding)),
      multiple_geometries_(multiple_geometries),
      num_attrs_(num_attrs),
-     count_(0)
+     feature_id_(1)
 {
+    if (use_connection_pool)
+        conn_.set_pool(pool);
+    else
+        conn_.set_connection(conn, false);
+
     try
     {
         rs_ = conn_.execute_query (sqlstring, prefetch_rows);
     }
     catch (SQLException &ex)
     {
-        throw datasource_exception(ex.getMessage());
+        std::clog << "OCCI Plugin: error processing " << sqlstring << " : " << ex.getMessage() << std::endl;
     }
 }
 
@@ -88,94 +92,106 @@ feature_ptr occi_featureset::next()
 {
     if (rs_ && rs_->next())
     {
-        feature_ptr feature(new Feature(count_));
+        feature_ptr feature(feature_factory::create(feature_id_));
+        ++feature_id_;
 
         boost::scoped_ptr<SDOGeometry> geom (dynamic_cast<SDOGeometry*> (rs_->getObject(1)));
         if (geom.get())
         {
-            convert_geometry (geom.get(), feature);
+            convert_geometry (geom.get(), feature, multiple_geometries_);
         }
 
         std::vector<MetaData> listOfColumns = rs_->getColumnListMetaData();
 
-        for (unsigned int i=1;i<listOfColumns.size();++i)
+        for (unsigned int i = 1; i < listOfColumns.size(); ++i)
         {
-           MetaData columnObj = listOfColumns[i];
+            MetaData columnObj = listOfColumns[i];
 
-           std::string fld_name = columnObj.getString(MetaData::ATTR_NAME);
-           int type_oid = columnObj.getInt(MetaData::ATTR_DATA_TYPE);
+            std::string fld_name = columnObj.getString(MetaData::ATTR_NAME);
+            int type_oid = columnObj.getInt(MetaData::ATTR_DATA_TYPE);
 
-#if 0
-           int type_code = columnObj.getInt(MetaData::ATTR_TYPECODE);
-           if (type_code == OCCI_TYPECODE_OBJECT)
-           {
-               continue;
-           }
-#endif
+            /*   
+            int type_code = columnObj.getInt(MetaData::ATTR_TYPECODE);
+            if (type_code == OCCI_TYPECODE_OBJECT)
+            {
+                continue;
+            }
+            */
 
-           switch (type_oid)
-           {
-           case oracle::occi::OCCIINT:
-           case oracle::occi::OCCIUNSIGNED_INT:
-           {
-              boost::put(*feature,fld_name,rs_->getInt (i + 1));
-              break;
-           }
-           
-           case oracle::occi::OCCIFLOAT:
-           case oracle::occi::OCCIBFLOAT:
-           case oracle::occi::OCCIDOUBLE:
-           case oracle::occi::OCCIBDOUBLE:
-           case oracle::occi::OCCINUMBER:
-           case oracle::occi::OCCI_SQLT_NUM:
-           {
-              boost::put(*feature,fld_name,rs_->getDouble (i + 1));
-              break;
-           }
-
-           case oracle::occi::OCCICHAR:
-           case oracle::occi::OCCISTRING:
-           case oracle::occi::OCCI_SQLT_AFC:
-           case oracle::occi::OCCI_SQLT_AVC:
-           case oracle::occi::OCCI_SQLT_CHR:
-           case oracle::occi::OCCI_SQLT_LVC:
-           case oracle::occi::OCCI_SQLT_STR:
-           case oracle::occi::OCCI_SQLT_VCS:
-           case oracle::occi::OCCI_SQLT_VNU:
-           case oracle::occi::OCCI_SQLT_VBI:
-           case oracle::occi::OCCI_SQLT_VST:
-           case oracle::occi::OCCI_SQLT_RDD:
-           {
-              UnicodeString ustr = tr_->transcode (rs_->getString (i + 1).c_str());
-              boost::put(*feature,fld_name,ustr);
-              break;
-           }
-           
-           case oracle::occi::OCCIDATE:
-           case oracle::occi::OCCITIMESTAMP:
-           case oracle::occi::OCCI_SQLT_DAT:
-           case oracle::occi::OCCI_SQLT_TIMESTAMP:
-           case oracle::occi::OCCI_SQLT_TIMESTAMP_LTZ:
-           case oracle::occi::OCCI_SQLT_TIMESTAMP_TZ:
-           case oracle::occi::OCCIPOBJECT:
-           {
+            switch (type_oid)
+            {
+                case oracle::occi::OCCIBOOL:
+                case oracle::occi::OCCIINT:
+                case oracle::occi::OCCIUNSIGNED_INT:
+                case oracle::occi::OCCIROWID:
+                    boost::put(*feature,fld_name,rs_->getInt (i + 1));
+                    break;
+                case oracle::occi::OCCIFLOAT:
+                case oracle::occi::OCCIBFLOAT:
+                case oracle::occi::OCCIDOUBLE:
+                case oracle::occi::OCCIBDOUBLE:
+                case oracle::occi::OCCINUMBER:
+                case oracle::occi::OCCI_SQLT_NUM:
+                    boost::put(*feature,fld_name,rs_->getDouble (i + 1));
+                    break;
+                case oracle::occi::OCCICHAR:
+                case oracle::occi::OCCISTRING:
+                case oracle::occi::OCCI_SQLT_AFC:
+                case oracle::occi::OCCI_SQLT_AVC:
+                case oracle::occi::OCCI_SQLT_CHR:
+                case oracle::occi::OCCI_SQLT_LVC:
+                case oracle::occi::OCCI_SQLT_RDD:
+                case oracle::occi::OCCI_SQLT_STR:
+                case oracle::occi::OCCI_SQLT_VCS:
+                case oracle::occi::OCCI_SQLT_VNU:
+                case oracle::occi::OCCI_SQLT_VBI:
+                case oracle::occi::OCCI_SQLT_VST:
+                    boost::put(*feature,fld_name,(UnicodeString) tr_->transcode (rs_->getString (i + 1).c_str()));
+                    break;
+                case oracle::occi::OCCIDATE:
+                case oracle::occi::OCCITIMESTAMP:
+                case oracle::occi::OCCIINTERVALDS:
+                case oracle::occi::OCCIINTERVALYM:
+                case oracle::occi::OCCI_SQLT_DAT:
+                case oracle::occi::OCCI_SQLT_DATE:
+                case oracle::occi::OCCI_SQLT_TIME:
+                case oracle::occi::OCCI_SQLT_TIME_TZ:
+                case oracle::occi::OCCI_SQLT_TIMESTAMP:
+                case oracle::occi::OCCI_SQLT_TIMESTAMP_LTZ:
+                case oracle::occi::OCCI_SQLT_TIMESTAMP_TZ:
+                case oracle::occi::OCCI_SQLT_INTERVAL_YM:
+                case oracle::occi::OCCI_SQLT_INTERVAL_DS:
+                case oracle::occi::OCCIANYDATA:
+                case oracle::occi::OCCIBLOB:
+                case oracle::occi::OCCIBFILE:
+                case oracle::occi::OCCIBYTES:
+                case oracle::occi::OCCICLOB:
+                case oracle::occi::OCCIVECTOR:
+                case oracle::occi::OCCIMETADATA:
+                case oracle::occi::OCCIPOBJECT:
+                case oracle::occi::OCCIREF:
+                case oracle::occi::OCCIREFANY:
+                case oracle::occi::OCCISTREAM:
+                case oracle::occi::OCCICURSOR:
+                case oracle::occi::OCCI_SQLT_FILE:
+                case oracle::occi::OCCI_SQLT_CFILE:
+                case oracle::occi::OCCI_SQLT_REF:
+                case oracle::occi::OCCI_SQLT_CLOB:
+                case oracle::occi::OCCI_SQLT_BLOB:
+                case oracle::occi::OCCI_SQLT_RSET:
 #ifdef MAPNIK_DEBUG
-              clog << "unsupported type_oid="<<type_oid<<endl;
+                    std::clog << "OCCI Plugin: unsupported datatype " << occi_enums::resolve_datatype(type_oid)
+                        << " (type_oid=" << type_oid << ")" << std::endl;
 #endif
-              break;
-           }
-
-           default: // shouldn't get here
-           {
+                    break;
+                default: // shouldn't get here
 #ifdef MAPNIK_DEBUG
-              clog << "unknown type_oid="<<type_oid<<endl;
+                    std::clog << "OCCI Plugin: unknown datatype (type_oid=" << type_oid << ")" << std::endl;
 #endif
-              break;
-           }
-           }	  
+                    break;
+            }    
         }
         
-        ++count_;
         return feature;
     }
 
@@ -183,224 +199,178 @@ feature_ptr occi_featureset::next()
 }
 
 
-void occi_featureset::convert_geometry (SDOGeometry* geom, feature_ptr feature)
+void occi_featureset::convert_geometry (SDOGeometry* geom, feature_ptr feature, bool multiple_geometries)
 {
-   int gtype = (int) geom->getSdo_gtype();
-   int dimensions = gtype / 1000;
-   int lrsvalue = (gtype - dimensions * 1000) / 100;
-   int geomtype = (gtype - dimensions * 1000 - lrsvalue * 100); 
+    int gtype = (int) geom->getSdo_gtype();
+    int dimensions = gtype / 1000;
+    int lrsvalue = (gtype - dimensions * 1000) / 100;
+    int geomtype = (gtype - dimensions * 1000 - lrsvalue * 100); 
 
 #if 0
-   clog << "-----------Geometry Object ------------" << endl;
-   clog << "SDO GTYPE = " << gtype << endl;
-   clog << "SDO DIMENSIONS = " << dimensions << endl;
-   clog << "SDO LRS = " << lrsvalue << endl;
-   clog << "SDO GEOMETRY TYPE = " << geomtype << endl;
-
-   Number sdo_srid = geom->getSdo_srid();
-   if (sdo_srid.isNull())
-      clog << "SDO SRID = " << "Null" << endl;
-   else
-      clog << "SDO SRID = " << (int) sdo_srid << endl;
-#endif
-
-   switch (geomtype)
-   {
-   case SDO_GTYPE_POINT:
-       convert_point (geom, feature, dimensions);
-       break;
-   case SDO_GTYPE_LINE:
-       convert_linestring (geom, feature, dimensions);
-       break;
-   case SDO_GTYPE_POLYGON:
-       convert_polygon (geom, feature, dimensions);
-       break;
-   case SDO_GTYPE_MULTIPOINT:
-       convert_multipoint (geom, feature, dimensions);
-       break;
-   case SDO_GTYPE_MULTILINE:
-       convert_multilinestring (geom, feature, dimensions);
-       break;
-   case SDO_GTYPE_MULTIPOLYGON:
-       convert_multipolygon (geom, feature, dimensions);
-       break;
-   case SDO_GTYPE_COLLECTION:
-#ifdef MAPNIK_DEBUG
-       clog << "unsupported <occi> collection" << endl;
-#endif
-       break;
-   case SDO_GTYPE_UNKNOWN:
-   default:
-#ifdef MAPNIK_DEBUG
-       clog << "unknown <occi> geometry_type=" << gtype << endl;
+    clog << "-----------Geometry Object ------------" << endl;
+    clog << "SDO GTYPE = " << gtype << endl;
+    clog << "SDO DIMENSIONS = " << dimensions << endl;
+    clog << "SDO LRS = " << lrsvalue << endl;
+    clog << "SDO GEOMETRY TYPE = " << geomtype << endl;
+
+    Number sdo_srid = geom->getSdo_srid();
+    if (sdo_srid.isNull())
+        clog << "SDO SRID = " << "Null" << endl;
+    else
+        clog << "SDO SRID = " << (int) sdo_srid << endl;
 #endif
-       break;
-   }
-}
-
-void occi_featureset::convert_point (SDOGeometry* geom, feature_ptr feature, int dimensions)
-{
-    SDOPointType* sdopoint = geom->getSdo_point();
-    if (sdopoint && ! sdopoint->isNull())
-    {
-        geometry2d* point = new point_impl;
-
-        point->move_to (sdopoint->getX(), sdopoint->getY());
-
-        feature->add_geometry (point);
-    }
-}
-
-void occi_featureset::convert_linestring (SDOGeometry* geom, feature_ptr feature, int dimensions)
-{
-    const std::vector<Number>& elem_info = geom->getSdo_elem_info();
-    const std::vector<Number>& ordinates = geom->getSdo_ordinates();
-    int ord_size = ordinates.size();
 
-    if (ord_size >= dimensions)
-    {
-        geometry2d * line = new line_string_impl;
-        line->set_capacity (ord_size);
-
-        fill_geometry2d (line, elem_info, ordinates, dimensions, false);
-        
-        feature->add_geometry (line);
-    }
-}
-
-void occi_featureset::convert_polygon (SDOGeometry* geom, feature_ptr feature, int dimensions)
-{
-    const std::vector<Number>& elem_info = geom->getSdo_elem_info();
-    const std::vector<Number>& ordinates = geom->getSdo_ordinates();
-    int ord_size = ordinates.size();
-
-    if (ord_size >= dimensions)
-    {
-        geometry2d * poly = new polygon_impl;
-        poly->set_capacity (ord_size);
-
-        fill_geometry2d (poly, elem_info, ordinates, dimensions, false);
-
-        feature->add_geometry (poly);
-    }
-}
-
-void occi_featureset::convert_multipoint (SDOGeometry* geom, feature_ptr feature, int dimensions)
-{
-    const std::vector<Number>& elem_info = geom->getSdo_elem_info();
-    const std::vector<Number>& ordinates = geom->getSdo_ordinates();
-    int ord_size = ordinates.size();
-
-    if (ord_size >= dimensions)
-    {
-        geometry2d * point = new point_impl;
-
-        fill_geometry2d (point, elem_info, ordinates, dimensions, true);
-
-        feature->add_geometry (point);
-    }
-}
-
-/*
-void occi_featureset::convert_multipoint_2 (SDOGeometry* geom, feature_ptr feature, int dimensions)
-{
-    int num_geometries = geom->getNumGeometries ();
-    for (int i=0;i<num_geometries;i++)
-    {
-        convert_point (static_cast<OGRPoint*>(geom->getGeometryRef (i)), feature);
-    }
-}
-*/
-
-void occi_featureset::convert_multilinestring (SDOGeometry* geom, feature_ptr feature, int dimensions)
-{
     const std::vector<Number>& elem_info = geom->getSdo_elem_info();
     const std::vector<Number>& ordinates = geom->getSdo_ordinates();
-    int ord_size = ordinates.size();
+    const int ordinates_size = (int) ordinates.size();
 
-    if (ord_size >= dimensions)
+    switch (geomtype)
     {
-        geometry2d * line = new line_string_impl;
-        line->set_capacity (ord_size);
+    case SDO_GTYPE_POINT:
+        {
+            SDOPointType* sdopoint = geom->getSdo_point();
+            if (sdopoint && ! sdopoint->isNull())
+            {
+                geometry_type* point = new geometry_type(mapnik::Point);
+                point->move_to (sdopoint->getX(), sdopoint->getY());
+                feature->add_geometry (point);
+            }
+        }
+        break;
+    case SDO_GTYPE_LINE:
+        {
+            if (ordinates_size >= dimensions)
+            {
+                convert_ordinates (feature,
+                                   mapnik::LineString,
+                                   elem_info,
+                                   ordinates,
+                                   dimensions,
+                                   true,   // is_single_geom
+                                   false,  // is_point_type
+                                   false); // multiple_geometries
+            }
+        }
+        break;
+    case SDO_GTYPE_POLYGON:
+        {
+            if (ordinates_size >= dimensions)
+            {
+                convert_ordinates (feature,
+                                   mapnik::Polygon,
+                                   elem_info,
+                                   ordinates,
+                                   dimensions,
+                                   true,   // is_single_geom
+                                   false,  // is_point_type
+                                   false); // multiple_geometries
+            }
+        }
+        break;
+    case SDO_GTYPE_MULTIPOINT:
+        {
+            if (ordinates_size >= dimensions)
+            {
+                const bool is_single_geom = false;
+                const bool is_point_type = true;
+
+                // Todo - force using true as multiple_geometries until we have proper multipoint handling
+                // http://trac.mapnik.org/ticket/458
+            
+                convert_ordinates (feature,
+                                   mapnik::Point,
+                                   elem_info,
+                                   ordinates,
+                                   dimensions,
+                                   false,  // is_single_geom
+                                   true,   // is_point_type
+                                   true);  // multiple_geometries
+            }
+        }
+        break;
+    case SDO_GTYPE_MULTILINE:
+        {
+            if (ordinates_size >= dimensions)
+            {
+                convert_ordinates (feature,
+                                   mapnik::LineString,
+                                   elem_info,
+                                   ordinates,
+                                   dimensions,
+                                   false,  // is_single_geom
+                                   false,  // is_point_type
+                                   multiple_geometries);
+            }
 
-        fill_geometry2d (line, elem_info, ordinates, dimensions, false);
+        }
+        break;
+    case SDO_GTYPE_MULTIPOLYGON:
+        {
+            if (ordinates_size >= dimensions)
+            {
+                convert_ordinates (feature,
+                                   mapnik::Polygon,
+                                   elem_info,
+                                   ordinates,
+                                   dimensions,
+                                   false, // is_single_geom
+                                   false, // is_point_type
+                                   multiple_geometries);
+            }
         
-        feature->add_geometry (line);
-    }
-}
-
-/*
-void occi_featureset::convert_multilinestring_2 (SDOGeometry* geom, feature_ptr feature, int dimensions)
-{
-    int num_geometries = geom->getNumGeometries ();
-    for (int i=0;i<num_geometries;i++)
-    {
-        convert_linestring (static_cast<OGRLineString*>(geom->getGeometryRef (i)), feature);
-    }
-}
-*/
-
-void occi_featureset::convert_multipolygon (SDOGeometry* geom, feature_ptr feature, int dimensions)
-{
-    const std::vector<Number>& elem_info = geom->getSdo_elem_info();
-    const std::vector<Number>& ordinates = geom->getSdo_ordinates();
-    int ord_size = ordinates.size();
-
-    if (ord_size >= dimensions)
-    {
-        geometry2d * poly = new polygon_impl;
-        poly->set_capacity (ord_size);
-
-        fill_geometry2d (poly, elem_info, ordinates, dimensions, false);
-
-        feature->add_geometry (poly);
-    }
-}
-
-/*
-void occi_featureset::convert_multipolygon_2 (SDOGeometry* geom, feature_ptr feature, int dimensions)
-{
-    int num_geometries = geom->getNumGeometries ();
-    for (int i=0;i<num_geometries;i++)
-    {
-        convert_polygon (static_cast<OGRPolygon*>(geom->getGeometryRef (i)), feature);
-    }
-}
-*/
-
-/*
-void occi_featureset::convert_collection (SDOGeometry* geom, feature_ptr feature, int dimensions)
-{
-    int num_geometries = geom->getNumGeometries ();
-    for (int i=0;i<num_geometries;i++)
-    {
-        OGRGeometry* g = geom->getGeometryRef (i);
-        if (g != NULL)
+        }
+        break;
+    case SDO_GTYPE_COLLECTION:
         {
-            convert_geometry (g, feature);
+            if (ordinates_size >= dimensions)
+            {
+                const bool is_single_geom = false;
+                const bool is_point_type = false;
+            
+                convert_ordinates (feature,
+                                   mapnik::Polygon,
+                                   elem_info,
+                                   ordinates,
+                                   dimensions,
+                                   false, // is_single_geom,
+                                   false, // is_point_type
+                                   multiple_geometries);
+            }
         }
+        break;
+    case SDO_GTYPE_UNKNOWN:
+    default:
+#ifdef MAPNIK_DEBUG
+        std::clog << "OCCI Plugin: unknown <occi> " << occi_enums::resolve_gtype(geomtype)
+            << "(gtype=" << gtype << ")" << std::endl;
+#endif
+        break;
     }
 }
-*/
 
-void occi_featureset::fill_geometry2d (geometry2d * geom,
-                                        const std::vector<Number>& elem_info,
-                                        const std::vector<Number>& ordinates,
-                                        const int dimensions,
-                                        const bool is_point_geom)
+void occi_featureset::convert_ordinates (mapnik::feature_ptr feature,
+                                         const mapnik::eGeomType& geom_type,
+                                         const std::vector<Number>& elem_info,
+                                         const std::vector<Number>& ordinates,
+                                         const int dimensions,
+                                         const bool is_single_geom,
+                                         const bool is_point_geom,
+                                         const bool multiple_geometries)
 {
-    int elem_size = elem_info.size();
-    int ord_size = ordinates.size();
-
-    int offset, etype, interp;
+    const int elem_size = elem_info.size();
+    const int ord_size = ordinates.size();
+    
     if (elem_size >= 0)
     {
-        offset = elem_info [0];
-        etype = elem_info [1];
-        interp = elem_info [2];
+        int offset = elem_info [0];
+        int etype = elem_info [1];
+        int interp = elem_info [2];
 
-        if (elem_size > SDO_ELEM_INFO_SIZE)
+        if (! is_single_geom && elem_size > SDO_ELEM_INFO_SIZE)
         {
+            geometry_type* geom = multiple_geometries ? 0 : new geometry_type(geom_type);
+            if (geom) geom->set_capacity (ord_size);
+        
             for (int i = SDO_ELEM_INFO_SIZE; i < elem_size; i+=3)
             {
                 int next_offset = elem_info [i];
@@ -408,17 +378,20 @@ void occi_featureset::fill_geometry2d (geometry2d * geom,
                 int next_interp = elem_info [i + 2];
                 bool is_linear_element = true;
                 bool is_unknown_etype = false;
+                mapnik::eGeomType gtype = mapnik::Point;
 
                 switch (etype)
                 {
                 case SDO_ETYPE_POINT:
                     if (interp == SDO_INTERPRETATION_POINT) {}
                     if (interp > SDO_INTERPRETATION_POINT)  {}
+                    gtype = mapnik::Point;
                     break;
                 
                 case SDO_ETYPE_LINESTRING:
                     if (interp == SDO_INTERPRETATION_STRAIGHT) {}
                     if (interp == SDO_INTERPRETATION_CIRCULAR) {}
+                    gtype = mapnik::LineString;
                     break;
 
                 case SDO_ETYPE_POLYGON:
@@ -427,6 +400,7 @@ void occi_featureset::fill_geometry2d (geometry2d * geom,
                     if (interp == SDO_INTERPRETATION_CIRCULAR)  {}
                     if (interp == SDO_INTERPRETATION_RECTANGLE) {}
                     if (interp == SDO_INTERPRETATION_CIRCLE)    {}
+                    gtype = mapnik::Polygon;
                     break;
 
                 case SDO_ETYPE_COMPOUND_LINESTRING:
@@ -434,6 +408,7 @@ void occi_featureset::fill_geometry2d (geometry2d * geom,
                 case SDO_ETYPE_COMPOUND_POLYGON_INTERIOR:
                     // interp = next ETYPE to consider
                     is_linear_element = false;
+                    gtype = mapnik::Polygon;
                     break;
 
                 case SDO_ETYPE_UNKNOWN:    // unknown
@@ -447,45 +422,69 @@ void occi_featureset::fill_geometry2d (geometry2d * geom,
 
                 if (is_linear_element)
                 {
-                    fill_geometry2d (geom,
-                                     offset - 1,
-                                     next_offset - 1,
-                                     ordinates,
-                                     dimensions,
-                                     is_point_geom);
+                    if (multiple_geometries)
+                    {
+                        if (geom)
+                            feature->add_geometry (geom);
+                            
+                        geom = new geometry_type(gtype);
+                        geom->set_capacity ((next_offset - 1) - (offset - 1 - dimensions));
+                    }
+
+                    fill_geometry_type (geom,
+                                        offset - 1,
+                                        next_offset - 1,
+                                        ordinates,
+                                        dimensions,
+                                        is_point_geom);
                 }
 
                 offset = next_offset;
                 etype = next_etype;
                 interp = next_interp;
             }
+            
+            if (geom)
+            {
+                feature->add_geometry (geom);
+                geom = 0;
+            }
         }
         else
         {
-            fill_geometry2d (geom,
-                             offset - 1,
-                             ord_size,
-                             ordinates,
-                             dimensions,
-                             is_point_geom);
+            geometry_type * geom = new geometry_type(geom_type);
+            geom->set_capacity (ord_size);
+        
+            fill_geometry_type (geom,
+                                offset - 1,
+                                ord_size,
+                                ordinates,
+                                dimensions,
+                                is_point_geom);
+
+            feature->add_geometry (geom);
         }
     }
 }
 
-void occi_featureset::fill_geometry2d (geometry2d * geom,
-                                        const int real_offset,
-                                        const int next_offset,
-                                        const std::vector<Number>& ordinates,
-                                        const int dimensions,
-                                        const bool is_point_geom)
+void occi_featureset::fill_geometry_type (geometry_type * geom,
+                                          const int real_offset,
+                                          const int next_offset,
+                                          const std::vector<Number>& ordinates,
+                                          const int dimensions,
+                                          const bool is_point_geom)
 {
     geom->move_to ((double) ordinates[real_offset], (double) ordinates[real_offset + 1]);
 
     if (is_point_geom)
+    {
         for (int p = real_offset + dimensions; p < next_offset; p += dimensions)
             geom->move_to ((double) ordinates[p], (double) ordinates[p + 1]);
+    }
     else
+    {
         for (int p = real_offset + dimensions; p < next_offset; p += dimensions)
             geom->line_to ((double) ordinates[p], (double) ordinates[p + 1]);
-
+    }
 }
+
diff --git a/plugins/input/occi/occi_featureset.hpp b/plugins/input/occi/occi_featureset.hpp
index b64e806..6536d93 100644
--- a/plugins/input/occi/occi_featureset.hpp
+++ b/plugins/input/occi/occi_featureset.hpp
@@ -26,6 +26,7 @@
 
 // mapnik
 #include <mapnik/datasource.hpp>
+#include <mapnik/geometry.hpp>
 #include <mapnik/unicode.hpp> 
 
 // boost
@@ -38,44 +39,39 @@
 class occi_featureset : public mapnik::Featureset
 {
    public:
-      occi_featureset(oracle::occi::StatelessConnectionPool * pool,
+      occi_featureset(oracle::occi::StatelessConnectionPool* pool,
+                      oracle::occi::Connection* conn,
                       std::string const& sqlstring,
                       std::string const& encoding,
                       bool multiple_geometries,
+                      bool use_connection_pool,
                       unsigned prefetch_rows,
                       unsigned num_attrs);
       virtual ~occi_featureset();
       mapnik::feature_ptr next();
    private:
-      void convert_geometry (SDOGeometry* geom, mapnik::feature_ptr feature);
-      void convert_point (SDOGeometry* geom, mapnik::feature_ptr feature, int dims);
-      void convert_linestring (SDOGeometry* geom, mapnik::feature_ptr feature, int dims);
-      void convert_polygon (SDOGeometry* geom, mapnik::feature_ptr feature, int dims);
-      void convert_multipoint (SDOGeometry* geom, mapnik::feature_ptr feature, int dims);
-      //void convert_multipoint_2 (SDOGeometry* geom, mapnik::feature_ptr feature, int dims);
-      void convert_multilinestring (SDOGeometry* geom, mapnik::feature_ptr feature, int dims);
-      //void convert_multilinestring_2 (SDOGeometry* geom, mapnik::feature_ptr feature, int dims);
-      void convert_multipolygon (SDOGeometry* geom, mapnik::feature_ptr feature, int dims);
-      //void convert_multipolygon_2 (SDOGeometry* geom, mapnik::feature_ptr feature, int dims);
-      //void convert_collection (SDOGeometry* geom, mapnik::feature_ptr feature, int dims);
-      void fill_geometry2d (mapnik::geometry2d * geom,
-                             const std::vector<oracle::occi::Number>& elem_info,
-                             const std::vector<oracle::occi::Number>& ordinates,
-                             const int dimensions,
-                             const bool is_point_geom);
-      void fill_geometry2d (mapnik::geometry2d * geom,
-                             const int real_offset,
-                             const int next_offset,
-                             const std::vector<oracle::occi::Number>& ordinates,
-                             const int dimensions,
-                             const bool is_point_geom);
+      void convert_geometry (SDOGeometry* geom, mapnik::feature_ptr feature, bool multiple_geometries);
+      void convert_ordinates (mapnik::feature_ptr feature,
+                              const mapnik::eGeomType& geom_type,
+                              const std::vector<oracle::occi::Number>& elem_info,
+                              const std::vector<oracle::occi::Number>& ordinates,
+                              const int dimensions,
+                              const bool is_single_geom,
+                              const bool is_point_geom,
+                              const bool multiple_geometries);
+      void fill_geometry_type (mapnik::geometry_type * geom,
+                               const int real_offset,
+                               const int next_offset,
+                               const std::vector<oracle::occi::Number>& ordinates,
+                               const int dimensions,
+                               const bool is_point_geom);
       occi_connection_ptr conn_;
       oracle::occi::ResultSet* rs_;
       boost::scoped_ptr<mapnik::transcoder> tr_;
       const char* fidcolumn_;
       bool multiple_geometries_;
       unsigned num_attrs_;
-      mutable int count_;
+      mutable int feature_id_;
 };
 
 #endif // OCCI_FEATURESET_HPP
diff --git a/plugins/input/occi/occi_types.cpp b/plugins/input/occi/occi_types.cpp
index c73b78a..03e205e 100644
--- a/plugins/input/occi/occi_types.cpp
+++ b/plugins/input/occi/occi_types.cpp
@@ -25,3 +25,71 @@
 
 oracle::occi::Environment* occi_environment::env_ = 0;
 
+
+std::string occi_enums::resolve_gtype(int gtype)
+{
+    switch(gtype)
+    {
+        case SDO_GTYPE_UNKNOWN:        return "SDO_GTYPE_UNKNOWN";
+        case SDO_GTYPE_POINT:          return "SDO_GTYPE_POINT";
+        case SDO_GTYPE_LINE:           return "SDO_GTYPE_LINE";
+        case SDO_GTYPE_POLYGON:        return "SDO_GTYPE_POLYGON";
+        case SDO_GTYPE_MULTIPOINT:     return "SDO_GTYPE_MULTIPOINT";
+        case SDO_GTYPE_MULTILINE:      return "SDO_GTYPE_MULTILINE";
+        case SDO_GTYPE_MULTIPOLYGON:   return "SDO_GTYPE_MULTIPOLYGON";
+        case SDO_GTYPE_COLLECTION:     return "SDO_GTYPE_COLLECTION";
+        default:                       return "<unknown SDO_GTYPE>";
+    }
+}
+
+std::string occi_enums::resolve_etype(int etype)
+{
+    switch(etype)
+    {
+        case SDO_ETYPE_UNKNOWN:                   return "SDO_ETYPE_UNKNOWN";
+        case SDO_ETYPE_POINT:                     return "SDO_ETYPE_POINT";
+        case SDO_ETYPE_LINESTRING:                return "SDO_ETYPE_LINESTRING";
+        case SDO_ETYPE_POLYGON:                   return "SDO_ETYPE_POLYGON";
+        case SDO_ETYPE_POLYGON_INTERIOR:          return "SDO_ETYPE_POLYGON_INTERIOR";
+        case SDO_ETYPE_COMPOUND_LINESTRING:       return "SDO_ETYPE_COMPOUND_LINESTRING";
+        case SDO_ETYPE_COMPOUND_POLYGON:          return "SDO_ETYPE_COMPOUND_POLYGON";
+        case SDO_ETYPE_COMPOUND_POLYGON_INTERIOR: return "SDO_ETYPE_COMPOUND_POLYGON_INTERIOR";
+        default:                                  return "<unknown SDO_ETYPE>";
+    }
+}
+
+std::string occi_enums::resolve_datatype(int type_id)
+{
+    switch(type_id)
+    {
+        case oracle::occi::OCCIINT:                 return "OCCIINT";
+        case oracle::occi::OCCIUNSIGNED_INT:        return "OCCIUNSIGNED_INT";
+        case oracle::occi::OCCIFLOAT:               return "OCCIFLOAT";
+        case oracle::occi::OCCIBFLOAT:              return "OCCIBFLOAT";
+        case oracle::occi::OCCIDOUBLE:              return "OCCIDOUBLE";
+        case oracle::occi::OCCIBDOUBLE:             return "OCCIBDOUBLE";
+        case oracle::occi::OCCINUMBER:              return "OCCINUMBER";
+        case oracle::occi::OCCI_SQLT_NUM:           return "OCCI_SQLT_NUM";
+        case oracle::occi::OCCICHAR:                return "OCCICHAR";
+        case oracle::occi::OCCISTRING:              return "OCCISTRING";
+        case oracle::occi::OCCI_SQLT_AFC:           return "OCCI_SQLT_AFC";
+        case oracle::occi::OCCI_SQLT_AVC:           return "OCCI_SQLT_AVC";
+        case oracle::occi::OCCI_SQLT_CHR:           return "OCCI_SQLT_CHR";
+        case oracle::occi::OCCI_SQLT_LVC:           return "OCCI_SQLT_LVC";
+        case oracle::occi::OCCI_SQLT_STR:           return "OCCI_SQLT_STR";
+        case oracle::occi::OCCI_SQLT_VCS:           return "OCCI_SQLT_VCS";
+        case oracle::occi::OCCI_SQLT_VNU:           return "OCCI_SQLT_VNU";
+        case oracle::occi::OCCI_SQLT_VBI:           return "OCCI_SQLT_VBI";
+        case oracle::occi::OCCI_SQLT_VST:           return "OCCI_SQLT_VST";
+        case oracle::occi::OCCI_SQLT_RDD:           return "OCCI_SQLT_RDD";
+        case oracle::occi::OCCIDATE:                return "OCCIDATE";
+        case oracle::occi::OCCITIMESTAMP:           return "OCCITIMESTAMP";
+        case oracle::occi::OCCI_SQLT_DAT:           return "OCCI_SQLT_DAT";
+        case oracle::occi::OCCI_SQLT_TIMESTAMP:     return "OCCI_SQLT_TIMESTAMP";
+        case oracle::occi::OCCI_SQLT_TIMESTAMP_LTZ: return "OCCI_SQLT_TIMESTAMP_LTZ";
+        case oracle::occi::OCCI_SQLT_TIMESTAMP_TZ:  return "OCCI_SQLT_TIMESTAMP_TZ";
+        case oracle::occi::OCCIPOBJECT:             return "OCCIPOBJECT";
+        default:                                    return "<unknown ATTR_DATA_TYPE>";
+    }
+}
+
diff --git a/plugins/input/occi/occi_types.hpp b/plugins/input/occi/occi_types.hpp
index c5b9a36..548c632 100644
--- a/plugins/input/occi/occi_types.hpp
+++ b/plugins/input/occi/occi_types.hpp
@@ -35,16 +35,14 @@
 #include "spatial_classesm.h"
 
 // check for oracle support
-#if OCCI_MAJOR_VERSION == 10 && OCCI_MINOR_VERSION >= 1
-  //     Only ORACLE 10g (>= 10.2.0.X) is supported !
+#if OCCI_MAJOR_VERSION >= 10 && OCCI_MINOR_VERSION >= 1
+  //     We have at least ORACLE 10g >= 10.2.0.X
 #else
-  #error Only ORACLE 10g (>= 10.2.0.X) is supported !
+  #error Only ORACLE 10g >= 10.2.0.X is supported !
 #endif
 
 
-#define SDO_GEOMETRY_METADATA_TABLE     "ALL_SDO_GEOM_METADATA"
-
-
+// geometry types definitions
 enum
 {
     SDO_GTYPE_UNKNOWN                   = 0,
@@ -93,7 +91,7 @@ public:
         if (env_ == 0)
         {
 #ifdef MAPNIK_DEBUG
-            std::clog << "occi_environment constructor" << std::endl;
+            std::clog << "OCCI Plugin: occi_environment constructor" << std::endl;
 #endif
 
             int mode = oracle::occi::Environment::OBJECT
@@ -117,7 +115,7 @@ private:
         if (env_)
         {
 #ifdef MAPNIK_DEBUG
-            std::clog << "occi_environment destructor" << std::endl;
+            std::clog << "OCCI Plugin: occi_environment destructor" << std::endl;
 #endif
 
             oracle::occi::Environment::terminateEnvironment (env_);
@@ -132,19 +130,39 @@ private:
 class occi_connection_ptr
 {
 public:
-    occi_connection_ptr (oracle::occi::StatelessConnectionPool* pool)
-        : pool_ (pool),
-          conn_ (pool->getConnection ()),
+    explicit occi_connection_ptr ()
+        : env_ (occi_environment::get_environment()),
+          pool_ (0),
+          conn_ (0),
           stmt_ (0),
-          rs_ (0)
+          rs_ (0),
+          owns_connection_ (false)
     {
     }
-    
+
     ~occi_connection_ptr ()
     {
         close_query (true);
     }
 
+    void set_pool(oracle::occi::StatelessConnectionPool* pool)
+    {
+        close_query (true);
+    
+        pool_ = pool;
+        conn_ = pool_->getConnection();
+        owns_connection_ = true;
+    }
+
+    void set_connection(oracle::occi::Connection* conn, bool owns_connection)
+    {
+        close_query (true);
+    
+        pool_ = 0;
+        conn_ = conn;
+        owns_connection_ = owns_connection;
+    }
+
     oracle::occi::ResultSet* execute_query (const std::string& s, const unsigned prefetch = 0)
     {
         close_query (false);
@@ -187,16 +205,40 @@ private:
             
             if (release_connection)
             {
-                pool_->releaseConnection (conn_);
+                if (pool_)
+                {
+                    pool_->releaseConnection (conn_);
+                }
+                else
+                {
+                    if (owns_connection_)
+                    {
+                        env_->terminateConnection(conn_);
+                    }
+                }
+                
                 conn_ = 0;
             }
         }
     }
 
+    oracle::occi::Environment* env_;
     oracle::occi::StatelessConnectionPool* pool_;
     oracle::occi::Connection* conn_;
     oracle::occi::Statement* stmt_;
     oracle::occi::ResultSet* rs_;
+    bool owns_connection_;
 };
 
+
+class occi_enums
+{
+public:
+
+    static std::string resolve_gtype(int gtype);
+    static std::string resolve_etype(int etype);
+    static std::string resolve_datatype(int type_id);
+};
+
+
 #endif // OCCI_TYPES_HPP
diff --git a/plugins/input/ogr/SConscript b/plugins/input/ogr/SConscript
deleted file mode 100644
index 8eddd99..0000000
--- a/plugins/input/ogr/SConscript
+++ /dev/null
@@ -1,49 +0,0 @@
-#
-# This file is part of Mapnik (c++ mapping toolkit)
-#
-# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-# $Id$
-
-Import ('env')
-
-prefix = env['PREFIX']
-install_prefix = env['DESTDIR'] + '/' + prefix
-
-ogr_src = Split(
-	"""
-	ogr_converter.cpp
-	ogr_datasource.cpp
-	ogr_featureset.cpp      
-	ogr_index_featureset.cpp
-	"""
-        )
-
-libraries = [env['PLUGINS']['ogr']['lib']]
-
-if env['PLATFORM'] == 'Darwin':
-    if env['HAS_BOOST_SYSTEM']:
-        boost_system = 'boost_system%s' % env['BOOST_APPEND']
-        libraries.append(boost_system)
-    libraries.append('mapnik')
-    libraries.append(env['ICU_LIB_NAME'])
-    libraries.append('boost_iostreams%s' % env['BOOST_APPEND'])
-
-ogr_inputdriver = env.SharedLibrary('ogr', source=ogr_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries)
-
-env.Install(install_prefix + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME'] + '/input', ogr_inputdriver)
-env.Alias('install', install_prefix + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME'] + '/input')
diff --git a/plugins/input/ogr/build.py b/plugins/input/ogr/build.py
new file mode 100644
index 0000000..f07b870
--- /dev/null
+++ b/plugins/input/ogr/build.py
@@ -0,0 +1,57 @@
+#
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+
+Import ('env')
+
+prefix = env['PREFIX']
+
+plugin_env = env.Clone()
+
+ogr_src = Split(
+  """
+      ogr_converter.cpp
+      ogr_datasource.cpp
+      ogr_featureset.cpp      
+      ogr_index_featureset.cpp
+  """
+        )
+
+plugin_env['LIBS'] = [env['PLUGINS']['ogr']['lib']]
+
+# Link Library to Dependencies
+plugin_env['LIBS'].append('mapnik2')
+plugin_env['LIBS'].append(env['ICU_LIB_NAME'])
+plugin_env['LIBS'].append('boost_system%s' % env['BOOST_APPEND'])
+plugin_env['LIBS'].append('boost_filesystem%s' % env['BOOST_APPEND'])
+
+if env['RUNTIME_LINK'] == 'static':
+    cmd = 'gdal-config --dep-libs'
+    plugin_env.ParseConfig(cmd)
+
+input_plugin = plugin_env.SharedLibrary('../ogr', source=ogr_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LINKFLAGS=env['CUSTOM_LDFLAGS'])
+
+# if the plugin links to libmapnik2 ensure it is built first
+Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME']))
+
+if 'uninstall' not in COMMAND_LINE_TARGETS:
+    env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin)
+    env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST'])
diff --git a/plugins/input/ogr/ogr_converter.cpp b/plugins/input/ogr/ogr_converter.cpp
index 5cb5e1c..e6b9f84 100644
--- a/plugins/input/ogr/ogr_converter.cpp
+++ b/plugins/input/ogr/ogr_converter.cpp
@@ -22,7 +22,7 @@
 //$Id$
 
 #include <mapnik/global.hpp>
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 #include <mapnik/geometry.hpp>
 #include <mapnik/feature.hpp>
 #include <mapnik/feature_layer_desc.hpp>
@@ -32,22 +32,9 @@
 // ogr
 #include "ogr_converter.hpp"
 
-using std::clog;
-using std::endl;
-
 using mapnik::feature_ptr;
 using mapnik::geometry_utils;
-using mapnik::geometry2d;
-using mapnik::point_impl;
-using mapnik::line_string_impl;
-using mapnik::polygon_impl;
-
-/*
-using mapnik::query;
-using mapnik::Envelope;
-using mapnik::CoordTransform;
-using mapnik::Feature;
-*/
+using mapnik::geometry_type;
 
 void ogr_converter::convert_geometry (OGRGeometry* geom, feature_ptr feature, bool multiple_geometries)
 {
@@ -94,7 +81,7 @@ void ogr_converter::convert_geometry (OGRGeometry* geom, feature_ptr feature, bo
   case wkbUnknown:
   default:
 #ifdef MAPNIK_DEBUG
-      clog << "unknown <ogr> geometry_type=" << wkbFlatten (geom->getGeometryType()) << endl;
+      std::clog << "OGR Plugin: unknown <ogr> geometry_type=" << wkbFlatten (geom->getGeometryType()) << std::endl;
 #endif
       break;
   }  
@@ -102,7 +89,7 @@ void ogr_converter::convert_geometry (OGRGeometry* geom, feature_ptr feature, bo
 
 void ogr_converter::convert_point (OGRPoint* geom, feature_ptr feature)
 {
-    geometry2d* point = new point_impl;
+    geometry_type * point = new geometry_type(mapnik::Point);
     point->move_to (geom->getX(), geom->getY());
     feature->add_geometry (point);
 }
@@ -110,7 +97,7 @@ void ogr_converter::convert_point (OGRPoint* geom, feature_ptr feature)
 void ogr_converter::convert_linestring (OGRLineString* geom, feature_ptr feature)
 {
     int num_points = geom->getNumPoints ();
-    geometry2d * line = new line_string_impl;
+    geometry_type * line = new geometry_type(mapnik::LineString);
     line->set_capacity (num_points);
     line->move_to (geom->getX (0), geom->getY (0));
     for (int i=1;i<num_points;++i)
@@ -132,7 +119,7 @@ void ogr_converter::convert_polygon (OGRPolygon* geom, feature_ptr feature)
         capacity += interior->getNumPoints ();
     }    
     
-    geometry2d * poly = new polygon_impl;
+    geometry_type * poly = new geometry_type(mapnik::Polygon);
     poly->set_capacity (num_points + capacity);
     poly->move_to (exterior->getX (0), exterior->getY (0));
     for (int i=1;i<num_points;++i)
@@ -155,13 +142,13 @@ void ogr_converter::convert_polygon (OGRPolygon* geom, feature_ptr feature)
 void ogr_converter::convert_multipoint (OGRMultiPoint* geom, feature_ptr feature)
 {
     int num_geometries = geom->getNumGeometries ();
-    geometry2d* point = new point_impl;
-
+    geometry_type * point = new geometry_type(mapnik::Point);
+    
     for (int i=0;i<num_geometries;i++)
     {
         OGRPoint* ogrpoint = static_cast<OGRPoint*>(geom->getGeometryRef (i));
         point->move_to (ogrpoint->getX(), ogrpoint->getY());
-        //Todo - need to accept multiple points per point_impl
+        //Todo - need to accept multiple points per mapnik::Point
     }
     
     // Todo - this only gets last point
@@ -188,9 +175,9 @@ void ogr_converter::convert_multilinestring (OGRMultiLineString* geom, feature_p
         num_points += ls->getNumPoints ();
     }
 
-    geometry2d * line = new line_string_impl;
+    geometry_type * line = new geometry_type(mapnik::LineString);
     line->set_capacity (num_points);
-
+    
     for (int i=0;i<num_geometries;i++)
     {
         OGRLineString* ls = static_cast<OGRLineString*>(geom->getGeometryRef (i));
@@ -231,7 +218,7 @@ void ogr_converter::convert_multipolygon (OGRMultiPolygon* geom, feature_ptr fea
         }    
     }
 
-    geometry2d * poly = new polygon_impl;
+    geometry_type * poly = new geometry_type(mapnik::Polygon);
     poly->set_capacity (capacity);
 
     for (int i=0;i<num_geometries;i++)
diff --git a/plugins/input/ogr/ogr_datasource.cpp b/plugins/input/ogr/ogr_datasource.cpp
index a7cc5ef..0380a0b 100644
--- a/plugins/input/ogr/ogr_datasource.cpp
+++ b/plugins/input/ogr/ogr_datasource.cpp
@@ -36,15 +36,12 @@
 // boost
 #include <boost/algorithm/string.hpp>
 
-using std::clog;
-using std::endl;
-
 using mapnik::datasource;
 using mapnik::parameters;
 
 DATASOURCE_PLUGIN(ogr_datasource)
 
-using mapnik::Envelope;
+using mapnik::box2d;
 using mapnik::coord2d;
 using mapnik::query;
 using mapnik::featureset_ptr;
@@ -55,63 +52,129 @@ using mapnik::filter_in_box;
 using mapnik::filter_at_point;
 
 
-ogr_datasource::ogr_datasource(parameters const& params)
+ogr_datasource::ogr_datasource(parameters const& params, bool bind)
    : datasource(params),
      extent_(),
      type_(datasource::Vector),
      desc_(*params.get<std::string>("type"), *params.get<std::string>("encoding","utf-8")),
      indexed_(false)
 {
-   OGRRegisterAll();
-
    boost::optional<std::string> file = params.get<std::string>("file");
-   if (!file) throw datasource_exception("missing <file> parameter");
+   boost::optional<std::string> string = params.get<std::string>("string");
+   if (!file && !string) throw datasource_exception("missing <file> or <string> parameter");
 
-   multiple_geometries_ = *params_.get<mapnik::boolean>("multiple_geometries",false);
+   multiple_geometries_ = *params.get<mapnik::boolean>("multiple_geometries",false);
 
-   boost::optional<std::string> base = params.get<std::string>("base");
-   if (base)
-      dataset_name_ = *base + "/" + *file;
+   if (string)
+   {
+       dataset_name_ = *string;
+   }
    else
-      dataset_name_ = *file;
+   {
+       boost::optional<std::string> base = params.get<std::string>("base");
+       if (base)
+          dataset_name_ = *base + "/" + *file;
+       else
+          dataset_name_ = *file;
+   }
+      
+   if (bind)
+   {
+      this->bind();
+   }
+}
+
+ogr_datasource::~ogr_datasource()
+{
+    if (is_bound_) 
+    {
+        OGRDataSource::DestroyDataSource (dataset_);
+    }
+}
 
+void ogr_datasource::bind() const
+{
+   if (is_bound_) return;   
+
+   // initialize ogr formats
+   OGRRegisterAll();
+    
    // open ogr driver   
    dataset_ = OGRSFDriverRegistrar::Open ((dataset_name_).c_str(), FALSE);
    if (!dataset_) 
    {
       std::string err = CPLGetLastErrorMsg();
-      if( err.size() == 0 )
-      {
-         throw datasource_exception("Connection failed: " + dataset_name_ + " was not found or is not a supported format");
+      if( err.size() == 0 ) {
+         throw datasource_exception("OGR Plugin: connection failed: " + dataset_name_ + " was not found or is not a supported format");
       } else {
-         throw datasource_exception(err);
+         throw datasource_exception("OGR Plugin: " + err);
       }
    } 
 
    // initialize layer
-   boost::optional<std::string> layer = params.get<std::string>("layer");
-   if (!layer) 
+   
+   boost::optional<std::string> layer_by_name = params_.get<std::string>("layer");
+   boost::optional<unsigned> layer_by_index = params_.get<unsigned>("layer_by_index");
+   
+   if (layer_by_name && layer_by_index)
+       throw datasource_exception("OGR Plugin: you can only select an ogr layer by name ('layer' parameter) or by number ('layer_by_index' parameter), do not supply both parameters" );
+
+   if (layer_by_name) 
    {
-      std::string s ("missing <layer> parameter, available layers are: ");
+       layerName_ = *layer_by_name;  
+       layer_ = dataset_->GetLayerByName (layerName_.c_str());
+   }
+   else if (layer_by_index)
+   { 
+       unsigned num_layers = dataset_->GetLayerCount();
+       if (*layer_by_index >= num_layers)
+       {
+           std::ostringstream s;
+           s << "OGR Plugin: only ";
+           s << num_layers;
+           s << " layer(s) exist, cannot find layer by index '" << *layer_by_index << "'";
+       
+           throw datasource_exception(s.str());
+       }
+       OGRLayer  *ogr_layer = dataset_->GetLayer(*layer_by_index);
+       if (ogr_layer)
+       {
+           OGRFeatureDefn* def = ogr_layer->GetLayerDefn();
+           if (def != 0) { 
+              layerName_ = def->GetName();
+              layer_ = ogr_layer;
+           }
+       }
+   }
+   else
+   {
+      std::ostringstream s;
+      s << "OGR Plugin: missing <layer> or <layer_by_index> parameter, available layers are: ";
       unsigned num_layers = dataset_->GetLayerCount();
+      bool found = false;
       for (unsigned i = 0; i < num_layers; ++i )
       {
          OGRLayer  *ogr_layer = dataset_->GetLayer(i);
          OGRFeatureDefn* def = ogr_layer->GetLayerDefn();
          if (def != 0) { 
-            s += " '";
-            s += def->GetName();
-            s += "' ";
-         } else {
-            s += "No layers found!";
+            found = true;
+            s << " '" << def->GetName() << "' ";
          }
       }
-      throw datasource_exception(s);
+      if (!found) {
+          s << "None (no layers were found in dataset)";
+      }
+      throw datasource_exception(s.str());
+   }
+
+   if (!layer_)
+   {
+       std::string s("OGR Plugin: ");
+       if (layer_by_name) s += "cannot find layer by name '" + *layer_by_name;
+       else if (layer_by_index) s += "cannot find layer by index number '" + *layer_by_index;
+       s += "' in dataset '" + dataset_name_ + "'";
+       throw datasource_exception(s);
    }
-   
-   layerName_ = *layer;  
-   layer_ = dataset_->GetLayerByName (layerName_.c_str());
-   if (! layer_) throw datasource_exception("cannot find <layer> in dataset");
    
    // initialize envelope
    OGREnvelope envelope;
@@ -119,15 +182,23 @@ ogr_datasource::ogr_datasource(parameters const& params)
    extent_.init (envelope.MinX, envelope.MinY, envelope.MaxX, envelope.MaxY);
 
    // scan for index file
+   // TODO - layer names don't match dataset name, so this will break for
+   // any layer types of ogr than shapefiles, etc
+   // fix here and in ogrindex
    size_t breakpoint = dataset_name_.find_last_of (".");
    if (breakpoint == std::string::npos) breakpoint = dataset_name_.length();
-   index_name_ = dataset_name_.substr(0, breakpoint) + ".index";
+   index_name_ = dataset_name_.substr(0, breakpoint) + ".ogrindex";
    std::ifstream index_file (index_name_.c_str(), std::ios::in | std::ios::binary);
    if (index_file)
    {
       indexed_=true;
       index_file.close();
    }
+   // enable this warning once the ogrindex tool is a bit more stable/mature
+   //else
+   /*{
+      std::clog << "### Notice: no ogrindex file found for " + dataset_name_ + ", use the 'ogrindex' program to build an index for faster rendering\n";
+   }*/
 
    // deal with attributes descriptions
    OGRFeatureDefn* def = layer_->GetLayerDefn ();
@@ -165,7 +236,7 @@ ogr_datasource::ogr_datasource(parameters const& params)
            case OFTStringList:
            case OFTWideStringList: // deprecated !
 #ifdef MAPNIK_DEBUG
-               clog << "unhandled type_oid=" << type_oid << endl;
+               std::clog << "OGR Plugin: unhandled type_oid=" << type_oid << std::endl;
 #endif
                break;
 
@@ -173,24 +244,21 @@ ogr_datasource::ogr_datasource(parameters const& params)
            case OFTTime:
            case OFTDateTime: // unhandled !
 #ifdef MAPNIK_DEBUG
-               clog << "unhandled type_oid=" << type_oid << endl;
+               std::clog << "OGR Plugin: unhandled type_oid=" << type_oid << std::endl;
 #endif
                desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Object));
                break;
 
            default: // unknown
 #ifdef MAPNIK_DEBUG
-               clog << "unknown type_oid=" << type_oid << endl;
+               std::clog << "OGR Plugin: unknown type_oid=" << type_oid << std::endl;
 #endif
                break;
            }
        }
    }
-}
-
-ogr_datasource::~ogr_datasource()
-{
-    OGRDataSource::DestroyDataSource (dataset_);
+   
+   is_bound_ = true;
 }
 
 std::string ogr_datasource::name()
@@ -203,20 +271,28 @@ int ogr_datasource::type() const
    return type_;
 }
 
-Envelope<double> ogr_datasource::envelope() const
+box2d<double> ogr_datasource::envelope() const
 {
+   if (!is_bound_) bind();
    return extent_;
 }
 
 layer_descriptor ogr_datasource::get_descriptor() const
 {
+   if (!is_bound_) bind();
    return desc_;
 }
 
 featureset_ptr ogr_datasource::features(query const& q) const
 {
+   if (!is_bound_) bind();
+   
    if (dataset_ && layer_)
    {
+
+        // TODO - actually filter fields!
+        // http://trac.osgeo.org/gdal/wiki/rfc29_desired_fields
+        // http://trac.osgeo.org/gdal/wiki/rfc28_sqlfunc
 #if 0
         std::ostringstream s;
             
@@ -228,7 +304,7 @@ featureset_ptr ogr_datasource::features(query const& q) const
         {
            s <<",\""<<*pos<<"\"";
            ++pos;
-        }	 
+        }   
         s << " from " << layerName_ ;
 
         // execute existing SQL
@@ -263,6 +339,8 @@ featureset_ptr ogr_datasource::features(query const& q) const
 
 featureset_ptr ogr_datasource::features_at_point(coord2d const& pt) const
 {
+   if (!is_bound_) bind();
+   
    if (dataset_ && layer_)
    {
         if (indexed_)
@@ -279,8 +357,8 @@ featureset_ptr ogr_datasource::features_at_point(coord2d const& pt) const
         else
         {
             OGRPoint point;
-	        point.setX (pt.x);
-	        point.setY (pt.y);
+            point.setX (pt.x);
+            point.setY (pt.y);
 
             return featureset_ptr(new ogr_featureset (*dataset_,
                                                       *layer_,
diff --git a/plugins/input/ogr/ogr_datasource.hpp b/plugins/input/ogr/ogr_datasource.hpp
index 4657d33..fee15ff 100644
--- a/plugins/input/ogr/ogr_datasource.hpp
+++ b/plugins/input/ogr/ogr_datasource.hpp
@@ -38,25 +38,26 @@
 class ogr_datasource : public mapnik::datasource 
 {
    public:
-      ogr_datasource(mapnik::parameters const& params);
+      ogr_datasource(mapnik::parameters const& params, bool bind=true);
       virtual ~ogr_datasource ();
       int type() const;
       static std::string name();
       mapnik::featureset_ptr features(mapnik::query const& q) const;
       mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt) const;
-      mapnik::Envelope<double> envelope() const;
+      mapnik::box2d<double> envelope() const;
       mapnik::layer_descriptor get_descriptor() const;
+      void bind() const;
    private:
-      mapnik::Envelope<double> extent_;
+      mutable mapnik::box2d<double> extent_;
       int type_;
       std::string dataset_name_;
-      std::string index_name_;
-      OGRDataSource* dataset_;
-      OGRLayer* layer_;
-      std::string layerName_;
-      mapnik::layer_descriptor desc_;
+      mutable std::string index_name_;
+      mutable OGRDataSource* dataset_;
+      mutable OGRLayer* layer_;
+      mutable std::string layerName_;
+      mutable mapnik::layer_descriptor desc_;
       bool multiple_geometries_;
-      bool indexed_;
+      mutable bool indexed_;
 };
 
 
diff --git a/plugins/input/ogr/ogr_featureset.cpp b/plugins/input/ogr/ogr_featureset.cpp
index 8e8e141..3ea72a1 100644
--- a/plugins/input/ogr/ogr_featureset.cpp
+++ b/plugins/input/ogr/ogr_featureset.cpp
@@ -23,28 +23,27 @@
 
 #include <mapnik/global.hpp>
 #include <mapnik/datasource.hpp>
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 #include <mapnik/geometry.hpp>
 #include <mapnik/feature.hpp>
 #include <mapnik/feature_layer_desc.hpp>
 #include <mapnik/wkb.hpp>
 #include <mapnik/unicode.hpp>
+#include <mapnik/feature_factory.hpp>
 
 // ogr
 #include "ogr_featureset.hpp"
 #include "ogr_converter.hpp"
 #include "ogr_feature_ptr.hpp"
 
-using std::clog;
-using std::endl;
-
 using mapnik::query;
-using mapnik::Envelope;
+using mapnik::box2d;
 using mapnik::CoordTransform;
 using mapnik::Feature;
 using mapnik::feature_ptr;
 using mapnik::geometry_utils;
 using mapnik::transcoder;
+using mapnik::feature_factory;
 
 
 ogr_featureset::ogr_featureset(OGRDataSource & dataset,
@@ -65,14 +64,14 @@ ogr_featureset::ogr_featureset(OGRDataSource & dataset,
 
 ogr_featureset::ogr_featureset(OGRDataSource & dataset,
                                OGRLayer & layer,
-                               const mapnik::Envelope<double> & extent,
+                               const mapnik::box2d<double> & extent,
                                const std::string& encoding,
                                const bool multiple_geometries)
    : dataset_(dataset),
      layer_(layer),
      layerdef_(layer.GetLayerDefn()),
      tr_(new transcoder(encoding)),
-     fidcolumn_(layer_.GetFIDColumn ()),
+     fidcolumn_(layer_.GetFIDColumn()),
      multiple_geometries_(multiple_geometries),
      count_(0)
 {
@@ -86,92 +85,100 @@ ogr_featureset::~ogr_featureset() {}
 
 feature_ptr ogr_featureset::next()
 {
-   ogr_feature_ptr feat (layer_.GetNextFeature());
-   if ((*feat) != NULL)
-   {
-      OGRGeometry* geom=(*feat)->GetGeometryRef();
-      if (!geom->IsEmpty())
-      {
-          feature_ptr feature(new Feature((*feat)->GetFID()));
-
-          ogr_converter::convert_geometry (geom, feature, multiple_geometries_);
-          ++count_;
-
-          int fld_count = layerdef_->GetFieldCount();
-          for (int i = 0; i < fld_count; i++)
-          {
-              OGRFieldDefn* fld = layerdef_->GetFieldDefn (i);
-              OGRFieldType type_oid = fld->GetType ();
-              std::string fld_name = fld->GetNameRef ();
-
-              switch (type_oid)
-              {
-               case OFTInteger:
-               {
+    ogr_feature_ptr feat (layer_.GetNextFeature());
+    if ((*feat) != NULL)
+    {
+        // ogr feature ids start at 0, so add one to stay
+        // consistent with other mapnik datasources that start at 1
+        int feature_id = ((*feat)->GetFID() + 1);
+        feature_ptr feature(feature_factory::create(feature_id));
+        
+        OGRGeometry* geom=(*feat)->GetGeometryRef();
+        if (geom && !geom->IsEmpty())
+        {
+            ogr_converter::convert_geometry (geom, feature, multiple_geometries_);
+        }
+#ifdef MAPNIK_DEBUG
+        else
+        {
+            std::clog << "### Warning: feature with null geometry: " << (*feat)->GetFID() << "\n";
+        }
+#endif
+        ++count_;
+        
+        int fld_count = layerdef_->GetFieldCount();
+        for (int i = 0; i < fld_count; i++)
+        {
+            OGRFieldDefn* fld = layerdef_->GetFieldDefn (i);
+            OGRFieldType type_oid = fld->GetType ();
+            std::string fld_name = fld->GetNameRef ();
+        
+            switch (type_oid)
+            {
+                case OFTInteger:
+                {
                    boost::put(*feature,fld_name,(*feat)->GetFieldAsInteger (i));
                    break;
-               }
-
-               case OFTReal:
-               {
+                }
+                
+                case OFTReal:
+                {
                    boost::put(*feature,fld_name,(*feat)->GetFieldAsDouble (i));
                    break;
-               }
+                }
                        
-               case OFTString:
-               case OFTWideString:     // deprecated !
-               {
+                case OFTString:
+                case OFTWideString:     // deprecated !
+                {
                    UnicodeString ustr = tr_->transcode((*feat)->GetFieldAsString (i));
                    boost::put(*feature,fld_name,ustr);
                    break;
-               }
-
-               case OFTIntegerList:
-               case OFTRealList:
-               case OFTStringList:
-               case OFTWideStringList: // deprecated !
-               {
-#ifdef MAPNIK_DEBUG
-                   clog << "unhandled type_oid=" << type_oid << endl;
-#endif
+                }
+                
+                case OFTIntegerList:
+                case OFTRealList:
+                case OFTStringList:
+                case OFTWideStringList: // deprecated !
+                {
+                #ifdef MAPNIK_DEBUG
+                   std::clog << "OGR Plugin: unhandled type_oid=" << type_oid << std::endl;
+                #endif
                    break;
-               }
-
-               case OFTBinary:
-               {
-#ifdef MAPNIK_DEBUG
-                   clog << "unhandled type_oid=" << type_oid << endl;
-#endif
+                }
+                
+                case OFTBinary:
+                {
+                #ifdef MAPNIK_DEBUG
+                   std::clog << "OGR Plugin: unhandled type_oid=" << type_oid << std::endl;
+                #endif
                    //boost::put(*feature,name,feat->GetFieldAsBinary (i, size));
                    break;
-               }
+                }
                    
-               case OFTDate:
-               case OFTTime:
-               case OFTDateTime:       // unhandled !
-               {
-#ifdef MAPNIK_DEBUG
-                   clog << "unhandled type_oid=" << type_oid << endl;
-#endif
+                case OFTDate:
+                case OFTTime:
+                case OFTDateTime:       // unhandled !
+                {
+                #ifdef MAPNIK_DEBUG
+                   std::clog << "OGR Plugin: unhandled type_oid=" << type_oid << std::endl;
+                #endif
                    break;
-               }
-
-               default: // unknown
-               {
-#ifdef MAPNIK_DEBUG
-                   clog << "unknown type_oid=" << type_oid << endl;
-#endif
+                }
+                
+                default: // unknown
+                {
+                #ifdef MAPNIK_DEBUG
+                   std::clog << "OGR Plugin: unknown type_oid=" << type_oid << std::endl;
+                #endif
                    break;
-               }
-              }
-          }
-      
-          return feature;
-      }
-   }
+                }
+            }
+        }
+        return feature;
+    }
 
 #ifdef MAPNIK_DEBUG
-   clog << count_ << " features" << endl;
+   std::clog << "OGR Plugin: " << count_ << " features" << std::endl;
 #endif
    return feature_ptr();
 }
diff --git a/plugins/input/ogr/ogr_featureset.hpp b/plugins/input/ogr/ogr_featureset.hpp
index 2f38d13..f28a3e6 100644
--- a/plugins/input/ogr/ogr_featureset.hpp
+++ b/plugins/input/ogr/ogr_featureset.hpp
@@ -53,7 +53,7 @@ class ogr_featureset : public mapnik::Featureset
 
       ogr_featureset(OGRDataSource & dataset,
                      OGRLayer & layer,
-                     const mapnik::Envelope<double> & extent,
+                     const mapnik::box2d<double> & extent,
                      const std::string& encoding,
                      const bool multiple_geometries);
       virtual ~ogr_featureset();
diff --git a/plugins/input/ogr/ogr_index.hpp b/plugins/input/ogr/ogr_index.hpp
index 49a15ed..bebcbd8 100644
--- a/plugins/input/ogr/ogr_index.hpp
+++ b/plugins/input/ogr/ogr_index.hpp
@@ -27,10 +27,10 @@
 #include <fstream>
 #include <vector>
 // mapnik
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 #include <mapnik/query.hpp>
 
-using mapnik::Envelope;
+using mapnik::box2d;
 using mapnik::query;
 
 template <typename filterT, typename IStream = std::ifstream>
@@ -44,7 +44,7 @@ private:
     ogr_index(const ogr_index&);
     ogr_index& operator=(const ogr_index&);
     static int read_ndr_integer(IStream & in);
-    static void read_envelope(IStream & in,Envelope<double> &envelope);
+    static void read_envelope(IStream & in,box2d<double> &envelope);
     static void query_node(const filterT& filter,IStream & in,std::vector<int>& pos);
 };
 
@@ -60,7 +60,7 @@ void ogr_index<filterT,IStream>::query_node(const filterT& filter,IStream &  fil
 {
     int offset=read_ndr_integer(file);
 
-    Envelope<double> node_ext;
+    box2d<double> node_ext;
     read_envelope(file,node_ext);
 
     int num_shapes=read_ndr_integer(file);
@@ -96,7 +96,7 @@ int ogr_index<filterT,IStream>::read_ndr_integer(IStream & file)
 
 
 template <typename filterT,typename IStream>
-void ogr_index<filterT,IStream>::read_envelope(IStream & file,Envelope<double>& envelope)
+void ogr_index<filterT,IStream>::read_envelope(IStream & file,box2d<double>& envelope)
 {
     file.read(reinterpret_cast<char*>(&envelope),sizeof(envelope));
 }
diff --git a/plugins/input/ogr/ogr_index_featureset.cpp b/plugins/input/ogr/ogr_index_featureset.cpp
index 16deae2..407578a 100644
--- a/plugins/input/ogr/ogr_index_featureset.cpp
+++ b/plugins/input/ogr/ogr_index_featureset.cpp
@@ -24,17 +24,17 @@
 // mapnik
 #include <mapnik/global.hpp>
 #include <mapnik/datasource.hpp>
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 #include <mapnik/geometry.hpp>
 #include <mapnik/feature.hpp>
 #include <mapnik/feature_layer_desc.hpp>
 #include <mapnik/wkb.hpp>
 #include <mapnik/unicode.hpp>
+#include <mapnik/mapped_memory_cache.hpp>
+#include <mapnik/feature_factory.hpp>
 
 // boost
-#include <boost/iostreams/stream.hpp>
-#include <boost/iostreams/device/file.hpp>
-#include <boost/iostreams/device/mapped_file.hpp>
+#include <boost/interprocess/streams/bufferstream.hpp>
 
 // ogr
 #include "ogr_index_featureset.hpp"
@@ -42,19 +42,14 @@
 #include "ogr_index.hpp"
 #include "ogr_feature_ptr.hpp"
 
-using std::clog;
-using std::endl;
-
 using mapnik::query;
-using mapnik::Envelope;
+using mapnik::box2d;
 using mapnik::CoordTransform;
 using mapnik::Feature;
 using mapnik::feature_ptr;
 using mapnik::geometry_utils;
 using mapnik::transcoder;
-
-using namespace boost::iostreams;
-
+using mapnik::feature_factory;
 
 template <typename filterT>
 ogr_index_featureset<filterT>::ogr_index_featureset(OGRDataSource & dataset,
@@ -68,20 +63,21 @@ ogr_index_featureset<filterT>::ogr_index_featureset(OGRDataSource & dataset,
      layerdef_(layer.GetLayerDefn()),
      filter_(filter),
      tr_(new transcoder(encoding)),
-     fidcolumn_(layer_.GetFIDColumn ()),
-     multiple_geometries_(multiple_geometries),
-     count_(0)
+     fidcolumn_(layer_.GetFIDColumn()),
+     multiple_geometries_(multiple_geometries)
 {
-    stream<mapped_file_source> file (index_file);
-    if (file)
+    
+    boost::optional<mapnik::mapped_region_ptr> memory = mapnik::mapped_memory_cache::find(index_file.c_str(),true);
+    if (memory)
     {
-       ogr_index<filterT,stream<mapped_file_source> >::query(filter,file,ids_);
-       file.close();
+        boost::interprocess::ibufferstream file(static_cast<char*>((*memory)->get_address()),(*memory)->get_size()); 
+        ogr_index<filterT,boost::interprocess::ibufferstream >::query(filter,file,ids_);
     }
+    
     std::sort(ids_.begin(),ids_.end());    
     
 #ifdef MAPNIK_DEBUG
-    std::clog<< "query size=" << ids_.size() << "\n";
+    std::clog << "OGR Plugin: query size=" << ids_.size() << std::endl;
 #endif
 
     itr_ = ids_.begin();
@@ -98,98 +94,102 @@ feature_ptr ogr_index_featureset<filterT>::next()
 {
     if (itr_ != ids_.end())
     {
-       int pos = *itr_++;
-       layer_.SetNextByIndex (pos);
-
-       ogr_feature_ptr feat (layer_.GetNextFeature());
-       if ((*feat) != NULL)
-       {
-          OGRGeometry* geom=(*feat)->GetGeometryRef();
-          if (!geom->IsEmpty())
-          {
-              feature_ptr feature(new Feature((*feat)->GetFID()));
-
-              ogr_converter::convert_geometry (geom, feature, multiple_geometries_);
-              ++count_;
-
-              int fld_count = layerdef_->GetFieldCount();
-              for (int i = 0; i < fld_count; i++)
-              {
-                  OGRFieldDefn* fld = layerdef_->GetFieldDefn (i);
-                  OGRFieldType type_oid = fld->GetType ();
-                  std::string fld_name = fld->GetNameRef ();
-
-                  switch (type_oid)
-                  {
-                   case OFTInteger:
-                   {
+        int pos = *itr_++;
+        layer_.SetNextByIndex (pos);
+
+        ogr_feature_ptr feat (layer_.GetNextFeature());
+        if ((*feat) != NULL)
+        {
+            // ogr feature ids start at 0, so add one to stay
+            // consistent with other mapnik datasources that start at 1
+            int feature_id = ((*feat)->GetFID() + 1);
+            feature_ptr feature(feature_factory::create(feature_id));
+            
+            OGRGeometry* geom=(*feat)->GetGeometryRef();
+            if (geom && !geom->IsEmpty())
+            {
+                ogr_converter::convert_geometry (geom, feature, multiple_geometries_);
+            }
+    #ifdef MAPNIK_DEBUG
+            else
+            {
+                std::clog << "### Warning: feature with null geometry: " << (*feat)->GetFID() << "\n";
+            }
+    #endif
+            
+            int fld_count = layerdef_->GetFieldCount();
+            for (int i = 0; i < fld_count; i++)
+            {
+                OGRFieldDefn* fld = layerdef_->GetFieldDefn (i);
+                OGRFieldType type_oid = fld->GetType ();
+                std::string fld_name = fld->GetNameRef ();
+            
+                switch (type_oid)
+                {
+                    case OFTInteger:
+                    {
                        boost::put(*feature,fld_name,(*feat)->GetFieldAsInteger (i));
                        break;
-                   }
-
-                   case OFTReal:
-                   {
+                    }
+                    
+                    case OFTReal:
+                    {
                        boost::put(*feature,fld_name,(*feat)->GetFieldAsDouble (i));
                        break;
-                   }
+                    }
                            
-                   case OFTString:
-                   case OFTWideString:     // deprecated !
-                   {
+                    case OFTString:
+                    case OFTWideString:     // deprecated !
+                    {
                        UnicodeString ustr = tr_->transcode((*feat)->GetFieldAsString (i));
                        boost::put(*feature,fld_name,ustr);
                        break;
-                   }
-
-                   case OFTIntegerList:
-                   case OFTRealList:
-                   case OFTStringList:
-                   case OFTWideStringList: // deprecated !
-                   {
-#ifdef MAPNIK_DEBUG
-                       clog << "unhandled type_oid=" << type_oid << endl;
-#endif
+                    }
+                    
+                    case OFTIntegerList:
+                    case OFTRealList:
+                    case OFTStringList:
+                    case OFTWideStringList: // deprecated !
+                    {
+                    #ifdef MAPNIK_DEBUG
+                       std::clog << "OGR Plugin: unhandled type_oid=" << type_oid << std::endl;
+                    #endif
                        break;
-                   }
-
-                   case OFTBinary:
-                   {
-#ifdef MAPNIK_DEBUG
-                       clog << "unhandled type_oid=" << type_oid << endl;
-#endif
+                    }
+                    
+                    case OFTBinary:
+                    {
+                    #ifdef MAPNIK_DEBUG
+                       std::clog << "OGR Plugin: unhandled type_oid=" << type_oid << std::endl;
+                    #endif
                        //boost::put(*feature,name,feat->GetFieldAsBinary (i, size));
                        break;
-                   }
+                    }
                        
-                   case OFTDate:
-                   case OFTTime:
-                   case OFTDateTime:       // unhandled !
-                   {
-#ifdef MAPNIK_DEBUG
-                       clog << "unhandled type_oid=" << type_oid << endl;
-#endif
+                    case OFTDate:
+                    case OFTTime:
+                    case OFTDateTime:       // unhandled !
+                    {
+                    #ifdef MAPNIK_DEBUG
+                       std::clog << "OGR Plugin: unhandled type_oid=" << type_oid << std::endl;
+                    #endif
                        break;
-                   }
-
-                   default: // unknown
-                   {
-#ifdef MAPNIK_DEBUG
-                       clog << "unknown type_oid=" << type_oid << endl;
-#endif
+                    }
+                    
+                    default: // unknown
+                    {
+                    #ifdef MAPNIK_DEBUG
+                       std::clog << "OGR Plugin: unknown type_oid=" << type_oid << std::endl;
+                    #endif
                        break;
-                   }
-                  }
-              }
-          
-              return feature;
-          }
-       }
-   }
-
-#ifdef MAPNIK_DEBUG
-   clog << count_ << " features" << endl;
-#endif
-   return feature_ptr();
+                    }
+                }
+            }
+            return feature;
+        }
+    }
+    
+    return feature_ptr();
 }
 
 template class ogr_index_featureset<mapnik::filter_in_box>;
diff --git a/plugins/input/ogr/ogr_index_featureset.hpp b/plugins/input/ogr/ogr_index_featureset.hpp
index 5977148..74ee297 100644
--- a/plugins/input/ogr/ogr_index_featureset.hpp
+++ b/plugins/input/ogr/ogr_index_featureset.hpp
@@ -41,7 +41,6 @@ class ogr_index_featureset : public mapnik::Featureset
       boost::scoped_ptr<mapnik::transcoder> tr_;
       const char* fidcolumn_;
       bool multiple_geometries_;
-      mutable int count_;
 
    public:
       ogr_index_featureset(OGRDataSource & dataset,
diff --git a/plugins/input/osm/Makefile.example b/plugins/input/osm/Makefile.example
index 8268e67..b896584 100644
--- a/plugins/input/osm/Makefile.example
+++ b/plugins/input/osm/Makefile.example
@@ -3,7 +3,7 @@ LDFLAGS = `xml2-config --libs` -L/usr/local/lib
 LDFLAGS5 = `xml2-config --libs` -L/usr/local/lib -lmapnik 
 OBJ = test.o osm.o osmparser.o
 test: $(OBJ) 
-	g++ -o test $(OBJ) $(LDFLAGS) 
+  g++ -o test $(OBJ) $(LDFLAGS) 
 render: render.o
-	g++ -o render render.o $(LDFLAGS5) 
+  g++ -o render render.o $(LDFLAGS5) 
 
diff --git a/plugins/input/osm/SConscript b/plugins/input/osm/SConscript
deleted file mode 100644
index 9c7b84d..0000000
--- a/plugins/input/osm/SConscript
+++ /dev/null
@@ -1,47 +0,0 @@
-#
-# This file is part of Mapnik (c++ mapping toolkit)
-#
-# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-# $Id$
-
-Import ('env')
-
-prefix = env['PREFIX']
-install_prefix = env['DESTDIR'] + '/' + prefix
-
-osm_src = Split(
-	"""
-	osmparser.cpp
-	osm.cpp
-	osm_datasource.cpp
-	osm_featureset.cpp 
-	dataset_deliverer.cpp
-	basiccurl.cpp
-	"""
-        )
-
-libraries = [ 'xml2' ]
-libraries.append('curl')
-if env['PLATFORM'] == 'Darwin':
-    libraries.append('mapnik')
-    libraries.append(env['ICU_LIB_NAME'])
-
-osm_inputdriver = env.SharedLibrary('osm', source=osm_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries)
-
-env.Install(install_prefix + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME'] + '/input', osm_inputdriver)
-env.Alias('install', install_prefix + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME'] + '/input')
diff --git a/plugins/input/osm/basiccurl.cpp b/plugins/input/osm/basiccurl.cpp
index bb582b0..74d6c98 100755
--- a/plugins/input/osm/basiccurl.cpp
+++ b/plugins/input/osm/basiccurl.cpp
@@ -2,44 +2,44 @@
 
 CURL_LOAD_DATA *grab_http_response(const char *url)
 {
-	CURL_LOAD_DATA *data;
+  CURL_LOAD_DATA *data;
 
-	CURL *curl =  curl_easy_init(); 
+  CURL *curl =  curl_easy_init(); 
 
-	if(curl)
-	{
-		data = do_grab(curl,url);
-		curl_easy_cleanup(curl);
-		return data;
-	}
-	return NULL;
+  if(curl)
+  {
+    data = do_grab(curl,url);
+    curl_easy_cleanup(curl);
+    return data;
+  }
+  return NULL;
 }
 
 CURL_LOAD_DATA *do_grab(CURL *curl,const char *url)
 {
-	CURLcode res;
-	CURL_LOAD_DATA *data = (CURL_LOAD_DATA *)malloc(sizeof(CURL_LOAD_DATA));
-	data->data = NULL;
-	data->nbytes = 0;
-	
-	curl_easy_setopt(curl,CURLOPT_URL,url);
-	curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,response_callback);
-	curl_easy_setopt(curl,CURLOPT_WRITEDATA,data);
+  CURLcode res;
+  CURL_LOAD_DATA *data = (CURL_LOAD_DATA *)malloc(sizeof(CURL_LOAD_DATA));
+  data->data = NULL;
+  data->nbytes = 0;
+  
+  curl_easy_setopt(curl,CURLOPT_URL,url);
+  curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,response_callback);
+  curl_easy_setopt(curl,CURLOPT_WRITEDATA,data);
 
-	res=curl_easy_perform(curl);
+  res=curl_easy_perform(curl);
 
-	return data;
+  return data;
 }
 
 size_t response_callback(void *ptr,size_t size,size_t nmemb, void *d)
 {
-	size_t rsize=size*nmemb;
-	CURL_LOAD_DATA *data=(CURL_LOAD_DATA *)d;
-//	fprintf(stderr,"rsize is %d\n", rsize);
-	data->data=(char *)realloc(data->data,(data->nbytes+rsize)
-										*sizeof(char));
-	memcpy(&(data->data[data->nbytes]),ptr,rsize);
-	data->nbytes += rsize;
-//	fprintf(stderr,"data->nbytes is %d\n", data->nbytes);
-	return rsize;
+  size_t rsize=size*nmemb;
+  CURL_LOAD_DATA *data=(CURL_LOAD_DATA *)d;
+//  fprintf(stderr,"rsize is %d\n", rsize);
+  data->data=(char *)realloc(data->data,(data->nbytes+rsize)
+                    *sizeof(char));
+  memcpy(&(data->data[data->nbytes]),ptr,rsize);
+  data->nbytes += rsize;
+//  fprintf(stderr,"data->nbytes is %d\n", data->nbytes);
+  return rsize;
 }
diff --git a/plugins/input/osm/basiccurl.h b/plugins/input/osm/basiccurl.h
index 5e600cf..8981c77 100755
--- a/plugins/input/osm/basiccurl.h
+++ b/plugins/input/osm/basiccurl.h
@@ -7,8 +7,8 @@
 
 typedef struct
 {
-	char *data;
-	int nbytes;
+  char *data;
+  int nbytes;
 } CURL_LOAD_DATA;
 
 CURL_LOAD_DATA *grab_http_response(const char *url);
diff --git a/plugins/input/osm/build.py b/plugins/input/osm/build.py
new file mode 100644
index 0000000..5fafc4d
--- /dev/null
+++ b/plugins/input/osm/build.py
@@ -0,0 +1,51 @@
+#
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+Import ('env')
+
+prefix = env['PREFIX']
+
+plugin_env = env.Clone()
+
+osm_src = Split(
+  """
+  osmparser.cpp
+  osm.cpp
+  osm_datasource.cpp
+  osm_featureset.cpp 
+  dataset_deliverer.cpp
+  basiccurl.cpp
+  """
+        )
+
+libraries = [ 'xml2' ]
+libraries.append('curl')
+libraries.append('mapnik2')
+libraries.append(env['ICU_LIB_NAME'])
+
+input_plugin = plugin_env.SharedLibrary('../osm', source=osm_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS'])
+
+# if the plugin links to libmapnik2 ensure it is built first
+Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME']))
+
+if 'uninstall' not in COMMAND_LINE_TARGETS:
+    env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin)
+    env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST'])
diff --git a/plugins/input/osm/dataset_deliverer.cpp b/plugins/input/osm/dataset_deliverer.cpp
index 17847e1..1e2b11d 100644
--- a/plugins/input/osm/dataset_deliverer.cpp
+++ b/plugins/input/osm/dataset_deliverer.cpp
@@ -4,45 +4,53 @@
 
 osm_dataset * dataset_deliverer::dataset=NULL;
 std::string dataset_deliverer::last_bbox = "";
+std::string dataset_deliverer::last_filename = "";
 
 osm_dataset* dataset_deliverer::load_from_file(const string& file,
-												const string& parser)
+                        const string& parser)
 {
-	// Only actually load from file if we haven't done so already
-	if(dataset == NULL)
-	{
-		dataset = new osm_dataset;
-		if(dataset->load(file.c_str(),parser)==false)
-				return NULL;
-		atexit(dataset_deliverer::release);
-
-	}
-	return dataset;
+  // Only actually load from file if we haven't done so already
+  if(dataset == NULL)
+  {
+    dataset = new osm_dataset;
+    if(dataset->load(file.c_str(),parser)==false)
+        return NULL;
+    atexit(dataset_deliverer::release);
+    last_filename = file;
+  }
+  else if(file != last_filename)
+  {
+    dataset = new osm_dataset;
+    if(dataset->load(file.c_str(),parser)==false)
+        return NULL;
+    last_filename = file;
+  }
+  return dataset;
 }
 
 osm_dataset* dataset_deliverer::load_from_url
-	(const string& url,const string& bbox,const string& parser)
+  (const string& url,const string& bbox,const string& parser)
 {
-	
-	if(dataset==NULL)
-	{
-		dataset = new osm_dataset;
-		if(dataset->load_from_url(url.c_str(),bbox,parser)==false)
-			return NULL;
-		atexit(dataset_deliverer::release);
-		last_bbox = bbox;
-	}
-	else if (bbox != last_bbox)
-	{
+  
+  if(dataset==NULL)
+  {
+    dataset = new osm_dataset;
+    if(dataset->load_from_url(url.c_str(),bbox,parser)==false)
+      return NULL;
+    atexit(dataset_deliverer::release);
+    last_bbox = bbox;
+  }
+  else if (bbox != last_bbox)
+  {
 #ifdef MAPNIK_DEBUG
-		cerr<<"BBOXES ARE DIFFERENT: " << last_bbox<<","<<bbox<<endl;
+    cerr<<"BBOXES ARE DIFFERENT: " << last_bbox<<","<<bbox<<endl;
 #endif
 
-		// Reload the dataset	
-		dataset->clear();
-		if(dataset->load_from_url(url.c_str(),bbox,parser)==false)
-			return NULL;
-		last_bbox = bbox;	
-	}
-	return dataset;	
+    // Reload the dataset  
+    dataset->clear();
+    if(dataset->load_from_url(url.c_str(),bbox,parser)==false)
+      return NULL;
+    last_bbox = bbox;  
+  }
+  return dataset;  
 }
diff --git a/plugins/input/osm/dataset_deliverer.h b/plugins/input/osm/dataset_deliverer.h
index afb0011..cdcbdee 100644
--- a/plugins/input/osm/dataset_deliverer.h
+++ b/plugins/input/osm/dataset_deliverer.h
@@ -9,6 +9,7 @@ class dataset_deliverer
 private:
     static osm_dataset* dataset; 
     static std::string last_bbox;
+    static std::string last_filename;
 
 public:
     static osm_dataset *load_from_file(const string&,const string&);
diff --git a/plugins/input/osm/demo/GoogleProjection.h b/plugins/input/osm/demo/GoogleProjection.h
index 801c9b6..e292ea2 100644
--- a/plugins/input/osm/demo/GoogleProjection.h
+++ b/plugins/input/osm/demo/GoogleProjection.h
@@ -10,16 +10,16 @@ using std::vector;
 
 struct ScreenPos
 {
-	int x,y;
-	ScreenPos() { x=y=0; }
-	ScreenPos(int x,int y) { this->x=x; this->y=y; }
+  int x,y;
+  ScreenPos() { x=y=0; }
+  ScreenPos(int x,int y) { this->x=x; this->y=y; }
 };
 
 struct EarthPoint
 {
-	double x,y; 
-	EarthPoint() { x=y=0.0; }
-	EarthPoint(double x,double y) { this->x=x; this->y=y; }
+  double x,y; 
+  EarthPoint() { x=y=0.0; }
+  EarthPoint(double x,double y) { this->x=x; this->y=y; }
 };
 
 class GoogleProjection
@@ -29,69 +29,69 @@ class GoogleProjection
    vector<double> Bc,Cc,zc,Ac;
    int levels;
 
-	double minmax (double a,double b, double c)
-	{
-    	a = max(a,b);
-    	a = min(a,c);
-    	return a;
-	}
+  double minmax (double a,double b, double c)
+  {
+      a = max(a,b);
+      a = min(a,c);
+      return a;
+  }
 
   public:
    GoogleProjection(int levels=18)
    {
-   		this->levels=levels;
+       this->levels=levels;
         double c = 256;
-		double e;
+    double e;
         for (int d=0; d<levels; d++) 
-		{
+    {
             e = c/2;
             Bc.push_back(c/360.0);
             Cc.push_back(c/(2 * M_PI));
             zc.push_back(e);
             Ac.push_back(c);
             c *= 2;
-		}
-	}
+    }
+  }
                 
-	ScreenPos fromLLToPixel(double lon,double lat,int zoom)
-	{
-		double d = zc[zoom];
-		double e = round(d + lon * Bc[zoom]);
-		double f = minmax(sin((M_PI/180.0) * lat),-0.9999,0.9999);
-		double g = round(d + 0.5*log((1+f)/(1-f))*-Cc[zoom]);
-		return ScreenPos(e,g);
-	}
+  ScreenPos fromLLToPixel(double lon,double lat,int zoom)
+  {
+    double d = zc[zoom];
+    double e = round(d + lon * Bc[zoom]);
+    double f = minmax(sin((M_PI/180.0) * lat),-0.9999,0.9999);
+    double g = round(d + 0.5*log((1+f)/(1-f))*-Cc[zoom]);
+    return ScreenPos(e,g);
+  }
 
-	EarthPoint fromPixelToLL(int x,int y,int zoom)
-	{
-		double e = zc[zoom];
-		double f = (x - e)/Bc[zoom];
-		double g = (y - e)/-Cc[zoom];
-		double h = (180.0/M_PI) * ( 2 * atan(exp(g)) - 0.5 * M_PI);
-		return EarthPoint(f,h);
-	}
+  EarthPoint fromPixelToLL(int x,int y,int zoom)
+  {
+    double e = zc[zoom];
+    double f = (x - e)/Bc[zoom];
+    double g = (y - e)/-Cc[zoom];
+    double h = (180.0/M_PI) * ( 2 * atan(exp(g)) - 0.5 * M_PI);
+    return EarthPoint(f,h);
+  }
 
-	// convert to the zoom independent Google system; TBH I don't really
-	// understand what it represents.... 
-	static EarthPoint fromLLToGoog(double lon,double lat)
-	{
-		double a = log(tan((90+lat)*M_PI / 360))/(M_PI / 180);
- 		double custLat = a * 20037508.34 / 180;
-		double custLon=lon;
- 		custLon = custLon * 20037508.34 / 180;
-		return EarthPoint(custLon,custLat);
-	}
+  // convert to the zoom independent Google system; TBH I don't really
+  // understand what it represents.... 
+  static EarthPoint fromLLToGoog(double lon,double lat)
+  {
+    double a = log(tan((90+lat)*M_PI / 360))/(M_PI / 180);
+     double custLat = a * 20037508.34 / 180;
+    double custLon=lon;
+     custLon = custLon * 20037508.34 / 180;
+    return EarthPoint(custLon,custLat);
+  }
 
-	// other way round
-	static EarthPoint fromGoogToLL(double x,double y)
-	{
-		double lat_deg,lon_deg;
-		lat_deg = (y / 20037508.34) * 180;
-   	    lon_deg = (x / 20037508.34) * 180;
-   	    lat_deg = 180/M_PI * 
-		   		(2 * atan(exp(lat_deg * M_PI / 180)) - M_PI / 2);
-		return EarthPoint(lon_deg,lat_deg);
-	}
+  // other way round
+  static EarthPoint fromGoogToLL(double x,double y)
+  {
+    double lat_deg,lon_deg;
+    lat_deg = (y / 20037508.34) * 180;
+         lon_deg = (x / 20037508.34) * 180;
+         lat_deg = 180/M_PI * 
+           (2 * atan(exp(lat_deg * M_PI / 180)) - M_PI / 2);
+    return EarthPoint(lon_deg,lat_deg);
+  }
 };
 
 #endif // GOOGLEPROJECTION_H
diff --git a/plugins/input/osm/demo/MapSource.cpp b/plugins/input/osm/demo/MapSource.cpp
index 951e7f5..4096413 100644
--- a/plugins/input/osm/demo/MapSource.cpp
+++ b/plugins/input/osm/demo/MapSource.cpp
@@ -132,23 +132,23 @@ void MapSource::generateMaps()
         bottomRight.x /= 256;
         bottomRight.y /= 256;
 
-		int x_fetch_freq, y_fetch_freq, x_fetches, y_fetches;
-
-		if(multirqst)
-		{
-        	// Gives a value approx equal to 0.1 lat/lon in southern UK
-        	x_fetch_freq = (int)(pow(2.0,zoom_start-11));
-        	y_fetch_freq = (int)(pow(2.0,zoom_start-11));
-        	x_fetches = ((bottomRight.x-topLeft.x) / x_fetch_freq)+1, 
+    int x_fetch_freq, y_fetch_freq, x_fetches, y_fetches;
+
+    if(multirqst)
+    {
+          // Gives a value approx equal to 0.1 lat/lon in southern UK
+          x_fetch_freq = (int)(pow(2.0,zoom_start-11));
+          y_fetch_freq = (int)(pow(2.0,zoom_start-11));
+          x_fetches = ((bottomRight.x-topLeft.x) / x_fetch_freq)+1, 
             y_fetches = ((bottomRight.y-topLeft.y) / y_fetch_freq)+1; 
-		}
-		else
-		{
-			x_fetch_freq = bottomRight.x - topLeft.x;
-			y_fetch_freq = bottomRight.y - topLeft.y;
-			x_fetches = 1;
-			y_fetches = 1;
-		}
+    }
+    else
+    {
+      x_fetch_freq = bottomRight.x - topLeft.x;
+      y_fetch_freq = bottomRight.y - topLeft.y;
+      x_fetches = 1;
+      y_fetches = 1;
+    }
 
         fprintf(stderr,"topLeft: %d %d\n",topLeft.x,topLeft.y);
         fprintf(stderr,"bottomRight: %d %d\n",bottomRight.x,bottomRight.y);
@@ -170,7 +170,7 @@ void MapSource::generateMaps()
                                                 *256, zoom_start),
                  bottomR_LL =
                     proj.fromPixelToLL( ((topLeft.x+xfetch*x_fetch_freq)+
-							x_fetch_freq)*256,
+              x_fetch_freq)*256,
                                     ((topLeft.y+yfetch*y_fetch_freq)
                                     +y_fetch_freq)*256, zoom_start),
                            topL_LL = 
@@ -179,10 +179,10 @@ void MapSource::generateMaps()
                                         (topLeft.y+yfetch*y_fetch_freq)
                                                 *256, zoom_start);
 
-				double w1 = min(bottomL_LL.x-0.01,topL_LL.x-0.01),
-					   s1 = min(bottomL_LL.y-0.01,bottomR_LL.y-0.01),
-					   e1 = max(bottomR_LL.x+0.01,topR_LL.x+0.01),
-					   n1 = max(topL_LL.y+0.01,topR_LL.y+0.01);
+        double w1 = min(bottomL_LL.x-0.01,topL_LL.x-0.01),
+             s1 = min(bottomL_LL.y-0.01,bottomR_LL.y-0.01),
+             e1 = max(bottomR_LL.x+0.01,topR_LL.x+0.01),
+             n1 = max(topL_LL.y+0.01,topR_LL.y+0.01);
 
                 parameters p;
                 if(getSource()=="api")
@@ -236,7 +236,7 @@ void MapSource::generateMaps()
                             cerr<<"x: " << tileX << " y: " << tileY
                                 <<" z: " << z << endl;
 
-                           Image32 buf(m.getWidth(),m.getHeight());
+                           image_32 buf(m.width(),m.height());
                            double metres_w =( (tileX*256.0) *
                             metres_per_pixel ) -
                                 20037814.088;
@@ -246,20 +246,20 @@ void MapSource::generateMaps()
                            double metres_e = metres_w + (metres_per_pixel*256);
                            double metres_n = metres_s + (metres_per_pixel*256);
    
-                            Envelope<double> bb
+                            box2d<double> bb
                             (metres_w-32*metres_per_pixel,
                              metres_s-32*metres_per_pixel,
                              metres_e+32*metres_per_pixel,
                              metres_n+32*metres_per_pixel); 
 
-                           m.zoomToBox(bb);
-                           agg_renderer<Image32> r(m,buf);
+                           m.zoom_to_box(bb);
+                           agg_renderer<image_32> r(m,buf);
                            r.apply();
                 
                            string filename="";
                            std::ostringstream str;
                            str<< z<< "."<<tileX<<"." << tileY << ".png";
-                           save_to_file<ImageData32>(buf.data(),
+                           save_to_file<image_data_32>(buf.data(),
                             "tmp.png","png");
                             FILE *in=fopen("tmp.png","r");
                             FILE *out=fopen(str.str().c_str(),"w");
@@ -290,31 +290,31 @@ void MapSource::generateMaps()
         load_map(m,xmlfile);
         setOSMLayers(m,p);
 
-        Envelope<double> latlon=
+        box2d<double> latlon=
             (hasBbox()) ? 
-            Envelope<double>(w,s,e,n):
+            box2d<double>(w,s,e,n):
             m.getLayer(0).envelope();
         
         EarthPoint bottomL_LL = 
             GoogleProjection::fromLLToGoog(latlon.minx(),latlon.miny()),
                    topR_LL =
             GoogleProjection::fromLLToGoog(latlon.maxx(),latlon.maxy());
-        Envelope<double> bb =
-                Envelope<double>(bottomL_LL.x,bottomL_LL.y,
+        box2d<double> bb =
+                box2d<double>(bottomL_LL.x,bottomL_LL.y,
                                 topR_LL.x,topR_LL.y);    
-        m.zoomToBox(bb);
-        Image32 buf (m.getWidth(), m.getHeight());
-        agg_renderer<Image32> r(m,buf);
+        m.zoom_to_box(bb);
+        image_32 buf (m.width(), m.height());
+        agg_renderer<image_32> r(m,buf);
         r.apply();
 
-        save_to_file<ImageData32>(buf.data(),outfile,"png");
+        save_to_file<image_data_32>(buf.data(),outfile,"png");
     }
 }
 
 void MapSource::setOSMLayers(Map& m, const parameters &p)
 {
     parameters q;
-    for(int count=0; count<m.layerCount(); count++)
+    for(int count=0; count<m.layer_count(); count++)
     {
         q = m.getLayer(count).datasource()->params();
         if(boost::get<std::string>(q["type"])=="osm")
@@ -381,12 +381,12 @@ void MapSource::addSRTMLayers(Map& m,double w,double s,double e,double n)
                         <<(lon>=0 ? lon:-lon)<<"c10";
                     p["file"] = str.str();
                     cerr<<"ADDING SRTM LAYER: " << p["file"] << endl;
-                    Layer layer("srtm_" + str.str());
-                    layer.add_style("contours");
-                    layer.add_style("contours-text");
-                    layer.set_datasource
+                    layer lyr("srtm_" + str.str());
+                    lyr.add_style("contours");
+                    lyr.add_style("contours-text");
+                    lyr.set_datasource
                         (datasource_cache::instance()->create(p));
-                    m.addLayer(layer);
+                    m.addLayer(lyr);
                 }
             }
         }
diff --git a/plugins/input/osm/libMakefile b/plugins/input/osm/libMakefile
index 5bc37a9..d072ba2 100644
--- a/plugins/input/osm/libMakefile
+++ b/plugins/input/osm/libMakefile
@@ -1,4 +1,4 @@
 CXXFLAGS = `xml2-config --cflags` -I/usr/local/include/mapnik -I/usr/include/boost -I/usr/include/freetype2  -I/home/nick/mapnik-osm/agg/include  -fPIC -g
 MAPNIK_OSM_OBJ = osmparser.o osm.o osm_datasource.o osm_featureset.o 
 osm.input: $(MAPNIK_OSM_OBJ)
-	g++ -shared -o osm.input $(MAPNIK_OSM_OBJ) 
+  g++ -shared -o osm.input $(MAPNIK_OSM_OBJ) 
diff --git a/plugins/input/osm/osm.cpp b/plugins/input/osm/osm.cpp
index ec3010d..b15ca98 100644
--- a/plugins/input/osm/osm.cpp
+++ b/plugins/input/osm/osm.cpp
@@ -15,86 +15,86 @@ polygon_types osm_way::ptypes;
 
 bool osm_dataset::load(const char* filename,const std::string& parser)
 {
-	if (parser=="libxml2")
-	{
-		return osmparser::parse(this,filename);
-	}
-	return false;	
+  if (parser=="libxml2")
+  {
+    return osmparser::parse(this,filename);
+  }
+  return false;  
 }
 
 bool osm_dataset::load_from_url(const std::string& url, 
-								const std::string& bbox,
-								const std::string& parser)
+                const std::string& bbox,
+                const std::string& parser)
 {
-	if(parser=="libxml2")
-	{
+  if(parser=="libxml2")
+  {
 #ifdef MAPNIK_DEBUG
-		cerr<<"osm_dataset::load_from_url: url=" << url << 
-			" bbox="<<bbox<<endl;
+    cerr<<"osm_dataset::load_from_url: url=" << url << 
+      " bbox="<<bbox<<endl;
 #endif
-		std::ostringstream str;
-		// use curl to grab the data
-		// fetch all the data we want - probably from osmxpai
+    std::ostringstream str;
+    // use curl to grab the data
+    // fetch all the data we want - probably from osmxpai
 
         str << url << "?bbox=" << bbox;
 
 #ifdef MAPNIK_DEBUG
-		cerr << "FULL URL : " << str.str() << endl; 
+    cerr << "FULL URL : " << str.str() << endl; 
 #endif
 
         CURL_LOAD_DATA *resp = grab_http_response(str.str().c_str()); 
-		if(resp!=NULL)
-		{
-			char *blx = new char[resp->nbytes+1];
-			memcpy(blx,resp->data,resp->nbytes);
-			blx[resp->nbytes] = '\0';
+    if(resp!=NULL)
+    {
+      char *blx = new char[resp->nbytes+1];
+      memcpy(blx,resp->data,resp->nbytes);
+      blx[resp->nbytes] = '\0';
 
 #ifdef MAPNIK_DEBUG
-			cerr<< " CURL RESPONSE: " << blx << endl;
+      cerr<< " CURL RESPONSE: " << blx << endl;
 #endif
 
-			delete[] blx;
-			bool success= osmparser::parse(this,resp->data,resp->nbytes);
-			return success;
-		}
-	}
-	return false;
+      delete[] blx;
+      bool success= osmparser::parse(this,resp->data,resp->nbytes);
+      return success;
+    }
+  }
+  return false;
 }
 
 osm_dataset::~osm_dataset()
 {
-	clear();
+  clear();
 }
 
 void osm_dataset::clear()
 {
 #ifdef MAPNIK_DEBUG
-	cerr<<"osm_dataset::clear()"<<endl;
-	cerr<<"deleting ways"<<endl;
+  cerr<<"osm_dataset::clear()"<<endl;
+  cerr<<"deleting ways"<<endl;
 #endif
 
-	for(unsigned int count=0; count<ways.size(); count++)
-	{
-		delete ways[count];
-		ways[count]=NULL;
-	}
+  for(unsigned int count=0; count<ways.size(); count++)
+  {
+    delete ways[count];
+    ways[count]=NULL;
+  }
 
 #ifdef MAPNIK_DEBUG
-	cerr<<"deleting nodes"<<endl;
+  cerr<<"deleting nodes"<<endl;
 #endif
 
-	for(unsigned int count=0; count<nodes.size(); count++)
-	{
-		delete nodes[count];
-		nodes[count]=NULL;
-	}
+  for(unsigned int count=0; count<nodes.size(); count++)
+  {
+    delete nodes[count];
+    nodes[count]=NULL;
+  }
 
 #ifdef MAPNIK_DEBUG
-	cerr<<"Clearing ways/nodes"<<endl;
+  cerr<<"Clearing ways/nodes"<<endl;
 #endif
 
-	ways.clear();
-	nodes.clear();
+  ways.clear();
+  nodes.clear();
 
 #ifdef MAPNIK_DEBUG
     cerr<<"Done"<<endl;
@@ -103,161 +103,161 @@ void osm_dataset::clear()
 
 std::string osm_dataset::to_string()
 {
-	std::string result;
+  std::string result;
 
-	for(unsigned int count=0; count<nodes.size(); count++)
-	{
-		result += nodes[count]->to_string();
-	}
-	for(unsigned int count=0; count<ways.size(); count++)
-	{
-		result += ways[count]->to_string();
-	}
-	return result;
+  for(unsigned int count=0; count<nodes.size(); count++)
+  {
+    result += nodes[count]->to_string();
+  }
+  for(unsigned int count=0; count<ways.size(); count++)
+  {
+    result += ways[count]->to_string();
+  }
+  return result;
 }
 
 bounds osm_dataset::get_bounds()
 {
-	bounds b (-180,-90,180,90);
-	for(unsigned int count=0; count<nodes.size();count++)
-	{
-		if(nodes[count]->lon > b.w)
-			b.w=nodes[count]->lon;
-		if(nodes[count]->lon < b.e)
-			b.e=nodes[count]->lon;
-		if(nodes[count]->lat > b.s)
-			b.s=nodes[count]->lat;
-		if(nodes[count]->lat < b.n)
-			b.n=nodes[count]->lat;
-	}
-	return b;
+  bounds b (-180,-90,180,90);
+  for(unsigned int count=0; count<nodes.size();count++)
+  {
+    if(nodes[count]->lon > b.w)
+      b.w=nodes[count]->lon;
+    if(nodes[count]->lon < b.e)
+      b.e=nodes[count]->lon;
+    if(nodes[count]->lat > b.s)
+      b.s=nodes[count]->lat;
+    if(nodes[count]->lat < b.n)
+      b.n=nodes[count]->lat;
+  }
+  return b;
 }
 
 osm_node *osm_dataset::next_node()
 {
-	if(node_i!=nodes.end())
-	{
-		return *(node_i++);
-	}
-	return NULL;
-	
+  if(node_i!=nodes.end())
+  {
+    return *(node_i++);
+  }
+  return NULL;
+  
 }
 osm_way *osm_dataset::next_way()
 {
-	if(way_i!=ways.end())
-	{
-		return *(way_i++);
-	}
-	return NULL;
+  if(way_i!=ways.end())
+  {
+    return *(way_i++);
+  }
+  return NULL;
 }
-		
+    
 osm_item *osm_dataset::next_item()
 {
-	osm_item *item=NULL;
-	if(next_item_mode==Node)
-	{
-		item = next_node();
-		if(item==NULL)
-		{
-			next_item_mode=Way;
-			rewind_ways();
-			item = next_way();
-		}
-	}
-	else
-	{
-		item = next_way();
-	}
-	return item;
+  osm_item *item=NULL;
+  if(next_item_mode==Node)
+  {
+    item = next_node();
+    if(item==NULL)
+    {
+      next_item_mode=Way;
+      rewind_ways();
+      item = next_way();
+    }
+  }
+  else
+  {
+    item = next_way();
+  }
+  return item;
 }
-	
+  
 std::set<std::string> osm_dataset::get_keys()
 {
-	std::set<std::string> keys;
-	for(unsigned int count=0; count<nodes.size(); count++)
-	{
-		for(std::map<std::string,std::string>::iterator i=
-			nodes[count]->keyvals.begin(); i!=nodes[count]->keyvals.end(); i++)
-		{
-			keys.insert(i->first);
-		}
-	}
-	for(unsigned int count=0; count<ways.size(); count++)
-	{
-		for(std::map<std::string,std::string>::iterator i=
-			ways[count]->keyvals.begin(); i!=ways[count]->keyvals.end(); i++)
-		{
-			keys.insert(i->first);
-		}
-	}
-	return keys;
+  std::set<std::string> keys;
+  for(unsigned int count=0; count<nodes.size(); count++)
+  {
+    for(std::map<std::string,std::string>::iterator i=
+      nodes[count]->keyvals.begin(); i!=nodes[count]->keyvals.end(); i++)
+    {
+      keys.insert(i->first);
+    }
+  }
+  for(unsigned int count=0; count<ways.size(); count++)
+  {
+    for(std::map<std::string,std::string>::iterator i=
+      ways[count]->keyvals.begin(); i!=ways[count]->keyvals.end(); i++)
+    {
+      keys.insert(i->first);
+    }
+  }
+  return keys;
 }
 
-			
-		
+      
+    
 
 std::string osm_item::to_string()
 {
-	std::ostringstream strm;
-	strm << "id=" << id << std::endl << "Keyvals: " << std::endl;
-	for(std::map<std::string,std::string>::iterator i=keyvals.begin();
-			i!=keyvals.end(); i++)
-	{
-		strm << "Key " << i->first << " Value " << i->second << std::endl; 
-	}
-	return strm.str();
+  std::ostringstream strm;
+  strm << "id=" << id << std::endl << "Keyvals: " << std::endl;
+  for(std::map<std::string,std::string>::iterator i=keyvals.begin();
+      i!=keyvals.end(); i++)
+  {
+    strm << "Key " << i->first << " Value " << i->second << std::endl; 
+  }
+  return strm.str();
 }
 
 std::string osm_node::to_string()
 {
-	std::ostringstream strm;
-	strm << "Node: "<< osm_item::to_string() << 
-			" Lat=" << lat <<" lon="  <<lon << std::endl;
-	return strm.str();
+  std::ostringstream strm;
+  strm << "Node: "<< osm_item::to_string() << 
+      " Lat=" << lat <<" lon="  <<lon << std::endl;
+  return strm.str();
 }
 
 std::string osm_way::to_string()
 {
-	std::ostringstream strm;
-	strm << "Way: " << osm_item::to_string() << "Nodes in way:";
+  std::ostringstream strm;
+  strm << "Way: " << osm_item::to_string() << "Nodes in way:";
 
-	for(unsigned int count=0; count<nodes.size(); count++)
-	{
-		if(nodes[count]!=NULL)
-		{
-			strm << nodes[count]->id << " ";
-		}
-	}
-	strm << std::endl;
-	return strm.str();
+  for(unsigned int count=0; count<nodes.size(); count++)
+  {
+    if(nodes[count]!=NULL)
+    {
+      strm << nodes[count]->id << " ";
+    }
+  }
+  strm << std::endl;
+  return strm.str();
 }
 
 bounds osm_way::get_bounds()
 {
-	bounds b (-180,-90,180,90);
-	for(unsigned int count=0; count<nodes.size();count++)
-	{
-		if(nodes[count]->lon > b.w)
-			b.w=nodes[count]->lon;
-		if(nodes[count]->lon < b.e)
-			b.e=nodes[count]->lon;
-		if(nodes[count]->lat > b.s)
-			b.s=nodes[count]->lat;
-		if(nodes[count]->lat < b.n)
-			b.n=nodes[count]->lat;
-	}
-	return b;
+  bounds b (-180,-90,180,90);
+  for(unsigned int count=0; count<nodes.size();count++)
+  {
+    if(nodes[count]->lon > b.w)
+      b.w=nodes[count]->lon;
+    if(nodes[count]->lon < b.e)
+      b.e=nodes[count]->lon;
+    if(nodes[count]->lat > b.s)
+      b.s=nodes[count]->lat;
+    if(nodes[count]->lat < b.n)
+      b.n=nodes[count]->lat;
+  }
+  return b;
 }
 
 bool osm_way::is_polygon()
 {
-	for(unsigned int count=0; count<ptypes.ptypes.size(); count++)
-	{
-		if(keyvals.find(ptypes.ptypes[count].first) != keyvals.end() &&
-		   keyvals[ptypes.ptypes[count].first] == ptypes.ptypes[count].second)
-		{
-			return true;
-		}
-	}
-	return false;
+  for(unsigned int count=0; count<ptypes.ptypes.size(); count++)
+  {
+    if(keyvals.find(ptypes.ptypes[count].first) != keyvals.end() &&
+       keyvals[ptypes.ptypes[count].first] == ptypes.ptypes[count].second)
+    {
+      return true;
+    }
+  }
+  return false;
 }
diff --git a/plugins/input/osm/osm.h b/plugins/input/osm/osm.h
index c536df2..80198cf 100644
--- a/plugins/input/osm/osm.h
+++ b/plugins/input/osm/osm.h
@@ -32,7 +32,7 @@ public:
         ptypes.push_back(std::pair<std::string,std::string>("natural","heath"));
         ptypes.push_back(std::pair<std::string,std::string>("natural","marsh"));
         ptypes.push_back(std::pair<std::string,std::string>("military",
-				"danger_area"));
+        "danger_area"));
         ptypes.push_back(std::pair<std::string,std::string>
                 ("landuse","forest"));
         ptypes.push_back(std::pair<std::string,std::string>
@@ -45,7 +45,7 @@ struct osm_item
     long id;
     std::map<std::string,std::string> keyvals;    
     virtual std::string to_string();
-	virtual ~osm_item() { }
+    virtual ~osm_item() { }
 };
 
 
diff --git a/plugins/input/osm/osm_datasource.cpp b/plugins/input/osm/osm_datasource.cpp
index 48916fc..f286c1f 100644
--- a/plugins/input/osm/osm_datasource.cpp
+++ b/plugins/input/osm/osm_datasource.cpp
@@ -20,17 +20,24 @@
  *
  *****************************************************************************/
 
+// mapnik
+#include <mapnik/geom_util.hpp>
+#include <mapnik/query.hpp>
+
+// boost
+#include <boost/make_shared.hpp>
+
+// stl
 #include <iostream>
 #include <fstream>
 #include <stdexcept>
-#include <mapnik/geom_util.hpp>
-#include <mapnik/query.hpp>
+#include <set>
+
 #include "osm_datasource.hpp"
 #include "osm_featureset.hpp"
 #include "dataset_deliverer.h"
 #include "osmtagtypes.h"
 #include "osmparser.h"
-#include <set>
 
 DATASOURCE_PLUGIN(osm_datasource)
 
@@ -42,19 +49,27 @@ using mapnik::filter_in_box;
 using mapnik::filter_at_point;
 using mapnik::attribute_descriptor;
 
-const std::string osm_datasource::name_ = "osm";
-
-osm_datasource::osm_datasource(const parameters &params)
+osm_datasource::osm_datasource(const parameters &params, bool bind)
    : datasource (params),
      type_(datasource::Vector),
-     desc_(*params.get<std::string>("type"), *params.get<std::string>("encoding","utf-8")) 
+     desc_(*params_.get<std::string>("type"), *params_.get<std::string>("encoding","utf-8")) 
 {
-    osm_data_ = NULL;
-    std::string osm_filename= *params.get<std::string>("file","");
-    std::string parser = *params.get<std::string>("parser","libxml2");
-    std::string url = *params.get<std::string>("url","");
-    std::string bbox = *params.get<std::string>("bbox","");
+    if (bind)
+    {
+        this->bind();
+    }
+}
+
+void osm_datasource::bind() const
+{
+    if (is_bound_) return;
 
+    osm_data_ = NULL;
+    std::string osm_filename= *params_.get<std::string>("file","");
+    std::string parser = *params_.get<std::string>("parser","libxml2");
+    std::string url = *params_.get<std::string>("url","");
+    std::string bbox = *params_.get<std::string>("bbox","");
+    
     bool do_process=false;
 
     // load the data
@@ -63,10 +78,10 @@ osm_datasource::osm_datasource(const parameters &params)
     {
         // otherwise if we supplied a url and a bounding box, load from the url
 #ifdef MAPNIK_DEBUG
-		cerr<<"loading_from_rul: url="<<url << " bbox="<<bbox<<endl;
+    cerr<<"loading_from_url: url="<<url << " bbox="<<bbox<<endl;
 #endif
         if((osm_data_=dataset_deliverer::load_from_url
-            (url,bbox,parser))==NULL)    
+            (url,bbox,parser))==NULL)
         {
             throw datasource_exception("Error loading from URL");
         }
@@ -78,7 +93,7 @@ osm_datasource::osm_datasource(const parameters &params)
             dataset_deliverer::load_from_file(osm_filename,parser))==NULL)
         {
             throw datasource_exception("Error loading from file");
-        }    
+        }
         do_process=true;
     }
 
@@ -99,8 +114,10 @@ osm_datasource::osm_datasource(const parameters &params)
 
         // Get the bounds of the data and set extent_ accordingly
         bounds b = osm_data_->get_bounds();
-        extent_ =  Envelope<double>(b.w,b.s,b.e,b.n);
+        extent_ =  box2d<double>(b.w,b.s,b.e,b.n);
     }
+    
+    is_bound_ = true;
 }
 
 
@@ -110,6 +127,10 @@ osm_datasource::~osm_datasource()
     //delete osm_data_; 
 }
 
+std::string osm_datasource::name()
+{
+   return "osm";
+}
 
 int osm_datasource::type() const
 {
@@ -123,18 +144,21 @@ layer_descriptor osm_datasource::get_descriptor() const
 
 featureset_ptr osm_datasource::features(const query& q) const
 {
-   filter_in_box filter(q.get_bbox());
+    if (!is_bound_) bind();  
+    
+    filter_in_box filter(q.get_bbox());
     // so we need to filter osm features by bbox here...
     
-    return featureset_ptr
-         (new osm_featureset<filter_in_box>(filter,
+    return boost::make_shared<osm_featureset<filter_in_box> >(filter,
                                               osm_data_,
                                               q.property_names(),
-                                              desc_.get_encoding()));
+                                              desc_.get_encoding());
 }
 
 featureset_ptr osm_datasource::features_at_point(coord2d const& pt) const
 {
+   if (!is_bound_) bind();
+    
    filter_at_point filter(pt);
    // collect all attribute names
    std::vector<attribute_descriptor> const& desc_vector = 
@@ -149,14 +173,15 @@ featureset_ptr osm_datasource::features_at_point(coord2d const& pt) const
       ++itr;
    }
     
-    return featureset_ptr
-         (new osm_featureset<filter_at_point>(filter,
+    return boost::make_shared<osm_featureset<filter_at_point> >(filter,
                                                 osm_data_,
                                                 names,
-                                                desc_.get_encoding()));
+                                                desc_.get_encoding());
 }
 
-Envelope<double> osm_datasource::envelope() const
+box2d<double> osm_datasource::envelope() const
 {
+   if (!is_bound_) bind();
+   
    return extent_;
 }
diff --git a/plugins/input/osm/osm_datasource.hpp b/plugins/input/osm/osm_datasource.hpp
index d5aadb4..44b8268 100644
--- a/plugins/input/osm/osm_datasource.hpp
+++ b/plugins/input/osm/osm_datasource.hpp
@@ -26,7 +26,7 @@
 #define OSM_DATASOURCE_HPP
 
 #include <mapnik/datasource.hpp>
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 
 #include "osm.h"
 
@@ -37,31 +37,30 @@ using mapnik::query;
 using mapnik::featureset_ptr;
 using mapnik::layer_descriptor;
 using mapnik::coord2d;
-using mapnik::Envelope;
+using mapnik::box2d;
 
 class osm_datasource : public datasource
 {
    public:
-      osm_datasource(const parameters &params);
+      osm_datasource(const parameters &params, bool bind=true);
       virtual ~osm_datasource();
     
-	  // these must be overridden
+    // these must be overridden
       int type() const;
       featureset_ptr features(const query& q) const;
       featureset_ptr features_at_point(coord2d const& pt) const;
-      Envelope<double> envelope() const;
+      box2d<double> envelope() const;
       layer_descriptor get_descriptor() const;   
-	  static std::string name() { return name_; }
-	  
+    static std::string name();
+    void bind() const;
    private:
       osm_datasource(const osm_datasource&);
       osm_datasource& operator=(const osm_datasource&);
    private:
-      Envelope<double> extent_;
-	  osm_dataset * osm_data_;
-	  int type_;
-	  layer_descriptor desc_;
-	  static const std::string name_;
+      mutable box2d<double> extent_;
+      mutable osm_dataset * osm_data_;
+    int type_;
+    mutable layer_descriptor desc_;
 };
 
 #endif //OSM_DATASOURCE_HPP
diff --git a/plugins/input/osm/osm_featureset.cpp b/plugins/input/osm/osm_featureset.cpp
index e33226e..3cf7b7b 100644
--- a/plugins/input/osm/osm_featureset.cpp
+++ b/plugins/input/osm/osm_featureset.cpp
@@ -21,119 +21,123 @@
  *
  *****************************************************************************/
 
-#include <iostream>
-#include "osm_featureset.hpp"
+// mapnik
 #include <mapnik/geometry.hpp>
+#include <mapnik/feature_factory.hpp>
+
+#include "osm_featureset.hpp"
+
+// stl
+#include <iostream>
 
 using mapnik::Feature;
 using mapnik::feature_ptr;
-using mapnik::geometry2d;
-using mapnik::point_impl;
-using mapnik::line_string_impl;
-using mapnik::polygon_impl;
-
+using mapnik::geometry_type;
+using mapnik::feature_factory;
 using std::cerr;
 using std::endl;
 
 template <typename filterT>
 osm_featureset<filterT>::osm_featureset(const filterT& filter, 
-                                           	osm_dataset * dataset, 
-                                            const std::set<std::string>& 
-													attribute_names,
-                                            std::string const& encoding)
-   : filter_(filter),
-     query_ext_(),
-     tr_(new transcoder(encoding)),
-     count_(0),
-	dataset_ (dataset),
-	attribute_names_ (attribute_names)
+                                        osm_dataset * dataset, 
+                                        const std::set<std::string>& 
+                                        attribute_names,
+                                        std::string const& encoding)
+    : filter_(filter),
+      query_ext_(),
+      tr_(new transcoder(encoding)),
+      feature_id_(1),
+      dataset_ (dataset),
+      attribute_names_ (attribute_names)
 {
-	dataset_->rewind();
+    dataset_->rewind();
 }
 
 
 template <typename filterT>
 feature_ptr osm_featureset<filterT>::next()
 {
-	osm_item * cur_item = dataset_->next_item();
-	feature_ptr feature;
-	bool success=false;
-	if(cur_item != NULL)
-	{
-		if(dataset_->current_item_is_node())
-		{
-			feature= feature_ptr(new Feature(count_++));
-			double lat = static_cast<osm_node*>(cur_item)->lat;
-			double lon = static_cast<osm_node*>(cur_item)->lon;
-			geometry2d * point = new point_impl;
-			point->move_to(lon,lat);
-			feature->add_geometry(point);
-			success=true;
-		} 
-		else if (dataset_->current_item_is_way())
-		{
-			bounds b = static_cast<osm_way*>(cur_item)->get_bounds();
-		
-			// Loop until we find a feature which passes the filter
-			while(cur_item != NULL &&
-					!filter_.pass(Envelope<double>(b.w,b.s,b.e,b.n)))
-			{
-				cur_item = dataset_->next_item();
-				if(cur_item!=NULL)
-					b = static_cast<osm_way*>(cur_item)->get_bounds();
-			}	
-				
-			if(cur_item != NULL)
-			{
-				if(static_cast<osm_way*>(cur_item)->nodes.size())
-				{
-					feature=feature_ptr(new Feature(count_++));
-					geometry2d *geom;
-					if(static_cast<osm_way*>(cur_item)->is_polygon())
-						geom=new polygon_impl;
-					else
-						geom=new line_string_impl;
-
-					geom->set_capacity(static_cast<osm_way*>(cur_item)->
-									nodes.size());
-					geom->move_to(static_cast<osm_way*>(cur_item)->
-										nodes[0]->lon,
-								static_cast<osm_way*>(cur_item)->
-										nodes[0]->lat);
-				
-					for(unsigned int count=1; count<static_cast<osm_way*>(cur_item)
-								->nodes.size(); count++)
-					{
-						geom->line_to(static_cast<osm_way*>(cur_item)
-									->nodes[count]->lon,
-								static_cast<osm_way*>(cur_item)
-									->nodes[count]->lat);
-					}
-					feature->add_geometry(geom);
-					success=true;
-				}
-			}
-		}
-	
-		// can feature_ptr be compared to NULL? - no 
-		if(success)
-		{
-			std::map<std::string,std::string>::iterator i=
-				cur_item->keyvals.begin();
+    osm_item * cur_item = dataset_->next_item();
+    feature_ptr feature;
+    bool success=false;
+    if(cur_item != NULL)
+    {
+        if(dataset_->current_item_is_node())
+        {
+            feature = feature_factory::create(feature_id_);
+            ++feature_id_;
+            double lat = static_cast<osm_node*>(cur_item)->lat;
+            double lon = static_cast<osm_node*>(cur_item)->lon;
+            geometry_type * point = new geometry_type(mapnik::Point);
+            point->move_to(lon,lat);
+            feature->add_geometry(point);
+            success = true;
+        } 
+        else if (dataset_->current_item_is_way())
+        {
+            bounds b = static_cast<osm_way*>(cur_item)->get_bounds();
+                
+            // Loop until we find a feature which passes the filter
+            while(cur_item != NULL &&
+                  !filter_.pass(box2d<double>(b.w,b.s,b.e,b.n)))
+            {
+                cur_item = dataset_->next_item();
+                if(cur_item!=NULL)
+                    b = static_cast<osm_way*>(cur_item)->get_bounds();
+            }   
+                                
+            if(cur_item != NULL)
+            {
+                if(static_cast<osm_way*>(cur_item)->nodes.size())
+                {
+                    feature = feature_factory::create(feature_id_);
+                    ++feature_id_;
+                    geometry_type *geom;
+                    if(static_cast<osm_way*>(cur_item)->is_polygon())
+                        geom = new geometry_type(mapnik::Polygon);
+                    else
+                        geom = new geometry_type(mapnik::LineString);
+                    
+                    geom->set_capacity(static_cast<osm_way*>(cur_item)->
+                                       nodes.size());
+                    geom->move_to(static_cast<osm_way*>(cur_item)->
+                                  nodes[0]->lon,
+                                  static_cast<osm_way*>(cur_item)->
+                                  nodes[0]->lat);
+                                
+                    for(unsigned int count=1; count<static_cast<osm_way*>(cur_item)
+                            ->nodes.size(); count++)
+                    {
+                        geom->line_to(static_cast<osm_way*>(cur_item)
+                                      ->nodes[count]->lon,
+                                      static_cast<osm_way*>(cur_item)
+                                      ->nodes[count]->lat);
+                    }
+                    feature->add_geometry(geom);
+                    success = true;
+                }
+            }
+        }
+        
+        // can feature_ptr be compared to NULL? - no 
+        if(success)
+        {
+            std::map<std::string,std::string>::iterator i=
+                cur_item->keyvals.begin();
 
-			// add the keyvals to the feature. the feature seems to be a map
-			// of some sort so this should work - see dbf_file::add_attribute()
-			while(i != cur_item->keyvals.end())
-			{	
-				//only add if in the specified set of attribute names
-				if(attribute_names_.find(i->first) != attribute_names_.end())
-					(*feature)[i->first] = tr_->transcode(i->second.c_str());
-				i++;
-			}
-			return feature;
-		}
-	}   
-	return feature_ptr();
+            // add the keyvals to the feature. the feature seems to be a map
+            // of some sort so this should work - see dbf_file::add_attribute()
+            while(i != cur_item->keyvals.end())
+            {   
+                //only add if in the specified set of attribute names
+                if(attribute_names_.find(i->first) != attribute_names_.end())
+                    (*feature)[i->first] = tr_->transcode(i->second.c_str());
+                i++;
+            }
+            return feature;
+        }
+    }   
+    return feature_ptr();
 }
 
 
diff --git a/plugins/input/osm/osm_featureset.hpp b/plugins/input/osm/osm_featureset.hpp
index 905448c..a1251e2 100644
--- a/plugins/input/osm/osm_featureset.hpp
+++ b/plugins/input/osm/osm_featureset.hpp
@@ -33,7 +33,7 @@
 #include <set>
 
 using mapnik::Featureset;
-using mapnik::Envelope;
+using mapnik::box2d;
 using mapnik::feature_ptr;
 using mapnik::transcoder;
 
@@ -41,14 +41,14 @@ template <typename filterT>
 class osm_featureset : public Featureset
 {
       filterT filter_;
-      Envelope<double> query_ext_;
+      box2d<double> query_ext_;
       boost::scoped_ptr<transcoder> tr_;
       std::vector<int> attr_ids_;
-      mutable Envelope<double> feature_ext_;
+      mutable box2d<double> feature_ext_;
       mutable int total_geom_size;
-      mutable int count_;
-	  osm_dataset *dataset_;
-	  std::set<std::string> attribute_names_;
+      mutable int feature_id_;
+      osm_dataset *dataset_;
+      std::set<std::string> attribute_names_;
 
    public:
       osm_featureset(const filterT& filter, 
diff --git a/plugins/input/osm/osmparser.cpp b/plugins/input/osm/osmparser.cpp
index 51864af..9219dbf 100644
--- a/plugins/input/osm/osmparser.cpp
+++ b/plugins/input/osm/osmparser.cpp
@@ -18,140 +18,140 @@ using std::endl;
 
 void osmparser::processNode(xmlTextReaderPtr reader)
 {
-	xmlChar *name = xmlTextReaderName(reader);
-	if(name==NULL)
-		name=xmlStrdup(BAD_CAST "--");
+  xmlChar *name = xmlTextReaderName(reader);
+  if(name==NULL)
+    name=xmlStrdup(BAD_CAST "--");
 
-	switch(xmlTextReaderNodeType(reader))
-	{
-		case XML_READER_TYPE_ELEMENT:
-			startElement(reader,name);
-			break;
+  switch(xmlTextReaderNodeType(reader))
+  {
+    case XML_READER_TYPE_ELEMENT:
+      startElement(reader,name);
+      break;
 
-		case XML_READER_TYPE_END_ELEMENT:
-			endElement(name);
-	}
-	xmlFree(name);
+    case XML_READER_TYPE_END_ELEMENT:
+      endElement(name);
+  }
+  xmlFree(name);
 }
 
 void osmparser::startElement(xmlTextReaderPtr reader, const xmlChar *name)
 {
-	std::string tags; 
-	xmlChar *xid, *xlat, *xlon, *xk, *xv;
+  std::string tags; 
+  xmlChar *xid, *xlat, *xlon, *xk, *xv;
 
-		if(xmlStrEqual(name,BAD_CAST "node"))
-		{
-			curID = 0;
-			in_node = true;
-			osm_node *node=new osm_node;
-			xlat=xmlTextReaderGetAttribute(reader,BAD_CAST "lat");
-			xlon=xmlTextReaderGetAttribute(reader,BAD_CAST "lon");
-			xid=xmlTextReaderGetAttribute(reader,BAD_CAST "id");
-			assert(xlat);
-			assert(xlon);
-			assert(xid);
-			node->lat=atof((char*)xlat);	
-			node->lon=atof((char*)xlon);	
-			node->id = atol((char*)xid);
-			cur_item = node;	
-			tmp_node_store[node->id] = node;
-			xmlFree(xid);
-			xmlFree(xlon);
-			xmlFree(xlat);
-		}
-		else if (xmlStrEqual(name,BAD_CAST "way")) 
-		{
-			curID=0;
-			in_way = true;
-			osm_way *way=new osm_way;
-			xid=xmlTextReaderGetAttribute(reader,BAD_CAST "id");
-			assert(xid);
-			way->id = atol((char*)xid); 
-			cur_item  =  way; 
-			// Prevent ways with no name being assigned a name of "0"
-			cur_item->keyvals["name"] = ""; 
+    if(xmlStrEqual(name,BAD_CAST "node"))
+    {
+      curID = 0;
+      in_node = true;
+      osm_node *node=new osm_node;
+      xlat=xmlTextReaderGetAttribute(reader,BAD_CAST "lat");
+      xlon=xmlTextReaderGetAttribute(reader,BAD_CAST "lon");
+      xid=xmlTextReaderGetAttribute(reader,BAD_CAST "id");
+      assert(xlat);
+      assert(xlon);
+      assert(xid);
+      node->lat=atof((char*)xlat);  
+      node->lon=atof((char*)xlon);  
+      node->id = atol((char*)xid);
+      cur_item = node;  
+      tmp_node_store[node->id] = node;
+      xmlFree(xid);
+      xmlFree(xlon);
+      xmlFree(xlat);
+    }
+    else if (xmlStrEqual(name,BAD_CAST "way")) 
+    {
+      curID=0;
+      in_way = true;
+      osm_way *way=new osm_way;
+      xid=xmlTextReaderGetAttribute(reader,BAD_CAST "id");
+      assert(xid);
+      way->id = atol((char*)xid); 
+      cur_item  =  way; 
+      // Prevent ways with no name being assigned a name of "0"
+      cur_item->keyvals["name"] = ""; 
 
-			// HACK: allows comparison with "" in the XML file. Otherwise it
-			// doesn't work. Only do for the most crucial tags for Freemap's
-			// purposes.  TODO investigate why this is
-			cur_item->keyvals["width"] = "";  
-			cur_item->keyvals["horse"] = "";  
-			cur_item->keyvals["foot"] = "";  
-			cur_item->keyvals["bicycle"] = "";  
-			xmlFree(xid);
-		}
-		else if (xmlStrEqual(name,BAD_CAST "nd"))
-		{
-			xid=xmlTextReaderGetAttribute(reader,BAD_CAST "ref");
-			assert(xid);
-			long ndid = atol((char*)xid); 
-			if(tmp_node_store.find(ndid)!=tmp_node_store.end())
-			{
-				(static_cast<osm_way*>(cur_item))->nodes.push_back
-						(tmp_node_store[ndid]);
-			}
-			xmlFree(xid);
-		}
-		else if (xmlStrEqual(name,BAD_CAST "tag"))
-		{
-			std::string key="", value="";
-			xk = xmlTextReaderGetAttribute(reader,BAD_CAST "k");
-			xv = xmlTextReaderGetAttribute(reader,BAD_CAST "v");
-			assert(xk);
-			assert(xv);
-			cur_item->keyvals[(char*)xk] = (char*)xv; 
-			xmlFree(xk);
-			xmlFree(xv);
-		}
+      // HACK: allows comparison with "" in the XML file. Otherwise it
+      // doesn't work. Only do for the most crucial tags for Freemap's
+      // purposes.  TODO investigate why this is
+      cur_item->keyvals["width"] = "";  
+      cur_item->keyvals["horse"] = "";  
+      cur_item->keyvals["foot"] = "";  
+      cur_item->keyvals["bicycle"] = "";  
+      xmlFree(xid);
+    }
+    else if (xmlStrEqual(name,BAD_CAST "nd"))
+    {
+      xid=xmlTextReaderGetAttribute(reader,BAD_CAST "ref");
+      assert(xid);
+      long ndid = atol((char*)xid); 
+      if(tmp_node_store.find(ndid)!=tmp_node_store.end())
+      {
+        (static_cast<osm_way*>(cur_item))->nodes.push_back
+            (tmp_node_store[ndid]);
+      }
+      xmlFree(xid);
+    }
+    else if (xmlStrEqual(name,BAD_CAST "tag"))
+    {
+      std::string key="", value="";
+      xk = xmlTextReaderGetAttribute(reader,BAD_CAST "k");
+      xv = xmlTextReaderGetAttribute(reader,BAD_CAST "v");
+      assert(xk);
+      assert(xv);
+      cur_item->keyvals[(char*)xk] = (char*)xv; 
+      xmlFree(xk);
+      xmlFree(xv);
+    }
 }
 
 void osmparser::endElement(const xmlChar* name)
 {
-	if(xmlStrEqual(name,BAD_CAST "node"))
-	{
-		in_node = false;
-		components->add_node(static_cast<osm_node*>(cur_item));
-	}
-	else if(xmlStrEqual(name,BAD_CAST "way"))
-	{
-		in_way = false;
-		components->add_way(static_cast<osm_way*>(cur_item));
-	}
+  if(xmlStrEqual(name,BAD_CAST "node"))
+  {
+    in_node = false;
+    components->add_node(static_cast<osm_node*>(cur_item));
+  }
+  else if(xmlStrEqual(name,BAD_CAST "way"))
+  {
+    in_way = false;
+    components->add_way(static_cast<osm_way*>(cur_item));
+  }
 }
 
 bool osmparser::parse(osm_dataset *ds, const char* filename)
 {
-	components=ds;
-	xmlTextReaderPtr reader = xmlNewTextReaderFilename(filename);
-	int ret=do_parse(reader);
-	xmlFreeTextReader(reader);
-	return (ret==0) ?  true:false;
+  components=ds;
+  xmlTextReaderPtr reader = xmlNewTextReaderFilename(filename);
+  int ret=do_parse(reader);
+  xmlFreeTextReader(reader);
+  return (ret==0) ?  true:false;
 }
 
 bool osmparser::parse(osm_dataset *ds,char* data, int nbytes)
 {
-	// from cocoasamurai.blogspot.com/2008/10/getting-some-xml-love-with-
-	// libxml2.html, converted from Objective-C to straight C
+  // from cocoasamurai.blogspot.com/2008/10/getting-some-xml-love-with-
+  // libxml2.html, converted from Objective-C to straight C
 
-	components=ds;
-	xmlTextReaderPtr reader = xmlReaderForMemory(data,nbytes,NULL,NULL,0);
-	int ret=do_parse(reader);
-	xmlFreeTextReader(reader);
-	return (ret==0) ? true:false;
+  components=ds;
+  xmlTextReaderPtr reader = xmlReaderForMemory(data,nbytes,NULL,NULL,0);
+  int ret=do_parse(reader);
+  xmlFreeTextReader(reader);
+  return (ret==0) ? true:false;
 }
 
-	
+  
 int osmparser::do_parse(xmlTextReaderPtr reader)
 {
-	int ret=-1;
-	if(reader!=NULL)
-	{
-		ret = xmlTextReaderRead(reader);
-		while(ret==1)
-		{
-			processNode(reader);
-			ret=xmlTextReaderRead(reader);
-		}
-	}
-	return ret;
+  int ret=-1;
+  if(reader!=NULL)
+  {
+    ret = xmlTextReaderRead(reader);
+    while(ret==1)
+    {
+      processNode(reader);
+      ret=xmlTextReaderRead(reader);
+    }
+  }
+  return ret;
 }
diff --git a/plugins/input/osm/osmparser.h b/plugins/input/osm/osmparser.h
index 1ac25f3..5ffa047 100644
--- a/plugins/input/osm/osmparser.h
+++ b/plugins/input/osm/osmparser.h
@@ -17,7 +17,7 @@ private:
     static std::string error;
     static std::map<long,osm_node*> tmp_node_store;
 
-	static int do_parse(xmlTextReaderPtr);
+  static int do_parse(xmlTextReaderPtr);
 
 public:
     static void processNode(xmlTextReaderPtr reader);
diff --git a/plugins/input/osm/osmtagtypes.h b/plugins/input/osm/osmtagtypes.h
index 1d48f2b..d486946 100644
--- a/plugins/input/osm/osmtagtypes.h
+++ b/plugins/input/osm/osmtagtypes.h
@@ -9,20 +9,20 @@
 class osm_tag_types
 {
 private:
-	std::map<std::string,mapnik::eAttributeType> types;
+  std::map<std::string,mapnik::eAttributeType> types;
 
 public:
-	void add_type(std::string tag, mapnik::eAttributeType type)
-	{
-		types[tag]=type;
-	}
+  void add_type(std::string tag, mapnik::eAttributeType type)
+  {
+    types[tag]=type;
+  }
 
-	mapnik::eAttributeType get_type(std::string tag)
-	{
-		std::map<std::string,mapnik::eAttributeType>::iterator i = 
-									types.find(tag);
-		return (i==types.end()) ? mapnik::String: i->second;
-	}
+  mapnik::eAttributeType get_type(std::string tag)
+  {
+    std::map<std::string,mapnik::eAttributeType>::iterator i = 
+                  types.find(tag);
+    return (i==types.end()) ? mapnik::String: i->second;
+  }
 };
-	
+  
 #endif // OSMTAGTYPES_H
diff --git a/plugins/input/osm/render.cpp b/plugins/input/osm/render.cpp
index 5d00b31..b55e8dd 100644
--- a/plugins/input/osm/render.cpp
+++ b/plugins/input/osm/render.cpp
@@ -1,6 +1,6 @@
 #include <mapnik/map.hpp>
 #include <mapnik/layer.hpp>
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 #include <mapnik/agg_renderer.hpp>
 #include <mapnik/image_util.hpp>
 #include <mapnik/load_map.hpp>
@@ -17,43 +17,43 @@ using namespace std;
 
 int main(int argc,char *argv[])
 {
-	if(argc < 6)
-	{
-		std::cerr<<"Usage: render XMLfile w s e n [OSMfile]" << std::endl;
-		exit(0);
-	}
-
-	datasource_cache::instance()->register_datasources
-		("/usr/local/lib/mapnik/input");
-	freetype_engine::register_font
-		("/usr/local/lib/mapnik/fonts/DejaVuSans.ttf");
-
-	Map m (800,800);
-	load_map(m,argv[1]);
-	
-	if(argc>6)
-	{
-		parameters p;
-		p["type"] = "osm";
-		p["file"] = argv[6];
-		for(int count=0; count<m.layerCount(); count++)
-		{
-			parameters q = m.getLayer(count).datasource()->params();
-			m.getLayer(count).set_datasource(datasource_cache::instance()->
-				create(p));
-		}
-	}
-
-	Envelope<double> bbox (atof(argv[2]),atof(argv[3]),
-							atof(argv[4]),atof(argv[5]));
-										
-	m.zoomToBox(bbox);
-
-	Image32 buf (m.getWidth(), m.getHeight());
-	agg_renderer<Image32> r(m,buf);
-	r.apply();
-
-	save_to_file<ImageData32>(buf.data(),"blah.png","png");
-
-	return 0;
+  if(argc < 6)
+  {
+    std::cerr<<"Usage: render XMLfile w s e n [OSMfile]" << std::endl;
+    exit(0);
+  }
+
+  datasource_cache::instance()->register_datasources
+    ("/usr/local/lib/mapnik/input");
+  freetype_engine::register_font
+    ("/usr/local/lib/mapnik/fonts/DejaVuSans.ttf");
+
+  Map m (800,800);
+  load_map(m,argv[1]);
+  
+  if(argc>6)
+  {
+    parameters p;
+    p["type"] = "osm";
+    p["file"] = argv[6];
+    for(int count=0; count<m.layer_count(); count++)
+    {
+      parameters q = m.getLayer(count).datasource()->params();
+      m.getLayer(count).set_datasource(datasource_cache::instance()->
+        create(p));
+    }
+  }
+
+  box2d<double> bbox (atof(argv[2]),atof(argv[3]),
+              atof(argv[4]),atof(argv[5]));
+                    
+  m.zoom_to_box(bbox);
+
+  image_32 buf (m.width(), m.height());
+  agg_renderer<image_32> r(m,buf);
+  r.apply();
+
+  save_to_file<image_data_32>(buf.data(),"blah.png","png");
+
+  return 0;
 }
diff --git a/plugins/input/osm/test.cpp b/plugins/input/osm/test.cpp
index d8ec5fe..ddee142 100644
--- a/plugins/input/osm/test.cpp
+++ b/plugins/input/osm/test.cpp
@@ -5,21 +5,21 @@ using std::endl;
 
 int main(int argc,char* argv[])
 {
-	if(argc>=2)
-	{
-		osm_dataset dataset(argv[1]);
-		bounds b = dataset.get_bounds();
-		osm_item *item;
-		dataset.rewind();
-		while((item=dataset.next_item())!=NULL)
-		{
-			std::cerr << item->to_string() << endl;
-		}
-	}
-	else
-	{
-		std::cerr<<"Usage: test OSMfile"<<std::endl;
-		exit(1);
-	}
-	return 0;
+  if(argc>=2)
+  {
+    osm_dataset dataset(argv[1]);
+    bounds b = dataset.get_bounds();
+    osm_item *item;
+    dataset.rewind();
+    while((item=dataset.next_item())!=NULL)
+    {
+      std::cerr << item->to_string() << endl;
+    }
+  }
+  else
+  {
+    std::cerr<<"Usage: test OSMfile"<<std::endl;
+    exit(1);
+  }
+  return 0;
 }
diff --git a/plugins/input/osm/test.xml b/plugins/input/osm/test.xml
index 7a73365..5c25294 100644
--- a/plugins/input/osm/test.xml
+++ b/plugins/input/osm/test.xml
@@ -1,21 +1,21 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE Map>
-<Map bgcolor="#b5d0d0" srs="+proj=latlong +datum=WGS84">
+<Map bgcolor="#b5d0d0" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
  
   <Style name="coast-poly">
      <Rule>
-	 	<PolygonSymbolizer>
-			<CssParameter name="fill">#f2efe9</CssParameter>
-		</PolygonSymbolizer>
-	</Rule>
+     <PolygonSymbolizer>
+      <CssParameter name="fill">#f2efe9</CssParameter>
+    </PolygonSymbolizer>
+  </Rule>
   </Style>
 
   <Style name="coast-line">
      <Rule>
-	 	<LineSymbolizer>
-			<CssParameter name="stroke">skyblue</CssParameter>
-		</LineSymbolizer>
-	</Rule>
+     <LineSymbolizer>
+      <CssParameter name="stroke">skyblue</CssParameter>
+    </LineSymbolizer>
+  </Rule>
   </Style>
 
   <Style name="leisure">
@@ -39,7 +39,7 @@
     </Rule>
      <Rule>
       <Filter>[leisure] = 'park' or [leisure] = 'common' or
-	  	[leisure] = 'golf_course'</Filter>
+      [leisure] = 'golf_course'</Filter>
       <PolygonSymbolizer>
         <CssParameter name="fill">#d8e8d0</CssParameter>
      </PolygonSymbolizer>
@@ -91,12 +91,12 @@
       <Filter>[natural] = 'peak'</Filter>
       <TextSymbolizer name="name" face_name="Bitstream Vera Sans Roman" size="11" fill="#000" halo_radius="1" wrap_width="0"/>
     </Rule>
-	<Rule>
-	  <Filter>[natural] = 'wood' or [natural] = 'water' or [natural] = 'heath'
-	  or [leisure] = 'golf_course' </Filter>
-	  <TextSymbolizer name="name" face_name="Bitstream Vera Sans Roman" 
-	  size="10" fill="#000" halo_radius="2" wrap_width="0" />
-	</Rule>
+  <Rule>
+    <Filter>[natural] = 'wood' or [natural] = 'water' or [natural] = 'heath'
+    or [leisure] = 'golf_course' </Filter>
+    <TextSymbolizer name="name" face_name="Bitstream Vera Sans Roman" 
+    size="10" fill="#000" halo_radius="2" wrap_width="0" />
+  </Rule>
   </Style>
   
    <Style name="river">
@@ -193,7 +193,7 @@
       <Filter>[highway] = 'unsurfaced' or [highway] = 'track'</Filter>
       <LineSymbolizer>
         <CssParameter name="stroke">#999</CssParameter>
-		<CssParameter name="stroke-dasharray">6,4</CssParameter>
+    <CssParameter name="stroke-dasharray">6,4</CssParameter>
         <CssParameter name="stroke-width">4</CssParameter>
         <CssParameter name="stroke-linejoin">round</CssParameter>
         <CssParameter name="stroke-linecap">round</CssParameter>
@@ -211,7 +211,7 @@
         <CssParameter name="stroke-linecap">round</CssParameter>
       </LineSymbolizer>
     </Rule>
-	</Style>
+  </Style>
   <Style name="trunk">
     <Rule>
       <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
@@ -275,7 +275,7 @@
    <Style name="residential">
     <Rule>
       <Filter>[highway] = 'residential' or [highway] = 'service' or
-	  	[highway] = 'unsurfaced' or [highway] = 'track'</Filter> 
+      [highway] = 'unsurfaced' or [highway] = 'track'</Filter> 
       <LineSymbolizer>
         <CssParameter name="stroke">#fff</CssParameter>
         <CssParameter name="stroke-width">2</CssParameter>
@@ -283,9 +283,9 @@
         <CssParameter name="stroke-linecap">round</CssParameter>
       </LineSymbolizer>
     </Rule>
-	</Style>
+  </Style>
     
-	<Style name="bridleway">
+  <Style name="bridleway">
     <Rule>
       <Filter>[highway] = 'bridleway' and [newforest_pathtype] = ''</Filter>
       <LineSymbolizer>
@@ -305,7 +305,7 @@
     </Rule>
     <Rule>
       <Filter>[highway] = 'bridleway' and [foot] = 'yes' and [horse] = 'yes'
-	  and [bicycle] = 'yes'</Filter>
+    and [bicycle] = 'yes'</Filter>
       <LineSymbolizer>
         <CssParameter name="stroke">#fff</CssParameter>
         <CssParameter name="stroke-width">6</CssParameter>
@@ -323,7 +323,7 @@
     </Rule>
     <Rule>
       <Filter>[highway] = 'bridleway' and [newforest_pathtype] = 'narrow'
-	  </Filter>
+    </Filter>
       <LineSymbolizer>
         <CssParameter name="stroke">#00c000</CssParameter>
         <CssParameter name="stroke-width">1.0</CssParameter>
@@ -351,7 +351,7 @@
     </Rule>
     <Rule>
       <Filter>[highway] = 'bridleway' and [newforest_pathtype] = 'gravel'
-	  </Filter>
+    </Filter>
       <LineSymbolizer>
         <CssParameter name="stroke">#fff</CssParameter>
         <CssParameter name="stroke-width">6</CssParameter>
@@ -361,7 +361,7 @@
       </LineSymbolizer>
       <LineSymbolizer>
         <CssParameter name="stroke">brown</CssParameter>
-		<CssParameter name="stroke-dasharray">6,4</CssParameter>
+    <CssParameter name="stroke-dasharray">6,4</CssParameter>
         <CssParameter name="stroke-width">2</CssParameter>
         <CssParameter name="stroke-linejoin">round</CssParameter>
         <CssParameter name="stroke-linecap">round</CssParameter>
@@ -369,17 +369,17 @@
     </Rule>
     <Rule>
       <Filter>[highway] = 'bridleway' and [newforest_pathtype] = 'track'
-	  </Filter>
+    </Filter>
       <LineSymbolizer>
         <CssParameter name="stroke">brown</CssParameter>
-		<CssParameter name="stroke-dasharray">2,4</CssParameter>
+    <CssParameter name="stroke-dasharray">2,4</CssParameter>
         <CssParameter name="stroke-width">2</CssParameter>
         <CssParameter name="stroke-linejoin">round</CssParameter>
         <CssParameter name="stroke-linecap">round</CssParameter>
       </LineSymbolizer>
     </Rule>
-	</Style>
-	<Style name="footway">
+  </Style>
+  <Style name="footway">
     <Rule>
       <Filter>[highway] = 'footway'</Filter>
       <LineSymbolizer>
@@ -414,8 +414,8 @@
         <CssParameter name="stroke-linecap">round</CssParameter>
       </LineSymbolizer>
     </Rule>
-	</Style>
-	<Style name="cycleway">
+  </Style>
+  <Style name="cycleway">
     <Rule>
       <Filter>[highway] = 'cycleway'</Filter>
       <LineSymbolizer>
@@ -433,8 +433,8 @@
         <CssParameter name="stroke-linecap">round</CssParameter>
       </LineSymbolizer>
     </Rule>
-	</Style>
-	<Style name="byway">
+  </Style>
+  <Style name="byway">
     <Rule>
       <Filter>[highway] = 'byway'</Filter>
       <LineSymbolizer>
@@ -454,16 +454,16 @@
   </Style>
 
   <Style name="contours">
-  	<Rule>
-  	<Filter>[major] = 1</Filter>
+    <Rule>
+    <Filter>[major] = 1</Filter>
       <LineSymbolizer>
         <CssParameter name="stroke">#fb9b67</CssParameter>
         <CssParameter name="stroke-width">1.0</CssParameter>
         <CssParameter name="stroke-linejoin">round</CssParameter>
         <CssParameter name="stroke-linecap">round</CssParameter>
       </LineSymbolizer>
-  	</Rule>
-	<Rule>
+    </Rule>
+  <Rule>
       <ElseFilter/>
       <LineSymbolizer>
         <CssParameter name="stroke">#fb9b67</CssParameter>
@@ -477,11 +477,11 @@
   <Style name="contours-text">
     <Rule>
       <TextSymbolizer name="height" face_name="Bitstream Vera Sans Roman" 
-	  	size="8" fill="#fb9b67" halo_radius="0" placement="line"/>
+      size="8" fill="#fb9b67" halo_radius="0" placement="line"/>
     </Rule>
   </Style>
 
-  <Layer name="roads" status="on" srs="+proj=latlong +datum=WGS84">
+  <Layer name="roads" status="on" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
     <StyleName>roads-casing</StyleName>
     <StyleName>footway</StyleName>
     <StyleName>cycleway</StyleName>
diff --git a/plugins/input/osm/test2.xml b/plugins/input/osm/test2.xml
index 0a01949..1d25f87 100644
--- a/plugins/input/osm/test2.xml
+++ b/plugins/input/osm/test2.xml
@@ -1,26 +1,26 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE Map>
-<Map bgcolor="#d0d0d0" srs="+proj=latlong +datum=WGS84">
+<Map bgcolor="#d0d0d0" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
   <Style name="amenity">
     <Rule>
       <Filter>[amenity]='pub'</Filter>
       <PointSymbolizer file="/home/nick/images/pub.png" type="png" 
-	  		width="16" height="16" />
+        width="16" height="16" />
     </Rule>
     <Rule>
       <Filter>[man_made]='mast'</Filter>
       <PointSymbolizer file="/home/nick/images/mast.png" type="png" 
-	  	width="16" height="16" />
+      width="16" height="16" />
     </Rule>
      <Rule>
       <Filter>[amenity]='parking'</Filter>
       <PointSymbolizer file="/home/nick/images/carpark.png" type="png" 
-	  	width="16" height="16"/>
+      width="16" height="16"/>
      </Rule>
      <Rule>
       <Filter>[residence]='farm'</Filter>
       <PointSymbolizer file="/home/nick/images/farm.png" type="png" 
-	  	width="16" height="16"/>
+      width="16" height="16"/>
      </Rule>
   </Style>
   
@@ -46,7 +46,7 @@
     </Rule>
      <Rule>
       <Filter>[leisure] = 'park' or [leisure] = 'common' or
-	  	[leisure] = 'golf_course'</Filter>
+      [leisure] = 'golf_course'</Filter>
       <PolygonSymbolizer>
         <CssParameter name="fill">#d8e8d0</CssParameter>
      </PolygonSymbolizer>
@@ -98,12 +98,12 @@
       <Filter>[natural] = 'peak'</Filter>
       <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="11" fill="#000" halo_radius="1" wrap_width="0"/>
     </Rule>
-	<Rule>
-	  <Filter>[natural] = 'wood' or [natural] = 'water' or [natural] = 'heath'
-	  or [leisure] = 'golf_course' </Filter>
-	  <TextSymbolizer name="name" face_name="DejaVu Sans Book" 
-	  size="10" fill="#000" halo_radius="2" wrap_width="0" />
-	</Rule>
+  <Rule>
+    <Filter>[natural] = 'wood' or [natural] = 'water' or [natural] = 'heath'
+    or [leisure] = 'golf_course' </Filter>
+    <TextSymbolizer name="name" face_name="DejaVu Sans Book" 
+    size="10" fill="#000" halo_radius="2" wrap_width="0" />
+  </Rule>
   </Style>
   
    <Style name="river">
@@ -200,7 +200,7 @@
       <Filter>[highway] = 'unsurfaced' or [highway] = 'track'</Filter>
       <LineSymbolizer>
         <CssParameter name="stroke">#999</CssParameter>
-		<CssParameter name="stroke-dasharray">6,4</CssParameter>
+    <CssParameter name="stroke-dasharray">6,4</CssParameter>
         <CssParameter name="stroke-width">4</CssParameter>
         <CssParameter name="stroke-linejoin">round</CssParameter>
         <CssParameter name="stroke-linecap">round</CssParameter>
@@ -218,7 +218,7 @@
         <CssParameter name="stroke-linecap">round</CssParameter>
       </LineSymbolizer>
     </Rule>
-	</Style>
+  </Style>
   <Style name="trunk">
     <Rule>
       <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
@@ -282,7 +282,7 @@
    <Style name="residential">
     <Rule>
       <Filter>[highway] = 'residential' or [highway] = 'service' or
-	  	[highway] = 'unsurfaced' or [highway] = 'track'</Filter> 
+      [highway] = 'unsurfaced' or [highway] = 'track'</Filter> 
       <LineSymbolizer>
         <CssParameter name="stroke">#fff</CssParameter>
         <CssParameter name="stroke-width">2</CssParameter>
@@ -290,9 +290,9 @@
         <CssParameter name="stroke-linecap">round</CssParameter>
       </LineSymbolizer>
     </Rule>
-	</Style>
+  </Style>
     
-	<Style name="bridleway">
+  <Style name="bridleway">
     <Rule>
       <Filter>[highway] = 'bridleway' and [newforest_pathtype] = ''</Filter>
       <LineSymbolizer>
@@ -312,7 +312,7 @@
     </Rule>
     <Rule>
       <Filter>[highway] = 'bridleway' and [foot] = 'yes' and [horse] = 'yes'
-	  and [bicycle] = 'yes'</Filter>
+    and [bicycle] = 'yes'</Filter>
       <LineSymbolizer>
         <CssParameter name="stroke">#fff</CssParameter>
         <CssParameter name="stroke-width">6</CssParameter>
@@ -330,7 +330,7 @@
     </Rule>
     <Rule>
       <Filter>[highway] = 'bridleway' and [newforest_pathtype] = 'narrow'
-	  </Filter>
+    </Filter>
       <LineSymbolizer>
         <CssParameter name="stroke">#00c000</CssParameter>
         <CssParameter name="stroke-width">1.0</CssParameter>
@@ -358,7 +358,7 @@
     </Rule>
     <Rule>
       <Filter>[highway] = 'bridleway' and [newforest_pathtype] = 'gravel'
-	  </Filter>
+    </Filter>
       <LineSymbolizer>
         <CssParameter name="stroke">#fff</CssParameter>
         <CssParameter name="stroke-width">6</CssParameter>
@@ -368,7 +368,7 @@
       </LineSymbolizer>
       <LineSymbolizer>
         <CssParameter name="stroke">brown</CssParameter>
-		<CssParameter name="stroke-dasharray">6,4</CssParameter>
+    <CssParameter name="stroke-dasharray">6,4</CssParameter>
         <CssParameter name="stroke-width">2</CssParameter>
         <CssParameter name="stroke-linejoin">round</CssParameter>
         <CssParameter name="stroke-linecap">round</CssParameter>
@@ -376,17 +376,17 @@
     </Rule>
     <Rule>
       <Filter>[highway] = 'bridleway' and [newforest_pathtype] = 'track'
-	  </Filter>
+    </Filter>
       <LineSymbolizer>
         <CssParameter name="stroke">brown</CssParameter>
-		<CssParameter name="stroke-dasharray">2,4</CssParameter>
+    <CssParameter name="stroke-dasharray">2,4</CssParameter>
         <CssParameter name="stroke-width">2</CssParameter>
         <CssParameter name="stroke-linejoin">round</CssParameter>
         <CssParameter name="stroke-linecap">round</CssParameter>
       </LineSymbolizer>
     </Rule>
-	</Style>
-	<Style name="footway">
+  </Style>
+  <Style name="footway">
     <Rule>
       <Filter>[highway] = 'footway'</Filter>
       <LineSymbolizer>
@@ -421,8 +421,8 @@
         <CssParameter name="stroke-linecap">round</CssParameter>
       </LineSymbolizer>
     </Rule>
-	</Style>
-	<Style name="cycleway">
+  </Style>
+  <Style name="cycleway">
     <Rule>
       <Filter>[highway] = 'cycleway'</Filter>
       <LineSymbolizer>
@@ -440,8 +440,8 @@
         <CssParameter name="stroke-linecap">round</CssParameter>
       </LineSymbolizer>
     </Rule>
-	</Style>
-	<Style name="byway">
+  </Style>
+  <Style name="byway">
     <Rule>
       <Filter>[highway] = 'byway'</Filter>
       <LineSymbolizer>
@@ -466,7 +466,7 @@
     </Rule>
   </Style>
 
-  <Layer name="leisure" status="on" srs="+proj=latlong +datum=WGS84">
+  <Layer name="leisure" status="on" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
     <StyleName>leisure</StyleName>
     <Datasource>
       <Parameter name="type">osm</Parameter>
@@ -474,7 +474,7 @@
     </Datasource>
   </Layer>
   
-  <Layer name="waterway" status="on" srs="+proj=latlong +datum=WGS84">
+  <Layer name="waterway" status="on" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
     <StyleName>river</StyleName>
     <StyleName>stream</StyleName>
     <Datasource>
@@ -483,7 +483,7 @@
     </Datasource>
   </Layer>
   
-  <Layer name="lakes" status="on" srs="+proj=latlong +datum=WGS84">
+  <Layer name="lakes" status="on" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
     <StyleName>lakes</StyleName>
     <Datasource>
       <Parameter name="type">osm</Parameter>
@@ -491,7 +491,7 @@
     </Datasource>
   </Layer>
 
-  <Layer name="roads" status="on" srs="+proj=latlong +datum=WGS84">
+  <Layer name="roads" status="on" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
     <StyleName>roads-casing</StyleName>
     <StyleName>footway</StyleName>
     <StyleName>cycleway</StyleName>
@@ -510,7 +510,7 @@
     </Datasource>
    </Layer>
 
-  <Layer name="amenity" status="on" srs="+proj=latlong +datum=WGS84">
+  <Layer name="amenity" status="on" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
     <StyleName>amenity</StyleName>
     <Datasource>
       <Parameter name="type">osm</Parameter>
@@ -518,7 +518,7 @@
     </Datasource>
   </Layer>
 
-  <Layer name="roadstext" status="on" srs="+proj=latlong +datum=WGS84">
+  <Layer name="roadstext" status="on" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
      <StyleName>roads-text</StyleName>
      <Datasource>
       <Parameter name="type">osm</Parameter>
@@ -526,7 +526,7 @@
     </Datasource>
    </Layer>
   
-  <Layer name="text" status="on" srs="+proj=latlong +datum=WGS84">
+  <Layer name="text" status="on" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
     <StyleName>text</StyleName>
     <Datasource>
       <Parameter name="type">osm</Parameter>
diff --git a/plugins/input/osm/test3.xml b/plugins/input/osm/test3.xml
index 8ba6cfa..8dce7fe 100644
--- a/plugins/input/osm/test3.xml
+++ b/plugins/input/osm/test3.xml
@@ -1,26 +1,26 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE Map>
-<Map bgcolor="#d0d0d0" srs="+proj=latlong +datum=WGS84">
+<Map bgcolor="#d0d0d0" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
   <Style name="amenity">
     <Rule>
       <Filter>[amenity]='pub'</Filter>
       <PointSymbolizer file="/home/nick/images/pub.png" type="png" 
-	  		width="16" height="16" />
+        width="16" height="16" />
     </Rule>
     <Rule>
       <Filter>[man_made]='mast'</Filter>
       <PointSymbolizer file="/home/nick/images/mast.png" type="png" 
-	  	width="16" height="16" />
+      width="16" height="16" />
     </Rule>
      <Rule>
       <Filter>[amenity]='parking'</Filter>
       <PointSymbolizer file="/home/nick/images/carpark.png" type="png" 
-	  	width="16" height="16"/>
+      width="16" height="16"/>
      </Rule>
      <Rule>
       <Filter>[residence]='farm'</Filter>
       <PointSymbolizer file="/home/nick/images/farm.png" type="png" 
-	  	width="16" height="16"/>
+      width="16" height="16"/>
      </Rule>
   </Style>
   
@@ -46,7 +46,7 @@
     </Rule>
      <Rule>
       <Filter>[leisure] = 'park' or [leisure] = 'common' or
-	  	[leisure] = 'golf_course'</Filter>
+      [leisure] = 'golf_course'</Filter>
       <PolygonSymbolizer>
         <CssParameter name="fill">#d8e8d0</CssParameter>
      </PolygonSymbolizer>
@@ -98,12 +98,12 @@
       <Filter>[natural] = 'peak'</Filter>
       <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="11" fill="#000" halo_radius="1" wrap_width="0"/>
     </Rule>
-	<Rule>
-	  <Filter>[natural] = 'wood' or [natural] = 'water' or [natural] = 'heath'
-	  or [leisure] = 'golf_course' </Filter>
-	  <TextSymbolizer name="name" face_name="DejaVu Sans Book" 
-	  size="10" fill="#000" halo_radius="2" wrap_width="0" />
-	</Rule>
+  <Rule>
+    <Filter>[natural] = 'wood' or [natural] = 'water' or [natural] = 'heath'
+    or [leisure] = 'golf_course' </Filter>
+    <TextSymbolizer name="name" face_name="DejaVu Sans Book" 
+    size="10" fill="#000" halo_radius="2" wrap_width="0" />
+  </Rule>
   </Style>
   
    <Style name="river">
@@ -200,7 +200,7 @@
       <Filter>[highway] = 'unsurfaced' or [highway] = 'track'</Filter>
       <LineSymbolizer>
         <CssParameter name="stroke">#999</CssParameter>
-		<CssParameter name="stroke-dasharray">6,4</CssParameter>
+    <CssParameter name="stroke-dasharray">6,4</CssParameter>
         <CssParameter name="stroke-width">4</CssParameter>
         <CssParameter name="stroke-linejoin">round</CssParameter>
         <CssParameter name="stroke-linecap">round</CssParameter>
@@ -218,7 +218,7 @@
         <CssParameter name="stroke-linecap">round</CssParameter>
       </LineSymbolizer>
     </Rule>
-	</Style>
+  </Style>
   <Style name="trunk">
     <Rule>
       <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
@@ -282,7 +282,7 @@
    <Style name="residential">
     <Rule>
       <Filter>[highway] = 'residential' or [highway] = 'service' or
-	  	[highway] = 'unsurfaced' or [highway] = 'track'</Filter> 
+      [highway] = 'unsurfaced' or [highway] = 'track'</Filter> 
       <LineSymbolizer>
         <CssParameter name="stroke">#fff</CssParameter>
         <CssParameter name="stroke-width">2</CssParameter>
@@ -290,9 +290,9 @@
         <CssParameter name="stroke-linecap">round</CssParameter>
       </LineSymbolizer>
     </Rule>
-	</Style>
+  </Style>
     
-	<Style name="bridleway">
+  <Style name="bridleway">
     <Rule>
       <Filter>[highway] = 'bridleway' and [newforest_pathtype] = ''</Filter>
       <LineSymbolizer>
@@ -312,7 +312,7 @@
     </Rule>
     <Rule>
       <Filter>[highway] = 'bridleway' and [foot] = 'yes' and [horse] = 'yes'
-	  and [bicycle] = 'yes'</Filter>
+    and [bicycle] = 'yes'</Filter>
       <LineSymbolizer>
         <CssParameter name="stroke">#fff</CssParameter>
         <CssParameter name="stroke-width">6</CssParameter>
@@ -330,7 +330,7 @@
     </Rule>
     <Rule>
       <Filter>[highway] = 'bridleway' and [newforest_pathtype] = 'narrow'
-	  </Filter>
+    </Filter>
       <LineSymbolizer>
         <CssParameter name="stroke">#00c000</CssParameter>
         <CssParameter name="stroke-width">1.0</CssParameter>
@@ -358,7 +358,7 @@
     </Rule>
     <Rule>
       <Filter>[highway] = 'bridleway' and [newforest_pathtype] = 'gravel'
-	  </Filter>
+    </Filter>
       <LineSymbolizer>
         <CssParameter name="stroke">#fff</CssParameter>
         <CssParameter name="stroke-width">6</CssParameter>
@@ -368,7 +368,7 @@
       </LineSymbolizer>
       <LineSymbolizer>
         <CssParameter name="stroke">brown</CssParameter>
-		<CssParameter name="stroke-dasharray">6,4</CssParameter>
+    <CssParameter name="stroke-dasharray">6,4</CssParameter>
         <CssParameter name="stroke-width">2</CssParameter>
         <CssParameter name="stroke-linejoin">round</CssParameter>
         <CssParameter name="stroke-linecap">round</CssParameter>
@@ -376,17 +376,17 @@
     </Rule>
     <Rule>
       <Filter>[highway] = 'bridleway' and [newforest_pathtype] = 'track'
-	  </Filter>
+    </Filter>
       <LineSymbolizer>
         <CssParameter name="stroke">brown</CssParameter>
-		<CssParameter name="stroke-dasharray">2,4</CssParameter>
+    <CssParameter name="stroke-dasharray">2,4</CssParameter>
         <CssParameter name="stroke-width">2</CssParameter>
         <CssParameter name="stroke-linejoin">round</CssParameter>
         <CssParameter name="stroke-linecap">round</CssParameter>
       </LineSymbolizer>
     </Rule>
-	</Style>
-	<Style name="footway">
+  </Style>
+  <Style name="footway">
     <Rule>
       <Filter>[highway] = 'footway'</Filter>
       <LineSymbolizer>
@@ -421,8 +421,8 @@
         <CssParameter name="stroke-linecap">round</CssParameter>
       </LineSymbolizer>
     </Rule>
-	</Style>
-	<Style name="cycleway">
+  </Style>
+  <Style name="cycleway">
     <Rule>
       <Filter>[highway] = 'cycleway'</Filter>
       <LineSymbolizer>
@@ -440,8 +440,8 @@
         <CssParameter name="stroke-linecap">round</CssParameter>
       </LineSymbolizer>
     </Rule>
-	</Style>
-	<Style name="byway">
+  </Style>
+  <Style name="byway">
     <Rule>
       <Filter>[highway] = 'byway'</Filter>
       <LineSymbolizer>
@@ -466,14 +466,14 @@
     </Rule>
   </Style>
 
-  <Layer name="leisure" status="on" srs="+proj=latlong +datum=WGS84">
+  <Layer name="leisure" status="on" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
     <StyleName>leisure</StyleName>
     <Datasource>
       <Parameter name="type">osm</Parameter>
     </Datasource>
   </Layer>
   
-  <Layer name="waterway" status="on" srs="+proj=latlong +datum=WGS84">
+  <Layer name="waterway" status="on" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
     <StyleName>river</StyleName>
     <StyleName>stream</StyleName>
     <Datasource>
@@ -481,14 +481,14 @@
     </Datasource>
   </Layer>
   
-  <Layer name="lakes" status="on" srs="+proj=latlong +datum=WGS84">
+  <Layer name="lakes" status="on" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
     <StyleName>lakes</StyleName>
     <Datasource>
       <Parameter name="type">osm</Parameter>
     </Datasource>
   </Layer>
 
-  <Layer name="roads" status="on" srs="+proj=latlong +datum=WGS84">
+  <Layer name="roads" status="on" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
     <StyleName>roads-casing</StyleName>
     <StyleName>footway</StyleName>
     <StyleName>cycleway</StyleName>
@@ -506,21 +506,21 @@
     </Datasource>
    </Layer>
 
-  <Layer name="amenity" status="on" srs="+proj=latlong +datum=WGS84">
+  <Layer name="amenity" status="on" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
     <StyleName>amenity</StyleName>
     <Datasource>
       <Parameter name="type">osm</Parameter>
     </Datasource>
   </Layer>
 
-  <Layer name="roadstext" status="on" srs="+proj=latlong +datum=WGS84">
+  <Layer name="roadstext" status="on" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
      <StyleName>roads-text</StyleName>
      <Datasource>
       <Parameter name="type">osm</Parameter>
     </Datasource>
    </Layer>
   
-  <Layer name="text" status="on" srs="+proj=latlong +datum=WGS84">
+  <Layer name="text" status="on" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
     <StyleName>text</StyleName>
     <Datasource>
       <Parameter name="type">osm</Parameter>
diff --git a/plugins/input/postgis/SConscript b/plugins/input/postgis/SConscript
deleted file mode 100644
index b0a069c..0000000
--- a/plugins/input/postgis/SConscript
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# This file is part of Mapnik (c++ mapping toolkit)
-#
-# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-# $Id$
-
-Import ('env')
-
-prefix = env['PREFIX']
-install_prefix = env['DESTDIR'] + '/' + prefix
-
-postgis_src = Split(
-	"""
-        postgis.cpp
-        postgisfs.cpp
-	"""
-        )
-
-libraries = ['pq']
-
-if env['PLATFORM'] == 'Darwin':
-    libraries.append('mapnik')
-    libraries.append(env['ICU_LIB_NAME'])
-    if env['THREADING'] == 'multi':
-        libraries.append('boost_thread%s' % env['BOOST_APPEND'])
-
-postgis_inputdriver = env.SharedLibrary('postgis', source=postgis_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries)
-
-env.Install(install_prefix + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME'] + '/input', postgis_inputdriver)
-env.Alias('install', install_prefix + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME'] + '/input')
diff --git a/plugins/input/postgis/build.py b/plugins/input/postgis/build.py
new file mode 100644
index 0000000..5694fe1
--- /dev/null
+++ b/plugins/input/postgis/build.py
@@ -0,0 +1,50 @@
+#
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+Import ('env')
+
+prefix = env['PREFIX']
+
+plugin_env = env.Clone()
+
+postgis_src = Split(
+  """
+        postgis_datasource.cpp
+        postgis_featureset.cpp
+  """
+        )
+
+libraries = ['pq']
+
+# Link Library to Dependencies
+libraries.append('mapnik2')
+libraries.append(env['ICU_LIB_NAME'])
+if env['THREADING'] == 'multi':
+	libraries.append('boost_thread%s' % env['BOOST_APPEND'])
+
+input_plugin = plugin_env.SharedLibrary('../postgis', source=postgis_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS'])
+
+# if the plugin links to libmapnik2 ensure it is built first
+Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME']))
+
+if 'uninstall' not in COMMAND_LINE_TARGETS:
+    env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin)
+    env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST'])
diff --git a/plugins/input/postgis/connection.hpp b/plugins/input/postgis/connection.hpp
index 5ec4bd2..9a8da17 100644
--- a/plugins/input/postgis/connection.hpp
+++ b/plugins/input/postgis/connection.hpp
@@ -34,7 +34,6 @@ extern "C"
 
 #include "resultset.hpp"
 
-class ResultSet;
 class Connection
 {
    private:
@@ -49,16 +48,16 @@ class Connection
          conn_=PQconnectdb(connection_str.c_str());
          if (PQstatus(conn_) != CONNECTION_OK)
          {
-             std::string s("PSQL error");
+             std::ostringstream s("Postgis Plugin: PSQL error");
              if (conn_ )
              {
                  std::string msg = PQerrorMessage( conn_ );
                  if ( ! msg.empty() )
                  {
-                     s += ":\n" + msg.substr( 0, msg.size() - 1 );
+                     s << ":\n" << msg.substr( 0, msg.size() - 1 );
                  }
              } 
-             throw mapnik::datasource_exception( s );
+             throw mapnik::datasource_exception( s.str() );
          }
       }
       
@@ -83,18 +82,20 @@ class Connection
          }
          if(!result || PQresultStatus(result) != PGRES_TUPLES_OK)
          {
-             std::string s("PSQL error");
+             std::ostringstream s("Postgis Plugin: PSQL error");
              if (conn_ )
              {
                  std::string msg = PQerrorMessage( conn_ );
                  if ( ! msg.empty() )
                  {
-                     s += ":\n" + msg.substr( 0, msg.size() - 1 );
+                     s << ":\n" <<  msg.substr( 0, msg.size() - 1 );
                  }
                  
-                 s += "\nFull sql was: '" + sql + "'\n";
-             } 
-             throw mapnik::datasource_exception( s );
+                 s << "\nFull sql was: '" <<  sql << "'\n";
+             }
+             if (result)
+                 PQclear(result);
+             throw mapnik::datasource_exception( s.str() );
          }
 
          return boost::shared_ptr<ResultSet>(new ResultSet(result));
@@ -116,7 +117,7 @@ class Connection
          {
              PQfinish(conn_);
 #ifdef MAPNIK_DEBUG
-             std::clog << "PostGIS: datasource closed, also closing connection - " << conn_ << "\n";
+             std::clog << "PostGIS: datasource closed, also closing connection - " << conn_ << std::endl;
 #endif
              closed_ = true;
          }
@@ -135,7 +136,7 @@ class Connection
          {
              PQfinish(conn_);
 #ifdef MAPNIK_DEBUG
-             std::clog << "PostGIS: postgresql connection closed - " << conn_ << "\n";
+             std::clog << "PostGIS: postgresql connection closed - " << conn_ << std::endl;
 #endif
              closed_ = true;
          }
diff --git a/plugins/input/postgis/connection_manager.hpp b/plugins/input/postgis/connection_manager.hpp
index 17cce28..ca6909e 100644
--- a/plugins/input/postgis/connection_manager.hpp
+++ b/plugins/input/postgis/connection_manager.hpp
@@ -47,46 +47,49 @@ class ConnectionCreator
 {
 
 public:
-      ConnectionCreator(boost::optional<string> const& host,
-                        boost::optional<string> const& port,
-                        boost::optional<string> const& dbname,
-                        boost::optional<string> const& user,
-                        boost::optional<string> const& pass)
-         : host_(host),
-           port_(port),
-           dbname_(dbname),
-           user_(user),
-           pass_(pass) {}
+    ConnectionCreator(boost::optional<string> const& host,
+                      boost::optional<string> const& port,
+                      boost::optional<string> const& dbname,
+                      boost::optional<string> const& user,
+                      boost::optional<string> const& pass,
+                      boost::optional<string> const& connect_timeout)
+        : host_(host),
+          port_(port),
+          dbname_(dbname),
+          user_(user),
+          pass_(pass),
+          connect_timeout_(connect_timeout) {}
       
-      T* operator()() const
-      {
-          return new T(connection_string());
-      }
+    T* operator()() const
+    {
+        return new T(connection_string());
+    }
       
-      inline std::string id() const 
-      {
-         return connection_string();
-      }
+    inline std::string id() const 
+    {
+        return connection_string();
+    }
       
-      inline std::string connection_string() const
-      {
-         std::string connect_str;
-         if (host_   && (*host_).size()) connect_str += "host=" + *host_;
-         if (port_   && (*port_).size()) connect_str += " port=" + *port_;
-         if (dbname_ && (*dbname_).size()) connect_str += " dbname=" + *dbname_;
-         if (user_   && (*user_).size()) connect_str += " user=" + *user_;
-         if (pass_   && (*pass_).size()) connect_str += " password=" + *pass_;
-         connect_str += " connect_timeout=4"; // todo: set by client (param)
-         return connect_str;
-      }
+    inline std::string connection_string() const
+    {
+        std::string connect_str;
+        if (host_   && (*host_).size()) connect_str += "host=" + *host_;
+        if (port_   && (*port_).size()) connect_str += " port=" + *port_;
+        if (dbname_ && (*dbname_).size()) connect_str += " dbname=" + *dbname_;
+        if (user_   && (*user_).size()) connect_str += " user=" + *user_;
+        if (pass_   && (*pass_).size()) connect_str += " password=" + *pass_;
+        if (connect_timeout_ && (*connect_timeout_).size()) 
+            connect_str +=" connect_timeout=" + *connect_timeout_;
+        return connect_str;
+    }
       
 private:
-      boost::optional<string> host_;
-      boost::optional<string> port_;
-      boost::optional<string> dbname_;
-      boost::optional<string> user_;
-      boost::optional<string> pass_;
-
+    boost::optional<string> host_;
+    boost::optional<string> port_;
+    boost::optional<string> dbname_;
+    boost::optional<string> user_;
+    boost::optional<string> pass_;
+    boost::optional<string> connect_timeout_;
 };
 
 class ConnectionManager : public singleton <ConnectionManager,CreateStatic>
@@ -99,11 +102,11 @@ class ConnectionManager : public singleton <ConnectionManager,CreateStatic>
     ContType pools_;
 
 public:
-	
+        
     bool registerPool(const ConnectionCreator<Connection>& creator,unsigned initialSize,unsigned maxSize) 
-    {	    
+    {       
 #ifdef MAPNIK_THREADSAFE
-        mutex::scoped_lock lock(mutex_);
+        //mutex::scoped_lock lock(mutex_);
 #endif
         if (pools_.find(creator.id())==pools_.end())
         {
@@ -112,13 +115,13 @@ public:
         }
 
         return false;
-	   	     
+                     
     }
     
     boost::shared_ptr<PoolType> getPool(std::string const& key) 
     {
 #ifdef MAPNIK_THREADSAFE
-        mutex::scoped_lock lock(mutex_);
+        //mutex::scoped_lock lock(mutex_);
 #endif 
         ContType::const_iterator itr=pools_.find(key);
         if (itr!=pools_.end())
@@ -128,11 +131,11 @@ public:
         static const boost::shared_ptr<PoolType> emptyPool;
         return emptyPool;
     }
-	
+        
     HolderType get(std::string const& key)
     {
 #ifdef MAPNIK_THREADSAFE
-        mutex::scoped_lock lock(mutex_);
+        //mutex::scoped_lock lock(mutex_);
 #endif 
         ContType::const_iterator itr=pools_.find(key);
         if (itr!=pools_.end()) 
diff --git a/plugins/input/postgis/cursorresultset.hpp b/plugins/input/postgis/cursorresultset.hpp
index 598034e..c071a64 100644
--- a/plugins/input/postgis/cursorresultset.hpp
+++ b/plugins/input/postgis/cursorresultset.hpp
@@ -14,29 +14,38 @@ private:
     bool is_closed_;
     int *refCount_;
     
-    void getNextResultSet() {
+    void getNextResultSet()
+    {
         std::ostringstream s;
         s << "FETCH FORWARD " << fetch_size_ << " FROM " << cursorName_;
 #ifdef MAPNIK_DEBUG
-        std::clog << s.str() << "\n";
+        std::clog << "Postgis Plugin: " << s.str() << std::endl;
 #endif
         rs_ = conn_->executeQuery(s.str());
         is_closed_ = false;
 #ifdef MAPNIK_DEBUG
-        std::clog << "FETCH result (" << cursorName_ << "): " << rs_->size() << " rows\n";
+        std::clog << "Postgis Plugin: FETCH result (" << cursorName_ << "): " << rs_->size() << " rows" << std::endl;
 #endif
     }
     
 public:
     CursorResultSet(boost::shared_ptr<Connection> const &conn, std::string cursorName, int fetch_count)
-    :conn_(conn),cursorName_(cursorName),fetch_size_(fetch_count),is_closed_(false),refCount_(new int(1))
+        : conn_(conn),
+          cursorName_(cursorName),
+          fetch_size_(fetch_count),
+          is_closed_(false),
+          refCount_(new int(1))
     {
         getNextResultSet();
     }
 
     CursorResultSet(const CursorResultSet& rhs)
-    :conn_(rhs.conn_),cursorName_(rhs.cursorName_),rs_(rhs.rs_),fetch_size_(rhs.fetch_size_),is_closed_(rhs.is_closed_),
-    refCount_(rhs.refCount_)
+        : conn_(rhs.conn_),
+          cursorName_(rhs.cursorName_),
+          rs_(rhs.rs_),
+          fetch_size_(rhs.fetch_size_),
+          is_closed_(rhs.is_closed_),
+          refCount_(rhs.refCount_)
     {
         (*refCount_)++;
     }
@@ -61,12 +70,13 @@ public:
 
     virtual void close()
     {
-        if (!is_closed_) {
+        if (!is_closed_)
+        {
             rs_.reset();
             std::ostringstream s;
             s << "CLOSE " << cursorName_;
 #ifdef MAPNIK_DEBUG
-            std::clog << s.str() << "\n";
+            std::clog << "Postgis Plugin: " << s.str() << std::endl;
 #endif
             conn_->execute(s.str());
             is_closed_ = true;
diff --git a/plugins/input/postgis/postgis.cpp b/plugins/input/postgis/postgis.cpp
deleted file mode 100644
index a23b4d0..0000000
--- a/plugins/input/postgis/postgis.cpp
+++ /dev/null
@@ -1,656 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-
-//$Id: postgis.cc 44 2005-04-22 18:53:54Z pavlenko $
-
-// mapnik
-#include <mapnik/global.hpp>
-#include <mapnik/ptree_helpers.hpp>
-
-/*
-#ifdef MAPNIK_DEBUG
-#include <mapnik/wall_clock_timer.hpp>
-#endif
-*/
-
-#include "connection_manager.hpp"
-#include "postgis.hpp"
-
-// boost
-#include <boost/algorithm/string.hpp>
-#include <boost/lexical_cast.hpp>
-#include <boost/tokenizer.hpp>
-#include <boost/format.hpp>
-
-// stl
-#include <string>
-#include <algorithm>
-#include <set>
-#include <sstream>
-#include <iomanip>
-
-#define FMAX std::numeric_limits<double>::max()
-
-DATASOURCE_PLUGIN(postgis_datasource)
-
-const std::string postgis_datasource::GEOMETRY_COLUMNS="geometry_columns";
-const std::string postgis_datasource::SPATIAL_REF_SYS="spatial_ref_system";
-
-using std::clog;
-using std::endl;
-
-using boost::lexical_cast;
-using boost::bad_lexical_cast;
-using boost::shared_ptr;
-
-using mapnik::PoolGuard;
-using mapnik::attribute_descriptor;
-
-postgis_datasource::postgis_datasource(parameters const& params)
-   : datasource(params),
-     table_(*params_.get<std::string>("table","")),
-     schema_(""),
-     geometry_table_(*params_.get<std::string>("geometry_table","")),
-     geometry_field_(*params_.get<std::string>("geometry_field","")),
-     cursor_fetch_size_(*params_.get<int>("cursor_size",0)),
-     row_limit_(*params_.get<int>("row_limit",0)),
-     type_(datasource::Vector),
-     srid_(*params_.get<int>("srid",0)),
-     extent_initialized_(false),
-     desc_(*params_.get<std::string>("type"),"utf-8"),
-     creator_(params.get<std::string>("host"),
-              params.get<std::string>("port"),
-              params.get<std::string>("dbname"),
-              params.get<std::string>("user"),
-              params.get<std::string>("password")),
-     bbox_token_("!bbox!"),
-     scale_denom_token_("!scale_denominator!"),
-     persist_connection_(*params_.get<mapnik::boolean>("persist_connection",true)),
-     extent_from_subquery_(*params_.get<mapnik::boolean>("extent_from_subquery",false))
-     //show_queries_(*params_.get<mapnik::boolean>("show_queries",false))
-     
-{   
-
-   if (table_.empty()) throw mapnik::datasource_exception("PostGIS: missing <table> parameter");
-
-   boost::optional<int> initial_size = params_.get<int>("inital_size",1);
-   boost::optional<int> max_size = params_.get<int>("max_size",10);
-
-   multiple_geometries_ = *params_.get<mapnik::boolean>("multiple_geometries",false);
-   
-   boost::optional<std::string> ext  = params_.get<std::string>("extent");
-   if (ext)
-   {
-      boost::char_separator<char> sep(",");
-      boost::tokenizer<boost::char_separator<char> > tok(*ext,sep);
-      unsigned i = 0;
-      bool success = false;
-      double d[4];
-      for (boost::tokenizer<boost::char_separator<char> >::iterator beg=tok.begin(); 
-           beg!=tok.end();++beg)
-      {
-         try 
-         {
-            d[i] = boost::lexical_cast<double>(boost::trim_copy(*beg));
-         }
-         catch (boost::bad_lexical_cast & ex)
-         {
-            clog << *beg << " : " << ex.what() << "\nAre your coordinates each separated by commas?\n";
-            break;
-         }
-         if (i==3) 
-         {
-            success = true;
-            break;
-         }
-         ++i;
-      }
-      if (success)
-      {
-         extent_.init(d[0],d[1],d[2],d[3]);
-         extent_initialized_ = true;
-      }
-   } 
-
-   ConnectionManager *mgr=ConnectionManager::instance();   
-   mgr->registerPool(creator_, *initial_size, *max_size);
-    
-   shared_ptr<Pool<Connection,ConnectionCreator> > pool=mgr->getPool(creator_.id());
-   if (pool)
-   {      
-      shared_ptr<Connection> conn = pool->borrowObject();
-      if (conn && conn->isOK())
-      {
-         PoolGuard<shared_ptr<Connection>,
-            shared_ptr<Pool<Connection,ConnectionCreator> > > guard(conn,pool);
-         
-         desc_.set_encoding(conn->client_encoding());
-
-         if(geometry_table_.empty())
-         {
-             geometry_table_ = table_from_sql(table_);
-         }
-         std::string::size_type idx = geometry_table_.find_last_of('.');
-         if (idx!=std::string::npos)
-         {
-            schema_ = geometry_table_.substr(0,idx);
-            geometry_table_ = geometry_table_.substr(idx+1);
-         }
-         else
-         {
-            geometry_table_ = geometry_table_.substr(0);
-         }
-
-         // If we do not know both the geometry_field and the srid
-         // then first attempt to fetch the geometry name from a geometry_columns entry.
-         // This will return no records if we are querying a bogus table returned
-         // from the simplistic table parsing in table_from_sql() or if
-         // the table parameter references a table, view, or subselect not
-         // registered in the geometry columns.
-         geometryColumn_ = geometry_field_;
-         if (!geometryColumn_.length() > 0 || srid_ == 0)
-         {
-             std::ostringstream s;
-             s << "SELECT f_geometry_column, srid FROM ";
-             s << GEOMETRY_COLUMNS <<" WHERE f_table_name='" << unquote(geometry_table_) <<"'";
-             
-             if (schema_.length() > 0) 
-                s << " AND f_table_schema='" << unquote(schema_) << "'";
-            
-             if (geometry_field_.length() > 0)
-                s << " AND f_geometry_column='" << unquote(geometry_field_) << "'";
-
-             /*if (show_queries_)
-             {
-                 clog << boost::format("PostGIS: sending query: %s\n") % s.str();
-             }*/
-                 
-             shared_ptr<ResultSet> rs=conn->executeQuery(s.str());
-             if (rs->next())
-             {
-                geometryColumn_ = rs->getValue("f_geometry_column");
-
-                if (srid_ == 0)
-                {
-                    try 
-                    {
-                        srid_ = lexical_cast<int>(rs->getValue("srid"));
-                    }
-                    catch (bad_lexical_cast &ex)
-                    {
-                       clog << "SRID: " << rs->getValue("srid") << ":" << ex.what() << endl;
-                    }
-                }
-             }
-             rs->close();
-             
-             // If we still do not know the srid then we can try to fetch
-             // it from the 'table_' parameter, which should work even if it is
-             // a subselect as long as we know the geometry_field to query
-             if (geometryColumn_.length() && srid_ <= 0)
-             {
-                s.str("");
-                s << "SELECT SRID(\"" << geometryColumn_ << "\") AS srid FROM ";
-                s << populate_tokens(table_) << " WHERE \"" << geometryColumn_ << "\" IS NOT NULL LIMIT 1;";
-
-                /*if (show_queries_)
-                {
-                   clog << boost::format("PostGIS: sending query: %s\n") % s.str();
-                }*/
-
-                shared_ptr<ResultSet> rs=conn->executeQuery(s.str());
-                if (rs->next())
-                {
-                    try
-                    {
-                        srid_ = lexical_cast<int>(rs->getValue("srid"));
-                    }
-                    catch (bad_lexical_cast &ex)
-                    {
-                        clog << "SRID: " << rs->getValue("srid") << ":" << ex.what() << endl;
-                    }
-                }
-                rs->close();
-            }
-         }
-         
-         if (srid_ == 0)
-         {
-            srid_ = -1;
-            clog << "PostGIS: SRID warning, using srid=-1" << endl;
-         }
-
-         // At this point the geometry_field may still not be known
-         // but we'll catch that where more useful...         
-#ifdef MAPNIK_DEBUG
-         clog << "PostGIS: using SRID=" << srid_ << endl;
-         clog << "PostGIS: using geometry_column=" << geometryColumn_ << endl;
-#endif
-
-         // collect attribute desc         
-         std::ostringstream s;
-         s << "select * from " << populate_tokens(table_) << " limit 0";
-
-         /*if (show_queries_)
-         {
-             clog << boost::format("PostGIS: sending query: %s\n") % s.str();
-         }*/
-
-         shared_ptr<ResultSet> rs=conn->executeQuery(s.str());
-         int count = rs->getNumFields();
-         for (int i=0;i<count;++i)
-         {
-            std::string fld_name=rs->getFieldName(i);
-            int type_oid = rs->getTypeOID(i);
-            switch (type_oid)
-            {
-               case 20:    // int8
-               case 21:    // int2
-               case 23:    // int4
-                  desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Integer));
-                  break;
-               case 700:   // float4 
-               case 701:   // float8
-               case 1700:  // numeric ??
-                  desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Double));
-               case 1042:  // bpchar
-               case 1043:  // varchar
-               case 25:    // text
-                  desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::String));
-                  break;
-               default: // should not get here
-#ifdef MAPNIK_DEBUG
-                  s.str("");
-                  s << "select oid, typname from pg_type where oid = " << type_oid;
-
-                  /*if (show_queries_)
-                  {
-                     clog << boost::format("PostGIS: sending query: %s\n") % s.str();
-                  }*/
-
-                  shared_ptr<ResultSet> rs_oid = conn->executeQuery(s.str());
-                  if (rs_oid->next())
-                  {
-                      clog << "PostGIS: unknown type = " << rs_oid->getValue("typname") << " (oid:" << rs_oid->getValue("oid") << ")\n";
-                  }
-                  else
-                  {
-                      clog << "PostGIS: unknown oid type =" << type_oid << endl;              
-                  }
-                  rs_oid->close();
-#endif
-                  break;
-            }
-         }
-         rs->close();
-      }
-   }
-}
-
-std::string const postgis_datasource::name_="postgis";
-
-std::string postgis_datasource::name()
-{
-   return name_;
-}
-
-int postgis_datasource::type() const
-{
-   return type_;
-}
-
-layer_descriptor postgis_datasource::get_descriptor() const
-{
-   return desc_;
-}
-
-
-std::string postgis_datasource::sql_bbox(Envelope<double> const& env) const
-{
-    std::ostringstream b;
-    if (srid_ > 0)
-        b << "SetSRID(";
-    b << "'BOX3D(";
-    b << std::setprecision(16);
-    b << env.minx() << " " << env.miny() << ",";
-    b << env.maxx() << " " << env.maxy() << ")'::box3d";
-    if (srid_ > 0)
-        b << ", " << srid_ << ")";
-    return b.str();
-}
-
-std::string postgis_datasource::populate_tokens(const std::string& sql) const
-{
-    std::string populated_sql = sql;
-    
-    if ( boost::algorithm::icontains(sql,bbox_token_) )
-    {
-        Envelope<double> max_env(-1 * FMAX,-1 * FMAX,FMAX,FMAX);
-        std::string max_box = sql_bbox(max_env);
-        boost::algorithm::replace_all(populated_sql,bbox_token_,max_box);
-    } 
-    if ( boost::algorithm::icontains(sql,scale_denom_token_) )
-    {
-        std::string max_denom = lexical_cast<std::string>(FMAX);
-        boost::algorithm::replace_all(populated_sql,scale_denom_token_,max_denom);
-    }
-    return populated_sql;
-}
-
-std::string postgis_datasource::populate_tokens(const std::string& sql, double const& scale_denom, Envelope<double> const& env) const
-{
-    std::string populated_sql = sql;
-    std::string box = sql_bbox(env);
-    
-    if ( boost::algorithm::icontains(populated_sql,scale_denom_token_) )
-    {
-        std::string max_denom = lexical_cast<std::string>(scale_denom);
-        boost::algorithm::replace_all(populated_sql,scale_denom_token_,max_denom);
-    }
-    
-    if ( boost::algorithm::icontains(populated_sql,bbox_token_) )
-    {
-        boost::algorithm::replace_all(populated_sql,bbox_token_,box);
-        return populated_sql;
-    }
-    else
-    {
-        std::ostringstream s;
-        s << " WHERE \"" << geometryColumn_ << "\" && " << box;
-        return populated_sql + s.str();    
-    }
-}
-
-
-std::string postgis_datasource::unquote(const std::string& sql)
-{
-    std::string table_name = boost::algorithm::to_lower_copy(sql);  
-    boost::algorithm::trim_if(table_name,boost::algorithm::is_any_of("\""));
-    return table_name;
-}
-
-// TODO - make smarter and potentially move to reusable utilities 
-// available to other SQL-based plugins
-std::string postgis_datasource::table_from_sql(const std::string& sql)
-{
-   std::string table_name = boost::algorithm::to_lower_copy(sql);
-   boost::algorithm::replace_all(table_name,"\n"," ");
-   
-   std::string::size_type idx = table_name.rfind(" from ");
-   if (idx!=std::string::npos)
-   {
-      
-      idx=table_name.find_first_not_of(" ",idx+5);
-      if (idx != std::string::npos)
-      {
-         table_name=table_name.substr(idx);
-      }
-      idx=table_name.find_first_of(" )");
-      if (idx != std::string::npos)
-      {
-         table_name = table_name.substr(0,idx);
-      }
-   }
-   return table_name;
-}
-
-boost::shared_ptr<IResultSet> postgis_datasource::get_resultset(boost::shared_ptr<Connection> const &conn, const std::string &sql) const
-{
-     if (cursor_fetch_size_ > 0) {
-         // cursor
-         std::ostringstream csql;
-         std::string cursor_name = conn->new_cursor_name();
-
-         csql << "DECLARE " << cursor_name << " BINARY INSENSITIVE NO SCROLL CURSOR WITH HOLD FOR " << sql << " FOR READ ONLY";
-
-         /*if (show_queries_)
-         {
-             clog << boost::format("PostGIS: sending query: %s\n") % csql.str();
-         }*/
-
-         if (!conn->execute(csql.str())) {
-            throw mapnik::datasource_exception( "PSQL Error: Creating cursor for data select." );
-         }
-         return shared_ptr<CursorResultSet>(new CursorResultSet(conn, cursor_name, cursor_fetch_size_));
-
-     } else {
-         // no cursor
-
-         /*if (show_queries_)
-         {
-             clog << boost::format("PostGIS: sending query: %s\n") % sql;
-         }*/
-
-         return conn->executeQuery(sql,1);
-     }
-}
-
-featureset_ptr postgis_datasource::features(const query& q) const
-{
-
-/*
-#ifdef MAPNIK_DEBUG
-    mapnik::wall_clock_progress_timer timer(clog, "end feature query: ");
-#endif
-*/
-
-   Envelope<double> const& box = q.get_bbox();
-   double scale_denom = q.scale_denominator();
-   ConnectionManager *mgr=ConnectionManager::instance();
-   shared_ptr<Pool<Connection,ConnectionCreator> > pool=mgr->getPool(creator_.id());
-   if (pool)
-   {
-      shared_ptr<Connection> conn = pool->borrowObject();
-      if (conn && conn->isOK())
-      {       
-         PoolGuard<shared_ptr<Connection>,shared_ptr<Pool<Connection,ConnectionCreator> > > guard(conn,pool);
-
-         if (!geometryColumn_.length() > 0)
-         {
-             std::ostringstream s_error;
-             s_error << "PostGIS: geometry name lookup failed for table '" << schema_ << "." << geometry_table_
-             << "'. Please manually provide the 'geometry_field' parameter or add an entry "
-             << "in the geometry_columns for '" << schema_ << "." << geometry_table_ << "'.";
-             throw mapnik::datasource_exception(s_error.str());
-         }
-
-         std::ostringstream s;
-         s << "SELECT AsBinary(\"" << geometryColumn_ << "\") AS geom";
-         std::set<std::string> const& props=q.property_names();
-         std::set<std::string>::const_iterator pos=props.begin();
-         std::set<std::string>::const_iterator end=props.end();
-         while (pos != end)
-         {
-            s <<",\""<<*pos<<"\"";
-            ++pos;
-         }	 
-
-         std::string table_with_bbox = populate_tokens(table_,scale_denom,box);
-
-         s << " from " << table_with_bbox;
-
-         if (row_limit_ > 0) {
-             s << " LIMIT " << row_limit_;
-         }
-         
-         boost::shared_ptr<IResultSet> rs = get_resultset(conn, s.str());
-         return featureset_ptr(new postgis_featureset(rs,desc_.get_encoding(),multiple_geometries_,props.size()));
-      }
-   }
-   return featureset_ptr();
-}
-
-featureset_ptr postgis_datasource::features_at_point(coord2d const& pt) const
-{
-   ConnectionManager *mgr=ConnectionManager::instance();
-   shared_ptr<Pool<Connection,ConnectionCreator> > pool=mgr->getPool(creator_.id());
-   if (pool)
-   {
-      shared_ptr<Connection> conn = pool->borrowObject();
-      if (conn && conn->isOK())
-      {       
-         PoolGuard<shared_ptr<Connection>,shared_ptr<Pool<Connection,ConnectionCreator> > > guard(conn,pool);
-         std::ostringstream s;
-
-         if (!geometryColumn_.length() > 0)
-         {
-             std::ostringstream s_error;
-             s_error << "PostGIS: geometry name lookup failed for table '" << schema_ << "." << geometry_table_
-             << "'. Please manually provide the 'geometry_field' parameter or add an entry "
-             << "in the geometry_columns for '" << schema_ << "." << geometry_table_ << "'.";
-             throw mapnik::datasource_exception(s_error.str());
-         }
-                    
-         s << "SELECT AsBinary(\"" << geometryColumn_ << "\") AS geom";
-            
-         std::vector<attribute_descriptor>::const_iterator itr = desc_.get_descriptors().begin();
-         std::vector<attribute_descriptor>::const_iterator end = desc_.get_descriptors().end();
-         unsigned size=0;
-         while (itr != end)
-         {
-            s << ",\"" << itr->get_name() << "\"";
-            ++itr;
-            ++size;
-         }
-
-         Envelope<double> box(pt.x,pt.y,pt.x,pt.y);
-         std::string table_with_bbox = populate_tokens(table_,FMAX,box);
-
-         s << " from " << table_with_bbox;
-         
-         if (row_limit_ > 0) {
-             s << " LIMIT " << row_limit_;
-         }
-         
-         boost::shared_ptr<IResultSet> rs = get_resultset(conn, s.str());
-         return featureset_ptr(new postgis_featureset(rs,desc_.get_encoding(),multiple_geometries_, size));
-      }
-   }
-   return featureset_ptr();
-}
-
-Envelope<double> postgis_datasource::envelope() const
-{
-   if (extent_initialized_) return extent_;
-    
-   ConnectionManager *mgr=ConnectionManager::instance();
-   shared_ptr<Pool<Connection,ConnectionCreator> > pool=mgr->getPool(creator_.id());
-   if (pool)
-   {
-      shared_ptr<Connection> conn = pool->borrowObject();
-      if (conn && conn->isOK())
-      {
-         PoolGuard<shared_ptr<Connection>,shared_ptr<Pool<Connection,ConnectionCreator> > > guard(conn,pool);
-         std::ostringstream s;
-         boost::optional<mapnik::boolean> estimate_extent = params_.get<mapnik::boolean>("estimate_extent",false);
-
-         if (!geometryColumn_.length() > 0)
-         {
-             std::ostringstream s_error;
-             s_error << "PostGIS: unable to query the layer extent of table '"
-             << schema_ << "." << geometry_table_ << "' because we cannot determine the geometry field name."
-             << "\nPlease provide either 1) an 'extent' parameter to skip this query, "
-             << "2) a 'geometry_field' and/or 'geometry_table' parameter, or 3) add a "
-             << "record to the 'geometry_columns' for your table.";
-             throw mapnik::datasource_exception(s_error.str());
-         }
-
-         if (estimate_extent && *estimate_extent)
-         {
-             s << "select xmin(ext),ymin(ext),xmax(ext),ymax(ext)"
-               << " from (select estimated_extent('";
-
-             if (schema_.length() > 0)
-             {
-                 s << unquote(schema_) << "','";
-             }
-
-             s << unquote(geometry_table_) << "','"
-               << unquote(geometryColumn_) << "') as ext) as tmp";
-         }
-         else
-         {
-            s << "select xmin(ext),ymin(ext),xmax(ext),ymax(ext)"
-              << " from (select extent(" <<geometryColumn_<< ") as ext from ";
-              if (extent_from_subquery_)
-              {
-                  // if a subselect limits records then calculating the extent upon the
-                  // subquery will be faster and the bounds will be more accurate
-                  s << populate_tokens(table_) << ") as tmp";
-              }
-              else
-              {
-                  if (schema_.length() > 0)
-                  {
-                      s << schema_ << ".";
-                  }
-
-                  // but if the subquery does not limit records then querying the
-                  // actual table will be faster as indexes can be used
-                  s << geometry_table_ << ") as tmp";
-              }
-         }
-
-         /*if (show_queries_)
-         {
-             clog << boost::format("PostGIS: sending query: %s\n") % s.str();
-         }*/
-            
-         shared_ptr<ResultSet> rs=conn->executeQuery(s.str());
-         if (rs->next())
-         {
-            try 
-            {
-               double lox=lexical_cast<double>(rs->getValue(0));
-               double loy=lexical_cast<double>(rs->getValue(1));
-               double hix=lexical_cast<double>(rs->getValue(2));
-               double hiy=lexical_cast<double>(rs->getValue(3));		    
-               extent_.init(lox,loy,hix,hiy);
-               extent_initialized_ = true;
-            }
-            catch (bad_lexical_cast &ex)
-            {
-                clog << boost::format("PostGIS: warning: could not determine extent from query: %s\nError was: '%s'\n") % s.str() % ex.what();
-            }
-         }
-         rs->close();
-      }
-   }
-   return extent_;
-}
-
-postgis_datasource::~postgis_datasource() 
-{
-    if (!persist_connection_)
-    {
-        ConnectionManager *mgr=ConnectionManager::instance();
-        shared_ptr<Pool<Connection,ConnectionCreator> > pool=mgr->getPool(creator_.id());
-        if (pool)
-        {
-            shared_ptr<Connection> conn = pool->borrowObject();
-            if (conn)
-            {
-                conn->close();
-            }
-        }
-    }
-}
diff --git a/plugins/input/postgis/postgis.hpp b/plugins/input/postgis/postgis.hpp
deleted file mode 100644
index 1d3f793..0000000
--- a/plugins/input/postgis/postgis.hpp
+++ /dev/null
@@ -1,120 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-
-//$Id: postgis.hpp 44 2005-04-22 18:53:54Z pavlenko $
-
-#ifndef POSTGIS_HPP
-#define POSTGIS_HPP
-
-
-#include <mapnik/datasource.hpp>
-#include <mapnik/envelope.hpp>
-#include <mapnik/feature.hpp>
-#include <mapnik/feature_layer_desc.hpp>
-#include <boost/lexical_cast.hpp>
-#include <boost/scoped_ptr.hpp>
-#include <set>
-
-#include "connection_manager.hpp"
-#include "resultset.hpp"
-#include "cursorresultset.hpp"
-
-using mapnik::transcoder;
-using mapnik::datasource;
-using mapnik::Envelope;
-using mapnik::layer_descriptor;
-using mapnik::featureset_ptr;
-using mapnik::feature_ptr;
-using mapnik::query;
-using mapnik::parameters;
-using mapnik::coord2d;
-
-class transcoder;
-class postgis_datasource : public datasource
-{
-      static const std::string GEOMETRY_COLUMNS;
-      static const std::string SPATIAL_REF_SYS;
-      const std::string uri_;
-      const std::string username_;
-      const std::string password_;
-      const std::string table_;
-      mutable std::string schema_;
-      mutable std::string geometry_table_;
-      const std::string geometry_field_;
-      const int cursor_fetch_size_;
-      const int row_limit_;
-      mutable std::string geometryColumn_;
-      int type_;
-      int srid_;
-      mutable bool extent_initialized_;
-      mutable mapnik::Envelope<double> extent_;
-      layer_descriptor desc_;
-      ConnectionCreator<Connection> creator_;
-      bool multiple_geometries_;
-      static const std::string name_;
-      const std::string bbox_token_;
-      const std::string scale_denom_token_;
-      bool persist_connection_;
-      bool extent_from_subquery_;
-      //bool show_queries_;
-   public:
-      static std::string name();
-      int type() const;
-      featureset_ptr features(const query& q) const;
-      featureset_ptr features_at_point(coord2d const& pt) const;
-      mapnik::Envelope<double> envelope() const;
-      layer_descriptor get_descriptor() const;
-      postgis_datasource(const parameters &params);
-      ~postgis_datasource();
-   private:
-      std::string sql_bbox(Envelope<double> const& env) const;
-      std::string populate_tokens(const std::string& sql, double const& scale_denom, Envelope<double> const& env) const;
-      std::string populate_tokens(const std::string& sql) const;
-      static std::string unquote(const std::string& sql);
-      static std::string table_from_sql(const std::string& sql);
-      boost::shared_ptr<IResultSet> get_resultset(boost::shared_ptr<Connection> const &conn, const std::string &sql) const;
-      postgis_datasource(const postgis_datasource&);
-      postgis_datasource& operator=(const postgis_datasource&);
-};
-
-class postgis_featureset : public mapnik::Featureset
-{
-   private:
-      boost::shared_ptr<IResultSet> rs_;
-      bool multiple_geometries_;
-      unsigned num_attrs_;
-      boost::scoped_ptr<mapnik::transcoder> tr_;
-      mutable int totalGeomSize_;
-      mutable int count_;
-   public:
-      postgis_featureset(boost::shared_ptr<IResultSet> const& rs,
-                         std::string const& encoding,
-                         bool multiple_geometries,
-                         unsigned num_attrs);
-      feature_ptr next();
-      ~postgis_featureset();
-   private:
-      postgis_featureset(const postgis_featureset&);
-      const postgis_featureset& operator=(const postgis_featureset&);
-};
-
-#endif                                            //POSTGIS_HPP
diff --git a/plugins/input/postgis/postgis_datasource.cpp b/plugins/input/postgis/postgis_datasource.cpp
new file mode 100644
index 0000000..b02dc9c
--- /dev/null
+++ b/plugins/input/postgis/postgis_datasource.cpp
@@ -0,0 +1,723 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id: postgis.cc 44 2005-04-22 18:53:54Z pavlenko $
+
+// mapnik
+#include <mapnik/global.hpp>
+#include <mapnik/ptree_helpers.hpp>
+#include <mapnik/sql_utils.hpp>
+
+#include "connection_manager.hpp"
+#include "postgis_datasource.hpp"
+#include "postgis_featureset.hpp"
+
+// boost
+#include <boost/algorithm/string.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/tokenizer.hpp>
+#include <boost/format.hpp>
+#include <boost/make_shared.hpp>
+
+// stl
+#include <string>
+#include <algorithm>
+#include <set>
+#include <sstream>
+#include <iomanip>
+
+#define FMAX std::numeric_limits<double>::max()
+
+DATASOURCE_PLUGIN(postgis_datasource)
+
+const std::string postgis_datasource::GEOMETRY_COLUMNS="geometry_columns";
+const std::string postgis_datasource::SPATIAL_REF_SYS="spatial_ref_system";
+
+using boost::lexical_cast;
+using boost::bad_lexical_cast;
+using boost::shared_ptr;
+
+using mapnik::PoolGuard;
+using mapnik::attribute_descriptor;
+
+postgis_datasource::postgis_datasource(parameters const& params, bool bind)
+    : datasource(params),
+      table_(*params_.get<std::string>("table","")),
+      schema_(""),
+      geometry_table_(*params_.get<std::string>("geometry_table","")),
+      geometry_field_(*params_.get<std::string>("geometry_field","")),
+      key_field_(*params_.get<std::string>("key_field","")),
+      cursor_fetch_size_(*params_.get<int>("cursor_size",0)),
+      row_limit_(*params_.get<int>("row_limit",0)),
+      type_(datasource::Vector),
+      srid_(*params_.get<int>("srid",0)),
+      extent_initialized_(false),
+      desc_(*params_.get<std::string>("type"),"utf-8"),
+      creator_(params.get<std::string>("host"),
+               params.get<std::string>("port"),
+               params.get<std::string>("dbname"),
+               params.get<std::string>("user"),
+               params.get<std::string>("password"),
+               params.get<std::string>("connect_timeout","4")),
+      bbox_token_("!bbox!"),
+      scale_denom_token_("!scale_denominator!"),
+      persist_connection_(*params_.get<mapnik::boolean>("persist_connection",true)),
+      extent_from_subquery_(*params_.get<mapnik::boolean>("extent_from_subquery",false)),
+      // params below are for testing purposes only (will likely be removed at any time)
+      force2d_(*params_.get<mapnik::boolean>("force_2d",false)),
+      st_(*params_.get<mapnik::boolean>("st_prefix",false)),
+      intersect_min_scale_(*params_.get<int>("intersect_min_scale",0)),
+      intersect_max_scale_(*params_.get<int>("intersect_max_scale",0))
+      //show_queries_(*params_.get<mapnik::boolean>("show_queries",false))
+{   
+    if (table_.empty()) throw mapnik::datasource_exception("Postgis Plugin: missing <table> parameter");
+
+    multiple_geometries_ = *params_.get<mapnik::boolean>("multiple_geometries",false);
+   
+    boost::optional<std::string> ext  = params_.get<std::string>("extent");
+    if (ext) extent_initialized_ = extent_.from_string(*ext);
+
+    if (bind)
+    {
+        this->bind();
+    }
+}
+
+void postgis_datasource::bind() const
+{
+    if (is_bound_) return;
+    
+    boost::optional<int> initial_size = params_.get<int>("initial_size",1);
+    boost::optional<int> max_size = params_.get<int>("max_size",10);
+
+    ConnectionManager *mgr=ConnectionManager::instance();   
+    mgr->registerPool(creator_, *initial_size, *max_size);
+    
+    shared_ptr<Pool<Connection,ConnectionCreator> > pool=mgr->getPool(creator_.id());
+    if (pool)
+    {      
+        shared_ptr<Connection> conn = pool->borrowObject();
+        if (conn && conn->isOK())
+        {
+
+            is_bound_ = true;
+
+            PoolGuard<shared_ptr<Connection>,
+                      shared_ptr<Pool<Connection,ConnectionCreator> > > guard(conn,pool);
+         
+            desc_.set_encoding(conn->client_encoding());
+
+            if(geometry_table_.empty())
+            {
+                geometry_table_ = mapnik::table_from_sql(table_);
+            }
+            std::string::size_type idx = geometry_table_.find_last_of('.');
+            if (idx!=std::string::npos)
+            {
+                schema_ = geometry_table_.substr(0,idx);
+                geometry_table_ = geometry_table_.substr(idx+1);
+            }
+            else
+            {
+                geometry_table_ = geometry_table_.substr(0);
+            }
+
+            // If we do not know both the geometry_field and the srid
+            // then first attempt to fetch the geometry name from a geometry_columns entry.
+            // This will return no records if we are querying a bogus table returned
+            // from the simplistic table parsing in table_from_sql() or if
+            // the table parameter references a table, view, or subselect not
+            // registered in the geometry columns.
+            geometryColumn_ = geometry_field_;
+            if (!geometryColumn_.length() > 0 || srid_ == 0)
+            {
+                std::ostringstream s;
+                s << "SELECT f_geometry_column, srid FROM ";
+                s << GEOMETRY_COLUMNS <<" WHERE f_table_name='" << mapnik::unquote_sql(geometry_table_) <<"'";
+             
+                if (schema_.length() > 0) 
+                    s << " AND f_table_schema='" << mapnik::unquote_sql(schema_) << "'";
+            
+                if (geometry_field_.length() > 0)
+                    s << " AND f_geometry_column='" << mapnik::unquote_sql(geometry_field_) << "'";
+
+                /*
+                if (show_queries_)
+                {
+                    std::clog << boost::format("PostGIS: sending query: %s\n") % s.str();
+                }
+                */
+                 
+                shared_ptr<ResultSet> rs=conn->executeQuery(s.str());
+                if (rs->next())
+                {
+                    geometryColumn_ = rs->getValue("f_geometry_column");
+
+                    if (srid_ == 0)
+                    {
+                        try 
+                        {
+                            srid_ = lexical_cast<int>(rs->getValue("srid"));
+                        }
+                        catch (bad_lexical_cast &ex)
+                        {
+                            std::clog << "Postgis Plugin: SRID=" << rs->getValue("srid") << " " << ex.what() << std::endl;
+                        }
+                    }
+                }
+                rs->close();
+             
+                // If we still do not know the srid then we can try to fetch
+                // it from the 'table_' parameter, which should work even if it is
+                // a subselect as long as we know the geometry_field to query
+                if (geometryColumn_.length() && srid_ <= 0)
+                {
+                    s.str("");
+                    s << "SELECT ST_SRID(\"" << geometryColumn_ << "\") AS srid FROM ";
+                    s << populate_tokens(table_) << " WHERE \"" << geometryColumn_ << "\" IS NOT NULL LIMIT 1;";
+
+                    /*
+                    if (show_queries_)
+                    {
+                        std::clog << boost::format("PostGIS: sending query: %s\n") % s.str();
+                    }
+                    */
+
+                    shared_ptr<ResultSet> rs=conn->executeQuery(s.str());
+                    if (rs->next())
+                    {
+                        try
+                        {
+                            srid_ = lexical_cast<int>(rs->getValue("srid"));
+                        }
+                        catch (bad_lexical_cast &ex)
+                        {
+                            std::clog << "Postgis Plugin: SRID=" << rs->getValue("srid") << " " << ex.what() << std::endl;
+                        }
+                    }
+                    rs->close();
+                }
+            }
+         
+            if (srid_ == 0)
+            {
+                srid_ = -1;
+                std::clog << "Postgis Plugin: SRID warning, using srid=-1" << std::endl;
+            }
+
+            // At this point the geometry_field may still not be known
+            // but we'll catch that where more useful...         
+#ifdef MAPNIK_DEBUG
+            std::clog << "Postgis Plugin: using SRID=" << srid_ << std::endl;
+            std::clog << "Postgis Plugin: using geometry_column=" << geometryColumn_ << std::endl;
+#endif
+
+            // collect attribute desc         
+            std::ostringstream s;
+            s << "SELECT * FROM " << populate_tokens(table_) << " LIMIT 0";
+
+            
+            /*
+            if (show_queries_)
+            {
+                std::clog << boost::format("PostGIS: sending query: %s\n") % s.str();
+            }
+            */
+            
+
+            shared_ptr<ResultSet> rs=conn->executeQuery(s.str());
+            int count = rs->getNumFields();
+            bool found_key_field = false;
+            for (int i=0;i<count;++i)
+            {
+                std::string fld_name=rs->getFieldName(i);
+                int type_oid = rs->getTypeOID(i);
+
+                // validate type of key_field
+                if (!found_key_field && !key_field_.empty() && fld_name == key_field_)
+                {
+                    found_key_field = true;
+                    if (type_oid == 20 || type_oid == 21 || type_oid == 23)
+                    {
+                        desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Integer));
+                    }
+                    else
+                    {
+                        std::ostringstream error_s;
+                        error_s << "invalid type '";
+                        std::ostringstream type_s;
+                        type_s << "SELECT oid, typname FROM pg_type WHERE oid = " << type_oid;
+                        shared_ptr<ResultSet> rs_oid = conn->executeQuery(type_s.str());
+                        if (rs_oid->next())
+                        {
+                            error_s << rs_oid->getValue("typname")
+                              << "' (oid:" << rs_oid->getValue("oid") << ")";
+                        }
+                        else
+                        {
+                            error_s << "oid:" << type_oid << "'";           
+                        }
+                        rs_oid->close();
+                        error_s << " for key_field '" << fld_name << "' - "
+                          << "must be an integer primary key";
+                        rs->close();
+                        throw mapnik::datasource_exception( error_s.str() );
+                    }
+                }
+                else
+                {
+                    switch (type_oid)
+                    {
+                    case 16:    // bool
+                        desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Boolean));
+                        break;
+                    case 20:    // int8
+                    case 21:    // int2
+                    case 23:    // int4
+                        desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Integer));
+                        break;
+                    case 700:   // float4 
+                    case 701:   // float8
+                    case 1700:  // numeric ??
+                        desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Double));
+                    case 1042:  // bpchar
+                    case 1043:  // varchar
+                    case 25:    // text
+                        desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::String));
+                        break;
+                    default: // should not get here
+    #ifdef MAPNIK_DEBUG
+                        s.str("");
+                        s << "SELECT oid, typname FROM pg_type WHERE oid = " << type_oid;
+    
+                        /*
+                        if (show_queries_)
+                        {
+                            std::clog << boost::format("PostGIS: sending query: %s\n") % s.str();
+                        }
+                        */
+    
+                        shared_ptr<ResultSet> rs_oid = conn->executeQuery(s.str());
+                        if (rs_oid->next())
+                        {
+                            std::clog << "Postgis Plugin: unknown type = " << rs_oid->getValue("typname")
+                                << " (oid:" << rs_oid->getValue("oid") << ")" << std::endl;
+                        }
+                        else
+                        {
+                            std::clog << "Postgis Plugin: unknown oid type =" << type_oid << std::endl;              
+                        }
+                        rs_oid->close();
+    #endif
+                        break;
+                    }
+                }
+            }
+            rs->close();
+        }
+    }
+}
+
+std::string postgis_datasource::name()
+{
+    return "postgis";
+}
+
+int postgis_datasource::type() const
+{
+    return type_;
+}
+
+layer_descriptor postgis_datasource::get_descriptor() const
+{
+    if (!is_bound_) bind();
+    return desc_;
+}
+
+
+std::string postgis_datasource::sql_bbox(box2d<double> const& env) const
+{    
+    std::ostringstream b;
+    if (srid_ > 0)
+        b << "SetSRID(";
+    b << "'BOX3D(";
+    b << std::setprecision(16);
+    b << env.minx() << " " << env.miny() << ",";
+    b << env.maxx() << " " << env.maxy() << ")'::box3d";
+    if (srid_ > 0)
+        b << ", " << srid_ << ")";
+    return b.str();
+}
+
+std::string postgis_datasource::populate_tokens(const std::string& sql) const
+{
+    std::string populated_sql = sql;
+    
+    if ( boost::algorithm::icontains(sql,bbox_token_) )
+    {
+        box2d<double> max_env(-1 * FMAX,-1 * FMAX,FMAX,FMAX);
+        std::string max_box = sql_bbox(max_env);
+        boost::algorithm::replace_all(populated_sql,bbox_token_,max_box);
+    } 
+    if ( boost::algorithm::icontains(sql,scale_denom_token_) )
+    {
+        std::string max_denom = lexical_cast<std::string>(FMAX);
+        boost::algorithm::replace_all(populated_sql,scale_denom_token_,max_denom);
+    }
+    return populated_sql;
+}
+
+std::string postgis_datasource::populate_tokens(const std::string& sql, double const& scale_denom, box2d<double> const& env) const
+{
+    std::string populated_sql = sql;
+    std::string box = sql_bbox(env);
+    
+    if ( boost::algorithm::icontains(populated_sql,scale_denom_token_) )
+    {
+        std::string max_denom = lexical_cast<std::string>(scale_denom);
+        boost::algorithm::replace_all(populated_sql,scale_denom_token_,max_denom);
+    }
+    
+    if ( boost::algorithm::icontains(populated_sql,bbox_token_) )
+    {
+        boost::algorithm::replace_all(populated_sql,bbox_token_,box);
+        return populated_sql;
+    }
+    else
+    {
+        std::ostringstream s;
+        if (intersect_min_scale_ > 0 && (scale_denom <= intersect_min_scale_ ))
+        {
+                s << " WHERE ST_Intersects(\"" << geometryColumn_ << "\"," << box << ")";
+        }
+        else if (intersect_max_scale_ > 0 && (scale_denom >= intersect_max_scale_ ))
+        {
+             // do no bbox restriction
+        }
+        else
+        {
+            s << " WHERE \"" << geometryColumn_ << "\" && " << box;
+        }
+        return populated_sql + s.str();    
+    }
+}
+
+
+boost::shared_ptr<IResultSet> postgis_datasource::get_resultset(boost::shared_ptr<Connection> const &conn, const std::string &sql) const
+{
+    if (cursor_fetch_size_ > 0)
+    {
+        // cursor
+        std::ostringstream csql;
+        std::string cursor_name = conn->new_cursor_name();
+
+        csql << "DECLARE " << cursor_name << " BINARY INSENSITIVE NO SCROLL CURSOR WITH HOLD FOR " << sql << " FOR READ ONLY";
+
+        /*
+        if (show_queries_)
+        {
+            std::clog << boost::format("PostGIS: sending query: %s\n") % csql.str();
+        }
+        */
+
+        if (!conn->execute(csql.str()))
+            throw mapnik::datasource_exception("Postgis Plugin: error creating cursor for data select." );
+
+        return boost::make_shared<CursorResultSet>(conn, cursor_name, cursor_fetch_size_);
+
+    }
+    else
+    {
+        // no cursor
+
+        /*
+        if (show_queries_)
+        {
+            std::clog << boost::format("PostGIS: sending query: %s\n") % sql;
+        }
+        */
+
+        return conn->executeQuery(sql,1);
+    }
+}
+
+featureset_ptr postgis_datasource::features(const query& q) const
+{
+    if (!is_bound_) bind();
+    
+    box2d<double> const& box = q.get_bbox();
+    double scale_denom = q.scale_denominator();
+    ConnectionManager *mgr=ConnectionManager::instance();
+    shared_ptr<Pool<Connection,ConnectionCreator> > pool=mgr->getPool(creator_.id());
+    if (pool)
+    {
+        shared_ptr<Connection> conn = pool->borrowObject();
+        if (conn && conn->isOK())
+        {       
+            PoolGuard<shared_ptr<Connection>,shared_ptr<Pool<Connection,ConnectionCreator> > > guard(conn,pool);
+
+            if (!geometryColumn_.length() > 0)
+            {
+                std::ostringstream s_error;
+                s_error << "geometry name lookup failed for table '";
+                if (schema_.length() > 0)
+                {
+                    s_error << schema_ << ".";
+                }
+                s_error << geometry_table_
+                        << "'. Please manually provide the 'geometry_field' parameter or add an entry "
+                        << "in the geometry_columns for '";
+                if (schema_.length() > 0)
+                {
+                    s_error << schema_ << ".";
+                }
+                s_error << geometry_table_ << "'.";
+                throw mapnik::datasource_exception("Postgis Plugin: " + s_error.str());
+            }
+
+            std::ostringstream s;
+            s << "SELECT ";
+            if (st_)
+                s << "ST_";
+            if (force2d_)
+                s << "AsBinary(ST_Force_2D(\"" << geometryColumn_ << "\")) AS geom";
+            else
+                s << "AsBinary(\"" << geometryColumn_ << "\") AS geom";
+
+            if (!key_field_.empty()) 
+                mapnik::quote_attr(s,key_field_);
+
+            std::set<std::string> const& props=q.property_names();
+            std::set<std::string>::const_iterator pos=props.begin();
+            std::set<std::string>::const_iterator end=props.end();
+            while (pos != end)
+            {
+                mapnik::quote_attr(s,*pos);
+                ++pos;
+            }       
+
+            std::string table_with_bbox = populate_tokens(table_,scale_denom,box);
+
+            s << " from " << table_with_bbox;
+
+            if (row_limit_ > 0) {
+                s << " LIMIT " << row_limit_;
+            }
+         
+            boost::shared_ptr<IResultSet> rs = get_resultset(conn, s.str());
+            unsigned num_attr = props.size();
+            if (!key_field_.empty())
+                ++num_attr;
+            return boost::make_shared<postgis_featureset>(rs,desc_.get_encoding(),multiple_geometries_,!key_field_.empty(),num_attr);
+        }
+        else 
+        {
+            throw mapnik::datasource_exception("Postgis Plugin: bad connection");
+        }
+    }
+    return featureset_ptr();
+}
+
+featureset_ptr postgis_datasource::features_at_point(coord2d const& pt) const
+{
+    if (!is_bound_) bind();
+    
+    ConnectionManager *mgr=ConnectionManager::instance();
+    shared_ptr<Pool<Connection,ConnectionCreator> > pool=mgr->getPool(creator_.id());
+    if (pool)
+    {
+        shared_ptr<Connection> conn = pool->borrowObject();
+        if (conn && conn->isOK())
+        {       
+            PoolGuard<shared_ptr<Connection>,shared_ptr<Pool<Connection,ConnectionCreator> > > guard(conn,pool);
+            std::ostringstream s;
+
+            if (!geometryColumn_.length() > 0)
+            {
+                std::ostringstream s_error;
+                s_error << "PostGIS: geometry name lookup failed for table '";
+                if (schema_.length() > 0)
+                {
+                    s_error << schema_ << ".";
+                }
+                s_error << "." << geometry_table_
+                        << "'. Please manually provide the 'geometry_field' parameter or add an entry "
+                        << "in the geometry_columns for '";
+                if (schema_.length() > 0)
+                {
+                    s_error << schema_ << ".";
+                }
+                s_error << geometry_table_ << "'.";
+                throw mapnik::datasource_exception(s_error.str());
+            }
+                    
+
+            s << "SELECT ";
+            if (st_)
+                s << "ST_";
+            if (force2d_)
+                s << "AsBinary(ST_Force_2D(\"" << geometryColumn_ << "\")) AS geom";
+            else
+                s << "AsBinary(\"" << geometryColumn_ << "\") AS geom";
+            
+            if (!key_field_.empty())
+                mapnik::quote_attr(s,key_field_);
+
+            std::vector<attribute_descriptor>::const_iterator itr = desc_.get_descriptors().begin();
+            std::vector<attribute_descriptor>::const_iterator end = desc_.get_descriptors().end();
+            unsigned size=0;
+            while (itr != end)
+            {
+                mapnik::quote_attr(s,itr->get_name());
+                ++itr;
+                ++size;
+            }
+
+            box2d<double> box(pt.x,pt.y,pt.x,pt.y);
+            std::string table_with_bbox = populate_tokens(table_,FMAX,box);
+
+            s << " from " << table_with_bbox;
+         
+            if (row_limit_ > 0) {
+                s << " LIMIT " << row_limit_;
+            }
+         
+            boost::shared_ptr<IResultSet> rs = get_resultset(conn, s.str());
+            return boost::make_shared<postgis_featureset>(rs,desc_.get_encoding(),multiple_geometries_,!key_field_.empty(),size);
+        }
+    }
+    return featureset_ptr();
+}
+
+box2d<double> postgis_datasource::envelope() const
+{
+    if (extent_initialized_) return extent_;
+    if (!is_bound_) bind();
+    
+    ConnectionManager *mgr=ConnectionManager::instance();
+    shared_ptr<Pool<Connection,ConnectionCreator> > pool=mgr->getPool(creator_.id());
+    if (pool)
+    {
+        shared_ptr<Connection> conn = pool->borrowObject();
+        if (conn && conn->isOK())
+        {
+            PoolGuard<shared_ptr<Connection>,shared_ptr<Pool<Connection,ConnectionCreator> > > guard(conn,pool);
+            std::ostringstream s;
+            boost::optional<mapnik::boolean> estimate_extent = params_.get<mapnik::boolean>("estimate_extent",false);
+
+            if (!geometryColumn_.length() > 0)
+            {
+                std::ostringstream s_error;
+                s_error << "PostGIS: unable to query the layer extent of table '";
+                if (schema_.length() > 0)
+                {
+                    s_error << schema_ << ".";
+                }
+                s_error << geometry_table_ << "' because we cannot determine the geometry field name."
+                        << "\nPlease provide either an 'extent' parameter to skip this query, "
+                        << "a 'geometry_field' and/or 'geometry_table' parameter, or add a "
+                        << "record to the 'geometry_columns' for your table.";
+                throw mapnik::datasource_exception("Postgis Plugin: " + s_error.str());
+            }
+
+            if (estimate_extent && *estimate_extent)
+            {
+                s << "SELECT ST_XMin(ext),ST_YMin(ext),ST_XMax(ext),ST_YMax(ext)"
+                  << " FROM (SELECT ST_Estimated_Extent('";
+
+                if (schema_.length() > 0)
+                {
+                    s << mapnik::unquote_sql(schema_) << "','";
+                }
+
+                s << mapnik::unquote_sql(geometry_table_) << "','"
+                  << mapnik::unquote_sql(geometryColumn_) << "') as ext) as tmp";
+            }
+            else
+            {
+                s << "SELECT ST_XMin(ext),ST_YMin(ext),ST_XMax(ext),ST_YMax(ext)"
+                  << " FROM (SELECT ST_Extent(" <<geometryColumn_<< ") as ext from ";
+                if (extent_from_subquery_)
+                {
+                    // if a subselect limits records then calculating the extent upon the
+                    // subquery will be faster and the bounds will be more accurate
+                    s << populate_tokens(table_) << ") as tmp";
+                }
+                else
+                {
+                    if (schema_.length() > 0)
+                    {
+                        s << schema_ << ".";
+                    }
+
+                    // but if the subquery does not limit records then querying the
+                    // actual table will be faster as indexes can be used
+                    s << geometry_table_ << ") as tmp";
+                }
+            }
+
+            /*
+            if (show_queries_)
+            {
+                std::clog << boost::format("PostGIS: sending query: %s\n") % s.str();
+            }
+            */
+            
+            shared_ptr<ResultSet> rs=conn->executeQuery(s.str());
+            if (rs->next())
+            {
+                try 
+                {
+                    double lox=lexical_cast<double>(rs->getValue(0));
+                    double loy=lexical_cast<double>(rs->getValue(1));
+                    double hix=lexical_cast<double>(rs->getValue(2));
+                    double hiy=lexical_cast<double>(rs->getValue(3));
+                    extent_.init(lox,loy,hix,hiy);
+                    extent_initialized_ = true;
+                }
+                catch (bad_lexical_cast &ex)
+                {
+                    std::clog << boost::format("Postgis Plugin: warning: could not determine extent from query: %s\nError was: '%s'\n") % s.str() % ex.what() << std::endl;
+                }
+            }
+            rs->close();
+        }
+    }
+    return extent_;
+}
+
+postgis_datasource::~postgis_datasource() 
+{
+    if (is_bound_ && !persist_connection_)
+    {
+        ConnectionManager *mgr=ConnectionManager::instance();
+        shared_ptr<Pool<Connection,ConnectionCreator> > pool=mgr->getPool(creator_.id());
+        if (pool)
+        {
+            shared_ptr<Connection> conn = pool->borrowObject();
+            if (conn)
+            {
+                conn->close();
+            }
+        }
+    }
+}
diff --git a/plugins/input/postgis/postgis_datasource.hpp b/plugins/input/postgis/postgis_datasource.hpp
new file mode 100644
index 0000000..eade578
--- /dev/null
+++ b/plugins/input/postgis/postgis_datasource.hpp
@@ -0,0 +1,103 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id: postgis.hpp 44 2005-04-22 18:53:54Z pavlenko $
+
+#ifndef POSTGIS_DATASOURCE_HPP
+#define POSTGIS_DATASOURCE_HPP
+
+// mapnik
+#include <mapnik/datasource.hpp>
+#include <mapnik/box2d.hpp>
+#include <mapnik/feature_layer_desc.hpp>
+
+// boost
+#include <boost/lexical_cast.hpp>
+#include <boost/scoped_ptr.hpp>
+
+#include "connection_manager.hpp"
+#include "resultset.hpp"
+#include "cursorresultset.hpp"
+
+using mapnik::transcoder;
+using mapnik::datasource;
+using mapnik::box2d;
+using mapnik::layer_descriptor;
+using mapnik::featureset_ptr;
+using mapnik::feature_ptr;
+using mapnik::query;
+using mapnik::parameters;
+using mapnik::coord2d;
+
+class postgis_datasource : public datasource
+{
+      static const std::string GEOMETRY_COLUMNS;
+      static const std::string SPATIAL_REF_SYS;
+      const std::string uri_;
+      const std::string username_;
+      const std::string password_;
+      const std::string table_;
+      mutable std::string schema_;
+      mutable std::string geometry_table_;
+      const std::string geometry_field_;
+      const std::string key_field_;
+      const int cursor_fetch_size_;
+      const int row_limit_;
+      mutable std::string geometryColumn_;
+      int type_;
+      mutable int srid_;
+      mutable bool extent_initialized_;
+      mutable mapnik::box2d<double> extent_;
+      mutable layer_descriptor desc_;
+      ConnectionCreator<Connection> creator_;
+      bool multiple_geometries_;
+      const std::string bbox_token_;
+      const std::string scale_denom_token_;
+      bool persist_connection_;
+      bool extent_from_subquery_;
+      // params below are for testing purposes only (will likely be removed at any time)
+      bool force2d_;
+      bool st_;
+      int intersect_min_scale_;
+      int intersect_max_scale_;
+      //bool show_queries_;
+   public:
+      static std::string name();
+      int type() const;
+      featureset_ptr features(const query& q) const;
+      featureset_ptr features_at_point(coord2d const& pt) const;
+      mapnik::box2d<double> envelope() const;
+      layer_descriptor get_descriptor() const;
+      postgis_datasource(const parameters &params, bool bind=true);
+      ~postgis_datasource();
+      void bind() const;
+   private:
+      std::string sql_bbox(box2d<double> const& env) const;
+      std::string populate_tokens(const std::string& sql, double const& scale_denom, box2d<double> const& env) const;
+      std::string populate_tokens(const std::string& sql) const;
+      static std::string unquote(const std::string& sql);
+      boost::shared_ptr<IResultSet> get_resultset(boost::shared_ptr<Connection> const &conn, const std::string &sql) const;
+      postgis_datasource(const postgis_datasource&);
+      postgis_datasource& operator=(const postgis_datasource&);
+};
+
+#endif //POSTGIS_DATASOURCE_HPP
diff --git a/plugins/input/postgis/postgis_featureset.cpp b/plugins/input/postgis/postgis_featureset.cpp
new file mode 100644
index 0000000..98dc8c9
--- /dev/null
+++ b/plugins/input/postgis/postgis_featureset.cpp
@@ -0,0 +1,199 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+// mapnik
+#include <mapnik/global.hpp>
+#include <mapnik/wkb.hpp>
+#include <mapnik/unicode.hpp>
+#include <mapnik/sql_utils.hpp>
+#include <mapnik/feature_factory.hpp>
+
+#include "postgis_featureset.hpp"
+#include "resultset.hpp"
+#include "cursorresultset.hpp"
+
+// boost
+#include <boost/lexical_cast.hpp>
+#include <boost/algorithm/string.hpp>
+
+// stl
+#include <sstream>
+#include <string>
+
+using boost::lexical_cast;
+using boost::bad_lexical_cast;
+using boost::trim_copy;
+using mapnik::geometry_type;
+using mapnik::byte;
+using mapnik::geometry_utils;
+using mapnik::feature_factory;
+
+postgis_featureset::postgis_featureset(boost::shared_ptr<IResultSet> const& rs,
+                                       std::string const& encoding,
+                                       bool multiple_geometries,
+                                       bool key_field=false,
+                                       unsigned num_attrs=0)
+    : rs_(rs),
+      multiple_geometries_(multiple_geometries),
+      num_attrs_(num_attrs),
+      tr_(new transcoder(encoding)),
+      totalGeomSize_(0),
+      feature_id_(1),
+      key_field_(key_field)  {}
+
+feature_ptr postgis_featureset::next()
+{
+    if (rs_->next())
+    { 
+        // new feature
+        feature_ptr feature;
+
+        unsigned pos = 1;
+
+        if (key_field_) {
+            // create feature with user driven id from attribute
+            int oid = rs_->getTypeOID(pos);
+            const char* buf = rs_->getValue(pos);
+            std::string name = rs_->getFieldName(pos);
+            // validation happens of this type at bind()
+            int val;
+            if (oid == 20)
+            {
+                val = int8net(buf);
+            }
+            else if (oid == 21)
+            {
+                val = int2net(buf);
+            }
+            else
+            {
+                val = int4net(buf);
+            }
+            feature = feature_factory::create(val);
+            // TODO - extend feature class to know
+            // that its id is also an attribute to avoid
+            // this duplication
+            boost::put(*feature,name,val);
+            ++pos;
+        } else {
+            // fallback to auto-incrementing id
+            feature = feature_factory::create(feature_id_);
+            ++feature_id_;
+        }
+
+        // parse geometry
+        int size = rs_->getFieldLength(0);
+        const char *data = rs_->getValue(0);
+        geometry_utils::from_wkb(feature->paths(),data,size,multiple_geometries_);
+        totalGeomSize_+=size;
+          
+        for ( ;pos<num_attrs_+1;++pos)
+        {
+            std::string name = rs_->getFieldName(pos);
+
+            if (rs_->isNull(pos))
+            {
+                boost::put(*feature,name,mapnik::value_null());
+            }
+            else
+            {
+                const char* buf = rs_->getValue(pos);
+                int oid = rs_->getTypeOID(pos);
+           
+                if (oid==16) //bool
+                {
+                    boost::put(*feature,name,buf[0] != 0);
+                }
+                else if (oid==23) //int4
+                {
+                    int val = int4net(buf);
+                    boost::put(*feature,name,val);
+                }
+                else if (oid==21) //int2
+                {
+                    int val = int2net(buf);
+                    boost::put(*feature,name,val);
+                }
+                else if (oid==20) //int8/BigInt
+                {
+                    int val = int8net(buf);
+                    boost::put(*feature,name,val);
+                }
+                else if (oid == 700) // float4
+                {
+                    float val;
+                    float4net(val,buf);
+                    boost::put(*feature,name,val);
+                }
+                else if (oid == 701) // float8
+                {
+                    double val;
+                    float8net(val,buf);
+                    boost::put(*feature,name,val);
+                }
+                else if (oid==25 || oid==1043) // text or varchar
+                {
+                    UnicodeString ustr = tr_->transcode(buf);
+                    boost::put(*feature,name,ustr);
+                }
+                else if (oid==1042)
+                {
+                    UnicodeString ustr = tr_->transcode(trim_copy(std::string(buf)).c_str()); // bpchar
+                    boost::put(*feature,name,ustr);
+                }
+                else if (oid == 1700) // numeric
+                {
+                    std::string str = mapnik::numeric2string(buf);
+                    try 
+                    {
+                        double val = boost::lexical_cast<double>(str);
+                        boost::put(*feature,name,val);
+                    }
+                    catch (boost::bad_lexical_cast & ex)
+                    {
+                        std::clog << ex.what() << "\n"; 
+                    }
+                }
+                else 
+                {
+#ifdef MAPNIK_DEBUG
+                    std::clog << "Postgis Plugin: uknown OID = " << oid << " FIXME " << std::endl;
+#endif
+                }
+            }
+        }
+        return feature;
+    }
+    else
+    {
+        rs_->close();
+        return feature_ptr();
+    }
+}
+
+
+postgis_featureset::~postgis_featureset()
+{
+    rs_->close();
+}
diff --git a/plugins/input/postgis/postgis_featureset.hpp b/plugins/input/postgis/postgis_featureset.hpp
new file mode 100644
index 0000000..d7ca61e
--- /dev/null
+++ b/plugins/input/postgis/postgis_featureset.hpp
@@ -0,0 +1,66 @@
+
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef POSTGIS_FEATURESET_HPP
+#define POSTGIS_FEATURESET_HPP
+
+// mapnik
+#include <mapnik/box2d.hpp>
+#include <mapnik/datasource.hpp>
+#include <mapnik/feature.hpp>
+
+// boost
+
+#include <boost/scoped_ptr.hpp>
+
+using mapnik::Featureset;
+using mapnik::box2d;
+using mapnik::feature_ptr;
+using mapnik::transcoder;
+
+class IResultSet;
+
+class postgis_featureset : public mapnik::Featureset
+{
+private:
+    boost::shared_ptr<IResultSet> rs_;
+    bool multiple_geometries_;
+    unsigned num_attrs_;
+    boost::scoped_ptr<mapnik::transcoder> tr_;
+    int totalGeomSize_;
+    int feature_id_;
+    bool key_field_;
+public:
+    postgis_featureset(boost::shared_ptr<IResultSet> const& rs,
+                       std::string const& encoding,
+                       bool multiple_geometries,
+                       bool key_field,
+                       unsigned num_attrs);
+    mapnik::feature_ptr next();
+    ~postgis_featureset();
+private:
+    postgis_featureset(const postgis_featureset&);
+    const postgis_featureset& operator=(const postgis_featureset&);
+};
+
+#endif // POSTGIS_FEATURESET_HPP
diff --git a/plugins/input/postgis/postgisfs.cpp b/plugins/input/postgis/postgisfs.cpp
deleted file mode 100644
index 562928d..0000000
--- a/plugins/input/postgis/postgisfs.cpp
+++ /dev/null
@@ -1,256 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-
-//$Id: postgisfs.cc 34 2005-04-04 13:27:23Z pavlenko $
-
-#include <boost/lexical_cast.hpp>
-#include <boost/scoped_array.hpp>
-#include <boost/algorithm/string.hpp>
-#include <mapnik/global.hpp>
-#include <mapnik/wkb.hpp>
-#include <mapnik/unicode.hpp>
-#include "postgis.hpp"
-#include <sstream>
-
-using boost::lexical_cast;
-using boost::bad_lexical_cast;
-using boost::trim_copy;
-using std::string;
-using mapnik::Feature;
-using mapnik::geometry2d;
-using mapnik::byte;
-using mapnik::geometry_utils;
-
-
-std::string numeric2string(const char* buf)
-{
-   int16_t ndigits = int2net(buf);
-   int16_t weight  = int2net(buf+2);
-   int16_t sign    = int2net(buf+4);
-   int16_t dscale  = int2net(buf+6);
-   
-   boost::scoped_array<int16_t> digits(new int16_t[ndigits]); 
-   for (int n=0; n < ndigits ;++n)
-   {
-      digits[n] = int2net(buf+8+n*2);
-   }
-   
-   std::ostringstream ss;
-   
-   if (sign == 0x4000) ss << "-";
-   
-   int i = std::max(weight,int16_t(0));
-   int d = 0;
-
-   // Each numeric "digit" is actually a value between 0000 and 9999 stored in a 16 bit field.
-   // For example, the number 1234567809990001 is stored as four digits: [1234] [5678] [999] [1].
-   // Note that the last two digits show that the leading 0's are lost when the number is split.
-   // We must be careful to re-insert these 0's when building the string.
-
-   while ( i >= 0)
-   {
-      if (i <= weight && d < ndigits) {
-         // All digits after the first must be padded to make the field 4 characters long
-         if (d != 0) {
-#ifdef _WINDOWS
-	     int dig = digits[d];
-	     if (dig < 10)
-	     {
-		 ss << "000"; // 0000 - 0009
-	     }
-	     else if (dig < 100)
-	     {
-		 ss << "00";  // 0010 - 0099
-	     }
-	     else
-	     {
-		 ss << "0";   // 0100 - 0999;
-	     }
-#else
-	     switch(digits[d]) {
-	     case 0 ... 9:
-		 ss << "000"; // 0000 - 0009
-		 break;
-	     case 10 ... 99:
-		 ss << "00";  // 0010 - 0099
-		 break;
-	     case 100 ... 999:
-		 ss << "0";   // 0100 - 0999
-		 break;
-	     }
-#endif
-         }
-         ss <<  digits[d++];
-      } else {
-         if (d == 0)
-            ss <<  "0";
-         else
-            ss <<  "0000";
-      }
-      i--;
-   }
-   if (dscale > 0)
-   {
-      ss << '.';
-      // dscale counts the number of decimal digits following the point, not the numeric digits
-      while (dscale > 0)
-      {
-         int value;
-         if (i <= weight && d < ndigits)
-            value = digits[d++];
-         else
-            value = 0;
-
-         // Output up to 4 decimal digits for this value
-         if (dscale > 0) {
-            ss << (value / 1000);
-            value %= 1000;
-            dscale--;
-         }
-         if (dscale > 0) {
-            ss << (value / 100);
-            value %= 100;
-            dscale--;
-         }
-         if (dscale > 0) {
-            ss << (value / 10);
-            value %= 10;
-            dscale--;
-         }
-         if (dscale > 0) {
-            ss << value;
-            dscale--;
-         }
-
-         i--;
-      }
-   }
-   return ss.str();
-}
-
-postgis_featureset::postgis_featureset(boost::shared_ptr<IResultSet> const& rs,
-                                       std::string const& encoding,
-                                       bool multiple_geometries,
-                                       unsigned num_attrs=0)
-    : rs_(rs),
-      multiple_geometries_(multiple_geometries),
-      num_attrs_(num_attrs),
-      tr_(new transcoder(encoding)),
-      totalGeomSize_(0),
-      count_(0)  {}
-
-feature_ptr postgis_featureset::next()
-{
-    if (rs_->next())
-    { 
-        feature_ptr feature(new Feature(count_));
-        int size=rs_->getFieldLength(0);
-        const char *data = rs_->getValue(0);
-        geometry_utils::from_wkb(*feature,data,size,multiple_geometries_);
-        totalGeomSize_+=size;
-	        
-        for (unsigned pos=1;pos<num_attrs_+1;++pos)
-        {
-           std::string name = rs_->getFieldName(pos);
-
-           if (!rs_->isNull(pos))
-           {
-              const char* buf=rs_->getValue(pos);
-              int oid = rs_->getTypeOID(pos);
-           
-              if (oid==16) //bool
-              {
-                 boost::put(*feature,name,buf[0] != 0);
-              }
-              else if (oid==23) //int4
-              {
-                 int val = int4net(buf);
-                 boost::put(*feature,name,val);
-              }
-              else if (oid==21) //int2
-              {
-                 int val = int2net(buf);
-                 boost::put(*feature,name,val);
-              }
-              else if (oid==20) //int8/BigInt
-              {
-                 int val = int8net(buf);
-                 boost::put(*feature,name,val);
-              }
-              else if (oid == 700) // float4
-              {
-                 float val;
-                 float4net(val,buf);
-                 boost::put(*feature,name,val);
-              }
-              else if (oid == 701) // float8
-              {
-                 double val;
-                 float8net(val,buf);
-                 boost::put(*feature,name,val);
-              }
-              else if (oid==25 || oid==1043) // text or varchar
-              {
-                 UnicodeString ustr = tr_->transcode(buf);
-                 boost::put(*feature,name,ustr);
-              }
-              else if (oid==1042)
-              {
-                 UnicodeString ustr = tr_->transcode(trim_copy(string(buf)).c_str()); // bpchar
-                 boost::put(*feature,name,ustr);
-              }
-              else if (oid == 1700) // numeric
-              {
-                 std::string str = numeric2string(buf);
-                 try 
-                 {
-                    double val = boost::lexical_cast<double>(str);
-                    boost::put(*feature,name,val);
-                 }
-                 catch (boost::bad_lexical_cast & ex)
-                 {
-                    std::clog << ex.what() << "\n"; 
-                 }
-              }
-              else 
-              {
-#ifdef MAPNIK_DEBUG
-                 std::clog << "uknown OID = " << oid << " FIXME \n";
-#endif
-              }
-           }
-        }
-        ++count_;   
-        return feature;
-    }
-    else
-    {
-        rs_->close();
-        return feature_ptr();
-    }
-}
-
-
-postgis_featureset::~postgis_featureset()
-{
-    rs_->close();
-}
diff --git a/plugins/input/postgis/resultset.hpp b/plugins/input/postgis/resultset.hpp
index db07f4c..25cc201 100644
--- a/plugins/input/postgis/resultset.hpp
+++ b/plugins/input/postgis/resultset.hpp
@@ -26,7 +26,10 @@
 #ifndef RESULTSET_HPP
 #define RESULTSET_HPP
 
-#include "connection.hpp"
+extern "C" 
+{
+#include "libpq-fe.h"
+}
 
 class IResultSet
 {
@@ -53,55 +56,58 @@ private:
     int pos_;
     int numTuples_;
     int *refCount_;
+
 public:
     ResultSet(PGresult *res)
-	:res_(res),pos_(-1),refCount_(new int(1))
+        : res_(res),
+          pos_(-1),
+          refCount_(new int(1))
     {
-	numTuples_=PQntuples(res_);
+        numTuples_=PQntuples(res_);
     }
 
     ResultSet(const ResultSet& rhs)
-	:res_(rhs.res_),
-	 pos_(rhs.pos_),
-	 numTuples_(rhs.numTuples_),
-	 refCount_(rhs.refCount_)
+        : res_(rhs.res_),
+          pos_(rhs.pos_),
+          numTuples_(rhs.numTuples_),
+          refCount_(rhs.refCount_)
     {
-	(*refCount_)++;
+        (*refCount_)++;
     }
 
     ResultSet& operator=(const ResultSet& rhs)
     {
-	if (this==&rhs) return *this;
-	if (--(refCount_)==0)
-	{
-	    close();
-	    delete refCount_,refCount_=0;
-	}
-	res_=rhs.res_;
-	pos_=rhs.pos_;
-	numTuples_=rhs.numTuples_;
-	refCount_=rhs.refCount_;
-	(*refCount_)++;
-	return *this;
+        if (this==&rhs) return *this;
+        if (--(refCount_)==0)
+        {
+            close();
+            delete refCount_,refCount_=0;
+        }
+        res_=rhs.res_;
+        pos_=rhs.pos_;
+        numTuples_=rhs.numTuples_;
+        refCount_=rhs.refCount_;
+        (*refCount_)++;
+        return *this;
     }
 
     virtual void close()
     {
-	PQclear(res_),res_=0;
+        PQclear(res_),res_=0;
     }
 
     virtual ~ResultSet()
     {
-	if (--(*refCount_)==0)
-	{
-	    PQclear(res_);
-	    delete refCount_,refCount_=0;
-	}
+        if (--(*refCount_)==0)
+        {
+            PQclear(res_);
+            delete refCount_,refCount_=0;
+        }
     }
 
     virtual int getNumFields() const
     {
-	return PQnfields(res_);
+        return PQnfields(res_);
     }
 
     int pos() const
@@ -116,38 +122,38 @@ public:
 
     virtual bool next()
     {
-	return (++pos_<numTuples_);
+        return (++pos_<numTuples_);
     }
 
     virtual const char* getFieldName(int index) const
     {
-	return PQfname(res_,index);
+        return PQfname(res_,index);
     }
 
     virtual int getFieldLength(int index) const
     {
-	return PQgetlength(res_,pos_,index);
+        return PQgetlength(res_,pos_,index);
     }
 
     virtual int getFieldLength(const char* name) const
     {
-	int col=PQfnumber(res_,name);
-	if (col>=0)
-	    return PQgetlength(res_,pos_,col);
-	return 0;
+        int col=PQfnumber(res_,name);
+        if (col>=0)
+            return PQgetlength(res_,pos_,col);
+        return 0;
     }
 
     virtual int getTypeOID(int index) const
     {
-	return PQftype(res_,index);
+        return PQftype(res_,index);
     }
 
     virtual int getTypeOID(const char* name) const
     {
-	int col=PQfnumber(res_,name);
-	if (col>=0)
-	    return PQftype(res_,col);
-	return 0;
+        int col=PQfnumber(res_,name);
+        if (col>=0)
+            return PQftype(res_,col);
+        return 0;
     }
     
     virtual bool isNull(int index) const
@@ -157,15 +163,15 @@ public:
     
     virtual const char* getValue(int index) const
     {
-	return PQgetvalue(res_,pos_,index);
+        return PQgetvalue(res_,pos_,index);
     }
 
     virtual const char* getValue(const char* name) const
     {
-	int col=PQfnumber(res_,name);
-	if (col>=0)
-	    return getValue(col);
-	return 0;
+        int col=PQfnumber(res_,name);
+        if (col>=0)
+            return getValue(col);
+        return 0;
     }
 };
 
diff --git a/plugins/input/raster/SConscript b/plugins/input/raster/SConscript
deleted file mode 100644
index ea3bc29..0000000
--- a/plugins/input/raster/SConscript
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# This file is part of Mapnik (c++ mapping toolkit)
-#
-# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-# $Id$
-
-Import ('env')
-
-prefix = env['PREFIX']
-install_prefix = env['DESTDIR'] + '/' + prefix
-
-raster_src = Split(
-	"""
-	raster_datasource.cpp
-	raster_featureset.cpp
-	raster_info.cpp      
-	"""
-        )
-
-libraries = []
-if env['PLATFORM'] == 'Darwin':
-    libraries.append('mapnik')
-    libraries.append(env['ICU_LIB_NAME'])
-    libraries.append('boost_system%s' % env['BOOST_APPEND'])
-    libraries.append('boost_filesystem%s' % env['BOOST_APPEND'])
-
-raster_inputdriver = env.SharedLibrary('raster', source=raster_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries)
-
-env.Install(install_prefix + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME'] + '/input', raster_inputdriver)
-env.Alias('install', install_prefix + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME'] + '/input')
diff --git a/plugins/input/raster/build.py b/plugins/input/raster/build.py
new file mode 100644
index 0000000..270509f
--- /dev/null
+++ b/plugins/input/raster/build.py
@@ -0,0 +1,50 @@
+#
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+Import ('env')
+
+prefix = env['PREFIX']
+
+plugin_env = env.Clone()
+
+raster_src = Split(
+  """
+  raster_datasource.cpp
+  raster_featureset.cpp
+  raster_info.cpp      
+  """
+        )
+
+libraries = []
+# Link Library to Dependencies
+libraries.append('mapnik2')
+libraries.append(env['ICU_LIB_NAME'])
+libraries.append('boost_system%s' % env['BOOST_APPEND'])
+libraries.append('boost_filesystem%s' % env['BOOST_APPEND'])
+
+input_plugin = plugin_env.SharedLibrary('../raster', source=raster_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS'])
+
+# if the plugin links to libmapnik2 ensure it is built first
+Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME']))
+
+if 'uninstall' not in COMMAND_LINE_TARGETS:
+    env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin)
+    env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST'])
diff --git a/plugins/input/raster/raster_datasource.cpp b/plugins/input/raster/raster_datasource.cpp
index d247628..e7bf0b4 100644
--- a/plugins/input/raster/raster_datasource.cpp
+++ b/plugins/input/raster/raster_datasource.cpp
@@ -20,9 +20,11 @@
  *
  *****************************************************************************/
 //$Id: raster_datasource.cc 44 2005-04-22 18:53:54Z pavlenko $
+
 // boost
 #include <boost/lexical_cast.hpp>
 #include <boost/filesystem/operations.hpp>
+#include <boost/make_shared.hpp>
 
 // mapnik
 #include <mapnik/image_reader.hpp>
@@ -31,15 +33,12 @@
 #include "raster_info.hpp"
 #include "raster_datasource.hpp"
 
-
 using mapnik::datasource;
 using mapnik::parameters;
-using mapnik::ImageReader;
+using mapnik::image_reader;
 
 DATASOURCE_PLUGIN(raster_datasource)
 
-using std::clog;
-using std::endl;
 using boost::lexical_cast;
 using boost::bad_lexical_cast;
 using mapnik::layer_descriptor;
@@ -48,70 +47,100 @@ using mapnik::query;
 using mapnik::coord2d;
 using mapnik::datasource_exception;
 
-raster_datasource::raster_datasource(const parameters& params)
+raster_datasource::raster_datasource(const parameters& params, bool bind)
     : datasource(params),
-      desc_(*params.get<std::string>("type"),"utf-8")
+      desc_(*params.get<std::string>("type"),"utf-8"),
+      extent_initialized_(false)
 {
- 
 #ifdef MAPNIK_DEBUG
-   std::cout << "\nRaster Plugin: Initializing...\n";
+    std::clog << "Raster Plugin: Initializing..." << std::endl;
 #endif
 
-   boost::optional<std::string> file=params.get<std::string>("file");
-   if (!file) throw datasource_exception("missing <file> parameter ");
+    boost::optional<std::string> file = params.get<std::string>("file");
+    if (! file) throw datasource_exception("Raster Plugin: missing <file> parameter ");
    
-   boost::optional<std::string> base=params.get<std::string>("base");
-   if (base)
-      filename_ = *base + "/" + *file;
-   else
-      filename_ = *file;
+    boost::optional<std::string> base = params.get<std::string>("base");
+    if (base)
+       filename_ = *base + "/" + *file;
+    else
+       filename_ = *file;
 
-   if (!boost::filesystem::exists(filename_)) throw datasource_exception(filename_ + " does not exist");
+    format_=*params_.get<std::string>("format","tiff");
    
-   format_=*params.get<std::string>("format","tiff");
-   boost::optional<double> lox = params.get<double>("lox");
-   boost::optional<double> loy = params.get<double>("loy");
-   boost::optional<double> hix = params.get<double>("hix");
-   boost::optional<double> hiy = params.get<double>("hiy");
+    boost::optional<double> lox = params_.get<double>("lox");
+    boost::optional<double> loy = params_.get<double>("loy");
+    boost::optional<double> hix = params_.get<double>("hix");
+    boost::optional<double> hiy = params_.get<double>("hiy");
+    boost::optional<std::string> ext = params_.get<std::string>("extent");
+
+    if (lox && loy && hix && hiy)
+    {
+        extent_.init(*lox, *loy, *hix, *hiy);
+        extent_initialized_ = true;
+    }
+    else if (ext)
+    {
+        extent_initialized_ = extent_.from_string(*ext);
+    }
+
+    if (! extent_initialized_)
+        throw datasource_exception("Raster Plugin: valid <extent> or <lox> <loy> <hix> <hiy> are required");
+
+    if (bind) 
+    {
+        this->bind();
+    }
+}
+
+void raster_datasource::bind() const
+{
+    if (is_bound_) return;
    
-   if (lox && loy && hix && hiy)
-   {
-      extent_.init(*lox,*loy,*hix,*hiy);
-   }
-   else throw datasource_exception("<lox> <loy> <hix> <hiy> are required");
-
-   try
-   {         
-      std::auto_ptr<ImageReader> reader(mapnik::get_image_reader(filename_, format_));
-      if (reader.get())
-      {
-         width_ = reader->width();
-         height_ = reader->height();
+    if (! boost::filesystem::exists(filename_))
+        throw datasource_exception("Raster Plugin: " + filename_ + " does not exist");
+    
+    try
+    {         
+        std::auto_ptr<image_reader> reader(mapnik::get_image_reader(filename_, format_));
+        if (reader.get())
+        {
+            width_ = reader->width();
+            height_ = reader->height();
+
 #ifdef MAPNIK_DEBUG
-         std::cout << "Raster Plugin: RASTER SIZE(" << width_ << "," << height_ << ")\n";
+            std::clog << "Raster Plugin: RASTER SIZE(" << width_ << "," << height_ << ")" << std::endl;
 #endif
-      }
-   }
-   catch (...)
-   {
-      std::cerr << "Exception caught\n";
-   }
+        }
+    }
+    catch (mapnik::image_reader_exception const& ex)
+    {
+        std::cerr << "Raster Plugin: image reader exception caught: " << ex.what() << std::endl;
+        throw;
+    }
+    catch (...)
+    {
+        std::cerr << "Raster Plugin: exception caught" << std::endl;
+        throw;
+    }
+    
+    is_bound_ = true;
 }
 
-raster_datasource::~raster_datasource() {}
+raster_datasource::~raster_datasource()
+{
+}
 
 int raster_datasource::type() const
 {
     return datasource::Raster;
 }
 
-std::string raster_datasource::name_="raster";
 std::string raster_datasource::name()
 {
-    return name_;
+    return "raster";
 }
 
-mapnik::Envelope<double> raster_datasource::envelope() const
+mapnik::box2d<double> raster_datasource::envelope() const
 {
     return extent_;
 }
@@ -123,36 +152,43 @@ layer_descriptor raster_datasource::get_descriptor() const
 
 featureset_ptr raster_datasource::features(query const& q) const
 {
-   mapnik::CoordTransform t(width_,height_,extent_,0,0);
-   mapnik::Envelope<double> intersect=extent_.intersect(q.get_bbox());
-   mapnik::Envelope<double> ext=t.forward(intersect);
+    if (! is_bound_) bind();
+   
+    mapnik::CoordTransform t(width_, height_, extent_, 0, 0);
+    mapnik::box2d<double> intersect = extent_.intersect(q.get_bbox());
+    mapnik::box2d<double> ext = t.forward(intersect);
    
-   unsigned width = int(ext.width() + 0.5);
-   unsigned height = int(ext.height() + 0.5);
+    const int width  = int(ext.maxx() + 0.5) - int(ext.minx() + 0.5);
+    const int height = int(ext.maxy() + 0.5) - int(ext.miny() + 0.5);
+
 #ifdef MAPNIK_DEBUG
-   std::cout << "Raster Plugin: BOX SIZE(" << width << " " << height << ")\n";
+    std::clog << "Raster Plugin: BOX SIZE(" << width << " " << height << ")" << std::endl;
 #endif
-   if (width * height > 1024*1024)
-   {
+
+    if (width * height > 512*512)
+    {
 #ifdef MAPNIK_DEBUG
-      std::cout << "Raster Plugin: TILED policy\n";
+        std::clog << "Raster Plugin: TILED policy" << std::endl;
 #endif
-      tiled_file_policy policy(filename_,format_, 1024, extent_,q.get_bbox(), width_,height_);
-      return featureset_ptr(new raster_featureset<tiled_file_policy>(policy,extent_,q));
-   }
-   else
-   {
+
+        tiled_file_policy policy(filename_, format_, 256, extent_, q.get_bbox(), width_, height_);
+        return boost::make_shared<raster_featureset<tiled_file_policy> >(policy, extent_, q);
+    }
+    else
+    {
 #ifdef MAPNIK_DEBUG
-      std::cout << "Raster Plugin: SINGLE FILE\n";
+        std::clog << "Raster Plugin: SINGLE FILE" << std::endl;
 #endif
-      raster_info info(filename_,format_,extent_,width_,height_);
-      single_file_policy policy(info);
-      return featureset_ptr(new raster_featureset<single_file_policy>(policy,extent_,q));
-   }
+
+        raster_info info(filename_, format_, extent_, width_, height_);
+        single_file_policy policy(info);
+        return boost::make_shared<raster_featureset<single_file_policy> >(policy, extent_, q);
+    }
 }
 
 featureset_ptr raster_datasource::features_at_point(coord2d const&) const
 {
+    std::clog << "Raster Plugin: ##WARNING: feature_at_point not supported for raster.input" << std::endl;
     return featureset_ptr();
 }
 
diff --git a/plugins/input/raster/raster_datasource.hpp b/plugins/input/raster/raster_datasource.hpp
index 7b83c9f..c8f5f47 100644
--- a/plugins/input/raster/raster_datasource.hpp
+++ b/plugins/input/raster/raster_datasource.hpp
@@ -24,34 +24,35 @@
 #ifndef RASTER_DATASOURCE_HPP
 #define RASTER_DATASOURCE_HPP
 
-#include <mapnik/envelope.hpp>
+// mapnik
+#include <mapnik/box2d.hpp>
 #include <mapnik/feature.hpp>
 #include <mapnik/datasource.hpp>
 
 class raster_datasource : public mapnik::datasource
 {
-private:
-   std::string                  filename_;
-   std::string                  format_;
-   mapnik::Envelope<double>     extent_;
-   mapnik::layer_descriptor     desc_;
-   unsigned                     width_;
-   unsigned                     height_;
-   static std::string           name_;  
-public:
-   raster_datasource(const mapnik::parameters& params);
-   virtual ~raster_datasource();
-   int type() const;
-   static std::string name();
-   mapnik::featureset_ptr features(const mapnik::query& q) const;
-   mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt) const;
-   mapnik::Envelope<double> envelope() const;
-   mapnik::layer_descriptor get_descriptor() const;
-private:
-   //no copying
-   raster_datasource(const raster_datasource&);
-   raster_datasource& operator=(const raster_datasource&);
-   //
+    private:
+       mapnik::layer_descriptor     desc_;
+       std::string                  filename_;
+       std::string                  format_;
+       mapnik::box2d<double>        extent_;
+       bool                         extent_initialized_;
+       mutable unsigned             width_;
+       mutable unsigned             height_;
+    public:
+       raster_datasource(const mapnik::parameters& params, bool bind=true);
+       virtual ~raster_datasource();
+       int type() const;
+       static std::string name();
+       mapnik::featureset_ptr features(const mapnik::query& q) const;
+       mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt) const;
+       mapnik::box2d<double> envelope() const;
+       mapnik::layer_descriptor get_descriptor() const;
+       void bind() const;
+    private:
+       //no copying
+       raster_datasource(const raster_datasource&);
+       raster_datasource& operator=(const raster_datasource&);
 };
 
 #endif //RASTER_DATASOURCE_HPP
diff --git a/plugins/input/raster/raster_featureset.cpp b/plugins/input/raster/raster_featureset.cpp
index 633f678..57a797f 100644
--- a/plugins/input/raster/raster_featureset.cpp
+++ b/plugins/input/raster/raster_featureset.cpp
@@ -19,27 +19,30 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *
  *****************************************************************************/
+
 // mapnik
 #include <mapnik/image_reader.hpp>
 #include <mapnik/image_util.hpp>
+#include <mapnik/feature_factory.hpp>
 
 #include "raster_featureset.hpp"
 
 
 using mapnik::query;
 using mapnik::CoordTransform;
-using mapnik::ImageReader;
+using mapnik::image_reader;
 using mapnik::Feature;
 using mapnik::feature_ptr;
-using mapnik::ImageData32;
+using mapnik::image_data_32;
 using mapnik::raster;
+using mapnik::feature_factory;
 
 template <typename LookupPolicy>
 raster_featureset<LookupPolicy>::raster_featureset(LookupPolicy const& policy,
-                                                   Envelope<double> const& extent,
+                                                   box2d<double> const& extent,
                                                    query const& q)
    : policy_(policy),
-     id_(1),
+     feature_id_(1),
      extent_(extent),
      bbox_(q.get_bbox()),
      curIter_(policy_.begin()),
@@ -54,14 +57,15 @@ feature_ptr raster_featureset<LookupPolicy>::next()
 {
    if (curIter_!=endIter_)
    {
-      feature_ptr feature(new Feature(++id_));
+      feature_ptr feature(feature_factory::create(feature_id_));
+      ++feature_id_;
       try
       {         
-         std::auto_ptr<ImageReader> reader(mapnik::get_image_reader(curIter_->file(),curIter_->format()));
+         std::auto_ptr<image_reader> reader(mapnik::get_image_reader(curIter_->file(),curIter_->format()));
 
 #ifdef MAPNIK_DEBUG         
-         std::cout << "Raster Plugin: READER = " << curIter_->format() << " " << curIter_->file() 
-                   << " size(" << curIter_->width() << "," << curIter_->height() << ")\n";
+         std::clog << "Raster Plugin: READER = " << curIter_->format() << " " << curIter_->file() 
+                   << " size(" << curIter_->width() << "," << curIter_->height() << ")" << std::endl;
 #endif
          if (reader.get())
          {
@@ -71,8 +75,8 @@ feature_ptr raster_featureset<LookupPolicy>::next()
             if (image_width>0 && image_height>0)
             {
                CoordTransform t(image_width,image_height,extent_,0,0);
-               Envelope<double> intersect=bbox_.intersect(curIter_->envelope());
-               Envelope<double> ext=t.forward(intersect);
+               box2d<double> intersect=bbox_.intersect(curIter_->envelope());
+               box2d<double> ext=t.forward(intersect);
                if ( ext.width()>0.5 && ext.height()>0.5 )
                {
                   //select minimum raster containing whole ext
@@ -91,21 +95,24 @@ feature_ptr raster_featureset<LookupPolicy>::next()
                      end_y = image_height;
                   int width = end_x - x_off;
                   int height = end_y - y_off;
-                  //calculate actual envelope of returned raster
-                  Envelope<double> feature_raster_extent(x_off, y_off, x_off+width, y_off+height); 
+                  //calculate actual box2d of returned raster
+                  box2d<double> feature_raster_extent(x_off, y_off, x_off+width, y_off+height); 
                   intersect = t.backward(feature_raster_extent);
 
-                  ImageData32 image(width,height);
+                  image_data_32 image(width,height);
                   reader->read(x_off,y_off,image);
-
-                  feature->set_raster(mapnik::raster_ptr(new raster(intersect,image)));
+                  feature->set_raster(boost::make_shared<raster>(intersect,image));
                }
             }
          }
       }
+      catch (mapnik::image_reader_exception const& ex)
+      {
+          std::cerr << "Raster Plugin: image reader exception caught:" << ex.what() << std::endl;
+      }
       catch (...)
       {
-         std::cerr << "Raster Plugin: Exception caught\n";
+         std::cerr << "Raster Plugin: exception caught" << std::endl;
       }
       
       ++curIter_;
diff --git a/plugins/input/raster/raster_featureset.hpp b/plugins/input/raster/raster_featureset.hpp
index f50bc92..879b2e8 100644
--- a/plugins/input/raster/raster_featureset.hpp
+++ b/plugins/input/raster/raster_featureset.hpp
@@ -82,7 +82,7 @@ public:
         return const_iterator(this);
     }
 
-    const_iterator query(const Envelope<double>& box)
+    const_iterator query(const box2d<double>& box)
     {
         if (box.intersects(info_.envelope()))
         {
@@ -104,7 +104,7 @@ public:
    typedef std::vector<raster_info>::const_iterator const_iterator;
    
    tiled_file_policy(std::string const& file, std::string const& format, unsigned tile_size, 
-                     Envelope<double> extent, Envelope<double> bbox,unsigned width, unsigned height)
+                     box2d<double> extent, box2d<double> bbox,unsigned width, unsigned height)
    {     
       
       double lox = extent.minx();
@@ -117,10 +117,10 @@ public:
       double pixel_y = extent.height()/double(height);
 
 #ifdef MAPNIK_DEBUG 
-      std::cout << "Raster Plugin: PIXEL SIZE("<< pixel_x << "," << pixel_y << ")\n";
+      std::clog << "Raster Plugin: PIXEL SIZE("<< pixel_x << "," << pixel_y << ")" << std::endl;
 #endif
 
-      Envelope<double> e = bbox.intersect(extent);
+      box2d<double> e = bbox.intersect(extent);
       
       for (int x = 0 ; x < max_x ; ++x)
       {
@@ -131,16 +131,16 @@ public:
             double x1 = x0 + tile_size*pixel_x;
             double y1 = y0 + tile_size*pixel_y;
             
-            if (e.intersects(Envelope<double>(x0,y0,x1,y1)))
+            if (e.intersects(box2d<double>(x0,y0,x1,y1)))
             {
-               Envelope<double> tile_box = e.intersect(Envelope<double>(x0,y0,x1,y1));            
+               box2d<double> tile_box = e.intersect(box2d<double>(x0,y0,x1,y1));            
                raster_info info(file,format,tile_box,tile_size,tile_size);
                infos_.push_back(info);
             }
          }
       }
 #ifdef MAPNIK_DEBUG 
-      std::cout << "Raster Plugin: INFO SIZE=" << infos_.size() << " " << file << "\n";
+      std::clog << "Raster Plugin: INFO SIZE=" << infos_.size() << " " << file << std::endl;
 #endif
    }
    
@@ -165,13 +165,13 @@ class raster_featureset : public mapnik::Featureset
 {
    typedef typename LookupPolicy::const_iterator iterator_type;
    LookupPolicy policy_;
-   size_t id_;
-   mapnik::Envelope<double> extent_;
-   mapnik::Envelope<double> bbox_;
+   int feature_id_;
+   mapnik::box2d<double> extent_;
+   mapnik::box2d<double> bbox_;
    iterator_type curIter_;
    iterator_type endIter_;
 public:
-   raster_featureset(LookupPolicy const& policy,Envelope<double> const& exttent, mapnik::query const& q);
+   raster_featureset(LookupPolicy const& policy,box2d<double> const& exttent, mapnik::query const& q);
    virtual ~raster_featureset();
    mapnik::feature_ptr next();
 };
diff --git a/plugins/input/raster/raster_info.cpp b/plugins/input/raster/raster_info.cpp
index 5203753..72ec49a 100644
--- a/plugins/input/raster/raster_info.cpp
+++ b/plugins/input/raster/raster_info.cpp
@@ -24,7 +24,7 @@
 #include "raster_info.hpp"
 
 raster_info::raster_info(std::string const& file, std::string const& format,
-                         mapnik::Envelope<double> const& extent, unsigned width, unsigned height)
+                         mapnik::box2d<double> const& extent, unsigned width, unsigned height)
     :file_(file),
      format_(format),
      extent_(extent),
diff --git a/plugins/input/raster/raster_info.hpp b/plugins/input/raster/raster_info.hpp
index 61cfcfb..63ff43e 100644
--- a/plugins/input/raster/raster_info.hpp
+++ b/plugins/input/raster/raster_info.hpp
@@ -27,20 +27,20 @@
 #include "raster_datasource.hpp"
 #include <string>
 
-using mapnik::Envelope;
+using mapnik::box2d;
 
 class raster_info
 {
    std::string file_;
    std::string format_;
-   Envelope<double> extent_;
+   box2d<double> extent_;
    unsigned width_;
    unsigned height_;
 public:
-   raster_info(const std::string& file,const std::string& format, const Envelope<double>& extent, unsigned width, unsigned height);
+   raster_info(const std::string& file,const std::string& format, const box2d<double>& extent, unsigned width, unsigned height);
    raster_info(const raster_info& rhs);
    raster_info& operator=(const raster_info& rhs);
-   inline Envelope<double> const& envelope() const {return extent_;}
+   inline box2d<double> const& envelope() const {return extent_;}
    inline std::string const& file() const { return file_;}
    inline std::string const& format() const {return format_;}
    inline unsigned width() const { return width_;}
diff --git a/plugins/input/rasterlite/build.py b/plugins/input/rasterlite/build.py
new file mode 100644
index 0000000..1046fa9
--- /dev/null
+++ b/plugins/input/rasterlite/build.py
@@ -0,0 +1,50 @@
+#
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+Import ('env')
+
+prefix = env['PREFIX']
+
+plugin_env = env.Clone()
+
+rasterlite_src = Split(
+  """
+  rasterlite_datasource.cpp
+  rasterlite_featureset.cpp      
+  """
+        )
+
+libraries = [env['PLUGINS']['rasterlite']['lib']]
+
+# Link Library to Dependencies
+libraries.append('mapnik2')
+libraries.append(env['ICU_LIB_NAME'])
+libraries.append('boost_system%s' % env['BOOST_APPEND'])
+libraries.append('boost_filesystem%s' % env['BOOST_APPEND'])
+
+input_plugin = plugin_env.SharedLibrary('../rasterlite', source=rasterlite_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS'])
+
+# if the plugin links to libmapnik2 ensure it is built first
+Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME']))
+
+if 'uninstall' not in COMMAND_LINE_TARGETS:
+    env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin)
+    env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST'])
diff --git a/plugins/input/rasterlite/rasterlite_datasource.cpp b/plugins/input/rasterlite/rasterlite_datasource.cpp
new file mode 100644
index 0000000..8fadb4e
--- /dev/null
+++ b/plugins/input/rasterlite/rasterlite_datasource.cpp
@@ -0,0 +1,205 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2007 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+// $Id$
+
+#include "rasterlite_datasource.hpp"
+#include "rasterlite_featureset.hpp"
+
+// boost
+#include <boost/filesystem/operations.hpp>
+#include <boost/make_shared.hpp>
+
+// mapnik
+#include <mapnik/ptree_helpers.hpp>
+#include <mapnik/geom_util.hpp>
+
+using mapnik::datasource;
+using mapnik::parameters;
+
+DATASOURCE_PLUGIN(rasterlite_datasource)
+
+using mapnik::box2d;
+using mapnik::coord2d;
+using mapnik::query;
+using mapnik::featureset_ptr;
+using mapnik::layer_descriptor;
+using mapnik::datasource_exception;
+
+
+
+/*
+ * Opens a GDALDataset and returns a pointer to it.
+ * Caller is responsible for calling GDALClose on it
+ */
+inline void *rasterlite_datasource::open_dataset() const
+{
+    void *dataset = rasterliteOpen (dataset_name_.c_str(), table_name_.c_str());
+   
+    if (! dataset) throw datasource_exception("Rasterlite Plugin: Error opening dataset");
+
+    if (rasterliteIsError (dataset))
+    {
+        std::string error (rasterliteGetLastError(dataset));
+
+        rasterliteClose (dataset);
+   
+        throw datasource_exception(error);
+    }
+
+    return dataset;
+}
+
+
+
+rasterlite_datasource::rasterlite_datasource(parameters const& params, bool bind)
+    : datasource(params),
+      desc_(*params.get<std::string>("type"),"utf-8")
+{
+#ifdef MAPNIK_DEBUG
+    std::clog << "Rasterlite Plugin: Initializing..." << std::endl;
+#endif
+
+    boost::optional<std::string> file = params.get<std::string>("file");
+    if (!file) throw datasource_exception("missing <file> parameter");
+
+    boost::optional<std::string> table = params.get<std::string>("table");
+    if (!table) throw datasource_exception("missing <table> parameter");
+
+    table_name_ = *table;
+
+    boost::optional<std::string> base = params.get<std::string>("base");
+    if (base)
+        dataset_name_ = *base + "/" + *file;
+    else
+        dataset_name_ = *file;
+
+    if (bind)
+    {
+        this->bind();
+    }
+}
+
+void rasterlite_datasource::bind() const
+{
+    if (is_bound_) return;   
+    
+    if (!boost::filesystem::exists(dataset_name_)) throw datasource_exception(dataset_name_ + " does not exist");
+
+    void *dataset = open_dataset();
+   
+    double x0, y0, x1, y1;
+    if (rasterliteGetExtent (dataset, &x0, &y0, &x1, &y1) != RASTERLITE_OK)
+    {
+        std::string error (rasterliteGetLastError(dataset));
+
+        rasterliteClose (dataset);
+   
+        throw datasource_exception(error);
+    }
+
+    extent_.init(x0,y0,x1,y1);
+   
+#ifdef MAPNIK_DEBUG
+    int srid, auth_srid;
+    const char *auth_name;
+    const char *ref_sys_name;
+    const char *proj4text;
+
+    int tile_count;
+    double pixel_x_size, pixel_y_size;
+    int levels = rasterliteGetLevels (dataset);
+
+    if (rasterliteGetSrid(dataset, &srid, &auth_name, &auth_srid, &ref_sys_name, &proj4text) != RASTERLITE_OK)
+    { 
+        std::string error (rasterliteGetLastError(dataset));
+
+        rasterliteClose (dataset);
+   
+        throw datasource_exception(error);
+    }
+
+    std::clog << "Rasterlite Plugin: Data Source=" << rasterliteGetTablePrefix(dataset) << std::endl;
+    std::clog << "Rasterlite Plugin: SRID=" << srid << std::endl;
+    std::clog << "Rasterlite Plugin: Authority=" << auth_name << std::endl;
+    std::clog << "Rasterlite Plugin: AuthSRID=" << auth_srid << std::endl;
+    std::clog << "Rasterlite Plugin: RefSys Name=" << ref_sys_name << std::endl;
+    std::clog << "Rasterlite Plugin: Proj4Text=" << proj4text << std::endl;
+    std::clog << "Rasterlite Plugin: Extent(" << x0 << "," << y0 << " " << x1 << "," << y1 << ")" << std::endl;
+    std::clog << "Rasterlite Plugin: Levels=" << levels << std::endl;
+   
+    for (int i = 0; i < levels; i++)
+    {
+        if (rasterliteGetResolution(dataset, i, &pixel_x_size, &pixel_y_size, &tile_count) == RASTERLITE_OK)
+        {
+            std::clog << "Rasterlite Plugin: Level=" << i
+                << " x=" << pixel_x_size << " y=" << pixel_y_size << " tiles=" << tile_count << std::endl;
+        }
+    }
+#endif
+
+    rasterliteClose(dataset);
+   
+    is_bound_ = true;
+}
+
+rasterlite_datasource::~rasterlite_datasource()
+{
+}
+
+std::string rasterlite_datasource::name()
+{
+    return "rasterlite";
+}
+
+int rasterlite_datasource::type() const
+{
+    return datasource::Raster;
+}
+
+box2d<double> rasterlite_datasource::envelope() const
+{
+    if (!is_bound_) bind();
+   
+    return extent_;
+}
+
+layer_descriptor rasterlite_datasource::get_descriptor() const
+{
+    return desc_;
+}
+
+featureset_ptr rasterlite_datasource::features(query const& q) const
+{
+    if (!is_bound_) bind();
+
+    rasterlite_query gq = q;
+    return boost::make_shared<rasterlite_featureset>(open_dataset(), gq);
+}
+
+featureset_ptr rasterlite_datasource::features_at_point(coord2d const& pt) const
+{
+    if (!is_bound_) bind();
+   
+    rasterlite_query gq = pt;
+    return boost::make_shared<rasterlite_featureset>(open_dataset(), gq);
+}
+
diff --git a/plugins/input/rasterlite/rasterlite_datasource.hpp b/plugins/input/rasterlite/rasterlite_datasource.hpp
new file mode 100644
index 0000000..b3acd01
--- /dev/null
+++ b/plugins/input/rasterlite/rasterlite_datasource.hpp
@@ -0,0 +1,54 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2007 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#ifndef RASTERLITE_DATASOURCE_HPP
+#define RASTERLITE_DATASOURCE_HPP
+
+#include <mapnik/datasource.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include "rasterlite_include.hpp"
+
+class rasterlite_datasource : public mapnik::datasource 
+{
+    public:
+        rasterlite_datasource(mapnik::parameters const& params, bool bind=true);
+        virtual ~rasterlite_datasource ();
+        int type() const;
+        static std::string name();
+        mapnik::featureset_ptr features(mapnik::query const& q) const;
+        mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt) const;
+        mapnik::box2d<double> envelope() const;
+        mapnik::layer_descriptor get_descriptor() const;
+        void bind() const;
+    private:
+        inline void *open_dataset() const;
+        mutable mapnik::box2d<double> extent_;
+        std::string dataset_name_;
+        std::string table_name_;
+        mapnik::layer_descriptor desc_;
+        unsigned width_;
+        unsigned height_;
+};
+
+#endif // RASTERLITE_DATASOURCE_HPP
diff --git a/plugins/input/rasterlite/rasterlite_featureset.cpp b/plugins/input/rasterlite/rasterlite_featureset.cpp
new file mode 100644
index 0000000..69b11c9
--- /dev/null
+++ b/plugins/input/rasterlite/rasterlite_featureset.cpp
@@ -0,0 +1,158 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2007 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#include "rasterlite_featureset.hpp"
+
+// mapnik
+#include <mapnik/image_util.hpp>
+#include <mapnik/feature_factory.hpp>
+
+// boost
+#include <boost/make_shared.hpp>
+
+
+using mapnik::query;
+using mapnik::coord2d;
+using mapnik::box2d;
+using mapnik::Feature;
+using mapnik::feature_ptr;
+using mapnik::CoordTransform;
+using mapnik::geometry_type;
+using mapnik::query;
+using mapnik::feature_factory;
+
+
+rasterlite_featureset::rasterlite_featureset(void* dataset, rasterlite_query q)
+   : dataset_(dataset),
+     gquery_(q),
+     first_(true)
+{
+    rasterliteSetBackgroundColor(dataset_, 255, 0, 255);
+    rasterliteSetTransparentColor(dataset_, 255, 0, 255);
+}
+
+rasterlite_featureset::~rasterlite_featureset()
+{
+#ifdef MAPNIK_DEBUG
+    std::clog << "Rasterlite Plugin: closing dataset" << std::endl;
+#endif
+
+    rasterliteClose(dataset_);
+}
+
+feature_ptr rasterlite_featureset::next()
+{
+    if (first_)
+    {
+        first_ = false;
+
+        query *q = boost::get<query>(&gquery_);
+        if(q) {
+            return get_feature(*q);
+        } else {
+            coord2d *p = boost::get<coord2d>(&gquery_);
+            if(p) {
+                return get_feature_at_point(*p);
+            }
+        }
+        // should never reach here
+    }
+    return feature_ptr();
+}
+
+feature_ptr rasterlite_featureset::get_feature(mapnik::query const& q)
+{
+#ifdef MAPNIK_DEBUG
+    std::clog << "Rasterlite Plugin: get_feature" << std::endl;
+#endif
+
+    feature_ptr feature(feature_factory::create(1));
+
+    double x0, y0, x1, y1;
+    rasterliteGetExtent (dataset_, &x0, &y0, &x1, &y1);
+
+    box2d<double> raster_extent(x0,y0,x1,y1); 
+    box2d<double> intersect = raster_extent.intersect(q.get_bbox());
+
+    const int width = static_cast<int>(boost::get<0>(q.resolution()) * intersect.width() + 0.5);
+    const int height = static_cast<int>(boost::get<0>(q.resolution()) * intersect.height() + 0.5);
+
+    const double pixel_size = (intersect.width() >= intersect.height()) ?
+        (intersect.width() / (double) width) : (intersect.height() / (double) height);
+
+#ifdef MAPNIK_DEBUG         
+    std::clog << "Rasterlite Plugin: Raster extent=" << raster_extent << std::endl;
+    std::clog << "Rasterlite Plugin: View extent=" << q.get_bbox() << std::endl;
+    std::clog << "Rasterlite Plugin: Intersect extent=" << intersect << std::endl;
+    std::clog << "Rasterlite Plugin: Query resolution=" << boost::get<0>(q.resolution()) 
+        << "," << boost::get<1>(q.resolution())  << std::endl;
+    std::clog << "Rasterlite Plugin: Size=" << width << " " << height << std::endl;
+    std::clog << "Rasterlite Plugin: Pixel Size=" << pixel_size << std::endl;
+#endif
+
+    if (width > 0 && height > 0)
+    {
+        int size = 0;
+        void *raster = 0;
+
+        if (rasterliteGetRawImageByRect(dataset_,
+            intersect.minx(), intersect.miny(), intersect.maxx(), intersect.maxy(),
+            pixel_size, width, height, GAIA_RGBA_ARRAY, &raster, &size) == RASTERLITE_OK)
+        {
+            if (size > 0)
+            {
+                mapnik::image_data_32 image(width, height);
+                image.set(0xffffffff);
+
+                unsigned char* raster_data = static_cast<unsigned char*>(raster);
+                unsigned char* image_data = image.getBytes();
+
+                memcpy (image_data, raster_data, size);
+
+                feature->set_raster(boost::make_shared<mapnik::raster>(intersect,image));
+
+                free (raster);
+
+#ifdef MAPNIK_DEBUG         
+                std::clog << "Rasterlite Plugin: done" << std::endl;
+#endif
+            }
+            else
+            {
+#ifdef MAPNIK_DEBUG         
+                std::clog << "Rasterlite Plugin: error=" << rasterliteGetLastError (dataset_) << std::endl;
+#endif
+            }
+        }
+      
+        return feature;
+    }
+    return feature_ptr();
+}
+
+
+feature_ptr rasterlite_featureset::get_feature_at_point(mapnik::coord2d const& pt)
+{
+    return feature_ptr();
+}
+
diff --git a/plugins/input/rasterlite/rasterlite_featureset.hpp b/plugins/input/rasterlite/rasterlite_featureset.hpp
new file mode 100644
index 0000000..0db77cc
--- /dev/null
+++ b/plugins/input/rasterlite/rasterlite_featureset.hpp
@@ -0,0 +1,48 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2007 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#ifndef RASTERLITE_FEATURESET_HPP
+#define RASTERLITE_FEATURESET_HPP
+
+#include <mapnik/datasource.hpp>
+#include <boost/variant.hpp>
+
+#include "rasterlite_include.hpp"
+
+typedef boost::variant<mapnik::query,mapnik::coord2d> rasterlite_query;
+
+class rasterlite_featureset : public mapnik::Featureset
+{
+    public:
+        rasterlite_featureset(void* dataset, rasterlite_query q);
+        virtual ~rasterlite_featureset();
+        mapnik::feature_ptr next();
+    private:
+        mapnik::feature_ptr get_feature(mapnik::query const& q);
+        mapnik::feature_ptr get_feature_at_point(mapnik::coord2d const& p);
+        void* dataset_;
+        rasterlite_query gquery_;
+        bool first_;
+};
+
+#endif // RASTERLITE_FEATURESET_HPP
diff --git a/plugins/input/rasterlite/rasterlite_include.hpp b/plugins/input/rasterlite/rasterlite_include.hpp
new file mode 100644
index 0000000..c1c9537
--- /dev/null
+++ b/plugins/input/rasterlite/rasterlite_include.hpp
@@ -0,0 +1,32 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2007 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#ifndef RASTERLITE_INCLUDE_HPP
+#define RASTERLITE_INCLUDE_HPP
+
+extern "C" {
+    #include <sqlite3.h>
+    #include <rasterlite.h>
+}
+
+#endif // RASTERLITE_FEATURESET_HPP
diff --git a/plugins/input/shape/SConscript b/plugins/input/shape/SConscript
deleted file mode 100644
index 526e580..0000000
--- a/plugins/input/shape/SConscript
+++ /dev/null
@@ -1,54 +0,0 @@
-	
-# This file is part of Mapnik (c++ mapping toolkit)
-#
-# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-# $Id$
-
-
-Import ('env')
-
-prefix = env['PREFIX']
-install_prefix = env['DESTDIR'] + '/' + prefix
-
-shape_src = Split(
-	"""
-        dbffile.cpp
-        shape.cpp
-        shape_featureset.cpp
-        shapefile.cpp
-        shape_index_featureset.cpp
-        shape_io.cpp
-	"""
-        )
-
-libraries = ['boost_iostreams%s' % env['BOOST_APPEND']]    
-
-if env['PLATFORM'] == 'Darwin':
-    libraries.append('mapnik')
-    libraries.append(env['ICU_LIB_NAME'])
-    libraries.append('boost_system%s' % env['BOOST_APPEND'])
-    libraries.append('boost_filesystem%s' % env['BOOST_APPEND'])
-
-cxx_flags = env['CXXFLAGS']
-if env['SHAPE_MEMORY_MAPPED_FILE']:
-    cxx_flags.append('-DSHAPE_MEMORY_MAPPED_FILE')
-
-shape_inputdriver = env.SharedLibrary('shape', SHLIBSUFFIX='.input', source=shape_src, SHLIBPREFIX='', LIBS = libraries, CXXFLAGS=cxx_flags)
-
-env.Install(install_prefix + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME'] + '/input', shape_inputdriver)
-env.Alias('install', install_prefix + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME'] + '/input')
diff --git a/plugins/input/shape/build.py b/plugins/input/shape/build.py
new file mode 100644
index 0000000..3970cef
--- /dev/null
+++ b/plugins/input/shape/build.py
@@ -0,0 +1,57 @@
+  
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+
+Import ('env')
+
+prefix = env['PREFIX']
+
+plugin_env = env.Clone()
+
+shape_src = Split(
+  """
+        dbfile.cpp
+        shape_datasource.cpp
+        shape_featureset.cpp
+        shape_index_featureset.cpp
+        shape_io.cpp
+  """
+        )
+
+libraries = []
+
+# Link Library to Dependencies
+libraries.append('mapnik2')
+libraries.append(env['ICU_LIB_NAME'])
+libraries.append('boost_system%s' % env['BOOST_APPEND'])
+libraries.append('boost_filesystem%s' % env['BOOST_APPEND'])
+
+if env['SHAPE_MEMORY_MAPPED_FILE']:
+    plugin_env.Append(CXXFLAGS = '-DSHAPE_MEMORY_MAPPED_FILE')
+
+input_plugin = plugin_env.SharedLibrary('../shape', SHLIBSUFFIX='.input', source=shape_src, SHLIBPREFIX='', LIBS = libraries, LINKFLAGS=env['CUSTOM_LDFLAGS'])
+
+# if the plugin links to libmapnik2 ensure it is built first
+Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME']))
+
+if 'uninstall' not in COMMAND_LINE_TARGETS:
+    env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin)
+    env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST'])
diff --git a/plugins/input/shape/dbf_test.cpp b/plugins/input/shape/dbf_test.cpp
index cd139f3..c59a4d0 100644
--- a/plugins/input/shape/dbf_test.cpp
+++ b/plugins/input/shape/dbf_test.cpp
@@ -22,7 +22,8 @@
 
 #include <iostream>
 #include <iomanip>
-#include "dbffile.hpp"
+
+#include "dbfile.hpp"
 
 using namespace std;
 
@@ -46,7 +47,7 @@ int main(int argc,char** argv)
             {
                 int width=dbf.descriptor(j).length_;
                 string name=dbf.descriptor(j).name_;
-		char type=dbf.descriptor(j).type_;
+                char type=dbf.descriptor(j).type_;
                 cout<<setw(width)<<name<<"("<<type<<")""|";
             }
             cout<<endl;
diff --git a/plugins/input/shape/dbffile.cpp b/plugins/input/shape/dbffile.cpp
deleted file mode 100644
index cb6f407..0000000
--- a/plugins/input/shape/dbffile.cpp
+++ /dev/null
@@ -1,225 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-// mapnik
-#include <mapnik/global.hpp>
-#include <mapnik/utils.hpp>
-#include <mapnik/unicode.hpp>
-#include "dbffile.hpp"
-// boost
-#include <boost/algorithm/string.hpp>
-#include <boost/lexical_cast.hpp>
-
-// stl
-#include <string>
-
-
-dbf_file::dbf_file()
-   : num_records_(0),
-     num_fields_(0),
-     record_length_(0),
-     record_(0) {}
-
-dbf_file::dbf_file(std::string const& file_name)
-   :num_records_(0),
-    num_fields_(0),
-    record_length_(0),
-#ifdef SHAPE_MEMORY_MAPPED_FILE
-    file_(file_name),
-#else
-    file_(file_name,std::ios::in | std::ios::binary),
-#endif
-    record_(0)
-{
-   if (file_.is_open())
-   {
-      read_header();
-   }
-}
-
-
-dbf_file::~dbf_file()
-{
-   ::operator delete(record_);
-}
-
-
-bool dbf_file::is_open()
-{
-   return file_.is_open();
-}
-
-
-void dbf_file::close()
-{
-   if (file_ && file_.is_open())
-      file_.close();
-}
-
-
-int dbf_file::num_records() const
-{
-   return num_records_;
-}
-
-
-int dbf_file::num_fields() const
-{
-   return num_fields_;
-}
-
-
-void dbf_file::move_to(int index)
-{
-   if (index>0 && index<=num_records_)
-   {
-      long pos=(num_fields_<<5)+34+(index-1)*(record_length_+1);
-      file_.seekg(pos,std::ios::beg);
-      file_.read(record_,record_length_);
-   }
-}
-
-
-std::string dbf_file::string_value(int col) const
-{
-   if (col>=0 && col<num_fields_)
-   {
-      return std::string(record_+fields_[col].offset_,fields_[col].length_);
-   }
-   return "";
-}
-
-
-const field_descriptor& dbf_file::descriptor(int col) const
-{
-   assert(col>=0 && col<num_fields_);
-   return fields_[col];
-}
-
-
-void dbf_file::add_attribute(int col, mapnik::transcoder const& tr, Feature const& f) const throw()
-{
-   if (col>=0 && col<num_fields_)
-   {
-      std::string name=fields_[col].name_;
-      std::string str(record_+fields_[col].offset_,fields_[col].length_);
-      boost::trim(str);
-      
-      switch (fields_[col].type_)
-      {
-         case 'C':
-         case 'D'://todo handle date?
-         case 'M':
-         case 'L':
-         {
-            f[name] = tr.transcode(str.c_str()); 
-            break;
-         }
-         case 'N':
-         case 'F':
-         {
-            if (str[0]=='*')
-            {
-               boost::put(f,name,0);
-               break;
-            }
-            if ( fields_[col].dec_>0 )
-            {   
-               double d = 0.0; 
-               std::istringstream(str) >> d; 
-               boost::put(f,name,d); 
-            }
-            else
-            {
-                int i = 0; 
-                std::istringstream(str) >> i; 
-                boost::put(f,name,i); 
-            }
-            break;
-         }
-      }
-   }
-}
-
-void dbf_file::read_header()
-{
-   char c=file_.get();
-   if (c=='\3' || c=='\131')
-   {
-      skip(3);
-      num_records_=read_int();
-      assert(num_records_>=0);
-      num_fields_=read_short();
-      assert(num_fields_>0);
-      num_fields_=(num_fields_-33)/32;
-      skip(22);
-      int offset=0;
-      char name[11];
-      memset(&name,0,11);
-      fields_.reserve(num_fields_);
-      for (int i=0;i<num_fields_;++i)
-      {
-         field_descriptor desc;
-         desc.index_=i;
-         file_.read(name,10);
-         desc.name_=boost::trim_left_copy(std::string(name));
-         skip(1);
-         desc.type_=file_.get();
-         skip(4);
-         desc.length_=file_.get();
-         desc.dec_=file_.get();
-         skip(14);
-         desc.offset_=offset;
-         offset+=desc.length_;
-         fields_.push_back(desc);
-      }
-      record_length_=offset;
-      if (record_length_>0)
-      {
-         record_=static_cast<char*>(::operator new (sizeof(char)*record_length_));
-      }
-   }
-}
-
-
-int dbf_file::read_short()
-{
-   char b[2];
-   file_.read(b,2);
-   boost::int16_t val;
-   mapnik::read_int16_ndr(b,val);
-   return val;
-}
-
-
-int dbf_file::read_int()
-{    
-   char b[4];
-   file_.read(b,4);
-   boost::int32_t val;
-   mapnik::read_int32_ndr(b,val);
-   return val;
-}
-
-void dbf_file::skip(int bytes)
-{
-   file_.seekg(bytes,std::ios::cur);
-}
diff --git a/plugins/input/shape/dbffile.hpp b/plugins/input/shape/dbffile.hpp
deleted file mode 100644
index cca766a..0000000
--- a/plugins/input/shape/dbffile.hpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-
-#ifndef DBFFILE_HPP
-#define DBFFILE_HPP
-
-#include <mapnik/feature.hpp>
-// boost
-#include <boost/iostreams/stream.hpp>
-#include <boost/iostreams/device/file.hpp>
-#include <boost/iostreams/device/mapped_file.hpp>
-// stl
-#include <vector>
-#include <string>
-#include <cassert>
-
-
-using mapnik::transcoder;
-using mapnik::Feature;
-
-struct field_descriptor
-{
-    int index_;
-    std::string name_;
-    char type_;
-    int length_;
-    int dec_;
-    int offset_;
-};
-
-using namespace boost::iostreams;
-
-class dbf_file
-{
-private:
-    int num_records_;
-    int num_fields_;
-    int record_length_;
-    std::vector<field_descriptor> fields_;
-#ifdef SHAPE_MEMORY_MAPPED_FILE
-    stream<mapped_file_source> file_;
-#else
-    stream<file_source> file_;
-#endif
-      char* record_;
-public:
-      dbf_file();
-      dbf_file(const std::string& file_name);
-      ~dbf_file();
-      bool is_open();
-      void close();
-      int num_records() const;
-      int num_fields() const;
-      field_descriptor const& descriptor(int col) const;
-      void move_to(int index);
-      std::string string_value(int col) const;
-      void add_attribute(int col, transcoder const& tr, Feature const& f) const throw();
-   private:
-      dbf_file(const dbf_file&);
-      dbf_file& operator=(const dbf_file&);
-      void read_header();
-      int read_short();
-      int read_int();
-      void skip(int bytes);
-};
-
-#endif //DBFFILE_HPP
diff --git a/plugins/input/shape/dbfile.cpp b/plugins/input/shape/dbfile.cpp
new file mode 100644
index 0000000..63b3906
--- /dev/null
+++ b/plugins/input/shape/dbfile.cpp
@@ -0,0 +1,239 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+// mapnik
+#include <mapnik/global.hpp>
+#include <mapnik/utils.hpp>
+#include <mapnik/unicode.hpp>
+
+#include "dbfile.hpp"
+
+// boost
+#include <boost/algorithm/string.hpp>
+#include <boost/spirit/include/qi.hpp>
+#include <mapnik/mapped_memory_cache.hpp>
+// stl
+#include <string>
+
+
+dbf_file::dbf_file()
+    : num_records_(0),
+      num_fields_(0),
+      record_length_(0),
+      record_(0) {}
+
+dbf_file::dbf_file(std::string const& file_name)
+    :num_records_(0),
+     num_fields_(0),
+     record_length_(0),
+#ifdef SHAPE_MEMORY_MAPPED_FILE
+     file_(),
+#else
+     file_(file_name.c_str() ,std::ios::in | std::ios::binary),
+#endif
+     record_(0)
+{
+
+#ifdef SHAPE_MEMORY_MAPPED_FILE
+    boost::optional<mapnik::mapped_region_ptr> memory = mapnik::mapped_memory_cache::find(file_name.c_str(),true);
+    if (memory)
+    {
+        file_.buffer(static_cast<char*>((*memory)->get_address()),(*memory)->get_size());
+    }
+#endif 
+    if (file_)
+    {
+        read_header();
+    }
+}
+
+
+dbf_file::~dbf_file()
+{
+    ::operator delete(record_);
+}
+
+
+bool dbf_file::is_open()
+{
+#ifdef SHAPE_MEMORY_MAPPED_FILE
+        return (file_.buffer().second > 0);
+#else
+        return file_.is_open();
+#endif
+}
+
+int dbf_file::num_records() const
+{
+    return num_records_;
+}
+
+
+int dbf_file::num_fields() const
+{
+    return num_fields_;
+}
+
+
+void dbf_file::move_to(int index)
+{
+    if (index>0 && index<=num_records_)
+    {
+        std::streampos pos=(num_fields_<<5)+34+(index-1)*(record_length_+1);
+        file_.seekg(pos,std::ios::beg);
+        file_.read(record_,record_length_);
+    }
+}
+
+
+std::string dbf_file::string_value(int col) const
+{
+    if (col>=0 && col<num_fields_)
+    {
+        return std::string(record_+fields_[col].offset_,fields_[col].length_);
+    }
+    return "";
+}
+
+
+const field_descriptor& dbf_file::descriptor(int col) const
+{
+    assert(col>=0 && col<num_fields_);
+    return fields_[col];
+}
+
+
+void dbf_file::add_attribute(int col, mapnik::transcoder const& tr, Feature const& f) const throw()
+{
+    using namespace boost::spirit;
+
+    if (col>=0 && col<num_fields_)
+    {
+        std::string name=fields_[col].name_;
+        
+        switch (fields_[col].type_)
+        {
+        case 'C':
+        case 'D'://todo handle date?
+        case 'M':
+        case 'L':
+        {
+            // FIXME - avoid constructing std::string on stack
+            std::string str(record_+fields_[col].offset_,fields_[col].length_);
+            boost::trim(str);
+            f[name] = tr.transcode(str.c_str()); 
+            break;
+        }
+        case 'N':
+        case 'F':
+        {
+            
+            if (record_[fields_[col].offset_] == '*')
+            {
+                boost::put(f,name,0);
+                break;
+            }
+            if ( fields_[col].dec_>0 )
+            {   
+                double val = 0.0;
+                const char *itr = record_+fields_[col].offset_;
+                const char *end = itr + fields_[col].length_;
+                qi::phrase_parse(itr,end,double_,ascii::space,val);
+                boost::put(f,name,val); 
+            }
+            else
+            {
+                int val = 0; 
+                const char *itr = record_+fields_[col].offset_;
+                const char *end = itr + fields_[col].length_;
+                qi::phrase_parse(itr,end,int_,ascii::space,val);
+                boost::put(f,name,val); 
+            }
+            break;
+        }
+        }
+    }
+}
+
+void dbf_file::read_header()
+{
+    char c=file_.get();
+    if (c=='\3' || c=='\131')
+    {
+        skip(3);
+        num_records_=read_int();
+        assert(num_records_>=0);
+        num_fields_=read_short();
+        assert(num_fields_>0);
+        num_fields_=(num_fields_-33)/32;
+        skip(22);
+        std::streampos offset=0;
+        char name[11];
+        memset(&name,0,11);
+        fields_.reserve(num_fields_);
+        for (int i=0;i<num_fields_;++i)
+        {
+            field_descriptor desc;
+            desc.index_=i;
+            file_.read(name,10);
+            desc.name_=boost::trim_left_copy(std::string(name));
+            skip(1);
+            desc.type_=file_.get();
+            skip(4);
+            desc.length_=file_.get();
+            desc.dec_=file_.get();
+            skip(14);
+            desc.offset_=offset;
+            offset+=desc.length_;
+            fields_.push_back(desc);
+        }
+        record_length_=offset;
+        if (record_length_>0)
+        {
+            record_=static_cast<char*>(::operator new (sizeof(char)*record_length_));
+        }
+    }
+}
+
+
+int dbf_file::read_short()
+{
+    char b[2];
+    file_.read(b,2);
+    boost::int16_t val;
+    mapnik::read_int16_ndr(b,val);
+    return val;
+}
+
+
+int dbf_file::read_int()
+{    
+    char b[4];
+    file_.read(b,4);
+    boost::int32_t val;
+    mapnik::read_int32_ndr(b,val);
+    return val;
+}
+
+void dbf_file::skip(int bytes)
+{
+    file_.seekg(bytes,std::ios::cur);
+}
diff --git a/plugins/input/shape/dbfile.hpp b/plugins/input/shape/dbfile.hpp
new file mode 100644
index 0000000..f2e4e3d
--- /dev/null
+++ b/plugins/input/shape/dbfile.hpp
@@ -0,0 +1,82 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#ifndef DBFFILE_HPP
+#define DBFFILE_HPP
+
+#include <mapnik/feature.hpp>
+// boost
+#include <boost/utility.hpp>
+#include <boost/interprocess/streams/bufferstream.hpp>
+
+// stl
+#include <vector>
+#include <string>
+#include <cassert>
+#include <fstream>
+
+using mapnik::transcoder;
+using mapnik::Feature;
+
+struct field_descriptor
+{
+    int index_;
+    std::string name_;
+    char type_;
+    int length_;
+    int dec_;
+    std::streampos offset_;
+};
+
+
+class dbf_file : private boost::noncopyable
+{
+private:
+    int num_records_;
+    int num_fields_;
+    std::size_t record_length_;
+    std::vector<field_descriptor> fields_;
+#ifdef SHAPE_MEMORY_MAPPED_FILE
+    boost::interprocess::ibufferstream file_;
+#else
+    std::ifstream file_;
+#endif
+    char* record_;
+public:
+    dbf_file();
+    dbf_file(const std::string& file_name);
+    ~dbf_file();
+    bool is_open();
+    int num_records() const;
+    int num_fields() const;
+    field_descriptor const& descriptor(int col) const;
+    void move_to(int index);
+    std::string string_value(int col) const;
+    void add_attribute(int col, transcoder const& tr, Feature const& f) const throw();
+private:
+    void read_header();
+    int read_short();
+    int read_int();
+    void skip(int bytes);
+};
+
+#endif //DBFFILE_HPP
diff --git a/plugins/input/shape/shape.cpp b/plugins/input/shape/shape.cpp
deleted file mode 100644
index ba39e3a..0000000
--- a/plugins/input/shape/shape.cpp
+++ /dev/null
@@ -1,256 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-
-#include <iostream>
-#include <fstream>
-#include <stdexcept>
-#include <mapnik/geom_util.hpp>
-
-// boost
-#include <boost/version.hpp>
-#include <boost/format.hpp>
-#include <boost/algorithm/string.hpp>
-#include <boost/filesystem/operations.hpp>
-
-
-#include "shape_featureset.hpp"
-#include "shape_index_featureset.hpp"
-#include "shape.hpp"
-
-DATASOURCE_PLUGIN(shape_datasource)
-
-using mapnik::String;
-using mapnik::Double;
-using mapnik::Integer;
-using mapnik::datasource_exception;
-using mapnik::filter_in_box;
-using mapnik::filter_at_point;
-using mapnik::attribute_descriptor;
-
-shape_datasource::shape_datasource(const parameters &params)
-   : datasource (params),
-     type_(datasource::Vector),
-     file_length_(0),
-     indexed_(false),
-     desc_(*params.get<std::string>("type"), *params.get<std::string>("encoding","utf-8"))
-{
-   boost::optional<std::string> file = params.get<std::string>("file");
-   if (!file) throw datasource_exception("missing <file> parameter");
-      
-   boost::optional<std::string> base = params.get<std::string>("base");
-   if (base)
-      shape_name_ = *base + "/" + *file;
-   else
-      shape_name_ = *file;
-
-   boost::algorithm::ireplace_last(shape_name_,".shp","");
-   
-   if (!boost::filesystem::exists(shape_name_ + ".shp"))
-   {
-       throw datasource_exception(shape_name_ + " does not exist");
-   }
-
-   try
-   {  
-      shape_io shape(shape_name_);
-      init(shape);
-      for (int i=0;i<shape.dbf().num_fields();++i)
-      {
-         field_descriptor const& fd=shape.dbf().descriptor(i);
-         std::string fld_name=fd.name_;
-         switch (fd.type_)
-         {
-            case 'C':
-            case 'D':
-            case 'M':
-            case 'L':		
-               desc_.add_descriptor(attribute_descriptor(fld_name, String));
-               break;
-            case 'N':
-            case 'F':
-            {
-               if (fd.dec_>0)
-               {   
-                  desc_.add_descriptor(attribute_descriptor(fld_name,Double,false,8));
-               }
-               else
-               {
-                  desc_.add_descriptor(attribute_descriptor(fld_name,Integer,false,4));
-               }
-               break;
-            }
-            default:
-#ifdef MAPNIK_DEBUG                
-               std::clog << "unknown type "<<fd.type_<<"\n";
-#endif 
-               break;
-         }
-      }
-   }
-   catch (datasource_exception& ex)
-   {
-      std::clog<<ex.what()<<std::endl;
-      throw;
-   }
-   catch (...)
-   {
-      std::clog << " got exception ... \n";
-      throw;
-   }
-}
-
-shape_datasource::~shape_datasource() {}
-
-const std::string shape_datasource::name_="shape";
-
-void  shape_datasource::init(shape_io& shape)
-{
-   //first read header from *.shp
-   int file_code=shape.shp().read_xdr_integer();
-   if (file_code!=9994)
-   {
-       //invalid file code
-       throw datasource_exception((boost::format("wrong file code : %d") % file_code).str());
-   }
-   
-   shape.shp().skip(5*4);
-   file_length_=shape.shp().read_xdr_integer();
-   int version=shape.shp().read_ndr_integer();
-   
-   if (version!=1000)
-   {
-      //invalid version number
-       throw datasource_exception((boost::format("invalid version number: %d") % version).str());
-   }
-   
-#ifdef MAPNIK_DEBUG
-   int shape_type = shape.shp().read_ndr_integer();
-#else
-   shape.shp().skip(4);
-#endif
-   
-   shape.shp().read_envelope(extent_);
-
-#ifdef MAPNIK_DEBUG
-   double zmin = shape.shp().read_double();
-   double zmax = shape.shp().read_double();
-   double mmin = shape.shp().read_double();
-   double mmax = shape.shp().read_double();
-
-   std::clog << "Z min/max " << zmin << "," << zmax << "\n";
-   std::clog << "M min/max " << mmin << "," << mmax << "\n";
-#else
-   shape.shp().skip(4*8);
-#endif
-
-   // check if we have an index file around
-   std::string index_name(shape_name_+".index");
-   std::ifstream file(index_name.c_str(),std::ios::in | std::ios::binary);
-   if (file)
-   {
-      indexed_=true;
-      file.close();
-   }
- 
-#ifdef MAPNIK_DEBUG
-   std::clog << extent_ << std::endl;
-   std::clog << "file_length=" << file_length_ << std::endl;
-   std::clog << "shape_type=" << shape_type << std::endl;
-#endif
-
-}
-
-int shape_datasource::type() const
-{
-   return type_;
-}
-
-layer_descriptor shape_datasource::get_descriptor() const
-{
-   return desc_;
-}
-
-std::string shape_datasource::name()
-{
-   return name_;
-}
-
-featureset_ptr shape_datasource::features(const query& q) const
-{
-   filter_in_box filter(q.get_bbox());
-   if (indexed_)
-   {
-      return featureset_ptr
-         (new shape_index_featureset<filter_in_box>(filter,
-                                                    shape_name_,
-                                                    q.property_names(),
-                                                    desc_.get_encoding()));
-   }
-   else
-   {
-      return featureset_ptr
-         (new shape_featureset<filter_in_box>(filter,
-                                              shape_name_,
-                                              q.property_names(),
-                                              desc_.get_encoding(),
-                                              file_length_));
-   }
-}
-
-featureset_ptr shape_datasource::features_at_point(coord2d const& pt) const
-{
-   filter_at_point filter(pt);
-   // collect all attribute names
-   std::vector<attribute_descriptor> const& desc_vector = desc_.get_descriptors();
-   std::vector<attribute_descriptor>::const_iterator itr = desc_vector.begin();
-   std::vector<attribute_descriptor>::const_iterator end = desc_vector.end();
-   std::set<std::string> names;
-    
-   while (itr != end)
-   {    
-      names.insert(itr->get_name());
-      ++itr;
-   }
-    
-   if (indexed_)
-   {
-      return featureset_ptr
-         (new shape_index_featureset<filter_at_point>(filter,
-                                                      shape_name_,
-                                                      names,
-                                                      desc_.get_encoding()));
-   }
-   else
-   {
-      return featureset_ptr
-         (new shape_featureset<filter_at_point>(filter,
-                                                shape_name_,
-                                                names,
-                                                desc_.get_encoding(),
-                                                file_length_));
-   }
-}
-
-Envelope<double> shape_datasource::envelope() const
-{
-   return extent_;
-}
diff --git a/plugins/input/shape/shape.hpp b/plugins/input/shape/shape.hpp
deleted file mode 100644
index 886410d..0000000
--- a/plugins/input/shape/shape.hpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-
-// $Id$
-
-#ifndef SHAPE_HPP
-#define SHAPE_HPP
-
-#include <mapnik/datasource.hpp>
-#include <mapnik/envelope.hpp>
-
-#include "shape_io.hpp"
-
-using mapnik::datasource;
-using mapnik::parameters;
-using mapnik::query;
-using mapnik::featureset_ptr;
-using mapnik::layer_descriptor;
-using mapnik::coord2d;
-
-class shape_datasource : public datasource
-{
-   public:
-      shape_datasource(const parameters &params);
-      virtual ~shape_datasource();
-    
-      int type() const;
-      static std::string name();
-      featureset_ptr features(const query& q) const;
-      featureset_ptr features_at_point(coord2d const& pt) const;
-      Envelope<double> envelope() const;
-      layer_descriptor get_descriptor() const;   
-   private:
-      shape_datasource(const shape_datasource&);
-      shape_datasource& operator=(const shape_datasource&);
-      void init(shape_io& shape);
-   private:
-      int type_;
-      std::string shape_name_;
-      long file_length_;
-      Envelope<double> extent_;
-      bool indexed_;
-      layer_descriptor desc_;
-      static const std::string name_;
-};
-
-#endif //SHAPE_HPP
diff --git a/plugins/input/shape/shape_datasource.cpp b/plugins/input/shape/shape_datasource.cpp
new file mode 100644
index 0000000..f6ca9ab
--- /dev/null
+++ b/plugins/input/shape/shape_datasource.cpp
@@ -0,0 +1,316 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+// mapnik
+#include <mapnik/geom_util.hpp>
+
+// boost
+#include <boost/version.hpp>
+#include <boost/format.hpp>
+#include <boost/algorithm/string.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <boost/make_shared.hpp>
+
+// stl
+#include <iostream>
+#include <fstream>
+#include <stdexcept>
+
+#include "shape_datasource.hpp"
+#include "shape_featureset.hpp"
+#include "shape_index_featureset.hpp"
+
+DATASOURCE_PLUGIN(shape_datasource)
+
+using mapnik::String;
+using mapnik::Double;
+using mapnik::Integer;
+using mapnik::datasource_exception;
+using mapnik::filter_in_box;
+using mapnik::filter_at_point;
+using mapnik::attribute_descriptor;
+
+shape_datasource::shape_datasource(const parameters &params, bool bind)
+    : datasource (params),
+      type_(datasource::Vector),
+      file_length_(0),
+      indexed_(false),
+      row_limit_(*params_.get<int>("row_limit",0)),
+      desc_(*params.get<std::string>("type"), *params.get<std::string>("encoding","utf-8"))
+{
+    boost::optional<std::string> file = params.get<std::string>("file");
+    if (!file) throw datasource_exception("Shape Plugin: missing <file> parameter");
+      
+    boost::optional<std::string> base = params.get<std::string>("base");
+    if (base)
+        shape_name_ = *base + "/" + *file;
+    else
+        shape_name_ = *file;
+
+    boost::algorithm::ireplace_last(shape_name_,".shp","");
+    
+    if (bind)
+    {
+        this->bind();
+    }
+}
+
+void shape_datasource::bind() const
+{
+    if (is_bound_) return;
+    
+    if (!boost::filesystem::exists(shape_name_ + ".shp"))
+    {
+        throw datasource_exception("Shape Plugin: shapefile '" + shape_name_ + ".shp' does not exist");
+    }
+
+    if (boost::filesystem::is_directory(shape_name_ + ".shp"))
+    {
+        throw datasource_exception("Shape Plugin: shapefile '" + shape_name_ + ".shp' appears to be a directory not a file");
+    }
+
+    if (!boost::filesystem::exists(shape_name_ + ".dbf"))
+    {
+        throw datasource_exception("Shape Plugin: shapefile '" + shape_name_ + ".dbf' does not exist");
+    }
+
+
+    try
+    {  
+        boost::shared_ptr<shape_io> shape_ref = boost::make_shared<shape_io>(shape_name_);
+        init(*shape_ref);
+        for (int i=0;i<shape_ref->dbf().num_fields();++i)
+        {
+            field_descriptor const& fd=shape_ref->dbf().descriptor(i);
+            std::string fld_name=fd.name_;
+            switch (fd.type_)
+            {
+            case 'C': // character
+            case 'D': // Date
+            case 'M': // Memo, a string
+            case 'L': // logical
+            case '@': // timestamp
+                desc_.add_descriptor(attribute_descriptor(fld_name, String));
+                break;
+            case 'N':
+            case 'O': // double
+            case 'F': // float
+            {
+                if (fd.dec_>0)
+                {   
+                    desc_.add_descriptor(attribute_descriptor(fld_name,Double,false,8));
+                }
+                else
+                {
+                    desc_.add_descriptor(attribute_descriptor(fld_name,Integer,false,4));
+                }
+                break;
+            }
+            default:
+#ifdef MAPNIK_DEBUG
+                // I - long
+                // G - ole
+                // + - autoincrement
+                std::clog << "Shape Plugin: unknown type " << fd.type_ << std::endl;
+#endif 
+                break;
+            }
+        }
+        // for indexed shapefiles we keep open the file descriptor for fast reads
+        if (indexed_) {
+            shape_ = shape_ref;
+        }
+
+    }
+    catch (const datasource_exception& ex)
+    {
+        std::clog << "Shape Plugin: error processing field attributes, " << ex.what() << std::endl;
+        throw;
+    }
+    catch (const std::exception& ex)
+    {
+        std::clog << "Shape Plugin: error processing field attributes, " << ex.what() << std::endl;
+        throw;
+    }
+    catch (...) // exception: pipe_select_interrupter: Too many open files
+    {
+        std::clog << "Shape Plugin: error processing field attributes" << std::endl;
+        throw;
+    }
+    
+    is_bound_ = true;
+}
+
+shape_datasource::~shape_datasource() {}
+
+void  shape_datasource::init(shape_io& shape) const
+{
+    //first read header from *.shp
+    int file_code=shape.shp().read_xdr_integer();
+    if (file_code!=9994)
+    {
+        //invalid file code
+        throw datasource_exception("Shape Plugin: " + (boost::format("wrong file code : %d") % file_code).str());
+    }
+    
+    shape.shp().skip(5*4);
+    file_length_=shape.shp().read_xdr_integer();
+    int version=shape.shp().read_ndr_integer();
+   
+    if (version!=1000)
+    {
+        //invalid version number
+        throw datasource_exception("Shape Plugin: " + (boost::format("invalid version number: %d") % version).str());
+    }
+   
+    int shape_type = shape.shp().read_ndr_integer();
+    if (shape_type == shape_io::shape_multipatch)
+        throw datasource_exception("Shape Plugin: shapefile multipatch type is not supported");
+   
+    shape.shp().read_envelope(extent_);
+   
+#ifdef MAPNIK_DEBUG
+    double zmin = shape.shp().read_double();
+    double zmax = shape.shp().read_double();
+    double mmin = shape.shp().read_double();
+    double mmax = shape.shp().read_double();
+
+    std::clog << "Shape Plugin: Z min/max " << zmin << "," << zmax << std::endl;
+    std::clog << "Shape Plugin: M min/max " << mmin << "," << mmax << "\n";
+#else
+    shape.shp().skip(4*8);
+#endif
+
+    // check if we have an index file around
+    
+    indexed_ = shape.has_index();
+    
+    //std::string index_name(shape_name_+".index");
+    //std::ifstream file(index_name.c_str(),std::ios::in | std::ios::binary);
+    //if (file)
+    //{
+    //    indexed_=true;
+    //    file.close();
+    //}
+    //else
+    //{
+    //    std::clog << "### Notice: no .index file found for " + shape_name_ + ".shp, use the 'shapeindex' program to build an index for faster rendering\n";
+    //}
+    
+#ifdef MAPNIK_DEBUG
+    std::clog << "Shape Plugin: extent=" << extent_ << std::endl;
+    std::clog << "Shape Plugin: file_length=" << file_length_ << std::endl;
+    std::clog << "Shape Plugin: shape_type=" << shape_type << std::endl;
+#endif
+
+}
+
+std::string shape_datasource::name()
+{
+    return "shape";
+}
+
+int shape_datasource::type() const
+{
+    return type_;
+}
+
+layer_descriptor shape_datasource::get_descriptor() const
+{
+    if (!is_bound_) bind();
+    return desc_;
+}
+
+featureset_ptr shape_datasource::features(const query& q) const
+{
+    if (!is_bound_) bind();
+    
+    filter_in_box filter(q.get_bbox());
+    if (indexed_)
+    {
+        shape_->shp().seek(0);
+        // TODO - use boost::make_shared - #760
+        return featureset_ptr
+            (new shape_index_featureset<filter_in_box>(filter,
+                                                       *shape_,
+                                                       q.property_names(),
+                                                       desc_.get_encoding(),
+                                                       shape_name_,
+                                                       row_limit_));
+    }
+    else
+    {
+        return boost::make_shared<shape_featureset<filter_in_box> >(filter,
+                                                 shape_name_,
+                                                 q.property_names(),
+                                                 desc_.get_encoding(),
+                                                 file_length_,
+                                                 row_limit_);
+    }
+}
+
+featureset_ptr shape_datasource::features_at_point(coord2d const& pt) const
+{
+    if (!is_bound_) bind();
+
+    filter_at_point filter(pt);
+    // collect all attribute names
+    std::vector<attribute_descriptor> const& desc_vector = desc_.get_descriptors();
+    std::vector<attribute_descriptor>::const_iterator itr = desc_vector.begin();
+    std::vector<attribute_descriptor>::const_iterator end = desc_vector.end();
+    std::set<std::string> names;
+    
+    while (itr != end)
+    {    
+        names.insert(itr->get_name());
+        ++itr;
+    }
+    
+    if (indexed_)
+    {
+        shape_->shp().seek(0);
+        // TODO - use boost::make_shared - #760
+        return featureset_ptr
+            (new shape_index_featureset<filter_at_point>(filter,
+                                                         *shape_,
+                                                         names,
+                                                         desc_.get_encoding(),
+                                                         shape_name_,
+                                                         row_limit_));
+    }
+    else
+    {
+        return boost::make_shared<shape_featureset<filter_at_point> >(filter,
+                                                   shape_name_,
+                                                   names,
+                                                   desc_.get_encoding(),
+                                                   file_length_,
+                                                   row_limit_);
+    }
+}
+
+box2d<double> shape_datasource::envelope() const
+{
+    if (!is_bound_) bind();
+    
+    return extent_;
+}
diff --git a/plugins/input/shape/shape_datasource.hpp b/plugins/input/shape/shape_datasource.hpp
new file mode 100644
index 0000000..5fc85d0
--- /dev/null
+++ b/plugins/input/shape/shape_datasource.hpp
@@ -0,0 +1,70 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+// $Id$
+
+#ifndef SHAPE_HPP
+#define SHAPE_HPP
+
+#include <mapnik/datasource.hpp>
+#include <mapnik/box2d.hpp>
+
+#include <boost/shared_ptr.hpp>
+
+#include "shape_io.hpp"
+
+using mapnik::datasource;
+using mapnik::parameters;
+using mapnik::query;
+using mapnik::featureset_ptr;
+using mapnik::layer_descriptor;
+using mapnik::coord2d;
+
+class shape_datasource : public datasource
+{
+public:
+    shape_datasource(const parameters &params, bool bind=true);
+    virtual ~shape_datasource();
+    
+    int type() const;
+    static std::string name();
+    featureset_ptr features(const query& q) const;
+    featureset_ptr features_at_point(coord2d const& pt) const;
+    box2d<double> envelope() const;
+    layer_descriptor get_descriptor() const;
+    void bind() const;   
+private:
+    shape_datasource(const shape_datasource&);
+    shape_datasource& operator=(const shape_datasource&);
+    void init(shape_io& shape) const;
+private:
+    int type_;
+    std::string shape_name_;
+    mutable boost::shared_ptr<shape_io> shape_;
+    mutable long file_length_;
+    mutable box2d<double> extent_;
+    mutable bool indexed_;
+    const int row_limit_;
+    mutable layer_descriptor desc_;
+};
+
+#endif //SHAPE_HPP
diff --git a/plugins/input/shape/shape_featureset.cpp b/plugins/input/shape/shape_featureset.cpp
index 58a5042..efb95ae 100644
--- a/plugins/input/shape/shape_featureset.cpp
+++ b/plugins/input/shape/shape_featureset.cpp
@@ -21,37 +21,67 @@
  *
  *****************************************************************************/
 
+// mapnik
+#include <mapnik/feature_factory.hpp>
+
+// boost
+#include <boost/algorithm/string.hpp>
+
+// stl
 #include <iostream>
+
 #include "shape_featureset.hpp"
 
+using mapnik::geometry_type;
+using mapnik::feature_factory;
+
 template <typename filterT>
 shape_featureset<filterT>::shape_featureset(const filterT& filter, 
-                                            const std::string& shape_file,
+                                            const std::string& shape_name,
                                             const std::set<std::string>& attribute_names,
                                             std::string const& encoding,
-                                            long file_length )
+                                            long file_length,
+                                            int row_limit)
     : filter_(filter),
-      shape_type_(shape_io::shape_null),
-      shape_(shape_file),
+      //shape_type_(shape_io::shape_null),
+      shape_(shape_name, false),
       query_ext_(),
       tr_(new transcoder(encoding)),
       file_length_(file_length),
-      count_(0)
+      count_(0),
+      row_limit_(row_limit)
 {
     shape_.shp().skip(100);
     //attributes
     typename std::set<std::string>::const_iterator pos=attribute_names.begin();
     while (pos!=attribute_names.end())
     {
-	for (int i=0;i<shape_.dbf().num_fields();++i)
-	{
-	    if (shape_.dbf().descriptor(i).name_ == *pos)
-	    {
-		attr_ids_.push_back(i);
-		break;
-	    }
-	}
-	++pos;
+        bool found_name = false;
+        for (int i=0;i<shape_.dbf().num_fields();++i)
+        {
+            if (shape_.dbf().descriptor(i).name_ == *pos)
+            {
+                attr_ids_.push_back(i);
+                found_name = true;
+                break;
+            }
+        }
+        if (!found_name)
+        {
+            std::ostringstream s;
+
+            s << "no attribute '" << *pos << "' in '"
+              << shape_name << "'. Valid attributes are: ";
+            std::vector<std::string> list;
+            for (int i=0;i<shape_.dbf().num_fields();++i)
+            {
+                list.push_back(shape_.dbf().descriptor(i).name_);
+            }
+            s << boost::algorithm::join(list, ",") << ".";
+            
+            throw mapnik::datasource_exception( "Shape Plugin: " + s.str() );
+        }
+        ++pos;
     }
 }
 
@@ -59,194 +89,217 @@ shape_featureset<filterT>::shape_featureset(const filterT& filter,
 template <typename filterT>
 feature_ptr shape_featureset<filterT>::next()
 {
-    using mapnik::point_impl;
+    if (row_limit_ && count_ > row_limit_)
+        return feature_ptr();
+
     std::streampos pos=shape_.shp().pos();
+    // skip null shapes
+    while (pos > 0 && pos < std::streampos(file_length_ * 2))
+    {
+        shape_.move_to(pos);
+        if (shape_.type() ==  shape_io::shape_null)
+        {
+            pos += std::streampos(12);
+        }
+        else break;        
+    }
     
     if (pos < std::streampos(file_length_ * 2))
     {
-	shape_.move_to(pos);
-	int type=shape_.type();
-	feature_ptr feature(new Feature(shape_.id_));
-	if (type == shape_io::shape_point)
-	{
-	    double x=shape_.shp().read_double();
-	    double y=shape_.shp().read_double();
-	    geometry2d * point = new point_impl;
-	    point->move_to(x,y);
-	    feature->add_geometry(point);
-	    ++count_;
-	}
-	else if (type == shape_io::shape_pointm)
-	{
-	    double x=shape_.shp().read_double();
-	    double y=shape_.shp().read_double();
-	    shape_.shp().skip(8); //m
-	    geometry2d * point = new point_impl;
-	    point->move_to(x,y);
-	    feature->add_geometry(point);
-	    ++count_;
-	}
-	else if (type == shape_io::shape_pointz)
-	{
-	    double x=shape_.shp().read_double();
-	    double y=shape_.shp().read_double();
-	    // skip z
-	    shape_.shp().skip(8);
-	
-	    //skip m if exists
-	    if ( shape_.reclength_ == 8 + 36) 
-	    {
-	        shape_.shp().skip(8);
-	    }
-	    geometry2d * point=new point_impl;
-	    point->move_to(x,y);
-	    feature->add_geometry(point);
-	    ++count_;
-	}
-	else
-	{
-	    while (!filter_.pass(shape_.current_extent()))
-	    {		
-		int reclen=shape_.reclength_;
-		if (!shape_.shp().is_eof())
-		{
-		    long pos = shape_.shp().pos();
-		    //std::cerr << pos << " " << reclen << std::endl;
-		    shape_.move_to(pos + 2 * reclen - 36);
-		}
-		else
-		{
-		    return feature_ptr();
-		}
-	    }
-	    
-	    switch (type)
-	    {
-	    case shape_io::shape_multipoint:
-	    {
-		int num_points = shape_.shp().read_ndr_integer();
-		for (int i=0; i< num_points;++i)
-		{ 
-		    double x=shape_.shp().read_double();
-		    double y=shape_.shp().read_double();
-		    geometry2d * point = new point_impl;
-		    point->move_to(x,y);
-		    feature->add_geometry(point);
-		}
-		++count_;
-		break;
-	    }
-	    case shape_io::shape_multipointm:
-	    {
-		int num_points = shape_.shp().read_ndr_integer();
-		for (int i=0; i< num_points;++i)
-		{ 
-		    double x=shape_.shp().read_double();
-		    double y=shape_.shp().read_double();
-		    geometry2d * point = new point_impl;
-		    point->move_to(x,y);
-		    feature->add_geometry(point);
-		}
-		// skip m 
-		shape_.shp().skip(2*8 + 8*num_points);
-		++count_;
-		break;
-	    }
-	    case shape_io::shape_multipointz:
-	    {
-		unsigned num_points = shape_.shp().read_ndr_integer();
-		for (unsigned i=0; i< num_points;++i)
-		{ 
-		    double x=shape_.shp().read_double();
-		    double y=shape_.shp().read_double();
-		    geometry2d * point = new point_impl;
-		    point->move_to(x,y);
-		    feature->add_geometry(point);
-		}
-		// skip z
-		shape_.shp().skip(2*8 + 8*num_points);
-		
-		// check if we have measure data 
-		if ( shape_.reclength_ == num_points * 16 + 36)   
-		{
-                    // skip m 
-		    shape_.shp().skip(2*8 + 8*num_points);
-		}	
-                ++count_;
-		break;
-	    }
-	    case shape_io::shape_polyline:
-	    {
-		geometry2d * line = shape_.read_polyline();
-		feature->add_geometry(line);
-		++count_;
-		break;
-	    }
-	    case shape_io::shape_polylinem:
-	    {
-		geometry2d * line = shape_.read_polylinem();
-		feature->add_geometry(line);
-		++count_;
-		break;
-	    }
-	    case shape_io::shape_polylinez:
-	    {
-		geometry2d * line = shape_.read_polylinez();
-		feature->add_geometry(line);
-		++count_;
-		break;
+        int type=shape_.type();
+        feature_ptr feature(feature_factory::create(shape_.id_));
+        
+        if (type == shape_io::shape_point)
+        {
+            double x=shape_.shp().read_double();
+            double y=shape_.shp().read_double();
+            geometry_type * point = new geometry_type(mapnik::Point);
+            point->move_to(x,y);
+            feature->add_geometry(point);
+            ++count_;
+        }
+        else if (type == shape_io::shape_pointm)
+        {
+            double x=shape_.shp().read_double();
+            double y=shape_.shp().read_double();
+            shape_.shp().skip(8); //m
+            geometry_type * point = new geometry_type(mapnik::Point);
+            point->move_to(x,y);
+            feature->add_geometry(point);
+            ++count_;
+        }
+        else if (type == shape_io::shape_pointz)
+        {
+            double x=shape_.shp().read_double();
+            double y=shape_.shp().read_double();
+            // skip z
+            shape_.shp().skip(8);
+
+            //skip m if exists
+            if ( shape_.reclength_ == 8 + 36) 
+            {
+                shape_.shp().skip(8);
+            }
+            geometry_type * point = new geometry_type(mapnik::Point);
+            point->move_to(x,y);
+            feature->add_geometry(point);
+            ++count_;
+        }
+        else
+        {
+            // skip shapes 
+            for (;;)
+            {
+                std::streampos pos = shape_.shp().pos();
+                if (shape_.type() == shape_io::shape_null)
+                {
+                    pos += std::streampos(12);                    
+                    std::cerr << "NULL SHAPE len=" << shape_.reclength_ << std::endl;
+                }                    
+                else if (filter_.pass(shape_.current_extent())) break;
+                else pos += std::streampos(2 * shape_.reclength_ - 36);                
+                if (pos > 0 && pos < std::streampos(file_length_ * 2))
+                {
+                    shape_.move_to(pos);
+                }
+                else
+                {
+#ifdef MAPNIK_DEBUG
+                    std::clog << "Shape Plugin: total shapes read=" << count_ << std::endl;
+#endif
+                    return feature_ptr();
+                }
             }
-            case shape_io::shape_polygon:
-            {		 
-		geometry2d * poly = shape_.read_polygon();
-		feature->add_geometry(poly);
-		++count_;
-		break;
+            
+            switch (type)
+            {
+                case shape_io::shape_multipoint:
+                {
+                    int num_points = shape_.shp().read_ndr_integer();
+                    for (int i=0; i< num_points;++i)
+                    { 
+                        double x=shape_.shp().read_double();
+                        double y=shape_.shp().read_double();
+                        geometry_type * point = new geometry_type(mapnik::Point);
+                        point->move_to(x,y);
+                        feature->add_geometry(point);
+                    }
+                    ++count_;
+                    break;
+                }
+                case shape_io::shape_multipointm:
+                {
+                    int num_points = shape_.shp().read_ndr_integer();
+                    for (int i=0; i< num_points;++i)
+                    { 
+                        double x=shape_.shp().read_double();
+                        double y=shape_.shp().read_double();
+                        geometry_type * point = new geometry_type(mapnik::Point);
+                        point->move_to(x,y);
+                        feature->add_geometry(point);
+                    }
+        
+                    // skip m 
+                    shape_.shp().skip(2*8 + 8*num_points);
+                    ++count_;
+                    break;
+                }
+                case shape_io::shape_multipointz:
+                {
+                    unsigned num_points = shape_.shp().read_ndr_integer();
+                    for (unsigned i=0; i< num_points;++i)
+                    { 
+                        double x=shape_.shp().read_double();
+                        double y=shape_.shp().read_double();
+                        geometry_type * point = new geometry_type(mapnik::Point);
+                        point->move_to(x,y);
+                        feature->add_geometry(point);
+                    }
+        
+                    // skip z
+                    shape_.shp().skip(2*8 + 8*num_points);
+                    
+                    // check if we have measure data 
+        
+                    if ( shape_.reclength_ == num_points * 16 + 36)   
+                    {
+                        // skip m 
+                        shape_.shp().skip(2*8 + 8*num_points);
+                    }
+                    ++count_;
+                    break;
+                }
+                case shape_io::shape_polyline:
+                {
+                    geometry_type * line = shape_.read_polyline();
+                    feature->add_geometry(line);
+                    ++count_;
+                    break;
+                }
+                case shape_io::shape_polylinem:
+                {
+                    geometry_type * line = shape_.read_polylinem();
+                    feature->add_geometry(line);
+                    ++count_;
+                    break;
+                }
+                case shape_io::shape_polylinez:
+                {
+                    geometry_type * line = shape_.read_polylinez();
+                    feature->add_geometry(line);
+                    ++count_;
+                    break;
+                }
+                case shape_io::shape_polygon:
+                {         
+                    geometry_type * poly = shape_.read_polygon();
+                    feature->add_geometry(poly);
+                    ++count_;
+                    break;
+                }
+                case shape_io::shape_polygonm:
+                {         
+                    geometry_type * poly = shape_.read_polygonm();
+                    feature->add_geometry(poly);
+                    ++count_;
+                    break;
+                }
+                case shape_io::shape_polygonz:
+                {
+                    geometry_type * poly = shape_.read_polygonz();
+                    feature->add_geometry(poly);
+                    ++count_;
+                    break;
+                }
             }
-            case shape_io::shape_polygonm:
-            {		 
-		geometry2d * poly = shape_.read_polygonm();
-		feature->add_geometry(poly);
-		++count_;
-		break;
+        }
+        
+        feature->set_id(shape_.id_);
+        if (attr_ids_.size())
+        {
+            shape_.dbf().move_to(shape_.id_);
+            std::vector<int>::const_iterator itr=attr_ids_.begin();
+            std::vector<int>::const_iterator end=attr_ids_.end();
+            try 
+            {
+                for (;itr!=end;++itr)
+                {                    
+                    shape_.dbf().add_attribute(*itr,*tr_,*feature);//TODO optimize!!!
+                }
             }
-            case shape_io::shape_polygonz:
+            catch (...)
             {
-		geometry2d * poly = shape_.read_polygonz();
-		feature->add_geometry(poly);
-		++count_;
-		break;
+                std::clog << "Shape Plugin: error processing attributes " << std::endl;
             }
-
-	    }
-	}
-	if (attr_ids_.size())
-	{
-	    shape_.dbf().move_to(shape_.id_);
-	    std::vector<int>::const_iterator pos=attr_ids_.begin();
-	    std::vector<int>::const_iterator end=attr_ids_.end();
-         
-	    while (pos!=end)
-	    {
-		try 
-		{
-		    shape_.dbf().add_attribute(*pos,*tr_,*feature);//TODO optimize!!!
-		}
-		catch (...)
-		{
-		    std::clog << "error processing attributes " << std::endl;
-		}
-		++pos;
-	    }
-	}
-	return feature;
+        }
+        return feature;
     }
     else
     {
 #ifdef MAPNIK_DEBUG
-	std::clog<<" total shapes read="<<count_<<"\n";
+        std::clog << "Shape Plugin: total shapes read=" << count_ << std::endl;
 #endif
-	return feature_ptr();
+        return feature_ptr();
     }
 }
 
diff --git a/plugins/input/shape/shape_featureset.hpp b/plugins/input/shape/shape_featureset.hpp
index f416b53..285e74f 100644
--- a/plugins/input/shape/shape_featureset.hpp
+++ b/plugins/input/shape/shape_featureset.hpp
@@ -20,42 +20,52 @@
  *
  *****************************************************************************/
 
-#ifndef SHAPE_FS_HH
-#define SHAPE_FS_HH
+#ifndef SHAPE_FEATURESET_HPP
+#define SHAPE_FEATURESET_HPP
 
-#include <boost/scoped_ptr.hpp>
+//mapnik
 #include <mapnik/geom_util.hpp>
-#include "shape.hpp"
+#include <mapnik/datasource.hpp>
+
+#include "shape_io.hpp"
+
+//boost
+#include <boost/scoped_ptr.hpp>
 
 using mapnik::Featureset;
-using mapnik::Envelope;
+using mapnik::box2d;
 using mapnik::feature_ptr;
+using mapnik::transcoder;
 
 template <typename filterT>
 class shape_featureset : public Featureset
 {
       filterT filter_;
-      int shape_type_;
+      //int shape_type_;
       shape_io shape_;
-      Envelope<double> query_ext_;
+      box2d<double> query_ext_;
       boost::scoped_ptr<transcoder> tr_;
       long file_length_;
       std::vector<int> attr_ids_;
-      mutable Envelope<double> feature_ext_;
+      mutable box2d<double> feature_ext_;
       mutable int total_geom_size;
       mutable int count_;
+      const int row_limit_;
+
    public:
       shape_featureset(const filterT& filter, 
                        const std::string& shape_file,
                        const std::set<std::string>& attribute_names,
                        std::string const& encoding,
-                       long file_length);
+                       long file_length,
+                       int row_limit);
       virtual ~shape_featureset();
       feature_ptr next();
+
    private:
       shape_featureset(const shape_featureset&);
       const shape_featureset& operator=(const shape_featureset&);
       
 };
 
-#endif //SHAPE_FS_HH
+#endif //SHAPE_FEATURESET_HPP
diff --git a/plugins/input/shape/shape_index_featureset.cpp b/plugins/input/shape/shape_index_featureset.cpp
index d4f64f1..20a0b2e 100644
--- a/plugins/input/shape/shape_index_featureset.cpp
+++ b/plugins/input/shape/shape_index_featureset.cpp
@@ -22,39 +22,51 @@
 
 //$Id: shape_index_featureset.cc 36 2005-04-05 14:32:18Z pavlenko $
 
+// mapnik
 #include <mapnik/feature_factory.hpp>
+
 // boost
-#include <boost/iostreams/stream.hpp>
-#include <boost/iostreams/device/file.hpp>
-#include <boost/iostreams/device/mapped_file.hpp>
+#include <boost/algorithm/string.hpp>
+#include <boost/interprocess/streams/bufferstream.hpp>
+
+// stl
+#include <fstream>
 
 #include "shape_index_featureset.hpp"
 
-using namespace boost::iostreams;
+using mapnik::feature_factory;
+using mapnik::geometry_type;
 
 template <typename filterT>
 shape_index_featureset<filterT>::shape_index_featureset(const filterT& filter,
-                                                        const std::string& shape_file,
+                                                        shape_io& shape,
                                                         const std::set<std::string>& attribute_names,
-                                                        std::string const& encoding)
+                                                        std::string const& encoding,
+                                                        std::string const& shape_name,
+                                                        int row_limit)
     : filter_(filter),
-      shape_type_(0),
-      shape_(shape_file),
+      //shape_type_(0),
+      shape_(shape),
       tr_(new transcoder(encoding)),
-      count_(0)
+      count_(0),
+      row_limit_(row_limit)
 
 {
     shape_.shp().skip(100);
-    stream<mapped_file_source> file(shape_file + ".index");
-    if (file)
+    boost::shared_ptr<shape_file> index = shape_.index();
+    if (index)
     {
-	shp_index<filterT,stream<mapped_file_source> >::query(filter,file,ids_);
-	file.close();
+#ifdef SHAPE_MEMORY_MAPPED_FILE
+        //shp_index<filterT,stream<mapped_file_source> >::query(filter,index->file(),ids_);
+        shp_index<filterT,boost::interprocess::ibufferstream>::query(filter,index->file(),ids_);
+#else
+        shp_index<filterT,std::ifstream>::query(filter,index->file(),ids_);
+#endif
     }
     std::sort(ids_.begin(),ids_.end());    
     
 #ifdef MAPNIK_DEBUG
-    std::clog<< "query size=" << ids_.size() << "\n";
+    std::clog << "Shape Plugin: query size=" << ids_.size() << std::endl;
 #endif
 
     itr_ = ids_.begin();
@@ -63,14 +75,31 @@ shape_index_featureset<filterT>::shape_index_featureset(const filterT& filter,
     std::set<std::string>::const_iterator pos=attribute_names.begin();
     while (pos!=attribute_names.end())
     {
+        bool found_name = false;
         for (int i=0;i<shape_.dbf().num_fields();++i)
         {
             if (shape_.dbf().descriptor(i).name_ == *pos)
             {
                 attr_ids_.insert(i);
+                found_name = true;
                 break;
             }
         }
+        if (!found_name)
+        {
+            std::ostringstream s;
+
+            s << "no attribute '" << *pos << "' in '"
+              << shape_name << "'. Valid attributes are: ";
+            std::vector<std::string> list;
+            for (int i=0;i<shape_.dbf().num_fields();++i)
+            {
+                list.push_back(shape_.dbf().descriptor(i).name_);
+            }
+            s << boost::algorithm::join(list, ",") << ".";
+            
+            throw mapnik::datasource_exception( "Shape Plugin: " + s.str() );
+        }
         ++pos;
     }
 }
@@ -78,20 +107,20 @@ shape_index_featureset<filterT>::shape_index_featureset(const filterT& filter,
 template <typename filterT>
 feature_ptr shape_index_featureset<filterT>::next()
 {   
-    using mapnik::feature_factory;
-    using mapnik::point_impl;
+    if (row_limit_ && count_ > row_limit_)
+        return feature_ptr();
+
     if (itr_!=ids_.end())
     {
         int pos=*itr_++;
         shape_.move_to(pos);
         int type=shape_.type();
-	
         feature_ptr feature(feature_factory::create(shape_.id_));
         if (type == shape_io::shape_point)
-	{
+        {
             double x=shape_.shp().read_double();
-            double y=shape_.shp().read_double();	    
-            geometry2d * point = new point_impl;
+            double y=shape_.shp().read_double();            
+            geometry_type * point = new geometry_type(mapnik::Point);
             point->move_to(x,y);
             feature->add_geometry(point);
             ++count_;
@@ -102,7 +131,7 @@ feature_ptr shape_index_featureset<filterT>::next()
             double x=shape_.shp().read_double();
             double y=shape_.shp().read_double();
             shape_.shp().skip(8);// skip m
-            geometry2d * point = new point_impl;
+            geometry_type * point = new geometry_type(mapnik::Point);
             point->move_to(x,y);
             feature->add_geometry(point);
             ++count_;
@@ -119,98 +148,107 @@ feature_ptr shape_index_featureset<filterT>::next()
             {
                 shape_.shp().skip(8);
             }
-            geometry2d * point = new point_impl;
+            geometry_type * point = new geometry_type(mapnik::Point);
             point->move_to(x,y);
             feature->add_geometry(point);
             ++count_;
-        }	
+        }       
         else
         {
             while(!filter_.pass(shape_.current_extent()) && 
-		  itr_!=ids_.end())
+                  itr_!=ids_.end())
             {
-                pos=*itr_++;
-                shape_.move_to(pos);
+                if (shape_.type() != shape_io::shape_null) 
+                {
+                    pos=*itr_++;
+                    shape_.move_to(pos);
+                }
+                else
+                {
+                    return feature_ptr();
+                }
             }
-	    
+            
             switch (type)
             {
-	    case shape_io::shape_multipoint:
-	    case shape_io::shape_multipointm:
-	    case shape_io::shape_multipointz:
-	    {
-		int num_points = shape_.shp().read_ndr_integer();
-		for (int i=0; i< num_points;++i)
-		{ 
-		    double x=shape_.shp().read_double();
-		    double y=shape_.shp().read_double();
-		    geometry2d * point = new point_impl;
-		    point->move_to(x,y);
-		    feature->add_geometry(point);
-		}
-		// ignore m and z for now 
-		++count_;
-		break;
-	    }
-	    case shape_io::shape_polyline:
-	    {
-		geometry2d * line = shape_.read_polyline();
-		feature->add_geometry(line);
-		++count_;
-		break;
-	    }
-	    case shape_io::shape_polylinem:
-	    {
-		geometry2d * line = shape_.read_polylinem();
-		feature->add_geometry(line);
-		++count_;
-		break;
-	    }
-	    case shape_io::shape_polylinez:
-	    {
-		geometry2d * line = shape_.read_polylinez();
-		feature->add_geometry(line);
-		++count_;
-		break;
-	    }
-	    case shape_io::shape_polygon:
-	    { 
-		geometry2d * poly = shape_.read_polygon();
-		feature->add_geometry(poly);
-		++count_;
-		break;
-	    }
-	    case shape_io::shape_polygonm:
-	    { 
-		geometry2d * poly = shape_.read_polygonm();
-		feature->add_geometry(poly);
-		++count_;
-		break;
-	    }
-	    case shape_io::shape_polygonz:
-	    {
-		geometry2d * poly = shape_.read_polygonz();
-		feature->add_geometry(poly);
-		++count_;
-		break;
-	    }
+            case shape_io::shape_multipoint:
+            case shape_io::shape_multipointm:
+            case shape_io::shape_multipointz:
+            {
+                int num_points = shape_.shp().read_ndr_integer();
+                for (int i=0; i< num_points;++i)
+                { 
+                    double x=shape_.shp().read_double();
+                    double y=shape_.shp().read_double();
+                    geometry_type * point = new geometry_type(mapnik::Point);
+                    point->move_to(x,y);
+                    feature->add_geometry(point);
+                }
+                // ignore m and z for now 
+                ++count_;
+                break;
+            }
+            case shape_io::shape_polyline:
+            {
+                geometry_type * line = shape_.read_polyline();
+                feature->add_geometry(line);
+                ++count_;
+                break;
+            }
+            case shape_io::shape_polylinem:
+            {
+                geometry_type * line = shape_.read_polylinem();
+                feature->add_geometry(line);
+                ++count_;
+                break;
+            }
+            case shape_io::shape_polylinez:
+            {
+                geometry_type * line = shape_.read_polylinez();
+                feature->add_geometry(line);
+                ++count_;
+                break;
+            }
+            case shape_io::shape_polygon:
+            { 
+                geometry_type * poly = shape_.read_polygon();
+                feature->add_geometry(poly);
+                ++count_;
+                break;
+            }
+            case shape_io::shape_polygonm:
+            { 
+                geometry_type * poly = shape_.read_polygonm();
+                feature->add_geometry(poly);
+                ++count_;
+                break;
+            }
+            case shape_io::shape_polygonz:
+            {
+                geometry_type * poly = shape_.read_polygonz();
+                feature->add_geometry(poly);
+                ++count_;
+                break;
+            }
             }
         }
+        
+        feature->set_id(shape_.id_);
         if (attr_ids_.size())
         {
             shape_.dbf().move_to(shape_.id_);
-            std::set<int>::const_iterator pos=attr_ids_.begin();
-            while (pos!=attr_ids_.end())
+            std::set<int>::const_iterator itr=attr_ids_.begin();
+            std::set<int>::const_iterator end=attr_ids_.end();
+            try 
             {
-                try 
-                {
-                    shape_.dbf().add_attribute(*pos,*tr_,*feature);
-                }
-                catch (...)
-                {
-                    std::clog<<"exception caught\n";
+                for ( ; itr!=end; ++itr)
+                {                
+                    shape_.dbf().add_attribute(*itr,*tr_,*feature);
                 }
-                ++pos;
+            }
+            catch (...)
+            {
+                std::clog << "Shape Plugin: error processing attributes" << std::endl;
             }
         }
         return feature;
@@ -219,7 +257,7 @@ feature_ptr shape_index_featureset<filterT>::next()
     {
 
 #ifdef MAPNIK_DEBUG
-        std::clog<<count_<<" features\n";
+        std::clog << "Shape Plugin: " << count_ << " features" << std::endl;
 #endif
         return feature_ptr();
     }
diff --git a/plugins/input/shape/shape_index_featureset.hpp b/plugins/input/shape/shape_index_featureset.hpp
index b7da287..c73fdd1 100644
--- a/plugins/input/shape/shape_index_featureset.hpp
+++ b/plugins/input/shape/shape_index_featureset.hpp
@@ -23,32 +23,43 @@
 #ifndef SHAPE_INDEX_FEATURESET_HPP
 #define SHAPE_INDEX_FEATURESET_HPP
 
+#include <mapnik/geom_util.hpp>
+#include <boost/scoped_ptr.hpp>
+
+#include "shape_datasource.hpp"
+#include "shape_io.hpp"
 #include <set>
 #include <vector>
-#include <boost/scoped_ptr.hpp>
-#include "shape_featureset.hpp"
+
+using mapnik::Featureset;
+using mapnik::box2d;
+using mapnik::feature_ptr;
 
 template <typename filterT>
 class shape_index_featureset : public Featureset
 {
       filterT filter_;
-      int shape_type_;
-      shape_io shape_;
+      //int shape_type_;      
+      shape_io & shape_;
       boost::scoped_ptr<transcoder> tr_;
       std::vector<int> ids_;
       std::vector<int>::iterator itr_;
       std::set<int> attr_ids_;
-      mutable Envelope<double> feature_ext_;
+      mutable box2d<double> feature_ext_;
       mutable int total_geom_size;
       mutable int count_;
+      const int row_limit_;
 
    public:
       shape_index_featureset(const filterT& filter,
-                             const std::string& shape_file,
+                             shape_io& shape,
                              const std::set<std::string>& attribute_names,
-                             std::string const& encoding);
+                             std::string const& encoding,
+                             std::string const& shape_name,
+                             int row_limit);
       virtual ~shape_index_featureset();
       feature_ptr next();
+
    private:
       //no copying
       shape_index_featureset(const shape_index_featureset&);
diff --git a/plugins/input/shape/shape_io.cpp b/plugins/input/shape/shape_io.cpp
index 630e4e0..a625173 100644
--- a/plugins/input/shape/shape_io.cpp
+++ b/plugins/input/shape/shape_io.cpp
@@ -23,32 +23,49 @@
 //$Id: shape_io.cc 26 2005-03-29 19:18:59Z pavlenko $
 
 #include "shape_io.hpp"
-#include "shape.hpp"
 
+#include <mapnik/datasource.hpp>
+
+// boost
+#include <boost/filesystem/operations.hpp>
+#include <boost/make_shared.hpp>
 
 using mapnik::datasource_exception;
+using mapnik::geometry_type;
+
 const std::string shape_io::SHP = ".shp";
 const std::string shape_io::DBF = ".dbf";
+const std::string shape_io::INDEX = ".index";
 
-shape_io::shape_io(const std::string& shape_name)
+shape_io::shape_io(const std::string& shape_name, bool open_index)
    : type_(shape_null),
      shp_(shape_name + SHP),
      dbf_(shape_name + DBF),
      reclength_(0),
      id_(0)
 {
-   bool ok = (shp_.is_open() && dbf_.is_open());
-   if (!ok)
-   { 
-      throw datasource_exception("cannot read shape file");
-   }
+    bool ok = (shp_.is_open() && dbf_.is_open());
+    if (!ok)
+    { 
+        throw datasource_exception("Shape Plugin: cannot read shape file '" + shape_name + "'");
+    }
+    if (open_index)
+    {
+        try 
+        {
+            
+            index_= boost::make_shared<shape_file>(shape_name + INDEX);
+        }
+        catch (...)
+        {
+#ifdef MAPNIK_DEBUG 
+            std::clog << "Shape Plugin: warning - could not open index: '" + shape_name + INDEX + "'" << std::endl;
+#endif
+        }
+    }
 }
 
-shape_io::~shape_io()
-{
-   shp_.close();
-   dbf_.close();
-}
+shape_io::~shape_io() {}
 
 void shape_io::move_to (int pos)
 {
@@ -56,14 +73,8 @@ void shape_io::move_to (int pos)
    id_ = shp_.read_xdr_integer();
    reclength_ = shp_.read_xdr_integer();
    type_ = shp_.read_ndr_integer();
-
-   if (shp_.is_eof()) {
-       id_ = 0;
-       reclength_ = 0;
-       type_ = shape_null;
-   }
-
-   if (type_ != shape_point && type_ != shape_pointm && type_ != shape_pointz)
+   
+   if (type_!= shape_null && type_ != shape_point && type_ != shape_pointm && type_ != shape_pointz)
    {
       shp_.read_envelope(cur_extent_);
    }
@@ -74,7 +85,7 @@ int shape_io::type() const
    return type_;
 }
 
-const Envelope<double>& shape_io::current_extent() const
+const box2d<double>& shape_io::current_extent() const
 {
    return cur_extent_;
 }
@@ -84,10 +95,10 @@ shape_file& shape_io::shp()
    return shp_;
 }
 
-shape_file& shape_io::shx()
+/*shape_file& shape_io::shx()
 {
    return shx_;
-}
+}*/
 
 
 dbf_file& shape_io::dbf()
@@ -95,14 +106,13 @@ dbf_file& shape_io::dbf()
    return dbf_;
 }
 
-geometry2d * shape_io::read_polyline()
+geometry_type * shape_io::read_polyline()
 {    
-   using mapnik::line_string_impl;
    shape_file::record_type record(reclength_*2-36);
    shp_.read_record(record);
    int num_parts=record.read_ndr_integer();
    int num_points=record.read_ndr_integer();
-   geometry2d * line = new line_string_impl;
+   geometry_type * line = new geometry_type(mapnik::LineString);
    line->set_capacity(num_points + num_parts);
    if (num_parts == 1)
    {
@@ -134,11 +144,11 @@ geometry2d * shape_io::read_polyline()
             end=num_points;
          else
             end=parts[k+1];
-	    
+         
          double x=record.read_double();
          double y=record.read_double();
          line->move_to(x,y);
-	    
+         
          for (int j=start+1;j<end;++j)
          {
             x=record.read_double();
@@ -150,14 +160,13 @@ geometry2d * shape_io::read_polyline()
    return line;
 }
 
-geometry2d * shape_io::read_polylinem()
+geometry_type * shape_io::read_polylinem()
 {    
-   using mapnik::line_string_impl;
    shape_file::record_type record(reclength_*2-36);
    shp_.read_record(record);
    int num_parts=record.read_ndr_integer();
    int num_points=record.read_ndr_integer();
-   geometry2d * line = new line_string_impl;
+   geometry_type * line = new geometry_type(mapnik::LineString);
    line->set_capacity(num_points + num_parts);
    if (num_parts == 1)
    {
@@ -188,11 +197,11 @@ geometry2d * shape_io::read_polylinem()
             end=num_points;
          else
             end=parts[k+1];
-	    
+      
          double x=record.read_double();
          double y=record.read_double();
          line->move_to(x,y);
-	    
+      
          for (int j=start+1;j<end;++j)
          {
             x=record.read_double();
@@ -213,14 +222,13 @@ geometry2d * shape_io::read_polylinem()
    return line;
 }
 
-geometry2d * shape_io::read_polylinez()
+geometry_type * shape_io::read_polylinez()
 {
-   using mapnik::line_string_impl;
    shape_file::record_type record(reclength_*2-36);
    shp_.read_record(record);
    int num_parts=record.read_ndr_integer();
    int num_points=record.read_ndr_integer();
-   geometry2d * line = new line_string_impl;
+   geometry_type * line = new geometry_type(mapnik::LineString);
    line->set_capacity(num_points + num_parts);
    if (num_parts == 1)
    {
@@ -251,11 +259,11 @@ geometry2d * shape_io::read_polylinez()
             end=num_points;
          else
             end=parts[k+1];
-	    
+         
          double x=record.read_double();
          double y=record.read_double();
          line->move_to(x,y);
-	    
+         
          for (int j=start+1;j<end;++j)
          {
             x=record.read_double();
@@ -269,7 +277,7 @@ geometry2d * shape_io::read_polylinez()
    //double z1=record.read_double();
    //for (int i=0;i<num_points;++i)
    // {
-   //	double z=record.read_double();
+   //  double z=record.read_double();
    // }
     
    // m-range
@@ -283,15 +291,14 @@ geometry2d * shape_io::read_polylinez()
    return line;
 }
 
-geometry2d * shape_io::read_polygon()
+geometry_type * shape_io::read_polygon()
 {
-   using mapnik::polygon_impl;
    shape_file::record_type record(reclength_*2-36);
    shp_.read_record(record);
    int num_parts=record.read_ndr_integer();
    int num_points=record.read_ndr_integer();
    std::vector<int> parts(num_parts);
-   geometry2d * poly = new polygon_impl;
+   geometry_type * poly = new geometry_type(mapnik::Polygon);
    poly->set_capacity(num_points + num_parts);
    for (int i=0;i<num_parts;++i)
    {
@@ -324,15 +331,14 @@ geometry2d * shape_io::read_polygon()
    return poly;
 }
 
-geometry2d * shape_io::read_polygonm()
+geometry_type * shape_io::read_polygonm()
 {
-   using mapnik::polygon_impl;
    shape_file::record_type record(reclength_*2-36);
    shp_.read_record(record);
    int num_parts=record.read_ndr_integer();
    int num_points=record.read_ndr_integer();
    std::vector<int> parts(num_parts);
-   geometry2d * poly = new polygon_impl;
+   geometry_type * poly = new geometry_type(mapnik::Polygon);
    poly->set_capacity(num_points + num_parts);
    for (int i=0;i<num_parts;++i)
    {
@@ -373,15 +379,14 @@ geometry2d * shape_io::read_polygonm()
    return poly;
 }
 
-geometry2d * shape_io::read_polygonz()
+geometry_type * shape_io::read_polygonz()
 {
-   using mapnik::polygon_impl;
    shape_file::record_type record(reclength_*2-36);
    shp_.read_record(record);
    int num_parts=record.read_ndr_integer();
    int num_points=record.read_ndr_integer();
    std::vector<int> parts(num_parts);
-   geometry2d * poly=new polygon_impl;
+   geometry_type * poly = new geometry_type(mapnik::Polygon);
    poly->set_capacity(num_points + num_parts);
    for (int i=0;i<num_parts;++i)
    {
@@ -416,7 +421,7 @@ geometry2d * shape_io::read_polygonz()
    //double z1=record.read_double();
    //for (int i=0;i<num_points;++i)
    //{
-   //	double z=record.read_double();
+   //  double z=record.read_double();
    //}
     
    // m-range
diff --git a/plugins/input/shape/shape_io.hpp b/plugins/input/shape/shape_io.hpp
index 8a3db23..378b21d 100644
--- a/plugins/input/shape/shape_io.hpp
+++ b/plugins/input/shape/shape_io.hpp
@@ -24,61 +24,72 @@
 #define SHAPE_IO_HPP
 
 // mapnik
-#include "dbffile.hpp"
+#include "dbfile.hpp"
 #include "shapefile.hpp"
 #include "shp_index.hpp"
 // boost
 #include <boost/utility.hpp>
-
-using mapnik::geometry2d;
+#include <boost/shared_ptr.hpp>
 
 struct shape_io : boost::noncopyable
 {
-      static const std::string SHP;
-      static const std::string SHX;
-      static const std::string DBF;
-      unsigned type_;
-      shape_file shp_;
-      shape_file shx_;
-      dbf_file   dbf_;
-      
-      unsigned reclength_;
-      unsigned id_;
-      Envelope<double> cur_extent_;
-
-   public:
-      enum shapeType
-      {
-         shape_null = 0,
-         shape_point = 1,
-         shape_polyline = 3,
-         shape_polygon = 5,
-         shape_multipoint = 8,
-         shape_pointz = 11,
-         shape_polylinez = 13,
-         shape_polygonz = 15,
-         shape_multipointz = 18,
-         shape_pointm = 21,
-         shape_polylinem = 23,
-         shape_polygonm = 25,
-         shape_multipointm = 28,
-         shape_multipatch = 31
-      };
+    static const std::string SHP;
+    //static const std::string SHX;
+    static const std::string DBF;
+    static const std::string INDEX;
+    unsigned type_;
+    shape_file shp_;
+    //shape_file shx_;
+    dbf_file   dbf_;
+    boost::shared_ptr<shape_file>  index_;
+    unsigned reclength_;
+    unsigned id_;
+    box2d<double> cur_extent_;
+    
+public:
+    enum shapeType
+    {
+        shape_null = 0,
+        shape_point = 1,
+        shape_polyline = 3,
+        shape_polygon = 5,
+        shape_multipoint = 8,
+        shape_pointz = 11,
+        shape_polylinez = 13,
+        shape_polygonz = 15,
+        shape_multipointz = 18,
+        shape_pointm = 21,
+        shape_polylinem = 23,
+        shape_polygonm = 25,
+        shape_multipointm = 28,
+        shape_multipatch = 31
+    };
 
-      shape_io(const std::string& shape_name);
-      ~shape_io();
-      shape_file& shp();
-      shape_file& shx();
-      dbf_file& dbf();
-      void move_to(int id);
-      int type() const;
-      const Envelope<double>& current_extent() const;
-      geometry2d * read_polyline();
-      geometry2d * read_polylinem();
-      geometry2d * read_polylinez();
-      geometry2d * read_polygon();
-      geometry2d * read_polygonm();
-      geometry2d * read_polygonz();
+    shape_io(const std::string& shape_name, bool open_index=true);
+    ~shape_io();
+    shape_file& shp();
+    //shape_file& shx();
+    dbf_file& dbf();
+    
+    inline boost::shared_ptr<shape_file>& index()
+    {
+        return index_;
+    }
+    
+    inline bool has_index() const
+    {
+        return (index_ && index_->is_open());
+    }
+    
+    void move_to(int id);
+    int type() const;
+    const box2d<double>& current_extent() const;
+    mapnik::geometry_type * read_polyline();
+    mapnik::geometry_type * read_polylinem();
+    mapnik::geometry_type * read_polylinez();
+    mapnik::geometry_type * read_polygon();
+    mapnik::geometry_type * read_polygonm();
+    mapnik::geometry_type * read_polygonz();
 };
 
 #endif //SHAPE_IO_HPP
diff --git a/plugins/input/shape/shapefile.cpp b/plugins/input/shape/shapefile.cpp
deleted file mode 100644
index d85355d..0000000
--- a/plugins/input/shape/shapefile.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-
-#include "shapefile.hpp"
-
diff --git a/plugins/input/shape/shapefile.hpp b/plugins/input/shape/shapefile.hpp
index c4ec7a6..fba6599 100644
--- a/plugins/input/shape/shapefile.hpp
+++ b/plugins/input/shape/shapefile.hpp
@@ -25,19 +25,21 @@
 #ifndef SHAPEFILE_HPP
 #define SHAPEFILE_HPP
 
+// mapnik
 #include <mapnik/global.hpp>
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
+#include <mapnik/mapped_memory_cache.hpp>
+
 // boost
 #include <boost/utility.hpp>
 #include <boost/cstdint.hpp>
-#include <boost/iostreams/stream.hpp>
-
-#include <boost/iostreams/device/file.hpp>
-#include <boost/iostreams/device/mapped_file.hpp>
+#include <boost/interprocess/streams/bufferstream.hpp>
 
+// stl
 #include <cstring>
+#include <fstream>
 
-using mapnik::Envelope;
+using mapnik::box2d;
 using mapnik::read_int32_ndr;
 using mapnik::read_int32_xdr;
 using mapnik::read_double_ndr;
@@ -94,7 +96,7 @@ struct shape_record
       
     int read_ndr_integer()
     {
-	boost::int32_t val;
+        boost::int32_t val;
         read_int32_ndr(&data[pos],val);
         pos+=4;
         return val;
@@ -102,7 +104,7 @@ struct shape_record
       
     int read_xdr_integer()
     {
-	boost::int32_t val;
+        boost::int32_t val;
         read_int32_xdr(&data[pos],val);
         pos+=4;
         return val;
@@ -127,52 +129,61 @@ struct shape_record
  
 };
 
-using namespace boost::iostreams;
+using namespace boost::interprocess;
 
 class shape_file : boost::noncopyable
 {  
-#ifdef SHAPE_MEMORY_MAPPED_FILE
-    stream<mapped_file_source> file_;
-#else
-    stream<file_source> file_;
-#endif
-    
 public:
+
 #ifdef SHAPE_MEMORY_MAPPED_FILE
+    typedef ibufferstream file_source_type;
     typedef shape_record<MappedRecordTag> record_type;
 #else
+    typedef std::ifstream file_source_type;
     typedef shape_record<RecordTag> record_type;
 #endif
     
+    file_source_type file_;
     shape_file() {}
-
+    
     shape_file(std::string  const& file_name)
-        : 
+        :
 #ifdef SHAPE_MEMORY_MAPPED_FILE
-        file_(file_name)
-#else
-        file_(file_name,std::ios::in | std::ios::binary)
+        file_()
+#else  
+        file_(file_name.c_str(), std::ios::in | std::ios::binary)
 #endif
-    {}
+    {
+#ifdef SHAPE_MEMORY_MAPPED_FILE
+        
+        boost::optional<mapnik::mapped_region_ptr> memory = mapnik::mapped_memory_cache::find(file_name.c_str(),true);
+        if (memory)
+        {
+            file_.buffer(static_cast<char*>((*memory)->get_address()),(*memory)->get_size());
+        }
+#endif        
+    }
     
     ~shape_file() {}
 
-    inline bool is_open()
+    inline file_source_type & file()
     {
-        return file_.is_open();
+        return file_;
     }
-
-
-    inline void close()
+    
+    inline bool is_open()
     {
-        if (file_ && file_.is_open())
-            file_.close();
+#ifdef SHAPE_MEMORY_MAPPED_FILE
+        return (file_.buffer().second > 0);
+#else
+        return file_.is_open();
+#endif
     }
     
     inline void read_record(record_type& rec)
     {
 #ifdef SHAPE_MEMORY_MAPPED_FILE
-        rec.set_data(file_->data() + file_.tellg());
+        rec.set_data(file_.buffer().first + file_.tellg());
         file_.seekg(rec.size,std::ios::cur);
 #else
         file_.read(rec.get_data(),rec.size);
@@ -210,7 +221,7 @@ public:
         return val;
     }
     
-    inline void read_envelope(Envelope<double>& envelope)
+    inline void read_envelope(box2d<double>& envelope)
     {
 #ifndef MAPNIK_BIG_ENDIAN
         file_.read(reinterpret_cast<char*>(&envelope),sizeof(envelope));
diff --git a/plugins/input/shape/shp_index.hpp b/plugins/input/shape/shp_index.hpp
index a9dbc5c..37661dd 100644
--- a/plugins/input/shape/shp_index.hpp
+++ b/plugins/input/shape/shp_index.hpp
@@ -27,10 +27,10 @@
 #include <fstream>
 #include <vector>
 // mapnik
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 #include <mapnik/query.hpp>
 
-using mapnik::Envelope;
+using mapnik::box2d;
 using mapnik::query;
 
 template <typename filterT, typename IStream = std::ifstream>
@@ -44,7 +44,7 @@ private:
     shp_index(const shp_index&);
     shp_index& operator=(const shp_index&);
     static int read_ndr_integer(IStream & in);
-    static void read_envelope(IStream & in,Envelope<double> &envelope);
+    static void read_envelope(IStream & in,box2d<double> &envelope);
     static void query_node(const filterT& filter,IStream & in,std::vector<int>& pos);
 };
 
@@ -56,11 +56,11 @@ void shp_index<filterT, IStream>::query(const filterT& filter,IStream & file,std
 }
 
 template <typename filterT, typename IStream>
-void shp_index<filterT,IStream>::query_node(const filterT& filter,IStream &  file,std::vector<int>& ids)
+void shp_index<filterT,IStream>::query_node(const filterT& filter,IStream & file,std::vector<int>& ids)
 {
     int offset=read_ndr_integer(file);
 
-    Envelope<double> node_ext;
+    box2d<double> node_ext;
     read_envelope(file,node_ext);
 
     int num_shapes=read_ndr_integer(file);
@@ -96,7 +96,7 @@ int shp_index<filterT,IStream>::read_ndr_integer(IStream & file)
 
 
 template <typename filterT,typename IStream>
-void shp_index<filterT,IStream>::read_envelope(IStream & file,Envelope<double>& envelope)
+void shp_index<filterT,IStream>::read_envelope(IStream & file,box2d<double>& envelope)
 {
     file.read(reinterpret_cast<char*>(&envelope),sizeof(envelope));
 }
diff --git a/plugins/input/sqlite/SConscript b/plugins/input/sqlite/SConscript
deleted file mode 100644
index 2746617..0000000
--- a/plugins/input/sqlite/SConscript
+++ /dev/null
@@ -1,44 +0,0 @@
-#
-# This file is part of Mapnik (c++ mapping toolkit)
-#
-# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-# $Id$
-
-Import ('env')
-
-prefix = env['PREFIX']
-install_prefix = env['DESTDIR'] + '/' + prefix
-
-sqlite_src = Split(
-	"""
-	sqlite_datasource.cpp
-	sqlite_featureset.cpp      
-	"""
-        )
-
-libraries = [ 'sqlite3' ]
-if env['PLATFORM'] == 'Darwin':
-    libraries.append('mapnik')
-    libraries.append(env['ICU_LIB_NAME'])
-    libraries.append('boost_system%s' % env['BOOST_APPEND'])
-    libraries.append('boost_filesystem%s' % env['BOOST_APPEND'])
-    
-sqlite_inputdriver = env.SharedLibrary('sqlite', source=sqlite_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries)
-
-env.Install(install_prefix + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME'] + '/input', sqlite_inputdriver)
-env.Alias('install', install_prefix + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME'] + '/input')
diff --git a/plugins/input/sqlite/build.py b/plugins/input/sqlite/build.py
new file mode 100644
index 0000000..41a701c
--- /dev/null
+++ b/plugins/input/sqlite/build.py
@@ -0,0 +1,50 @@
+#
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2007 Artem Pavlenko, Jean-Francois Doyon
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+Import ('env')
+
+prefix = env['PREFIX']
+
+plugin_env = env.Clone()
+
+sqlite_src = Split(
+  """
+  sqlite_datasource.cpp
+  sqlite_featureset.cpp      
+  """
+        )
+
+libraries = [ 'sqlite3' ]
+
+# Link Library to Dependencies
+libraries.append('mapnik2')
+libraries.append(env['ICU_LIB_NAME'])
+libraries.append('boost_system%s' % env['BOOST_APPEND'])
+libraries.append('boost_filesystem%s' % env['BOOST_APPEND'])
+    
+input_plugin = plugin_env.SharedLibrary('../sqlite', source=sqlite_src, SHLIBPREFIX='', SHLIBSUFFIX='.input', LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS'])
+
+# if the plugin links to libmapnik2 ensure it is built first
+Depends(input_plugin, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME']))
+
+if 'uninstall' not in COMMAND_LINE_TARGETS:
+    env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], input_plugin)
+    env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST'])
diff --git a/plugins/input/sqlite/sqlite_datasource.cpp b/plugins/input/sqlite/sqlite_datasource.cpp
index a2e3132..7103228 100644
--- a/plugins/input/sqlite/sqlite_datasource.cpp
+++ b/plugins/input/sqlite/sqlite_datasource.cpp
@@ -2,7 +2,7 @@
  * 
  * This file is part of Mapnik (c++ mapping toolkit)
  *
- * Copyright (C) 2007 Artem Pavlenko
+ * Copyright (C) 2010 Artem Pavlenko
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -26,15 +26,19 @@
 
 // mapnik
 #include <mapnik/ptree_helpers.hpp>
+#include <mapnik/sql_utils.hpp>
+
+// to enable extent fallback hack
+#include <mapnik/feature_factory.hpp>
 
 // boost
 #include <boost/algorithm/string.hpp>
 #include <boost/lexical_cast.hpp>
+#include <boost/format.hpp>
 #include <boost/tokenizer.hpp>
 #include <boost/filesystem/operations.hpp>
+#include <boost/make_shared.hpp>
 
-using std::clog;
-using std::endl;
 
 using boost::lexical_cast;
 using boost::bad_lexical_cast;
@@ -44,7 +48,7 @@ using mapnik::parameters;
 
 DATASOURCE_PLUGIN(sqlite_datasource)
 
-using mapnik::Envelope;
+using mapnik::box2d;
 using mapnik::coord2d;
 using mapnik::query;
 using mapnik::featureset_ptr;
@@ -53,47 +57,122 @@ using mapnik::attribute_descriptor;
 using mapnik::datasource_exception;
 
 
-std::string table_from_sql(std::string const& sql)
-{
-   std::string table_name = boost::algorithm::to_lower_copy(sql);
-   boost::algorithm::replace_all(table_name,"\n"," ");
-   
-   std::string::size_type idx = table_name.rfind("from");
-   if (idx!=std::string::npos)
-   {
-      
-      idx=table_name.find_first_not_of(" ",idx+4);
-      if (idx != std::string::npos)
-      {
-         table_name=table_name.substr(idx);
-      }
-      idx=table_name.find_first_of(" ),");
-      if (idx != std::string::npos)
-      {
-         table_name = table_name.substr(0,idx);
-      }
-   }
-   return table_name;
-}
-
-sqlite_datasource::sqlite_datasource(parameters const& params)
+sqlite_datasource::sqlite_datasource(parameters const& params, bool bind)
    : datasource(params),
      extent_(),
      extent_initialized_(false),
      type_(datasource::Vector),
-     table_(*params.get<std::string>("table","")),
-     metadata_(*params.get<std::string>("metadata","")),
-     geometry_field_(*params.get<std::string>("geometry_field","the_geom")),
-     key_field_(*params.get<std::string>("key_field","OGC_FID")),
+     table_(*params_.get<std::string>("table","")),
+     fields_(*params_.get<std::string>("fields","*")),
+     metadata_(*params_.get<std::string>("metadata","")),
+     geometry_table_(*params_.get<std::string>("geometry_table","")),
+     geometry_field_(*params_.get<std::string>("geometry_field","")),
+     // index_table_ defaults to "idx_{geometry_table_}_{geometry_field_}"
+     index_table_(*params_.get<std::string>("index_table","")),
+     // http://www.sqlite.org/lang_createtable.html#rowid
+     key_field_(*params_.get<std::string>("key_field","")),
      row_offset_(*params_.get<int>("row_offset",0)),
      row_limit_(*params_.get<int>("row_limit",0)),
-     desc_(*params.get<std::string>("type"), *params.get<std::string>("encoding","utf-8")),
+     desc_(*params_.get<std::string>("type"), *params_.get<std::string>("encoding","utf-8")),
      format_(mapnik::wkbGeneric)
 {
-    boost::optional<std::string> file = params.get<std::string>("file");
-    if (!file) throw datasource_exception("missing <file> parameter");
+    // TODO
+    // - change param from 'file' to 'dbname'
+    // - ensure that the supplied key_field is a valid "integer primary key"
+    
+    boost::optional<std::string> file = params_.get<std::string>("file");
+    if (!file) throw datasource_exception("Sqlite Plugin: missing <file> parameter");
+
+    if (table_.empty()) {
+        throw mapnik::datasource_exception("Sqlite Plugin: missing <table> parameter");
+    }
+    
+    if (bind)
+    {
+        this->bind();
+    }
+}
+
+void sqlite_datasource::parse_attachdb(std::string const& attachdb) const
+{
+    boost::char_separator<char> sep(",");
+    boost::tokenizer<boost::char_separator<char> > tok(attachdb, sep);
+    
+    // The attachdb line is a comma sparated list of
+    //    [dbname@]filename
+    for (boost::tokenizer<boost::char_separator<char> >::iterator beg = tok.begin(); 
+         beg != tok.end(); ++beg)
+    {
+        std::string const& spec(*beg);
+        size_t atpos=spec.find('@');
+        
+        // See if it contains an @ sign
+        if (atpos==spec.npos) {
+            throw datasource_exception("attachdb parameter has syntax dbname at filename[,...]");
+        }
+        
+        // Break out the dbname and the filename
+        std::string dbname = boost::trim_copy(spec.substr(0, atpos));
+        std::string filename = boost::trim_copy(spec.substr(atpos+1));
+        
+        // Normalize the filename and make it relative to dataset_name_
+        if (filename.compare(":memory:") != 0) {
+
+            boost::filesystem::path child_path(filename);
+            
+            // It is a relative path.  Fix it.
+            if (!child_path.has_root_directory() && !child_path.has_root_name()) {
+                boost::filesystem::path absolute_path(dataset_name_);
+
+                // support symlinks
+                #if (BOOST_FILESYSTEM_VERSION == 3)
+                if (boost::filesystem::is_symlink(absolute_path))
+                {
+                    absolute_path = boost::filesystem::read_symlink(absolute_path);
+                }
+
+                filename = boost::filesystem::absolute(absolute_path.parent_path()/filename).string();
+
+                #else
+                if (boost::filesystem::is_symlink(absolute_path))
+                {
+                    //cannot figure out how to resolve on in v2 so just print a warning
+                    std::clog << "###Warning: '" << absolute_path.string() << "' is a symlink which is not supported in attachdb\n";
+                }
+
+                filename = boost::filesystem::complete(absolute_path.branch_path()/filename).normalize().string();
+
+                #endif
+            }
+        }
+        
+        // And add an init_statement_
+        init_statements_.push_back("attach database '" + filename + "' as " + dbname);
+    }
+}
 
-    boost::optional<std::string> wkb = params.get<std::string>("wkb_format");
+void sqlite_datasource::bind() const
+{
+    if (is_bound_) return;
+    
+    boost::optional<std::string> file = params_.get<std::string>("file");
+    if (!file) throw datasource_exception("Sqlite Plugin: missing <file> parameter");
+    
+    boost::optional<std::string> key_field_name = params_.get<std::string>("key_field");
+    if (key_field_name) {
+        std::string const& key_field_string = *key_field_name;
+        if (key_field_string.empty()) {
+            key_field_ = "rowid";
+        } else {
+            key_field_ = key_field_string;
+        }
+    }
+    else
+    {
+        key_field_ = "rowid";
+    }
+    
+    boost::optional<std::string> wkb = params_.get<std::string>("wkb_format");
     if (wkb)
     {
         if (*wkb == "spatialite")
@@ -102,102 +181,72 @@ sqlite_datasource::sqlite_datasource(parameters const& params)
 
     multiple_geometries_ = *params_.get<mapnik::boolean>("multiple_geometries",false);
     use_spatial_index_ = *params_.get<mapnik::boolean>("use_spatial_index",true);
+    has_spatial_index_ = false;
+    using_subquery_ = false;
 
-    boost::optional<std::string> base = params.get<std::string>("base");
+    boost::optional<std::string> ext  = params_.get<std::string>("extent");
+    if (ext) extent_initialized_ = extent_.from_string(*ext);
+
+    boost::optional<std::string> base = params_.get<std::string>("base");
     if (base)
         dataset_name_ = *base + "/" + *file;
     else
         dataset_name_ = *file;
 
-    if (!boost::filesystem::exists(dataset_name_)) throw datasource_exception(dataset_name_ + " does not exist");
+    // Populate init_statements_
+    //   1. Build attach database statements from the "attachdb" parameter
+    //   2. Add explicit init statements from "initdb" parameter
+    // Note that we do some extra work to make sure that any attached
+    // databases are relative to directory containing dataset_name_.  Sqlite
+    // will default to attaching from cwd.  Typicaly usage means that the
+    // map loader will produce full paths here.
+    boost::optional<std::string> attachdb = params_.get<std::string>("attachdb");
+    if (attachdb) {
+       parse_attachdb(*attachdb);
+    }
+    
+    boost::optional<std::string> initdb = params_.get<std::string>("initdb");
+    if (initdb) {
+       init_statements_.push_back(*initdb);
+    }
+
+    if (!boost::filesystem::exists(dataset_name_))
+        throw datasource_exception("Sqlite Plugin: " + dataset_name_ + " does not exist");
           
     dataset_ = new sqlite_connection (dataset_name_);
 
-    boost::optional<std::string> ext  = params_.get<std::string>("extent");
-    if (ext)
+    // Execute init_statements_
+    for (std::vector<std::string>::const_iterator iter=init_statements_.begin(); iter!=init_statements_.end(); ++iter)
     {
-        boost::char_separator<char> sep(",");
-        boost::tokenizer<boost::char_separator<char> > tok(*ext,sep);
-        unsigned i = 0;
-        bool success = false;
-        double d[4];
-        for (boost::tokenizer<boost::char_separator<char> >::iterator beg=tok.begin(); 
-             beg!=tok.end();++beg)
-        {
-            try 
-            {
-                d[i] = boost::lexical_cast<double>(*beg);
-            }
-            catch (boost::bad_lexical_cast & ex)
-            {
-                std::clog << ex.what() << "\n";
-                break;
-            }
-            if (i==3) 
-            {
-                success = true;
-                break;
-            }
-            ++i;
-        }
-
-        if (success)
-        {
-            extent_.init(d[0],d[1],d[2],d[3]);
-            extent_initialized_ = true;
-        }
-    } 
-    
-    std::string table_name = table_from_sql(table_);
+#ifdef MAPNIK_DEBUG
+        std::clog << "Sqlite Plugin: Execute init sql: " << *iter << std::endl;
+#endif
+        dataset_->execute(*iter);
+    }
     
-    if (metadata_ != "" && ! extent_initialized_)
+    if(geometry_table_.empty())
     {
-        std::ostringstream s;
-        s << "select xmin, ymin, xmax, ymax from " << metadata_;
-        s << " where lower(f_table_name) = lower('" << table_name << "')";
-        boost::scoped_ptr<sqlite_resultset> rs (dataset_->execute_query (s.str()));
-        if (rs->is_valid () && rs->step_next())
-        {
-            double xmin = rs->column_double (0);
-            double ymin = rs->column_double (1);
-            double xmax = rs->column_double (2);
-            double ymax = rs->column_double (3);
-
-            extent_.init (xmin,ymin,xmax,ymax);
-            extent_initialized_ = true;
-        }
+        geometry_table_ = mapnik::table_from_sql(table_);
     }
 
-    if (use_spatial_index_)
-    {
-        std::ostringstream s;
-        s << "select count (*) from sqlite_master";
-        s << " where lower(name) = lower('idx_" << table_name << "_" << geometry_field_ << "')";
-        boost::scoped_ptr<sqlite_resultset> rs (dataset_->execute_query (s.str()));
-        if (rs->is_valid () && rs->step_next())
-        {
-            use_spatial_index_ = rs->column_integer (0) == 1;
-        }
-
-#ifdef MAPNIK_DEBUG
-        if (! use_spatial_index_)
-           clog << "cannot use the spatial index " << endl;
-#endif
-    }
+    // should we deduce column names and types using PRAGMA?
+    bool use_pragma_table_info = true;
     
+    if (table_ != geometry_table_)
     {
-        /*
-            XXX - This is problematic, if we do not have at least a row,
-                  we cannot determine the right columns types and names 
-                  as all column_type are SQLITE_NULL
-        */
+        // if 'table_' is a subquery then we try to deduce names
+        // and types from the first row returned from that query
+        using_subquery_ = true;
+        use_pragma_table_info = false;
+    }
 
-        std::string::size_type idx = table_.find(table_name);
+    if (!use_pragma_table_info)
+    {
         std::ostringstream s;
-        s << "select * from (" << table_.substr(0,idx + table_name.length()) << ") limit 1";
-        
-        boost::scoped_ptr<sqlite_resultset> rs (dataset_->execute_query (s.str()));
-        if (rs->is_valid () && rs->step_next())
+        s << "SELECT " << fields_ << " FROM (" << table_ << ") LIMIT 1";
+
+        boost::scoped_ptr<sqlite_resultset> rs(dataset_->execute_query(s.str()));
+        if (rs->is_valid() && rs->step_next())
         {
             for (int i = 0; i < rs->column_count (); ++i)
             {
@@ -218,30 +267,331 @@ sqlite_datasource::sqlite_datasource(parameters const& params)
                      break;
                      
                   case SQLITE_NULL:
+                     // sqlite reports based on value, not actual column type unless
+                     // PRAGMA table_info is used so here we assume the column is a string
+                     // which is a lesser evil than altogether dropping the column
+                     desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::String));
+
                   case SQLITE_BLOB:
+                        if (geometry_field_.empty() && 
+                             (boost::algorithm::icontains(fld_name,"geom") ||
+                              boost::algorithm::icontains(fld_name,"point") ||
+                              boost::algorithm::icontains(fld_name,"linestring") ||
+                              boost::algorithm::icontains(fld_name,"polygon"))
+                            )
+                            geometry_field_ = std::string(fld_name);
                      break;
                      
                   default:
 #ifdef MAPNIK_DEBUG
-                     clog << "unknown type_oid="<<type_oid<<endl;
+                     std::clog << "Sqlite Plugin: unknown type_oid=" << type_oid << std::endl;
 #endif
                      break;
                 }
-            }    
+            }
+        }
+        else
+        {
+            // if we do not have at least a row and
+            // we cannot determine the right columns types and names 
+            // as all column_type are SQLITE_NULL
+            // so we fallback to using PRAGMA table_info
+            use_pragma_table_info = true;
+        }
+    }
+
+    if (key_field_ == "rowid")
+        desc_.add_descriptor(attribute_descriptor("rowid",mapnik::Integer));
+    
+    if (use_pragma_table_info)
+    {
+        std::ostringstream s;
+        s << "PRAGMA table_info(" << geometry_table_ << ")";
+        boost::scoped_ptr<sqlite_resultset> rs(dataset_->execute_query(s.str()));
+        bool found_table = false;
+        while (rs->is_valid() && rs->step_next())
+        {
+            found_table = true;
+            // TODO - support unicode strings?
+            const char* fld_name = rs->column_text(1);
+            std::string fld_type(rs->column_text(2));
+            boost::algorithm::to_lower(fld_type);
+
+            // see 2.1 "Column Affinity" at http://www.sqlite.org/datatype3.html
+            if (geometry_field_.empty() && 
+                       (
+                       (boost::algorithm::icontains(fld_name,"geom") ||
+                        boost::algorithm::icontains(fld_name,"point") ||
+                        boost::algorithm::icontains(fld_name,"linestring") ||
+                        boost::algorithm::icontains(fld_name,"polygon"))
+                       ||
+                       (boost::algorithm::contains(fld_type,"geom") ||
+                        boost::algorithm::contains(fld_type,"point") ||
+                        boost::algorithm::contains(fld_type,"linestring") ||
+                        boost::algorithm::contains(fld_type,"polygon"))
+                       )
+                    )
+                    geometry_field_ = std::string(fld_name);
+            else if (boost::algorithm::contains(fld_type,"int"))
+            {
+                desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Integer));
+            }
+            else if (boost::algorithm::contains(fld_type,"text") ||
+                     boost::algorithm::contains(fld_type,"char") ||
+                     boost::algorithm::contains(fld_type,"clob"))
+            {
+                desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::String));
+            }
+            else if (boost::algorithm::contains(fld_type,"real") ||
+                     boost::algorithm::contains(fld_type,"float") ||
+                     boost::algorithm::contains(fld_type,"double"))
+            {
+                desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Double));
+            }
+            else if (boost::algorithm::contains(fld_type,"blob") && !geometry_field_.empty())
+            {
+                 desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::String));
+            }
+#ifdef MAPNIK_DEBUG
+            else
+            {
+                // "Column Affinity" says default to "Numeric" but for now we pass..
+                //desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Double));
+                std::clog << "Sqlite Plugin: column '" << std::string(fld_name) << "' unhandled due to unknown type: " << fld_type << std::endl;
+            }
+#endif
+        }
+        if (!found_table)
+        {
+            std::ostringstream s;
+            s << "Sqlite Plugin: could not query table '" << geometry_table_ << "' ";
+            if (using_subquery_)
+                s << " from subquery '" << table_ << "' ";
+            s << "using 'PRAGMA table_info(" << geometry_table_  << ")' ";
+            std::string sq_err = std::string(sqlite3_errmsg(*(*dataset_)));
+            if (sq_err != "unknown error")
+                s << ": " << sq_err;
+            throw datasource_exception(s.str());
+        }
+    }
+
+    if (geometry_field_.empty()) {
+        throw datasource_exception("Sqlite Plugin: cannot detect geometry_field, please supply the name of the geometry_field to use.");
+    }
+
+    if (index_table_.size() == 0) {
+        // Generate implicit index_table name - need to do this after
+        // we have discovered meta-data or else we don't know the column name
+        index_table_ = "\"idx_" + mapnik::unquote_sql2(geometry_table_) + "_" + geometry_field_ + "\"";
+    }
+    
+    if (use_spatial_index_)
+    {
+        std::ostringstream s;
+        s << "SELECT pkid,xmin,xmax,ymin,ymax FROM " << index_table_;
+        s << " LIMIT 0";
+        if (dataset_->execute_with_code(s.str()) == SQLITE_OK)
+        {
+            has_spatial_index_ = true;
+        }
+        #ifdef MAPNIK_DEBUG
+        else
+        {
+            std::clog << "SQLite Plugin: rtree index lookup did not succeed: '" << sqlite3_errmsg(*(*dataset_)) << "'\n";
+        }
+        #endif
+    }
+
+    if (metadata_ != "" && !extent_initialized_)
+    {
+        std::ostringstream s;
+        s << "SELECT xmin, ymin, xmax, ymax FROM " << metadata_;
+        s << " WHERE LOWER(f_table_name) = LOWER('" << geometry_table_ << "')";
+        boost::scoped_ptr<sqlite_resultset> rs(dataset_->execute_query(s.str()));
+        if (rs->is_valid() && rs->step_next())
+        {
+            double xmin = rs->column_double (0);
+            double ymin = rs->column_double (1);
+            double xmax = rs->column_double (2);
+            double ymax = rs->column_double (3);
+
+            extent_.init (xmin,ymin,xmax,ymax);
+            extent_initialized_ = true;
+        }
+    }
+    
+    if (!extent_initialized_ && has_spatial_index_)
+    {
+        std::ostringstream s;
+        s << "SELECT MIN(xmin), MIN(ymin), MAX(xmax), MAX(ymax) FROM " 
+        << index_table_;
+        boost::scoped_ptr<sqlite_resultset> rs(dataset_->execute_query(s.str()));
+        if (rs->is_valid() && rs->step_next())
+        {
+            if (!rs->column_isnull(0)) {
+                try 
+                {
+                    double xmin = lexical_cast<double>(rs->column_double(0));
+                    double ymin = lexical_cast<double>(rs->column_double(1));
+                    double xmax = lexical_cast<double>(rs->column_double(2));
+                    double ymax = lexical_cast<double>(rs->column_double(3));
+                    extent_.init (xmin,ymin,xmax,ymax);
+                    extent_initialized_ = true;
+    
+                }
+                catch (bad_lexical_cast &ex)
+                {
+                    std::clog << boost::format("SQLite Plugin: warning: could not determine extent from query: %s\nError was: '%s'\n") % s.str() % ex.what() << std::endl;
+                }
+            }
+        }    
+    }
+
+#ifdef MAPNIK_DEBUG
+    if (!has_spatial_index_
+        && use_spatial_index_ 
+        && using_subquery_
+        && key_field_ == "rowid"
+        && !boost::algorithm::icontains(table_,"rowid")) {
+       // this is an impossible situation because rowid will be null via a subquery
+       std::clog << "Sqlite Plugin: WARNING: spatial index usage will fail because rowid is not present in your subquery. You have 4 options: 1) Add rowid into your select statement, 2) alias your primary key as rowid, 3) supply a 'key_field' value that references the primary key of your spatial table, or 4) avoid using a spatial index by setting 'use_spatial_index'=false";
+    }
+#endif
+    
+    // final fallback to gather extent
+    if (!extent_initialized_ || !has_spatial_index_) {
+                
+        std::ostringstream s;
+        
+        s << "SELECT " << geometry_field_ << "," << key_field_
+          << " FROM " << geometry_table_;
+        if (row_limit_ > 0) {
+            s << " LIMIT " << row_limit_;
         }
+        if (row_offset_ > 0) {
+            s << " OFFSET " << row_offset_;
+        }
+
+#ifdef MAPNIK_DEBUG
+        std::clog << "Sqlite Plugin: " << s.str() << std::endl;
+#endif
+
+        boost::shared_ptr<sqlite_resultset> rs(dataset_->execute_query(s.str()));
+        
+        // spatial index sql
+        std::string spatial_index_sql = "create virtual table " + index_table_ 
+            + " using rtree(pkid, xmin, xmax, ymin, ymax)";
+        std::string spatial_index_insert_sql = "insert into " + index_table_
+            + " values (?,?,?,?,?)" ;
+        sqlite3_stmt* stmt = 0;
+
+        if (use_spatial_index_) {    
+            dataset_->execute(spatial_index_sql);
+            int rc = sqlite3_prepare_v2 (*(*dataset_), spatial_index_insert_sql.c_str(), -1, &stmt, 0);
+            if (rc != SQLITE_OK)
+            {
+               std::ostringstream index_error;
+               index_error << "Sqlite Plugin: auto-index table creation failed: '"
+                 << sqlite3_errmsg(*(*dataset_)) << "' query was: " << spatial_index_insert_sql;
+               throw datasource_exception(index_error.str());
+            }
+        }
+
+        bool first = true;
+        while (rs->is_valid() && rs->step_next())
+        {
+            int size;
+            const char* data = (const char *) rs->column_blob (0, size);
+            if (data) {
+                // create a tmp feature to be able to parse geometry
+                // ideally we would not have to do this.
+                // see: http://trac.mapnik.org/ticket/745
+                mapnik::feature_ptr feature(mapnik::feature_factory::create(0));
+                mapnik::geometry_utils::from_wkb(feature->paths(),data,size,multiple_geometries_,format_);
+                mapnik::box2d<double> const& bbox = feature->envelope();
+                if (bbox.valid()) {
+                    extent_initialized_ = true;
+                    if (first) {
+                        first = false;
+                        extent_ = bbox;
+                    } else {
+                        extent_.expand_to_include(bbox);
+                    }
+
+                    // index creation
+                    if (use_spatial_index_) {
+                        const int type_oid = rs->column_type(1);
+                        if (type_oid != SQLITE_INTEGER) {
+                            std::ostringstream type_error;
+                            type_error << "Sqlite Plugin: invalid type for key field '"
+                                << key_field_ << "' when creating index '" << index_table_ 
+                                << "' type was: " << type_oid << "";
+                            throw datasource_exception(type_error.str());
+                        }
+    
+                        sqlite_int64 pkid = rs->column_integer64(1);
+                        if (sqlite3_bind_int64(stmt, 1 , pkid ) != SQLITE_OK)
+                        {
+                            throw datasource_exception("invalid value for for key field while generating index");
+                        }
+                        if ((sqlite3_bind_double(stmt, 2 , bbox.minx() ) != SQLITE_OK) ||
+                           (sqlite3_bind_double(stmt, 3 , bbox.maxx() ) != SQLITE_OK) ||
+                           (sqlite3_bind_double(stmt, 4 , bbox.miny() ) != SQLITE_OK) ||
+                           (sqlite3_bind_double(stmt, 5 , bbox.maxy() ) != SQLITE_OK)) {
+                               throw datasource_exception("invalid value for for extent while generating index");
+                           }
+
+                        int res = sqlite3_step(stmt);
+                        if (res != SQLITE_DONE) {
+                            std::ostringstream s;
+                            s << "SQLite Plugin: inserting bbox into rtree index failed: "
+                                 << "error code " << sqlite3_errcode(*(*dataset_)) << ": '"
+                                 << sqlite3_errmsg(*(*dataset_)) << "' query was: " << spatial_index_insert_sql;
+                            throw datasource_exception(s.str());
+                        }
+                        sqlite3_reset(stmt);
+                    }
+                }
+                else {
+                    std::ostringstream index_error;
+                    index_error << "SQLite Plugin: encountered invalid bbox at '"
+                        << key_field_ << "' == " << rs->column_integer64(1);
+                    throw datasource_exception(index_error.str());
+                }
+            }
+        }
+        
+        int res = sqlite3_finalize(stmt);
+        if (res != SQLITE_OK)
+        {
+            throw datasource_exception("auto-indexing failed: set use_spatial_index=false to disable auto-indexing and avoid this error");
+        }
+        
     }
+
+    if (!extent_initialized_) {
+        std::ostringstream s;
+        s << "Sqlite Plugin: extent could not be determined for table '" 
+          << geometry_table_ << "' and geometry field '" << geometry_field_ << "'"
+          << " because an rtree spatial index is missing or empty."
+          << " - either set the table 'extent' or create an rtree spatial index";
+        throw datasource_exception(s.str());
+    }
+    
+    is_bound_ = true;
 }
 
 sqlite_datasource::~sqlite_datasource()
 {
-    delete dataset_;
+    if (is_bound_) 
+    {
+        delete dataset_;
+    }
 }
 
-std::string const sqlite_datasource::name_="sqlite";
-
 std::string sqlite_datasource::name()
 {
-   return name_;
+   return "sqlite";
 }
 
 int sqlite_datasource::type() const
@@ -249,73 +599,85 @@ int sqlite_datasource::type() const
    return type_;
 }
 
-Envelope<double> sqlite_datasource::envelope() const
+box2d<double> sqlite_datasource::envelope() const
 {
+   if (!is_bound_) bind();
    return extent_;
 }
 
 layer_descriptor sqlite_datasource::get_descriptor() const
 {
+   if (!is_bound_) bind();
    return desc_;
 }
 
 featureset_ptr sqlite_datasource::features(query const& q) const
 {
+   if (!is_bound_) bind();
    if (dataset_)
    {
-        mapnik::Envelope<double> const& e = q.get_bbox();
+        mapnik::box2d<double> const& e = q.get_bbox();
 
         std::ostringstream s;
         
-        s << "select " << geometry_field_ << "," << key_field_;
+        s << "SELECT " << geometry_field_ << "," << key_field_;
         std::set<std::string> const& props = q.property_names();
         std::set<std::string>::const_iterator pos = props.begin();
         std::set<std::string>::const_iterator end = props.end();
         while (pos != end)
         {
-           s << "," << *pos << "";
-           ++pos;
-        }
+            s << ",\"" << *pos << "\"";
+            ++pos;
+        }       
         
-        s << " from "; 
+        s << " FROM "; 
         
-        std::string query (table_); 
+        std::string query (table_);
+        
+        /* todo
+          throw if select * and key_field == rowid?
+          or add schema support so sqlite throws
+        */
         
-        if (use_spatial_index_)
+        if (has_spatial_index_)
         {
-           std::string table_name = table_from_sql(query);
+           /* 
+              Use rtree to limit record id's to a given bbox
+              then a btree to pull the records for those ids.        
+           */
            std::ostringstream spatial_sql;
            spatial_sql << std::setprecision(16);
-           spatial_sql << " where rowid in (select pkid from idx_" << table_name << "_" << geometry_field_;
-           spatial_sql << " where xmax>=" << e.minx() << " and xmin<=" << e.maxx() ;
-           spatial_sql << " and ymax>=" << e.miny() << " and ymin<=" << e.maxy() << ")";
-           if (boost::algorithm::ifind_first(query,"where"))
+           spatial_sql << " WHERE " << key_field_ << " IN (SELECT pkid FROM " << index_table_;
+           spatial_sql << " WHERE xmax>=" << e.minx() << " AND xmin<=" << e.maxx() ;
+           spatial_sql << " AND ymax>=" << e.miny() << " AND ymin<=" << e.maxy() << ")";
+           if (boost::algorithm::ifind_first(query, "WHERE"))
            {
-              boost::algorithm::ireplace_first(query, "where", spatial_sql.str() + " and");
+              boost::algorithm::ireplace_first(query, "WHERE", spatial_sql.str() + " AND ");
            }
-           else if (boost::algorithm::find_first(query,table_name))  
+           else if (boost::algorithm::ifind_first(query, geometry_table_))  
            {
-              boost::algorithm::ireplace_first(query, table_name , table_name + " " + spatial_sql.str());
+              boost::algorithm::ireplace_first(query, table_, table_ + " " + spatial_sql.str());
            }
         }
         
         s << query ;
         
         if (row_limit_ > 0) {
-            s << " limit " << row_limit_;
+            s << " LIMIT " << row_limit_;
         }
 
         if (row_offset_ > 0) {
-            s << " offset " << row_offset_;
+            s << " OFFSET " << row_offset_;
         }
 
 #ifdef MAPNIK_DEBUG
-        std::cerr << s.str() << "\n";
+        std::clog << "Sqlite Plugin: table_: " << table_ << "\n\n";
+        std::clog << "Sqlite Plugin: query:" << s.str() << "\n\n";
 #endif
 
-        boost::shared_ptr<sqlite_resultset> rs (dataset_->execute_query (s.str()));
+        boost::shared_ptr<sqlite_resultset> rs(dataset_->execute_query(s.str()));
 
-        return featureset_ptr (new sqlite_featureset(rs, desc_.get_encoding(), format_, multiple_geometries_));
+        return boost::make_shared<sqlite_featureset>(rs, desc_.get_encoding(), format_, multiple_geometries_, using_subquery_);
    }
 
    return featureset_ptr();
@@ -323,19 +685,65 @@ featureset_ptr sqlite_datasource::features(query const& q) const
 
 featureset_ptr sqlite_datasource::features_at_point(coord2d const& pt) const
 {
-#if 0
-   if (dataset_ && layer_)
+   if (!is_bound_) bind();
+
+   if (dataset_)
    {
-        OGRPoint point;
-        point.setX (pt.x);
-        point.setY (pt.y);
+        // TODO - need tolerance
+        mapnik::box2d<double> const e(pt.x,pt.y,pt.x,pt.y);
+
+        std::ostringstream s;
+        s << "SELECT " << geometry_field_ << "," << key_field_;
+        std::vector<attribute_descriptor>::const_iterator itr = desc_.get_descriptors().begin();
+        std::vector<attribute_descriptor>::const_iterator end = desc_.get_descriptors().end();
+        while (itr != end)
+        {
+            std::string fld_name = itr->get_name();
+            if (fld_name != key_field_)
+                s << ",\"" << itr->get_name() << "\"";
+            ++itr;
+        }
         
-        layer_->SetSpatialFilter (&point);
+        s << " FROM "; 
         
-        return featureset_ptr(new ogr_featureset(*dataset_, *layer_, desc_.get_encoding(), multiple_geometries_));
-   }
+        std::string query (table_); 
+        
+        if (has_spatial_index_)
+        {
+           std::ostringstream spatial_sql;
+           spatial_sql << std::setprecision(16);
+           spatial_sql << " WHERE " << key_field_ << " IN (SELECT pkid FROM " << index_table_;
+           spatial_sql << " WHERE xmax>=" << e.minx() << " AND xmin<=" << e.maxx() ;
+           spatial_sql << " AND ymax>=" << e.miny() << " AND ymin<=" << e.maxy() << ")";
+           if (boost::algorithm::ifind_first(query, "WHERE"))
+           {
+              boost::algorithm::ireplace_first(query, "WHERE", spatial_sql.str() + " AND ");
+           }
+           else if (boost::algorithm::ifind_first(query, geometry_table_))  
+           {
+              boost::algorithm::ireplace_first(query, table_, table_ + " " + spatial_sql.str());
+           }
+        }
+        
+        s << query ;
+        
+        if (row_limit_ > 0) {
+            s << " LIMIT " << row_limit_;
+        }
+
+        if (row_offset_ > 0) {
+            s << " OFFSET " << row_offset_;
+        }
+
+#ifdef MAPNIK_DEBUG
+        std::clog << "Sqlite Plugin: " << s.str() << std::endl;
 #endif
 
+        boost::shared_ptr<sqlite_resultset> rs(dataset_->execute_query(s.str()));
+
+        return boost::make_shared<sqlite_featureset>(rs, desc_.get_encoding(), format_, multiple_geometries_, using_subquery_);
+   }
+      
    return featureset_ptr();
 }
 
diff --git a/plugins/input/sqlite/sqlite_datasource.hpp b/plugins/input/sqlite/sqlite_datasource.hpp
index 3b6f9c0..4f75d45 100644
--- a/plugins/input/sqlite/sqlite_datasource.hpp
+++ b/plugins/input/sqlite/sqlite_datasource.hpp
@@ -40,31 +40,41 @@
 class sqlite_datasource : public mapnik::datasource 
 {
    public:
-      sqlite_datasource(mapnik::parameters const& params);
+      sqlite_datasource(mapnik::parameters const& params, bool bind=true);
       virtual ~sqlite_datasource ();
       int type() const;
       static std::string name();
       mapnik::featureset_ptr features(mapnik::query const& q) const;
       mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt) const;
-      mapnik::Envelope<double> envelope() const;
+      mapnik::box2d<double> envelope() const;
       mapnik::layer_descriptor get_descriptor() const;
+      void bind() const;
    private:
-      static const std::string name_;
-      mapnik::Envelope<double> extent_;
+      mutable mapnik::box2d<double> extent_;
       mutable bool extent_initialized_;
       int type_;
-      std::string dataset_name_;
-      sqlite_connection* dataset_;
+      mutable std::string dataset_name_;
+      mutable sqlite_connection* dataset_;
       std::string table_;
+      std::string fields_;
       std::string metadata_;
-      std::string geometry_field_;
-      std::string key_field_;
-      const int row_offset_;
-      const int row_limit_;
-      mapnik::layer_descriptor desc_;
-      mapnik::wkbFormat format_;
-      bool multiple_geometries_;
-      bool use_spatial_index_;
+      mutable std::string geometry_table_;
+      mutable std::string geometry_field_;
+      mutable std::string index_table_;
+      mutable std::string key_field_;
+      mutable int row_offset_;
+      mutable int row_limit_;
+      mutable mapnik::layer_descriptor desc_;
+      mutable mapnik::wkbFormat format_;
+      mutable bool multiple_geometries_;
+      mutable bool use_spatial_index_;
+      mutable bool has_spatial_index_;
+      mutable bool using_subquery_;
+      mutable std::vector<std::string> init_statements_;
+      
+      // Fill init_statements with any statements
+      // needed to attach auxillary databases
+      void parse_attachdb(std::string const& attachdb) const;
 };
 
 
diff --git a/plugins/input/sqlite/sqlite_featureset.cpp b/plugins/input/sqlite/sqlite_featureset.cpp
index 6b889b9..528aa84 100644
--- a/plugins/input/sqlite/sqlite_featureset.cpp
+++ b/plugins/input/sqlite/sqlite_featureset.cpp
@@ -21,97 +21,179 @@
  *****************************************************************************/
 //$Id$
 
+// mapnik
 #include <mapnik/global.hpp>
 #include <mapnik/datasource.hpp>
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 #include <mapnik/geometry.hpp>
 #include <mapnik/feature.hpp>
 #include <mapnik/feature_layer_desc.hpp>
 #include <mapnik/wkb.hpp>
 #include <mapnik/unicode.hpp>
+#include <mapnik/feature_factory.hpp>
+#include <mapnik/sql_utils.hpp>
+#include <string.h>
 
 // ogr
 #include "sqlite_featureset.hpp"
 
-using std::clog;
-using std::endl;
-
 using mapnik::query;
-using mapnik::Envelope;
+using mapnik::box2d;
 using mapnik::CoordTransform;
 using mapnik::Feature;
 using mapnik::feature_ptr;
-using mapnik::point_impl;
-using mapnik::line_string_impl;
-using mapnik::polygon_impl;
-using mapnik::geometry2d;
 using mapnik::geometry_utils;
 using mapnik::transcoder;
+using mapnik::feature_factory;
 
 sqlite_featureset::sqlite_featureset(boost::shared_ptr<sqlite_resultset> rs,
                                      std::string const& encoding,
                                      mapnik::wkbFormat format,
-                                     bool multiple_geometries)
+                                     bool multiple_geometries,
+                                     bool using_subquery)
    : rs_(rs),
      tr_(new transcoder(encoding)),
      format_(format),
-     multiple_geometries_(multiple_geometries)
+     multiple_geometries_(multiple_geometries),
+     using_subquery_(using_subquery)
 {
 }
 
 sqlite_featureset::~sqlite_featureset() {}
 
+void sqlite_dequote(char *z){
+  char quote;                     /* Quote character (if any ) */
+
+  quote = z[0];
+  if( quote=='[' || quote=='\'' || quote=='"' || quote=='`' ){
+    int iIn = 1;                  /* Index of next byte to read from input */
+    int iOut = 0;                 /* Index of next byte to write to output */
+
+    /* If the first byte was a '[', then the close-quote character is a ']' */
+    if( quote=='[' ) quote = ']';  
+
+    while( z[iIn] ){
+      if( z[iIn]==quote ){
+        if( z[iIn+1]!=quote ) break;
+        z[iOut++] = quote;
+        iIn += 2;
+      }else{
+        z[iOut++] = z[iIn++];
+      }
+    }
+    z[iOut] = '\0';
+  }
+}
+
+
+
 feature_ptr sqlite_featureset::next()
 {
     if (rs_->is_valid () && rs_->step_next ())
     {
         int size;
         const char* data = (const char *) rs_->column_blob (0, size);
+        if (!data)
+            return feature_ptr();
         int feature_id = rs_->column_integer (1);   
 
-#ifdef MAPNIK_DEBUG
-        // clog << "feature_oid=" << feature_id << endl;
-#endif
-
-        feature_ptr feature(new Feature(feature_id));
-        geometry_utils::from_wkb(*feature,data,size,multiple_geometries_,format_);
+        feature_ptr feature(feature_factory::create(feature_id));
+        geometry_utils::from_wkb(feature->paths(),data,size,multiple_geometries_,format_);
         
         for (int i = 2; i < rs_->column_count (); ++i)
         {
-           const int type_oid = rs_->column_type (i);
-           const char* fld_name = rs_->column_name (i);
-           
-           switch (type_oid)
-           {
-              case SQLITE_INTEGER:
-              {
-                 boost::put(*feature,fld_name,rs_->column_integer (i));
-                 break;
-              }
-              
-              case SQLITE_FLOAT:
-              {
-                 boost::put(*feature,fld_name,rs_->column_double (i));
-                 break;
-              }
-              
-              case SQLITE_TEXT:
-              {
-                 UnicodeString ustr = tr_->transcode (rs_->column_text (i));
-                 boost::put(*feature,fld_name,ustr);
-                 break;
-              }
-              
-              case SQLITE_BLOB:
-              case SQLITE_NULL:
-                 break;
-                 
-              default:
-#ifdef MAPNIK_DEBUG
-                 clog << "unhandled type_oid=" << type_oid << endl;
-#endif
-                 break;
-           }
+            const int type_oid = rs_->column_type (i);
+            const char* fld_name = rs_->column_name(i);
+
+            if (!fld_name)
+                continue;
+
+            if (!using_subquery_)
+            {
+                switch (type_oid)
+                {
+                  case SQLITE_INTEGER:
+                  {
+                     boost::put(*feature,fld_name,rs_->column_integer (i));
+                     break;
+                  }
+                  
+                  case SQLITE_FLOAT:
+                  {
+                     boost::put(*feature,fld_name,rs_->column_double (i));
+                     break;
+                  }
+                  
+                  case SQLITE_TEXT:
+                  {
+                     int text_size;
+                     const char * data = rs_->column_text(i,text_size);
+                     UnicodeString ustr = tr_->transcode(data,text_size);
+                     boost::put(*feature,fld_name,ustr);
+                     break;
+                  }
+    
+                  case SQLITE_NULL:
+                  {
+                     boost::put(*feature,fld_name,mapnik::value_null());
+                     break;                 
+                  }
+                  
+                  case SQLITE_BLOB:
+                     break;
+                     
+                  default:
+    #ifdef MAPNIK_DEBUG
+                     std::clog << "Sqlite Plugin: unhandled type_oid=" << type_oid << std::endl;
+    #endif
+                     break;
+                }
+            }
+            else
+            {
+                // subqueries in sqlite lead to field double quoting which we need to strip
+                char fld_name2[strlen(fld_name)];
+                strcpy(fld_name2,fld_name);
+                sqlite_dequote(fld_name2);
+                switch (type_oid)
+                {
+                  case SQLITE_INTEGER:
+                  {
+                     boost::put(*feature,fld_name2,rs_->column_integer (i));
+                     break;
+                  }
+                  
+                  case SQLITE_FLOAT:
+                  {
+                     boost::put(*feature,fld_name2,rs_->column_double (i));
+                     break;
+                  }
+                  
+                  case SQLITE_TEXT:
+                  {
+                     int text_size;
+                     const char * data = rs_->column_text(i,text_size);
+                     UnicodeString ustr = tr_->transcode(data,text_size);
+                     boost::put(*feature,fld_name2,ustr);
+                     break;
+                  }
+    
+                  case SQLITE_NULL:
+                  {
+                     boost::put(*feature,fld_name2,mapnik::value_null());
+                     break;                 
+                  }
+                  
+                  case SQLITE_BLOB:
+                     break;
+                     
+                  default:
+    #ifdef MAPNIK_DEBUG
+                     std::clog << "Sqlite Plugin: unhandled type_oid=" << type_oid << std::endl;
+    #endif
+                     break;
+                }
+            }
         }
 
         return feature;
diff --git a/plugins/input/sqlite/sqlite_featureset.hpp b/plugins/input/sqlite/sqlite_featureset.hpp
index 0a025f0..d9d3eaf 100644
--- a/plugins/input/sqlite/sqlite_featureset.hpp
+++ b/plugins/input/sqlite/sqlite_featureset.hpp
@@ -43,7 +43,8 @@ class sqlite_featureset : public mapnik::Featureset
       sqlite_featureset(boost::shared_ptr<sqlite_resultset> rs,
                         std::string const& encoding,
                         mapnik::wkbFormat format,
-                        bool multiple_geometries);
+                        bool multiple_geometries,
+                        bool using_subquery);
       virtual ~sqlite_featureset();
       mapnik::feature_ptr next();
    private:
@@ -51,6 +52,7 @@ class sqlite_featureset : public mapnik::Featureset
       boost::scoped_ptr<mapnik::transcoder> tr_;
       mapnik::wkbFormat format_;
       bool multiple_geometries_;
+      bool using_subquery_;
 };
 
 #endif // SQLITE_FEATURESET_HPP
diff --git a/plugins/input/sqlite/sqlite_types.hpp b/plugins/input/sqlite/sqlite_types.hpp
index 5b64c7a..7c57272 100644
--- a/plugins/input/sqlite/sqlite_types.hpp
+++ b/plugins/input/sqlite/sqlite_types.hpp
@@ -58,7 +58,15 @@ public:
 
     bool step_next ()
     {
-        return (sqlite3_step (stmt_) == SQLITE_ROW);
+        int status = sqlite3_step (stmt_);
+        if (status != SQLITE_ROW && status != SQLITE_DONE) {
+            std::ostringstream s;
+            s << "SQLite Plugin: retrieving next row failed";
+            std::string msg(sqlite3_errmsg(sqlite3_db_handle(stmt_)));
+            if (msg != "unknown error") s << ": " << msg;
+            throw mapnik::datasource_exception(s.str());
+        }
+        return status == SQLITE_ROW;
     }
 
     int column_count ()
@@ -86,11 +94,23 @@ public:
         return sqlite3_column_int (stmt_, col);
     }
 
+    int column_integer64 (int col)
+    {
+        return sqlite3_column_int64 (stmt_, col);
+    }
+
     double column_double (int col)
     {
         return sqlite3_column_double (stmt_, col);
     }
 
+    const char* column_text (int col, int& len)
+    {
+        const char* text = (const char*) sqlite3_column_text (stmt_, col);
+        len = sqlite3_column_bytes (stmt_, col);
+        return text;
+    }
+
     const char* column_text (int col)
     {
         return (const char*) sqlite3_column_text (stmt_, col);
@@ -98,9 +118,9 @@ public:
 
     const void* column_blob (int col, int& bytes)
     {
+        const char* blob = (const char*) sqlite3_column_blob (stmt_, col);
         bytes = sqlite3_column_bytes (stmt_, col);
-    
-        return sqlite3_column_blob (stmt_, col);
+        return blob;
     }
 
     sqlite3_stmt* get_statement()
@@ -122,9 +142,26 @@ public:
     sqlite_connection (const std::string& file)
         : db_(0)
     {
+        // sqlite3_open_v2 is available earlier but 
+        // shared cache not available until >= 3.6.18
+        #if SQLITE_VERSION_NUMBER >= 3006018
+        int rc = sqlite3_enable_shared_cache(1);
+        if (rc != SQLITE_OK)
+        {
+           throw mapnik::datasource_exception (sqlite3_errmsg (db_));
+        }
+        
+        int mode = SQLITE_OPEN_READWRITE | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_SHAREDCACHE;
+        if (sqlite3_open_v2 (file.c_str(), &db_, mode, NULL))
+        #else
+        #warning "Mapnik's sqlite plugin is compiling against an version of sqlite older than 3.6.18 which may make rendering slow..."
         if (sqlite3_open (file.c_str(), &db_))
+        #endif
+        {
+            std::ostringstream s;
+            s << "Sqlite Plugin: ";
             throw mapnik::datasource_exception (sqlite3_errmsg (db_));
-
+        }
         //sqlite3_enable_load_extension(db_, 1);
     }
 
@@ -134,19 +171,47 @@ public:
             sqlite3_close (db_);
     }
 
-    sqlite_resultset* execute_query (const std::string& sql)
+    void throw_sqlite_error(const std::string& sql)
+    {
+      std::ostringstream s;
+      s << "Sqlite Plugin: ";
+      if (db_)
+          s << "'" << sqlite3_errmsg(db_) << "'";
+      else
+          s << "unknown error, lost connection";
+      
+      s << "\nFull sql was: '" <<  sql << "'\n";
+      throw mapnik::datasource_exception( s.str() ); 
+    }
+    
+    sqlite_resultset* execute_query(const std::string& sql)
     {
         sqlite3_stmt* stmt = 0;
 
         int rc = sqlite3_prepare_v2 (db_, sql.c_str(), -1, &stmt, 0);
         if (rc != SQLITE_OK)
         {
-            std::clog << sqlite3_errmsg(db_) << std::endl;
+           throw_sqlite_error(sql);
         }
 
         return new sqlite_resultset (stmt);
-	}
+    }
+  
+    void execute(const std::string& sql)
+    {
+        int rc=sqlite3_exec(db_, sql.c_str(), 0, 0, 0);
+        if (rc != SQLITE_OK)
+        {
+            throw_sqlite_error(sql);
+        }
+    }
 
+    int execute_with_code(const std::string& sql)
+    {
+        int rc=sqlite3_exec(db_, sql.c_str(), 0, 0, 0);
+        return rc;
+    }
+   
     sqlite3* operator*()
     {
         return db_;
diff --git a/plugins/input/templates/README b/plugins/input/templates/README
new file mode 100644
index 0000000..2b80be8
--- /dev/null
+++ b/plugins/input/templates/README
@@ -0,0 +1,14 @@
+template plugins
+----------------
+
+Directory to hold sample plugin templates.
+
+These are NOT intended to be used except for testing by developers.
+
+Build these plugins with:
+
+$ scons SAMPLE_INPUT_PLUGINS=True
+
+Only an ultra-simple hello world is available currently,
+but planned are example plugins templates for file-based
+and sql-based datasources.
diff --git a/plugins/input/templates/helloworld/README b/plugins/input/templates/helloworld/README
new file mode 100644
index 0000000..51483d6
--- /dev/null
+++ b/plugins/input/templates/helloworld/README
@@ -0,0 +1,51 @@
+hello world plugin
+------------------
+
+This is a very simple sample plugin. It is designed to help developers
+see the skeletal basics needed to achieve a functional datasource plugin.
+
+Code comments attempt to highlight which code is mandatory, which is
+simply recommended, and which is purely fluff used to get the plugin to
+actually show some data.
+
+When added to a map it provides a single point geometry representing
+the center of any query. This means that it should place a point in
+the middle of any map tile and display a "hello world!" label if used like:
+
+<?xml version="1.0" encoding="utf-8"?>
+<Map srs="+init=epsg:4326" background-color="white">
+    <Style name="style">
+        <Rule>
+            <PointSymbolizer />
+            <TextSymbolizer name="[key]" face_name="DejaVu Sans Book" size="10" dx="5" dy="5"/>
+        </Rule>
+    </Style>
+    <Layer name="test" srs="+init=epsg:4326">
+        <StyleName>style</StyleName>
+        <Datasource>
+            <Parameter name="type">hello</Parameter>
+        </Datasource>
+    </Layer>
+</Map>
+
+
+Or used in python like:
+
+from mapnik2 import *
+m = Map(600,400)
+m.background = Color('white')
+s = Style()
+r = Rule()
+r.symbols.append(PointSymbolizer())
+t = TextSymbolizer(Expression("[key]"),"DejaVu Sans Book",10,Color('black'))
+t.displacement = (15,15)
+r.symbols.append(t)
+s.rules.append(r)
+m.append_style('style',s)
+ds = Datasource(type="hello")
+l = Layer('test')
+l.styles.append('style')
+l.datasource = ds
+m.layers.append(l)
+m.zoom_all()
+render_to_file(m,'test.png')
diff --git a/plugins/input/templates/helloworld/build.py b/plugins/input/templates/helloworld/build.py
new file mode 100644
index 0000000..88c09a3
--- /dev/null
+++ b/plugins/input/templates/helloworld/build.py
@@ -0,0 +1,74 @@
+#!/usr/bin/env python
+
+# Mapnik uses the build tool SCons.
+
+# This python file is run to compile a plugin
+# It must be called from the main 'SConstruct' file like:
+
+# SConscript('path/to/this/file.py')
+
+# see docs at: http://www.scons.org/wiki/SConscript()
+
+import os
+
+# Give this plugin a name
+# here this happens to be the same as the directory
+PLUGIN_NAME = 'hello'
+
+# Here we pull from the SCons environment exported from the main instance
+Import ('env')
+
+# the below install details are also pulled from the
+# main SConstruct file where configuration happens
+
+# plugins can go anywhere, and be registered in custom locations by Mapnik
+# but the standard location is '/usr/local/lib/mapnik2/input'
+install_dest = env['MAPNIK_INPUT_PLUGINS_DEST']
+
+# clone the environment here
+# so that if we modify the env it in this file
+# those changes to not pollute other builds later on...
+plugin_env = env.Clone()
+
+# Add the cpp files that need to be compiled
+plugin_sources = Split(
+  """
+  %(PLUGIN_NAME)s_datasource.cpp
+  %(PLUGIN_NAME)s_featureset.cpp      
+  """ % locals()
+        )
+
+# Add any external libraries this plugin should
+# directly link to
+libraries = [ '' ] # eg 'libfoo'
+
+libraries.append('mapnik2')
+# link libicuuc, but ICU_LIB_NAME is used custom builds of icu can
+# have different library names like osx which offers /usr/lib/libicucore.dylib
+libraries.append(env['ICU_LIB_NAME'])
+    
+TARGET = plugin_env.SharedLibrary(
+              # the name of the target to build, eg 'sqlite.input'
+              '../%s' % PLUGIN_NAME,
+              # prefix - normally none used
+              SHLIBPREFIX='',
+              # extension, mapnik expects '.input'
+              SHLIBSUFFIX='.input',
+              # list of source files to compile
+              source=plugin_sources,
+              # libraries to link to
+              LIBS=libraries,
+              # any custom linkflags, eg. LDFLAGS
+              # in this case CUSTOM_LDFLAGS comes
+              # from Mapnik's main SConstruct file
+              # and can be removed here if you do
+              # not need it
+              LINKFLAGS=env.get('CUSTOM_LDFLAGS')
+              )
+
+# if 'uninstall' is not passed on the command line
+# then we actually create the install targets that
+# scons will install if 'install' is passed as an arg
+if 'uninstall' not in COMMAND_LINE_TARGETS:
+    env.Install(install_dest, TARGET)
+    env.Alias('install', install_dest)
diff --git a/plugins/input/templates/helloworld/hello_datasource.cpp b/plugins/input/templates/helloworld/hello_datasource.cpp
new file mode 100644
index 0000000..d817e9a
--- /dev/null
+++ b/plugins/input/templates/helloworld/hello_datasource.cpp
@@ -0,0 +1,90 @@
+// file plugin
+#include "hello_datasource.hpp"
+#include "hello_featureset.hpp"
+
+// boost
+#include <boost/make_shared.hpp>
+
+
+using mapnik::datasource;
+using mapnik::parameters;
+
+DATASOURCE_PLUGIN(hello_datasource)
+
+hello_datasource::hello_datasource(parameters const& params, bool bind)
+   : datasource(params),
+     type_(datasource::Vector),
+     desc_(*params_.get<std::string>("type"), *params_.get<std::string>("encoding","utf-8")),
+     extent_()
+{
+    if (bind)
+    {
+        this->bind();
+    }
+}
+
+void hello_datasource::bind() const
+{
+    if (is_bound_) return;
+    
+    // every datasource must have some way of reporting its extent
+    // in this case we are not actually reading from any data so for fun
+    // let's just create a world extent in Mapnik's default srs:
+    // '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs' (equivalent to +init=epsg:4326)
+    // see http://spatialreference.org/ref/epsg/4326/ for more details
+    extent_.init(-180,-90,180,90);
+    
+    is_bound_ = true;
+}
+
+hello_datasource::~hello_datasource() { }
+
+// This name must match the plugin filename, eg 'hello.input'
+std::string const hello_datasource::name_="hello";
+
+std::string hello_datasource::name()
+{
+    return name_;
+}
+
+int hello_datasource::type() const
+{
+    return type_;
+}
+
+mapnik::box2d<double> hello_datasource::envelope() const
+{
+    if (!is_bound_) bind();
+
+    return extent_;
+}
+
+mapnik::layer_descriptor hello_datasource::get_descriptor() const
+{
+    if (!is_bound_) bind();
+   
+    return desc_;
+}
+
+mapnik::featureset_ptr hello_datasource::features(mapnik::query const& q) const
+{
+    if (!is_bound_) bind();
+      
+    // if the query box intersects our world extent then query for features
+    if (extent_.intersects(q.get_bbox()))
+    {
+        return boost::make_shared<hello_featureset>(q.get_bbox(),desc_.get_encoding());
+    }
+
+    // otherwise return an empty featureset pointer
+    return mapnik::featureset_ptr();
+}
+
+mapnik::featureset_ptr hello_datasource::features_at_point(mapnik::coord2d const& pt) const
+{
+    if (!is_bound_) bind();
+
+    // features_at_point is rarely used - only by custom applications,
+    // so for this sample plugin let's do nothing...
+    return mapnik::featureset_ptr();
+}
diff --git a/plugins/input/templates/helloworld/hello_datasource.hpp b/plugins/input/templates/helloworld/hello_datasource.hpp
new file mode 100644
index 0000000..1921ee9
--- /dev/null
+++ b/plugins/input/templates/helloworld/hello_datasource.hpp
@@ -0,0 +1,51 @@
+#ifndef FILE_DATASOURCE_HPP
+#define FILE_DATASOURCE_HPP
+
+// mapnik
+#include <mapnik/datasource.hpp>
+
+class hello_datasource : public mapnik::datasource 
+{
+   public:
+      // constructor
+      // arguments must not change
+      hello_datasource(mapnik::parameters const& params, bool bind=true);
+      
+      // destructor
+      virtual ~hello_datasource ();
+      
+      // mandatory: type of the plugin, used to match at runtime
+      int type() const;
+
+      // mandatory: name of the plugin
+      static std::string name();
+
+      // mandatory: function to query features by box2d
+      // this is called when rendering, specifically in feature_style_processor.hpp
+      mapnik::featureset_ptr features(mapnik::query const& q) const;
+
+      // mandatory: function to query features by point (coord2d)
+      // not used by rendering, but available to calling applications
+      mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt) const;
+
+      // mandatory: return the box2d of the datasource
+      // called during rendering to determine if the layer should be processed
+      mapnik::box2d<double> envelope() const;
+      
+      // mandatory: return the layer descriptor
+      mapnik::layer_descriptor get_descriptor() const;
+      
+      // mandatory: will bind the datasource given params
+      void bind() const;
+
+   private:
+      // recommended naming convention of datasource members:
+      // name_, type_, extent_, and desc_
+      static const std::string name_;
+      int type_;
+      mutable mapnik::layer_descriptor desc_;
+      mutable mapnik::box2d<double> extent_;
+};
+
+
+#endif // FILE_DATASOURCE_HPP
diff --git a/plugins/input/templates/helloworld/hello_featureset.cpp b/plugins/input/templates/helloworld/hello_featureset.cpp
new file mode 100644
index 0000000..6976fa2
--- /dev/null
+++ b/plugins/input/templates/helloworld/hello_featureset.cpp
@@ -0,0 +1,61 @@
+// mapnik
+#include <mapnik/feature_factory.hpp>
+#include <mapnik/geometry.hpp>
+
+#include "hello_featureset.hpp"
+
+hello_featureset::hello_featureset(mapnik::box2d<double> const& box, std::string const& encoding)
+  : box_(box),
+    feature_id_(1),
+    tr_(new mapnik::transcoder(encoding)) { }
+
+hello_featureset::~hello_featureset() { }
+
+mapnik::feature_ptr hello_featureset::next()
+{
+    if (feature_id_ == 1)
+    {
+        // create a new feature
+        mapnik::feature_ptr feature(mapnik::feature_factory::create(feature_id_));
+
+        // increment the count so that we only return one feature
+        ++feature_id_;
+
+        // create an attribute pair of key:value
+        UnicodeString ustr = tr_->transcode("hello world!");
+        boost::put(*feature,"key",ustr);
+
+        // we need a geometry to display so just for fun here
+        // we take the center of the bbox that was used to query
+        // since we don't actually have any data to pull from...
+        mapnik::coord2d center = box_.center();
+        
+        // create a new point geometry
+        mapnik::geometry_type * pt = new mapnik::geometry_type(mapnik::Point);
+        
+        // we use path type geometries in Mapnik to fit nicely with AGG and Cairo
+        // here we stick an x,y pair into the geometry using move_to()
+        pt->move_to(center.x,center.y);
+        
+        // add the geometry to the feature
+        feature->add_geometry(pt);
+        
+        // A feature usually will have just one geometry of a given type
+        // but mapnik does support many geometries per feature of any type
+        // so here we draw a line around the point
+        mapnik::geometry_type * line = new mapnik::geometry_type(mapnik::LineString);
+        line->move_to(box_.minx(),box_.miny());
+        line->line_to(box_.minx(),box_.maxy());
+        line->line_to(box_.maxx(),box_.maxy());
+        line->line_to(box_.maxx(),box_.miny());
+        line->line_to(box_.minx(),box_.miny());
+        feature->add_geometry(line);
+        
+        // return the feature!
+        return feature;
+    }
+    
+    // otherwise return an empty feature
+    return mapnik::feature_ptr();
+}
+
diff --git a/plugins/input/templates/helloworld/hello_featureset.hpp b/plugins/input/templates/helloworld/hello_featureset.hpp
new file mode 100644
index 0000000..e3d0dc5
--- /dev/null
+++ b/plugins/input/templates/helloworld/hello_featureset.hpp
@@ -0,0 +1,30 @@
+#ifndef HELLO_FEATURESET_HPP
+#define HELLO_FEATURESET_HPP
+
+// mapnik
+#include <mapnik/datasource.hpp>
+
+// boost
+#include <boost/scoped_ptr.hpp> // needed for wrapping the transcoder
+
+// extend the mapnik::Featureset defined in include/mapnik/datasource.hpp
+class hello_featureset : public mapnik::Featureset
+{
+   public:
+      // this constructor can have any arguments you need
+      hello_featureset(mapnik::box2d<double> const& box, std::string const& encoding);
+      
+      // desctructor
+      virtual ~hello_featureset();
+      
+      // mandatory: you must expose a next() method, called when rendering
+      mapnik::feature_ptr next();
+   
+   private:
+      // members are up to you, but these are recommended
+      mapnik::box2d<double> const& box_;
+      mutable int feature_id_;
+      boost::scoped_ptr<mapnik::transcoder> tr_;
+};
+
+#endif // HELLO_FEATURESET_HPP
diff --git a/plugins/input/templates/helloworld/test.xml b/plugins/input/templates/helloworld/test.xml
new file mode 100644
index 0000000..a23792c
--- /dev/null
+++ b/plugins/input/templates/helloworld/test.xml
@@ -0,0 +1,19 @@
+<Map srs="+init=epsg:4326" background-color="white" minimum-version="0.7.2">
+    <Style name="style">
+        <Rule>
+            <PointSymbolizer/>
+            <!-- the hello world sample hardcodes 'key' as the hypothetical field name -->
+            <TextSymbolizer name="[key]" size="10" dx="5" dy="5" face-name="DejaVu Sans Book"/>
+            <LineSymbolizer stroke="green" stroke-width="3"/>
+        </Rule>
+    </Style>
+    <!-- this example only works in EPSG:4326 -->
+    <Layer name="test" srs="+init=epsg:4326">
+        <StyleName>style</StyleName>
+        <Datasource>
+            <!-- here we create a 'hello' type datasource which simply
+            displays a point in the middle of the world's boundin box -->
+            <Parameter name="type">hello</Parameter>
+        </Datasource>
+    </Layer>
+</Map>
\ No newline at end of file
diff --git a/scons/scons-LICENSE b/scons/scons-LICENSE
index 804ed86..790d971 100644
--- a/scons/scons-LICENSE
+++ b/scons/scons-LICENSE
@@ -3,7 +3,7 @@
         This copyright and license do not apply to any other software
         with which this software may have been included.
 
-Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 The SCons Foundation
+Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
 
 Permission is hereby granted, free of charge, to any person obtaining
 a copy of this software and associated documentation files (the
diff --git a/scons/scons-README b/scons/scons-README
index 298a221..32b691c 100644
--- a/scons/scons-README
+++ b/scons/scons-README
@@ -1,4 +1,4 @@
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 The SCons Foundation
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
 
                  SCons - a software construction tool
 
@@ -44,7 +44,7 @@ scons-local package, or any SCons package, at the SCons download page:
 EXECUTION REQUIREMENTS
 ======================
 
-Running SCons requires Python version 1.5.2 or later.  There should be
+Running SCons requires Python version 2.4 or later.  There should be
 no other dependencies or requirements to run SCons.
 
 The default SCons configuration assumes use of the Microsoft Visual C++
diff --git a/scons/scons-local-1.2.0/SCons/Tool/__init__.py b/scons/scons-local-1.2.0/SCons/Tool/__init__.py
index 0b03282..803defe 100644
--- a/scons/scons-local-1.2.0/SCons/Tool/__init__.py
+++ b/scons/scons-local-1.2.0/SCons/Tool/__init__.py
@@ -581,9 +581,9 @@ def tool_list(platform, env):
         ars = ['sgiar']
     elif str(platform) == 'sunos':
         "prefer Forte tools on SunOS"
-        linkers = ['sunlink', 'gnulink']
-        c_compilers = ['suncc', 'gcc', 'cc']
-        cxx_compilers = ['sunc++', 'g++', 'c++']
+        linkers = ['gnulink','sunlink']
+        c_compilers = ['gcc','suncc', 'cc']
+        cxx_compilers = ['g++','sunc++', 'c++']
         assemblers = ['as', 'gas']
         fortran_compilers = ['sunf95', 'sunf90', 'sunf77', 'f95', 'f90', 'f77',
                              'gfortran', 'g77', 'fortran']
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Action.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Action.py
new file mode 100644
index 0000000..e5cc54b
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Action.py
@@ -0,0 +1,1241 @@
+"""SCons.Action
+
+This encapsulates information about executing any sort of action that
+can build one or more target Nodes (typically files) from one or more
+source Nodes (also typically files) given a specific Environment.
+
+The base class here is ActionBase.  The base class supplies just a few
+OO utility methods and some generic methods for displaying information
+about an Action in response to the various commands that control printing.
+
+A second-level base class is _ActionAction.  This extends ActionBase
+by providing the methods that can be used to show and perform an
+action.  True Action objects will subclass _ActionAction; Action
+factory class objects will subclass ActionBase.
+
+The heavy lifting is handled by subclasses for the different types of
+actions we might execute:
+
+    CommandAction
+    CommandGeneratorAction
+    FunctionAction
+    ListAction
+
+The subclasses supply the following public interface methods used by
+other modules:
+
+    __call__()
+        THE public interface, "calling" an Action object executes the
+        command or Python function.  This also takes care of printing
+        a pre-substitution command for debugging purposes.
+
+    get_contents()
+        Fetches the "contents" of an Action for signature calculation
+        plus the varlist.  This is what gets MD5 checksummed to decide
+        if a target needs to be rebuilt because its action changed.
+
+    genstring()
+        Returns a string representation of the Action *without*
+        command substitution, but allows a CommandGeneratorAction to
+        generate the right action based on the specified target,
+        source and env.  This is used by the Signature subsystem
+        (through the Executor) to obtain an (imprecise) representation
+        of the Action operation for informative purposes.
+
+
+Subclasses also supply the following methods for internal use within
+this module:
+
+    __str__()
+        Returns a string approximation of the Action; no variable
+        substitution is performed.
+
+    execute()
+        The internal method that really, truly, actually handles the
+        execution of a command or Python function.  This is used so
+        that the __call__() methods can take care of displaying any
+        pre-substitution representations, and *then* execute an action
+        without worrying about the specific Actions involved.
+
+    get_presig()
+        Fetches the "contents" of a subclass for signature calculation.
+        The varlist is added to this to produce the Action's contents.
+
+    strfunction()
+        Returns a substituted string representation of the Action.
+        This is used by the _ActionAction.show() command to display the
+        command/function that will be executed to generate the target(s).
+
+There is a related independent ActionCaller class that looks like a
+regular Action, and which serves as a wrapper for arbitrary functions
+that we want to let the user specify the arguments to now, but actually
+execute later (when an out-of-date check determines that it's needed to
+be executed, for example).  Objects of this class are returned by an
+ActionFactory class that provides a __call__() method as a convenient
+way for wrapping up the functions.
+
+"""
+
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Action.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.compat
+
+import dis
+import os
+# compat layer imports "cPickle" for us if it's available.
+import pickle
+import re
+import sys
+import subprocess
+
+from SCons.Debug import logInstanceCreation
+import SCons.Errors
+import SCons.Executor
+import SCons.Util
+import SCons.Subst
+
+# we use these a lot, so try to optimize them
+is_String = SCons.Util.is_String
+is_List = SCons.Util.is_List
+
+class _null(object):
+    pass
+
+print_actions = 1
+execute_actions = 1
+print_actions_presub = 0
+
+def rfile(n):
+    try:
+        return n.rfile()
+    except AttributeError:
+        return n
+
+def default_exitstatfunc(s):
+    return s
+
+try:
+    SET_LINENO = dis.SET_LINENO
+    HAVE_ARGUMENT = dis.HAVE_ARGUMENT
+except AttributeError:
+    remove_set_lineno_codes = lambda x: x
+else:
+    def remove_set_lineno_codes(code):
+        result = []
+        n = len(code)
+        i = 0
+        while i < n:
+            c = code[i]
+            op = ord(c)
+            if op >= HAVE_ARGUMENT:
+                if op != SET_LINENO:
+                    result.append(code[i:i+3])
+                i = i+3
+            else:
+                result.append(c)
+                i = i+1
+        return ''.join(result)
+
+strip_quotes = re.compile('^[\'"](.*)[\'"]$')
+
+
+def _callable_contents(obj):
+    """Return the signature contents of a callable Python object.
+    """
+    try:
+        # Test if obj is a method.
+        return _function_contents(obj.im_func)
+
+    except AttributeError:
+        try:
+            # Test if obj is a callable object.
+            return _function_contents(obj.__call__.im_func)
+
+        except AttributeError:
+            try:
+                # Test if obj is a code object.
+                return _code_contents(obj)
+
+            except AttributeError:
+                    # Test if obj is a function object.
+                    return _function_contents(obj)
+
+
+def _object_contents(obj):
+    """Return the signature contents of any Python object.
+
+    We have to handle the case where object contains a code object
+    since it can be pickled directly.
+    """
+    try:
+        # Test if obj is a method.
+        return _function_contents(obj.im_func)
+
+    except AttributeError:
+        try:
+            # Test if obj is a callable object.
+            return _function_contents(obj.__call__.im_func)
+
+        except AttributeError:
+            try:
+                # Test if obj is a code object.
+                return _code_contents(obj)
+
+            except AttributeError:
+                try:
+                    # Test if obj is a function object.
+                    return _function_contents(obj)
+
+                except AttributeError:
+                    # Should be a pickable Python object.
+                    try:
+                        return pickle.dumps(obj)
+                    except (pickle.PicklingError, TypeError):
+                        # This is weird, but it seems that nested classes
+                        # are unpickable. The Python docs say it should
+                        # always be a PicklingError, but some Python
+                        # versions seem to return TypeError.  Just do
+                        # the best we can.
+                        return str(obj)
+
+
+def _code_contents(code):
+    """Return the signature contents of a code object.
+
+    By providing direct access to the code object of the
+    function, Python makes this extremely easy.  Hooray!
+
+    Unfortunately, older versions of Python include line
+    number indications in the compiled byte code.  Boo!
+    So we remove the line number byte codes to prevent
+    recompilations from moving a Python function.
+    """
+
+    contents = []
+
+    # The code contents depends on the number of local variables
+    # but not their actual names.
+    contents.append("%s,%s" % (code.co_argcount, len(code.co_varnames)))
+    try:
+        contents.append(",%s,%s" % (len(code.co_cellvars), len(code.co_freevars)))
+    except AttributeError:
+        # Older versions of Python do not support closures.
+        contents.append(",0,0")
+
+    # The code contents depends on any constants accessed by the
+    # function. Note that we have to call _object_contents on each
+    # constants because the code object of nested functions can
+    # show-up among the constants.
+    #
+    # Note that we also always ignore the first entry of co_consts
+    # which contains the function doc string. We assume that the
+    # function does not access its doc string.
+    contents.append(',(' + ','.join(map(_object_contents,code.co_consts[1:])) + ')')
+
+    # The code contents depends on the variable names used to
+    # accessed global variable, as changing the variable name changes
+    # the variable actually accessed and therefore changes the
+    # function result.
+    contents.append(',(' + ','.join(map(_object_contents,code.co_names)) + ')')
+
+
+    # The code contents depends on its actual code!!!
+    contents.append(',(' + str(remove_set_lineno_codes(code.co_code)) + ')')
+
+    return ''.join(contents)
+
+
+def _function_contents(func):
+    """Return the signature contents of a function."""
+
+    contents = [_code_contents(func.func_code)]
+
+    # The function contents depends on the value of defaults arguments
+    if func.func_defaults:
+        contents.append(',(' + ','.join(map(_object_contents,func.func_defaults)) + ')')
+    else:
+        contents.append(',()')
+
+    # The function contents depends on the closure captured cell values.
+    try:
+        closure = func.func_closure or []
+    except AttributeError:
+        # Older versions of Python do not support closures.
+        closure = []
+
+    #xxx = [_object_contents(x.cell_contents) for x in closure]
+    try:
+        xxx = [_object_contents(x.cell_contents) for x in closure]
+    except AttributeError:
+        xxx = []
+    contents.append(',(' + ','.join(xxx) + ')')
+
+    return ''.join(contents)
+
+
+def _actionAppend(act1, act2):
+    # This function knows how to slap two actions together.
+    # Mainly, it handles ListActions by concatenating into
+    # a single ListAction.
+    a1 = Action(act1)
+    a2 = Action(act2)
+    if a1 is None or a2 is None:
+        raise TypeError("Cannot append %s to %s" % (type(act1), type(act2)))
+    if isinstance(a1, ListAction):
+        if isinstance(a2, ListAction):
+            return ListAction(a1.list + a2.list)
+        else:
+            return ListAction(a1.list + [ a2 ])
+    else:
+        if isinstance(a2, ListAction):
+            return ListAction([ a1 ] + a2.list)
+        else:
+            return ListAction([ a1, a2 ])
+
+def _do_create_keywords(args, kw):
+    """This converts any arguments after the action argument into
+    their equivalent keywords and adds them to the kw argument.
+    """
+    v = kw.get('varlist', ())
+    # prevent varlist="FOO" from being interpreted as ['F', 'O', 'O']
+    if is_String(v): v = (v,)
+    kw['varlist'] = tuple(v)
+    if args:
+        # turn positional args into equivalent keywords
+        cmdstrfunc = args[0]
+        if cmdstrfunc is None or is_String(cmdstrfunc):
+            kw['cmdstr'] = cmdstrfunc
+        elif callable(cmdstrfunc):
+            kw['strfunction'] = cmdstrfunc
+        else:
+            raise SCons.Errors.UserError(
+                'Invalid command display variable type. '
+                'You must either pass a string or a callback which '
+                'accepts (target, source, env) as parameters.')
+        if len(args) > 1:
+            kw['varlist'] = args[1:] + kw['varlist']
+    if kw.get('strfunction', _null) is not _null \
+                      and kw.get('cmdstr', _null) is not _null:
+        raise SCons.Errors.UserError(
+            'Cannot have both strfunction and cmdstr args to Action()')
+
+def _do_create_action(act, kw):
+    """This is the actual "implementation" for the
+    Action factory method, below.  This handles the
+    fact that passing lists to Action() itself has
+    different semantics than passing lists as elements
+    of lists.
+
+    The former will create a ListAction, the latter
+    will create a CommandAction by converting the inner
+    list elements to strings."""
+
+    if isinstance(act, ActionBase):
+        return act
+
+    if is_List(act):
+        return CommandAction(act, **kw)
+
+    if callable(act):
+        try:
+            gen = kw['generator']
+            del kw['generator']
+        except KeyError:
+            gen = 0
+        if gen:
+            action_type = CommandGeneratorAction
+        else:
+            action_type = FunctionAction
+        return action_type(act, kw)
+
+    if is_String(act):
+        var=SCons.Util.get_environment_var(act)
+        if var:
+            # This looks like a string that is purely an Environment
+            # variable reference, like "$FOO" or "${FOO}".  We do
+            # something special here...we lazily evaluate the contents
+            # of that Environment variable, so a user could put something
+            # like a function or a CommandGenerator in that variable
+            # instead of a string.
+            return LazyAction(var, kw)
+        commands = str(act).split('\n')
+        if len(commands) == 1:
+            return CommandAction(commands[0], **kw)
+        # The list of string commands may include a LazyAction, so we
+        # reprocess them via _do_create_list_action.
+        return _do_create_list_action(commands, kw)
+    return None
+
+def _do_create_list_action(act, kw):
+    """A factory for list actions.  Convert the input list into Actions
+    and then wrap them in a ListAction."""
+    acts = []
+    for a in act:
+        aa = _do_create_action(a, kw)
+        if aa is not None: acts.append(aa)
+    if not acts:
+        return ListAction([])
+    elif len(acts) == 1:
+        return acts[0]
+    else:
+        return ListAction(acts)
+
+def Action(act, *args, **kw):
+    """A factory for action objects."""
+    # Really simple: the _do_create_* routines do the heavy lifting.
+    _do_create_keywords(args, kw)
+    if is_List(act):
+        return _do_create_list_action(act, kw)
+    return _do_create_action(act, kw)
+
+class ActionBase(object):
+    """Base class for all types of action objects that can be held by
+    other objects (Builders, Executors, etc.)  This provides the
+    common methods for manipulating and combining those actions."""
+
+    def __cmp__(self, other):
+        return cmp(self.__dict__, other)
+
+    def no_batch_key(self, env, target, source):
+        return None
+
+    batch_key = no_batch_key
+
+    def genstring(self, target, source, env):
+        return str(self)
+
+    def get_contents(self, target, source, env):
+        result = [ self.get_presig(target, source, env) ]
+        # This should never happen, as the Action() factory should wrap
+        # the varlist, but just in case an action is created directly,
+        # we duplicate this check here.
+        vl = self.get_varlist(target, source, env)
+        if is_String(vl): vl = (vl,)
+        for v in vl:
+            result.append(env.subst('${'+v+'}'))
+        return ''.join(result)
+
+    def __add__(self, other):
+        return _actionAppend(self, other)
+
+    def __radd__(self, other):
+        return _actionAppend(other, self)
+
+    def presub_lines(self, env):
+        # CommandGeneratorAction needs a real environment
+        # in order to return the proper string here, since
+        # it may call LazyAction, which looks up a key
+        # in that env.  So we temporarily remember the env here,
+        # and CommandGeneratorAction will use this env
+        # when it calls its _generate method.
+        self.presub_env = env
+        lines = str(self).split('\n')
+        self.presub_env = None      # don't need this any more
+        return lines
+
+    def get_varlist(self, target, source, env, executor=None):
+        return self.varlist
+
+    def get_targets(self, env, executor):
+        """
+        Returns the type of targets ($TARGETS, $CHANGED_TARGETS) used
+        by this action.
+        """
+        return self.targets
+
+class _ActionAction(ActionBase):
+    """Base class for actions that create output objects."""
+    def __init__(self, cmdstr=_null, strfunction=_null, varlist=(),
+                       presub=_null, chdir=None, exitstatfunc=None,
+                       batch_key=None, targets='$TARGETS',
+                 **kw):
+        self.cmdstr = cmdstr
+        if strfunction is not _null:
+            if strfunction is None:
+                self.cmdstr = None
+            else:
+                self.strfunction = strfunction
+        self.varlist = varlist
+        self.presub = presub
+        self.chdir = chdir
+        if not exitstatfunc:
+            exitstatfunc = default_exitstatfunc
+        self.exitstatfunc = exitstatfunc
+
+        self.targets = targets
+
+        if batch_key:
+            if not callable(batch_key):
+                # They have set batch_key, but not to their own
+                # callable.  The default behavior here will batch
+                # *all* targets+sources using this action, separated
+                # for each construction environment.
+                def default_batch_key(self, env, target, source):
+                    return (id(self), id(env))
+                batch_key = default_batch_key
+            SCons.Util.AddMethod(self, batch_key, 'batch_key')
+
+    def print_cmd_line(self, s, target, source, env):
+        sys.stdout.write(s + u"\n")
+
+    def __call__(self, target, source, env,
+                               exitstatfunc=_null,
+                               presub=_null,
+                               show=_null,
+                               execute=_null,
+                               chdir=_null,
+                               executor=None):
+        if not is_List(target):
+            target = [target]
+        if not is_List(source):
+            source = [source]
+
+        if presub is _null:
+            presub = self.presub
+            if presub is _null:
+                presub = print_actions_presub
+        if exitstatfunc is _null: exitstatfunc = self.exitstatfunc
+        if show is _null:  show = print_actions
+        if execute is _null:  execute = execute_actions
+        if chdir is _null: chdir = self.chdir
+        save_cwd = None
+        if chdir:
+            save_cwd = os.getcwd()
+            try:
+                chdir = str(chdir.abspath)
+            except AttributeError:
+                if not is_String(chdir):
+                    if executor:
+                        chdir = str(executor.batches[0].targets[0].dir)
+                    else:
+                        chdir = str(target[0].dir)
+        if presub:
+            if executor:
+                target = executor.get_all_targets()
+                source = executor.get_all_sources()
+            t = ' and '.join(map(str, target))
+            l = '\n  '.join(self.presub_lines(env))
+            out = u"Building %s with action:\n  %s\n" % (t, l)
+            sys.stdout.write(out)
+        cmd = None
+        if show and self.strfunction:
+            if executor:
+                target = executor.get_all_targets()
+                source = executor.get_all_sources()
+            try:
+                cmd = self.strfunction(target, source, env, executor)
+            except TypeError:
+                cmd = self.strfunction(target, source, env)
+            if cmd:
+                if chdir:
+                    cmd = ('os.chdir(%s)\n' % repr(chdir)) + cmd
+                try:
+                    get = env.get
+                except AttributeError:
+                    print_func = self.print_cmd_line
+                else:
+                    print_func = get('PRINT_CMD_LINE_FUNC')
+                    if not print_func:
+                        print_func = self.print_cmd_line
+                print_func(cmd, target, source, env)
+        stat = 0
+        if execute:
+            if chdir:
+                os.chdir(chdir)
+            try:
+                stat = self.execute(target, source, env, executor=executor)
+                if isinstance(stat, SCons.Errors.BuildError):
+                    s = exitstatfunc(stat.status)
+                    if s:
+                        stat.status = s
+                    else:
+                        stat = s
+                else:
+                    stat = exitstatfunc(stat)
+            finally:
+                if save_cwd:
+                    os.chdir(save_cwd)
+        if cmd and save_cwd:
+            print_func('os.chdir(%s)' % repr(save_cwd), target, source, env)
+
+        return stat
+
+
+def _string_from_cmd_list(cmd_list):
+    """Takes a list of command line arguments and returns a pretty
+    representation for printing."""
+    cl = []
+    for arg in map(str, cmd_list):
+        if ' ' in arg or '\t' in arg:
+            arg = '"' + arg + '"'
+        cl.append(arg)
+    return ' '.join(cl)
+
+# A fiddlin' little function that has an 'import SCons.Environment' which
+# can't be moved to the top level without creating an import loop.  Since
+# this import creates a local variable named 'SCons', it blocks access to
+# the global variable, so we move it here to prevent complaints about local
+# variables being used uninitialized.
+default_ENV = None
+def get_default_ENV(env):
+    global default_ENV
+    try:
+        return env['ENV']
+    except KeyError:
+        if not default_ENV:
+            import SCons.Environment
+            # This is a hideously expensive way to get a default shell
+            # environment.  What it really should do is run the platform
+            # setup to get the default ENV.  Fortunately, it's incredibly
+            # rare for an Environment not to have a shell environment, so
+            # we're not going to worry about it overmuch.
+            default_ENV = SCons.Environment.Environment()['ENV']
+        return default_ENV
+
+# This function is still in draft mode.  We're going to need something like
+# it in the long run as more and more places use subprocess, but I'm sure
+# it'll have to be tweaked to get the full desired functionality.
+# one special arg (so far?), 'error', to tell what to do with exceptions.
+def _subproc(scons_env, cmd, error = 'ignore', **kw):
+    """Do common setup for a subprocess.Popen() call"""
+    # allow std{in,out,err} to be "'devnull'"
+    io = kw.get('stdin')
+    if is_String(io) and io == 'devnull':
+        kw['stdin'] = open(os.devnull)
+    io = kw.get('stdout')
+    if is_String(io) and io == 'devnull':
+        kw['stdout'] = open(os.devnull, 'w')
+    io = kw.get('stderr')
+    if is_String(io) and io == 'devnull':
+        kw['stderr'] = open(os.devnull, 'w')
+
+    # Figure out what shell environment to use
+    ENV = kw.get('env', None)
+    if ENV is None: ENV = get_default_ENV(scons_env)
+
+    # Ensure that the ENV values are all strings:
+    new_env = {}
+    for key, value in ENV.items():
+        if is_List(value):
+            # If the value is a list, then we assume it is a path list,
+            # because that's a pretty common list-like value to stick
+            # in an environment variable:
+            value = SCons.Util.flatten_sequence(value)
+            new_env[key] = os.pathsep.join(map(str, value))
+        else:
+            # It's either a string or something else.  If it's a string,
+            # we still want to call str() because it might be a *Unicode*
+            # string, which makes subprocess.Popen() gag.  If it isn't a
+            # string or a list, then we just coerce it to a string, which
+            # is the proper way to handle Dir and File instances and will
+            # produce something reasonable for just about everything else:
+            new_env[key] = str(value)
+    kw['env'] = new_env
+
+    try:
+        #FUTURE return subprocess.Popen(cmd, **kw)
+        return subprocess.Popen(cmd, **kw)
+    except EnvironmentError, e:
+        if error == 'raise': raise
+        # return a dummy Popen instance that only returns error
+        class dummyPopen(object):
+            def __init__(self, e): self.exception = e
+            def communicate(self): return ('','')
+            def wait(self): return -self.exception.errno
+            stdin = None
+            class f(object):
+                def read(self): return ''
+                def readline(self): return ''
+            stdout = stderr = f()
+        return dummyPopen(e)
+
+class CommandAction(_ActionAction):
+    """Class for command-execution actions."""
+    def __init__(self, cmd, **kw):
+        # Cmd can actually be a list or a single item; if it's a
+        # single item it should be the command string to execute; if a
+        # list then it should be the words of the command string to
+        # execute.  Only a single command should be executed by this
+        # object; lists of commands should be handled by embedding
+        # these objects in a ListAction object (which the Action()
+        # factory above does).  cmd will be passed to
+        # Environment.subst_list() for substituting environment
+        # variables.
+        if __debug__: logInstanceCreation(self, 'Action.CommandAction')
+
+        _ActionAction.__init__(self, **kw)
+        if is_List(cmd):
+            if list(filter(is_List, cmd)):
+                raise TypeError("CommandAction should be given only " \
+                      "a single command")
+        self.cmd_list = cmd
+
+    def __str__(self):
+        if is_List(self.cmd_list):
+            return ' '.join(map(str, self.cmd_list))
+        return str(self.cmd_list)
+
+    def process(self, target, source, env, executor=None):
+        if executor:
+            result = env.subst_list(self.cmd_list, 0, executor=executor)
+        else:
+            result = env.subst_list(self.cmd_list, 0, target, source)
+        silent = None
+        ignore = None
+        while True:
+            try: c = result[0][0][0]
+            except IndexError: c = None
+            if c == '@': silent = 1
+            elif c == '-': ignore = 1
+            else: break
+            result[0][0] = result[0][0][1:]
+        try:
+            if not result[0][0]:
+                result[0] = result[0][1:]
+        except IndexError:
+            pass
+        return result, ignore, silent
+
+    def strfunction(self, target, source, env, executor=None):
+        if self.cmdstr is None:
+            return None
+        if self.cmdstr is not _null:
+            from SCons.Subst import SUBST_RAW
+            if executor:
+                c = env.subst(self.cmdstr, SUBST_RAW, executor=executor)
+            else:
+                c = env.subst(self.cmdstr, SUBST_RAW, target, source)
+            if c:
+                return c
+        cmd_list, ignore, silent = self.process(target, source, env, executor)
+        if silent:
+            return ''
+        return _string_from_cmd_list(cmd_list[0])
+
+    def execute(self, target, source, env, executor=None):
+        """Execute a command action.
+
+        This will handle lists of commands as well as individual commands,
+        because construction variable substitution may turn a single
+        "command" into a list.  This means that this class can actually
+        handle lists of commands, even though that's not how we use it
+        externally.
+        """
+        escape_list = SCons.Subst.escape_list
+        flatten_sequence = SCons.Util.flatten_sequence
+
+        try:
+            shell = env['SHELL']
+        except KeyError:
+            raise SCons.Errors.UserError('Missing SHELL construction variable.')
+
+        try:
+            spawn = env['SPAWN']
+        except KeyError:
+            raise SCons.Errors.UserError('Missing SPAWN construction variable.')
+        else:
+            if is_String(spawn):
+                spawn = env.subst(spawn, raw=1, conv=lambda x: x)
+
+        escape = env.get('ESCAPE', lambda x: x)
+
+        ENV = get_default_ENV(env)
+
+        # Ensure that the ENV values are all strings:
+        for key, value in ENV.items():
+            if not is_String(value):
+                if is_List(value):
+                    # If the value is a list, then we assume it is a
+                    # path list, because that's a pretty common list-like
+                    # value to stick in an environment variable:
+                    value = flatten_sequence(value)
+                    ENV[key] = os.pathsep.join(map(str, value))
+                else:
+                    # If it isn't a string or a list, then we just coerce
+                    # it to a string, which is the proper way to handle
+                    # Dir and File instances and will produce something
+                    # reasonable for just about everything else:
+                    ENV[key] = str(value)
+
+        if executor:
+            target = executor.get_all_targets()
+            source = executor.get_all_sources()
+        cmd_list, ignore, silent = self.process(target, list(map(rfile, source)), env, executor)
+
+        # Use len() to filter out any "command" that's zero-length.
+        for cmd_line in filter(len, cmd_list):
+            # Escape the command line for the interpreter we are using.
+            cmd_line = escape_list(cmd_line, escape)
+            result = spawn(shell, escape, cmd_line[0], cmd_line, ENV)
+            if not ignore and result:
+                msg = "Error %s" % result
+                return SCons.Errors.BuildError(errstr=msg,
+                                               status=result,
+                                               action=self,
+                                               command=cmd_line)
+        return 0
+
+    def get_presig(self, target, source, env, executor=None):
+        """Return the signature contents of this action's command line.
+
+        This strips $(-$) and everything in between the string,
+        since those parts don't affect signatures.
+        """
+        from SCons.Subst import SUBST_SIG
+        cmd = self.cmd_list
+        if is_List(cmd):
+            cmd = ' '.join(map(str, cmd))
+        else:
+            cmd = str(cmd)
+        if executor:
+            return env.subst_target_source(cmd, SUBST_SIG, executor=executor)
+        else:
+            return env.subst_target_source(cmd, SUBST_SIG, target, source)
+
+    def get_implicit_deps(self, target, source, env, executor=None):
+        icd = env.get('IMPLICIT_COMMAND_DEPENDENCIES', True)
+        if is_String(icd) and icd[:1] == '$':
+            icd = env.subst(icd)
+        if not icd or icd in ('0', 'None'):
+            return []
+        from SCons.Subst import SUBST_SIG
+        if executor:
+            cmd_list = env.subst_list(self.cmd_list, SUBST_SIG, executor=executor)
+        else:
+            cmd_list = env.subst_list(self.cmd_list, SUBST_SIG, target, source)
+        res = []
+        for cmd_line in cmd_list:
+            if cmd_line:
+                d = str(cmd_line[0])
+                m = strip_quotes.match(d)
+                if m:
+                    d = m.group(1)
+                d = env.WhereIs(d)
+                if d:
+                    res.append(env.fs.File(d))
+        return res
+
+class CommandGeneratorAction(ActionBase):
+    """Class for command-generator actions."""
+    def __init__(self, generator, kw):
+        if __debug__: logInstanceCreation(self, 'Action.CommandGeneratorAction')
+        self.generator = generator
+        self.gen_kw = kw
+        self.varlist = kw.get('varlist', ())
+        self.targets = kw.get('targets', '$TARGETS')
+
+    def _generate(self, target, source, env, for_signature, executor=None):
+        # ensure that target is a list, to make it easier to write
+        # generator functions:
+        if not is_List(target):
+            target = [target]
+
+        if executor:
+            target = executor.get_all_targets()
+            source = executor.get_all_sources()
+        ret = self.generator(target=target,
+                             source=source,
+                             env=env,
+                             for_signature=for_signature)
+        gen_cmd = Action(ret, **self.gen_kw)
+        if not gen_cmd:
+            raise SCons.Errors.UserError("Object returned from command generator: %s cannot be used to create an Action." % repr(ret))
+        return gen_cmd
+
+    def __str__(self):
+        try:
+            env = self.presub_env
+        except AttributeError:
+            env = None
+        if env is None:
+            env = SCons.Defaults.DefaultEnvironment()
+        act = self._generate([], [], env, 1)
+        return str(act)
+
+    def batch_key(self, env, target, source):
+        return self._generate(target, source, env, 1).batch_key(env, target, source)
+
+    def genstring(self, target, source, env, executor=None):
+        return self._generate(target, source, env, 1, executor).genstring(target, source, env)
+
+    def __call__(self, target, source, env, exitstatfunc=_null, presub=_null,
+                 show=_null, execute=_null, chdir=_null, executor=None):
+        act = self._generate(target, source, env, 0, executor)
+        if act is None:
+            raise UserError("While building `%s': "
+                            "Cannot deduce file extension from source files: %s"
+                % (repr(list(map(str, target))), repr(list(map(str, source)))))
+        return act(target, source, env, exitstatfunc, presub,
+                   show, execute, chdir, executor)
+
+    def get_presig(self, target, source, env, executor=None):
+        """Return the signature contents of this action's command line.
+
+        This strips $(-$) and everything in between the string,
+        since those parts don't affect signatures.
+        """
+        return self._generate(target, source, env, 1, executor).get_presig(target, source, env)
+
+    def get_implicit_deps(self, target, source, env, executor=None):
+        return self._generate(target, source, env, 1, executor).get_implicit_deps(target, source, env)
+
+    def get_varlist(self, target, source, env, executor=None):
+        return self._generate(target, source, env, 1, executor).get_varlist(target, source, env, executor)
+
+    def get_targets(self, env, executor):
+        return self._generate(None, None, env, 1, executor).get_targets(env, executor)
+
+
+
+# A LazyAction is a kind of hybrid generator and command action for
+# strings of the form "$VAR".  These strings normally expand to other
+# strings (think "$CCCOM" to "$CC -c -o $TARGET $SOURCE"), but we also
+# want to be able to replace them with functions in the construction
+# environment.  Consequently, we want lazy evaluation and creation of
+# an Action in the case of the function, but that's overkill in the more
+# normal case of expansion to other strings.
+#
+# So we do this with a subclass that's both a generator *and*
+# a command action.  The overridden methods all do a quick check
+# of the construction variable, and if it's a string we just call
+# the corresponding CommandAction method to do the heavy lifting.
+# If not, then we call the same-named CommandGeneratorAction method.
+# The CommandGeneratorAction methods work by using the overridden
+# _generate() method, that is, our own way of handling "generation" of
+# an action based on what's in the construction variable.
+
+class LazyAction(CommandGeneratorAction, CommandAction):
+
+    def __init__(self, var, kw):
+        if __debug__: logInstanceCreation(self, 'Action.LazyAction')
+        #FUTURE CommandAction.__init__(self, '${'+var+'}', **kw)
+        CommandAction.__init__(self, '${'+var+'}', **kw)
+        self.var = SCons.Util.to_String(var)
+        self.gen_kw = kw
+
+    def get_parent_class(self, env):
+        c = env.get(self.var)
+        if is_String(c) and not '\n' in c:
+            return CommandAction
+        return CommandGeneratorAction
+
+    def _generate_cache(self, env):
+        if env:
+            c = env.get(self.var, '')
+        else:
+            c = ''
+        gen_cmd = Action(c, **self.gen_kw)
+        if not gen_cmd:
+            raise SCons.Errors.UserError("$%s value %s cannot be used to create an Action." % (self.var, repr(c)))
+        return gen_cmd
+
+    def _generate(self, target, source, env, for_signature, executor=None):
+        return self._generate_cache(env)
+
+    def __call__(self, target, source, env, *args, **kw):
+        c = self.get_parent_class(env)
+        return c.__call__(self, target, source, env, *args, **kw)
+
+    def get_presig(self, target, source, env):
+        c = self.get_parent_class(env)
+        return c.get_presig(self, target, source, env)
+
+    def get_varlist(self, target, source, env, executor=None):
+        c = self.get_parent_class(env)
+        return c.get_varlist(self, target, source, env, executor)
+
+
+class FunctionAction(_ActionAction):
+    """Class for Python function actions."""
+
+    def __init__(self, execfunction, kw):
+        if __debug__: logInstanceCreation(self, 'Action.FunctionAction')
+
+        self.execfunction = execfunction
+        try:
+            self.funccontents = _callable_contents(execfunction)
+        except AttributeError:
+            try:
+                # See if execfunction will do the heavy lifting for us.
+                self.gc = execfunction.get_contents
+            except AttributeError:
+                # This is weird, just do the best we can.
+                self.funccontents = _object_contents(execfunction)
+
+        _ActionAction.__init__(self, **kw)
+
+    def function_name(self):
+        try:
+            return self.execfunction.__name__
+        except AttributeError:
+            try:
+                return self.execfunction.__class__.__name__
+            except AttributeError:
+                return "unknown_python_function"
+
+    def strfunction(self, target, source, env, executor=None):
+        if self.cmdstr is None:
+            return None
+        if self.cmdstr is not _null:
+            from SCons.Subst import SUBST_RAW
+            if executor:
+                c = env.subst(self.cmdstr, SUBST_RAW, executor=executor)
+            else:
+                c = env.subst(self.cmdstr, SUBST_RAW, target, source)
+            if c:
+                return c
+        def array(a):
+            def quote(s):
+                try:
+                    str_for_display = s.str_for_display
+                except AttributeError:
+                    s = repr(s)
+                else:
+                    s = str_for_display()
+                return s
+            return '[' + ", ".join(map(quote, a)) + ']'
+        try:
+            strfunc = self.execfunction.strfunction
+        except AttributeError:
+            pass
+        else:
+            if strfunc is None:
+                return None
+            if callable(strfunc):
+                return strfunc(target, source, env)
+        name = self.function_name()
+        tstr = array(target)
+        sstr = array(source)
+        return "%s(%s, %s)" % (name, tstr, sstr)
+
+    def __str__(self):
+        name = self.function_name()
+        if name == 'ActionCaller':
+            return str(self.execfunction)
+        return "%s(target, source, env)" % name
+
+    def execute(self, target, source, env, executor=None):
+        exc_info = (None,None,None)
+        try:
+            if executor:
+                target = executor.get_all_targets()
+                source = executor.get_all_sources()
+            rsources = list(map(rfile, source))
+            try:
+                result = self.execfunction(target=target, source=rsources, env=env)
+            except KeyboardInterrupt, e:
+                raise
+            except SystemExit, e:
+                raise
+            except Exception, e:
+                result = e
+                exc_info = sys.exc_info()
+
+            if result:
+                result = SCons.Errors.convert_to_BuildError(result, exc_info)
+                result.node=target
+                result.action=self
+                try:
+                    result.command=self.strfunction(target, source, env, executor)
+                except TypeError:
+                    result.command=self.strfunction(target, source, env)
+
+                # FIXME: This maintains backward compatibility with respect to
+                # which type of exceptions were returned by raising an
+                # exception and which ones were returned by value. It would
+                # probably be best to always return them by value here, but
+                # some codes do not check the return value of Actions and I do
+                # not have the time to modify them at this point.
+                if (exc_info[1] and
+                    not isinstance(exc_info[1],EnvironmentError)):
+                    raise result
+
+            return result
+        finally:
+            # Break the cycle between the traceback object and this
+            # function stack frame. See the sys.exc_info() doc info for
+            # more information about this issue.
+            del exc_info
+
+
+    def get_presig(self, target, source, env):
+        """Return the signature contents of this callable action."""
+        try:
+            return self.gc(target, source, env)
+        except AttributeError:
+            return self.funccontents
+
+    def get_implicit_deps(self, target, source, env):
+        return []
+
+class ListAction(ActionBase):
+    """Class for lists of other actions."""
+    def __init__(self, actionlist):
+        if __debug__: logInstanceCreation(self, 'Action.ListAction')
+        def list_of_actions(x):
+            if isinstance(x, ActionBase):
+                return x
+            return Action(x)
+        self.list = list(map(list_of_actions, actionlist))
+        # our children will have had any varlist
+        # applied; we don't need to do it again
+        self.varlist = ()
+        self.targets = '$TARGETS'
+
+    def genstring(self, target, source, env):
+        return '\n'.join([a.genstring(target, source, env) for a in self.list])
+
+    def __str__(self):
+        return '\n'.join(map(str, self.list))
+
+    def presub_lines(self, env):
+        return SCons.Util.flatten_sequence(
+            [a.presub_lines(env) for a in self.list])
+
+    def get_presig(self, target, source, env):
+        """Return the signature contents of this action list.
+
+        Simple concatenation of the signatures of the elements.
+        """
+        return "".join([x.get_contents(target, source, env) for x in self.list])
+
+    def __call__(self, target, source, env, exitstatfunc=_null, presub=_null,
+                 show=_null, execute=_null, chdir=_null, executor=None):
+        if executor:
+            target = executor.get_all_targets()
+            source = executor.get_all_sources()
+        for act in self.list:
+            stat = act(target, source, env, exitstatfunc, presub,
+                       show, execute, chdir, executor)
+            if stat:
+                return stat
+        return 0
+
+    def get_implicit_deps(self, target, source, env):
+        result = []
+        for act in self.list:
+            result.extend(act.get_implicit_deps(target, source, env))
+        return result
+
+    def get_varlist(self, target, source, env, executor=None):
+        result = SCons.Util.OrderedDict()
+        for act in self.list:
+            for var in act.get_varlist(target, source, env, executor):
+                result[var] = True
+        return list(result.keys())
+
+class ActionCaller(object):
+    """A class for delaying calling an Action function with specific
+    (positional and keyword) arguments until the Action is actually
+    executed.
+
+    This class looks to the rest of the world like a normal Action object,
+    but what it's really doing is hanging on to the arguments until we
+    have a target, source and env to use for the expansion.
+    """
+    def __init__(self, parent, args, kw):
+        self.parent = parent
+        self.args = args
+        self.kw = kw
+
+    def get_contents(self, target, source, env):
+        actfunc = self.parent.actfunc
+        try:
+            # "self.actfunc" is a function.
+            contents = str(actfunc.func_code.co_code)
+        except AttributeError:
+            # "self.actfunc" is a callable object.
+            try:
+                contents = str(actfunc.__call__.im_func.func_code.co_code)
+            except AttributeError:
+                # No __call__() method, so it might be a builtin
+                # or something like that.  Do the best we can.
+                contents = str(actfunc)
+        contents = remove_set_lineno_codes(contents)
+        return contents
+
+    def subst(self, s, target, source, env):
+        # If s is a list, recursively apply subst()
+        # to every element in the list
+        if is_List(s):
+            result = []
+            for elem in s:
+                result.append(self.subst(elem, target, source, env))
+            return self.parent.convert(result)
+
+        # Special-case hack:  Let a custom function wrapped in an
+        # ActionCaller get at the environment through which the action
+        # was called by using this hard-coded value as a special return.
+        if s == '$__env__':
+            return env
+        elif is_String(s):
+            return env.subst(s, 1, target, source)
+        return self.parent.convert(s)
+
+    def subst_args(self, target, source, env):
+        return [self.subst(x, target, source, env) for x in self.args]
+
+    def subst_kw(self, target, source, env):
+        kw = {}
+        for key in self.kw.keys():
+            kw[key] = self.subst(self.kw[key], target, source, env)
+        return kw
+
+    def __call__(self, target, source, env, executor=None):
+        args = self.subst_args(target, source, env)
+        kw = self.subst_kw(target, source, env)
+        return self.parent.actfunc(*args, **kw)
+
+    def strfunction(self, target, source, env):
+        args = self.subst_args(target, source, env)
+        kw = self.subst_kw(target, source, env)
+        return self.parent.strfunc(*args, **kw)
+
+    def __str__(self):
+        return self.parent.strfunc(*self.args, **self.kw)
+
+class ActionFactory(object):
+    """A factory class that will wrap up an arbitrary function
+    as an SCons-executable Action object.
+
+    The real heavy lifting here is done by the ActionCaller class.
+    We just collect the (positional and keyword) arguments that we're
+    called with and give them to the ActionCaller object we create,
+    so it can hang onto them until it needs them.
+    """
+    def __init__(self, actfunc, strfunc, convert=lambda x: x):
+        self.actfunc = actfunc
+        self.strfunc = strfunc
+        self.convert = convert
+
+    def __call__(self, *args, **kw):
+        ac = ActionCaller(self, args, kw)
+        action = Action(ac, strfunction=ac.strfunction)
+        return action
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Builder.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Builder.py
new file mode 100644
index 0000000..9fc59dc
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Builder.py
@@ -0,0 +1,877 @@
+"""SCons.Builder
+
+Builder object subsystem.
+
+A Builder object is a callable that encapsulates information about how
+to execute actions to create a target Node (file) from source Nodes
+(files), and how to create those dependencies for tracking.
+
+The main entry point here is the Builder() factory method.  This provides
+a procedural interface that creates the right underlying Builder object
+based on the keyword arguments supplied and the types of the arguments.
+
+The goal is for this external interface to be simple enough that the
+vast majority of users can create new Builders as necessary to support
+building new types of files in their configurations, without having to
+dive any deeper into this subsystem.
+
+The base class here is BuilderBase.  This is a concrete base class which
+does, in fact, represent the Builder objects that we (or users) create.
+
+There is also a proxy that looks like a Builder:
+
+    CompositeBuilder
+
+        This proxies for a Builder with an action that is actually a
+        dictionary that knows how to map file suffixes to a specific
+        action.  This is so that we can invoke different actions
+        (compilers, compile options) for different flavors of source
+        files.
+
+Builders and their proxies have the following public interface methods
+used by other modules:
+
+    __call__()
+        THE public interface.  Calling a Builder object (with the
+        use of internal helper methods) sets up the target and source
+        dependencies, appropriate mapping to a specific action, and the
+        environment manipulation necessary for overridden construction
+        variable.  This also takes care of warning about possible mistakes
+        in keyword arguments.
+
+    add_emitter()
+        Adds an emitter for a specific file suffix, used by some Tool
+        modules to specify that (for example) a yacc invocation on a .y
+        can create a .h *and* a .c file.
+
+    add_action()
+        Adds an action for a specific file suffix, heavily used by
+        Tool modules to add their specific action(s) for turning
+        a source file into an object file to the global static
+        and shared object file Builders.
+
+There are the following methods for internal use within this module:
+
+    _execute()
+        The internal method that handles the heavily lifting when a
+        Builder is called.  This is used so that the __call__() methods
+        can set up warning about possible mistakes in keyword-argument
+        overrides, and *then* execute all of the steps necessary so that
+        the warnings only occur once.
+
+    get_name()
+        Returns the Builder's name within a specific Environment,
+        primarily used to try to return helpful information in error
+        messages.
+
+    adjust_suffix()
+    get_prefix()
+    get_suffix()
+    get_src_suffix()
+    set_src_suffix()
+        Miscellaneous stuff for handling the prefix and suffix
+        manipulation we use in turning source file names into target
+        file names.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Builder.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import collections
+
+import SCons.Action
+from SCons.Debug import logInstanceCreation
+from SCons.Errors import InternalError, UserError
+import SCons.Executor
+import SCons.Memoize
+import SCons.Node
+import SCons.Node.FS
+import SCons.Util
+import SCons.Warnings
+
+class _Null(object):
+    pass
+
+_null = _Null
+
+def match_splitext(path, suffixes = []):
+    if suffixes:
+        matchsuf = [S for S in suffixes if path[-len(S):] == S]
+        if matchsuf:
+            suf = max([(len(_f),_f) for _f in matchsuf])[1]
+            return [path[:-len(suf)], path[-len(suf):]]
+    return SCons.Util.splitext(path)
+
+class DictCmdGenerator(SCons.Util.Selector):
+    """This is a callable class that can be used as a
+    command generator function.  It holds on to a dictionary
+    mapping file suffixes to Actions.  It uses that dictionary
+    to return the proper action based on the file suffix of
+    the source file."""
+
+    def __init__(self, dict=None, source_ext_match=1):
+        SCons.Util.Selector.__init__(self, dict)
+        self.source_ext_match = source_ext_match
+
+    def src_suffixes(self):
+        return list(self.keys())
+
+    def add_action(self, suffix, action):
+        """Add a suffix-action pair to the mapping.
+        """
+        self[suffix] = action
+
+    def __call__(self, target, source, env, for_signature):
+        if not source:
+            return []
+
+        if self.source_ext_match:
+            suffixes = self.src_suffixes()
+            ext = None
+            for src in map(str, source):
+                my_ext = match_splitext(src, suffixes)[1]
+                if ext and my_ext != ext:
+                    raise UserError("While building `%s' from `%s': Cannot build multiple sources with different extensions: %s, %s"
+                             % (repr(list(map(str, target))), src, ext, my_ext))
+                ext = my_ext
+        else:
+            ext = match_splitext(str(source[0]), self.src_suffixes())[1]
+
+        if not ext:
+            #return ext
+            raise UserError("While building `%s': "
+                            "Cannot deduce file extension from source files: %s"
+                 % (repr(list(map(str, target))), repr(list(map(str, source)))))
+
+        try:
+            ret = SCons.Util.Selector.__call__(self, env, source, ext)
+        except KeyError, e:
+            raise UserError("Ambiguous suffixes after environment substitution: %s == %s == %s" % (e.args[0], e.args[1], e.args[2]))
+        if ret is None:
+            raise UserError("While building `%s' from `%s': Don't know how to build from a source file with suffix `%s'.  Expected a suffix in this list: %s." % \
+                            (repr(list(map(str, target))), repr(list(map(str, source))), ext, repr(list(self.keys()))))
+        return ret
+
+class CallableSelector(SCons.Util.Selector):
+    """A callable dictionary that will, in turn, call the value it
+    finds if it can."""
+    def __call__(self, env, source):
+        value = SCons.Util.Selector.__call__(self, env, source)
+        if callable(value):
+            value = value(env, source)
+        return value
+
+class DictEmitter(SCons.Util.Selector):
+    """A callable dictionary that maps file suffixes to emitters.
+    When called, it finds the right emitter in its dictionary for the
+    suffix of the first source file, and calls that emitter to get the
+    right lists of targets and sources to return.  If there's no emitter
+    for the suffix in its dictionary, the original target and source are
+    returned.
+    """
+    def __call__(self, target, source, env):
+        emitter = SCons.Util.Selector.__call__(self, env, source)
+        if emitter:
+            target, source = emitter(target, source, env)
+        return (target, source)
+
+class ListEmitter(collections.UserList):
+    """A callable list of emitters that calls each in sequence,
+    returning the result.
+    """
+    def __call__(self, target, source, env):
+        for e in self.data:
+            target, source = e(target, source, env)
+        return (target, source)
+
+# These are a common errors when calling a Builder;
+# they are similar to the 'target' and 'source' keyword args to builders,
+# so we issue warnings when we see them.  The warnings can, of course,
+# be disabled.
+misleading_keywords = {
+    'targets'   : 'target',
+    'sources'   : 'source',
+}
+
+class OverrideWarner(collections.UserDict):
+    """A class for warning about keyword arguments that we use as
+    overrides in a Builder call.
+
+    This class exists to handle the fact that a single Builder call
+    can actually invoke multiple builders.  This class only emits the
+    warnings once, no matter how many Builders are invoked.
+    """
+    def __init__(self, dict):
+        collections.UserDict.__init__(self, dict)
+        if __debug__: logInstanceCreation(self, 'Builder.OverrideWarner')
+        self.already_warned = None
+    def warn(self):
+        if self.already_warned:
+            return
+        for k in self.keys():
+            if k in misleading_keywords:
+                alt = misleading_keywords[k]
+                msg = "Did you mean to use `%s' instead of `%s'?" % (alt, k)
+                SCons.Warnings.warn(SCons.Warnings.MisleadingKeywordsWarning, msg)
+        self.already_warned = 1
+
+def Builder(**kw):
+    """A factory for builder objects."""
+    composite = None
+    if 'generator' in kw:
+        if 'action' in kw:
+            raise UserError("You must not specify both an action and a generator.")
+        kw['action'] = SCons.Action.CommandGeneratorAction(kw['generator'], {})
+        del kw['generator']
+    elif 'action' in kw:
+        source_ext_match = kw.get('source_ext_match', 1)
+        if 'source_ext_match' in kw:
+            del kw['source_ext_match']
+        if SCons.Util.is_Dict(kw['action']):
+            composite = DictCmdGenerator(kw['action'], source_ext_match)
+            kw['action'] = SCons.Action.CommandGeneratorAction(composite, {})
+            kw['src_suffix'] = composite.src_suffixes()
+        else:
+            kw['action'] = SCons.Action.Action(kw['action'])
+
+    if 'emitter' in kw:
+        emitter = kw['emitter']
+        if SCons.Util.is_String(emitter):
+            # This allows users to pass in an Environment
+            # variable reference (like "$FOO") as an emitter.
+            # We will look in that Environment variable for
+            # a callable to use as the actual emitter.
+            var = SCons.Util.get_environment_var(emitter)
+            if not var:
+                raise UserError("Supplied emitter '%s' does not appear to refer to an Environment variable" % emitter)
+            kw['emitter'] = EmitterProxy(var)
+        elif SCons.Util.is_Dict(emitter):
+            kw['emitter'] = DictEmitter(emitter)
+        elif SCons.Util.is_List(emitter):
+            kw['emitter'] = ListEmitter(emitter)
+
+    result = BuilderBase(**kw)
+
+    if not composite is None:
+        result = CompositeBuilder(result, composite)
+
+    return result
+
+def _node_errors(builder, env, tlist, slist):
+    """Validate that the lists of target and source nodes are
+    legal for this builder and environment.  Raise errors or
+    issue warnings as appropriate.
+    """
+
+    # First, figure out if there are any errors in the way the targets
+    # were specified.
+    for t in tlist:
+        if t.side_effect:
+            raise UserError("Multiple ways to build the same target were specified for: %s" % t)
+        if t.has_explicit_builder():
+            if not t.env is None and not t.env is env:
+                action = t.builder.action
+                t_contents = action.get_contents(tlist, slist, t.env)
+                contents = action.get_contents(tlist, slist, env)
+
+                if t_contents == contents:
+                    msg = "Two different environments were specified for target %s,\n\tbut they appear to have the same action: %s" % (t, action.genstring(tlist, slist, t.env))
+                    SCons.Warnings.warn(SCons.Warnings.DuplicateEnvironmentWarning, msg)
+                else:
+                    msg = "Two environments with different actions were specified for the same target: %s" % t
+                    raise UserError(msg)
+            if builder.multi:
+                if t.builder != builder:
+                    msg = "Two different builders (%s and %s) were specified for the same target: %s" % (t.builder.get_name(env), builder.get_name(env), t)
+                    raise UserError(msg)
+                # TODO(batch):  list constructed each time!
+                if t.get_executor().get_all_targets() != tlist:
+                    msg = "Two different target lists have a target in common: %s  (from %s and from %s)" % (t, list(map(str, t.get_executor().get_all_targets())), list(map(str, tlist)))
+                    raise UserError(msg)
+            elif t.sources != slist:
+                msg = "Multiple ways to build the same target were specified for: %s  (from %s and from %s)" % (t, list(map(str, t.sources)), list(map(str, slist)))
+                raise UserError(msg)
+
+    if builder.single_source:
+        if len(slist) > 1:
+            raise UserError("More than one source given for single-source builder: targets=%s sources=%s" % (list(map(str,tlist)), list(map(str,slist))))
+
+class EmitterProxy(object):
+    """This is a callable class that can act as a
+    Builder emitter.  It holds on to a string that
+    is a key into an Environment dictionary, and will
+    look there at actual build time to see if it holds
+    a callable.  If so, we will call that as the actual
+    emitter."""
+    def __init__(self, var):
+        self.var = SCons.Util.to_String(var)
+
+    def __call__(self, target, source, env):
+        emitter = self.var
+
+        # Recursively substitute the variable.
+        # We can't use env.subst() because it deals only
+        # in strings.  Maybe we should change that?
+        while SCons.Util.is_String(emitter) and emitter in env:
+            emitter = env[emitter]
+        if callable(emitter):
+            target, source = emitter(target, source, env)
+        elif SCons.Util.is_List(emitter):
+            for e in emitter:
+                target, source = e(target, source, env)
+
+        return (target, source)
+
+
+    def __cmp__(self, other):
+        return cmp(self.var, other.var)
+
+class BuilderBase(object):
+    """Base class for Builders, objects that create output
+    nodes (files) from input nodes (files).
+    """
+
+    if SCons.Memoize.use_memoizer:
+        __metaclass__ = SCons.Memoize.Memoized_Metaclass
+
+    memoizer_counters = []
+
+    def __init__(self,  action = None,
+                        prefix = '',
+                        suffix = '',
+                        src_suffix = '',
+                        target_factory = None,
+                        source_factory = None,
+                        target_scanner = None,
+                        source_scanner = None,
+                        emitter = None,
+                        multi = 0,
+                        env = None,
+                        single_source = 0,
+                        name = None,
+                        chdir = _null,
+                        is_explicit = 1,
+                        src_builder = None,
+                        ensure_suffix = False,
+                        **overrides):
+        if __debug__: logInstanceCreation(self, 'Builder.BuilderBase')
+        self._memo = {}
+        self.action = action
+        self.multi = multi
+        if SCons.Util.is_Dict(prefix):
+            prefix = CallableSelector(prefix)
+        self.prefix = prefix
+        if SCons.Util.is_Dict(suffix):
+            suffix = CallableSelector(suffix)
+        self.env = env
+        self.single_source = single_source
+        if 'overrides' in overrides:
+            SCons.Warnings.warn(SCons.Warnings.DeprecatedBuilderKeywordsWarning,
+                "The \"overrides\" keyword to Builder() creation has been deprecated;\n" +\
+                "\tspecify the items as keyword arguments to the Builder() call instead.")
+            overrides.update(overrides['overrides'])
+            del overrides['overrides']
+        if 'scanner' in overrides:
+            SCons.Warnings.warn(SCons.Warnings.DeprecatedBuilderKeywordsWarning,
+                                "The \"scanner\" keyword to Builder() creation has been deprecated;\n"
+                                "\tuse: source_scanner or target_scanner as appropriate.")
+            del overrides['scanner']
+        self.overrides = overrides
+
+        self.set_suffix(suffix)
+        self.set_src_suffix(src_suffix)
+        self.ensure_suffix = ensure_suffix
+
+        self.target_factory = target_factory
+        self.source_factory = source_factory
+        self.target_scanner = target_scanner
+        self.source_scanner = source_scanner
+
+        self.emitter = emitter
+
+        # Optional Builder name should only be used for Builders
+        # that don't get attached to construction environments.
+        if name:
+            self.name = name
+        self.executor_kw = {}
+        if not chdir is _null:
+            self.executor_kw['chdir'] = chdir
+        self.is_explicit = is_explicit
+
+        if src_builder is None:
+            src_builder = []
+        elif not SCons.Util.is_List(src_builder):
+            src_builder = [ src_builder ]
+        self.src_builder = src_builder
+
+    def __nonzero__(self):
+        raise InternalError("Do not test for the Node.builder attribute directly; use Node.has_builder() instead")
+
+    def get_name(self, env):
+        """Attempts to get the name of the Builder.
+
+        Look at the BUILDERS variable of env, expecting it to be a
+        dictionary containing this Builder, and return the key of the
+        dictionary.  If there's no key, then return a directly-configured
+        name (if there is one) or the name of the class (by default)."""
+
+        try:
+            index = list(env['BUILDERS'].values()).index(self)
+            return list(env['BUILDERS'].keys())[index]
+        except (AttributeError, KeyError, TypeError, ValueError):
+            try:
+                return self.name
+            except AttributeError:
+                return str(self.__class__)
+
+    def __cmp__(self, other):
+        return cmp(self.__dict__, other.__dict__)
+
+    def splitext(self, path, env=None):
+        if not env:
+            env = self.env
+        if env:
+            suffixes = self.src_suffixes(env)
+        else:
+            suffixes = []
+        return match_splitext(path, suffixes)
+
+    def _adjustixes(self, files, pre, suf, ensure_suffix=False):
+        if not files:
+            return []
+        result = []
+        if not SCons.Util.is_List(files):
+            files = [files]
+
+        for f in files:
+            if SCons.Util.is_String(f):
+                f = SCons.Util.adjustixes(f, pre, suf, ensure_suffix)
+            result.append(f)
+        return result
+
+    def _create_nodes(self, env, target = None, source = None):
+        """Create and return lists of target and source nodes.
+        """
+        src_suf = self.get_src_suffix(env)
+
+        target_factory = env.get_factory(self.target_factory)
+        source_factory = env.get_factory(self.source_factory)
+
+        source = self._adjustixes(source, None, src_suf)
+        slist = env.arg2nodes(source, source_factory)
+
+        pre = self.get_prefix(env, slist)
+        suf = self.get_suffix(env, slist)
+
+        if target is None:
+            try:
+                t_from_s = slist[0].target_from_source
+            except AttributeError:
+                raise UserError("Do not know how to create a target from source `%s'" % slist[0])
+            except IndexError:
+                tlist = []
+            else:
+                splitext = lambda S: self.splitext(S,env)
+                tlist = [ t_from_s(pre, suf, splitext) ]
+        else:
+            target = self._adjustixes(target, pre, suf, self.ensure_suffix)
+            tlist = env.arg2nodes(target, target_factory, target=target, source=source)
+
+        if self.emitter:
+            # The emitter is going to do str(node), but because we're
+            # being called *from* a builder invocation, the new targets
+            # don't yet have a builder set on them and will look like
+            # source files.  Fool the emitter's str() calls by setting
+            # up a temporary builder on the new targets.
+            new_targets = []
+            for t in tlist:
+                if not t.is_derived():
+                    t.builder_set(self)
+                    new_targets.append(t)
+
+            orig_tlist = tlist[:]
+            orig_slist = slist[:]
+
+            target, source = self.emitter(target=tlist, source=slist, env=env)
+
+            # Now delete the temporary builders that we attached to any
+            # new targets, so that _node_errors() doesn't do weird stuff
+            # to them because it thinks they already have builders.
+            for t in new_targets:
+                if t.builder is self:
+                    # Only delete the temporary builder if the emitter
+                    # didn't change it on us.
+                    t.builder_set(None)
+
+            # Have to call arg2nodes yet again, since it is legal for
+            # emitters to spit out strings as well as Node instances.
+            tlist = env.arg2nodes(target, target_factory,
+                                  target=orig_tlist, source=orig_slist)
+            slist = env.arg2nodes(source, source_factory,
+                                  target=orig_tlist, source=orig_slist)
+
+        return tlist, slist
+
+    def _execute(self, env, target, source, overwarn={}, executor_kw={}):
+        # We now assume that target and source are lists or None.
+        if self.src_builder:
+            source = self.src_builder_sources(env, source, overwarn)
+
+        if self.single_source and len(source) > 1 and target is None:
+            result = []
+            if target is None: target = [None]*len(source)
+            for tgt, src in zip(target, source):
+                if not tgt is None: tgt = [tgt]
+                if not src is None: src = [src]
+                result.extend(self._execute(env, tgt, src, overwarn))
+            return SCons.Node.NodeList(result)
+
+        overwarn.warn()
+
+        tlist, slist = self._create_nodes(env, target, source)
+
+        # Check for errors with the specified target/source lists.
+        _node_errors(self, env, tlist, slist)
+
+        # The targets are fine, so find or make the appropriate Executor to
+        # build this particular list of targets from this particular list of
+        # sources.
+
+        executor = None
+        key = None
+
+        if self.multi:
+            try:
+                executor = tlist[0].get_executor(create = 0)
+            except (AttributeError, IndexError):
+                pass
+            else:
+                executor.add_sources(slist)
+
+        if executor is None:
+            if not self.action:
+                fmt = "Builder %s must have an action to build %s."
+                raise UserError(fmt % (self.get_name(env or self.env),
+                                        list(map(str,tlist))))
+            key = self.action.batch_key(env or self.env, tlist, slist)
+            if key:
+                try:
+                    executor = SCons.Executor.GetBatchExecutor(key)
+                except KeyError:
+                    pass
+                else:
+                    executor.add_batch(tlist, slist)
+
+        if executor is None:
+            executor = SCons.Executor.Executor(self.action, env, [],
+                                               tlist, slist, executor_kw)
+            if key:
+                SCons.Executor.AddBatchExecutor(key, executor)
+
+        # Now set up the relevant information in the target Nodes themselves.
+        for t in tlist:
+            t.cwd = env.fs.getcwd()
+            t.builder_set(self)
+            t.env_set(env)
+            t.add_source(slist)
+            t.set_executor(executor)
+            t.set_explicit(self.is_explicit)
+
+        return SCons.Node.NodeList(tlist)
+
+    def __call__(self, env, target=None, source=None, chdir=_null, **kw):
+        # We now assume that target and source are lists or None.
+        # The caller (typically Environment.BuilderWrapper) is
+        # responsible for converting any scalar values to lists.
+        if chdir is _null:
+            ekw = self.executor_kw
+        else:
+            ekw = self.executor_kw.copy()
+            ekw['chdir'] = chdir
+        if kw:
+            if 'srcdir' in kw:
+                def prependDirIfRelative(f, srcdir=kw['srcdir']):
+                    import os.path
+                    if SCons.Util.is_String(f) and not os.path.isabs(f):
+                        f = os.path.join(srcdir, f)
+                    return f
+                if not SCons.Util.is_List(source):
+                    source = [source]
+                source = list(map(prependDirIfRelative, source))
+                del kw['srcdir']
+            if self.overrides:
+                env_kw = self.overrides.copy()
+                env_kw.update(kw)
+            else:
+                env_kw = kw
+        else:
+            env_kw = self.overrides
+        env = env.Override(env_kw)
+        return self._execute(env, target, source, OverrideWarner(kw), ekw)
+
+    def adjust_suffix(self, suff):
+        if suff and not suff[0] in [ '.', '_', '$' ]:
+            return '.' + suff
+        return suff
+
+    def get_prefix(self, env, sources=[]):
+        prefix = self.prefix
+        if callable(prefix):
+            prefix = prefix(env, sources)
+        return env.subst(prefix)
+
+    def set_suffix(self, suffix):
+        if not callable(suffix):
+            suffix = self.adjust_suffix(suffix)
+        self.suffix = suffix
+
+    def get_suffix(self, env, sources=[]):
+        suffix = self.suffix
+        if callable(suffix):
+            suffix = suffix(env, sources)
+        return env.subst(suffix)
+
+    def set_src_suffix(self, src_suffix):
+        if not src_suffix:
+            src_suffix = []
+        elif not SCons.Util.is_List(src_suffix):
+            src_suffix = [ src_suffix ]
+        self.src_suffix = [callable(suf) and suf or self.adjust_suffix(suf) for suf in src_suffix]
+
+    def get_src_suffix(self, env):
+        """Get the first src_suffix in the list of src_suffixes."""
+        ret = self.src_suffixes(env)
+        if not ret:
+            return ''
+        return ret[0]
+
+    def add_emitter(self, suffix, emitter):
+        """Add a suffix-emitter mapping to this Builder.
+
+        This assumes that emitter has been initialized with an
+        appropriate dictionary type, and will throw a TypeError if
+        not, so the caller is responsible for knowing that this is an
+        appropriate method to call for the Builder in question.
+        """
+        self.emitter[suffix] = emitter
+
+    def add_src_builder(self, builder):
+        """
+        Add a new Builder to the list of src_builders.
+
+        This requires wiping out cached values so that the computed
+        lists of source suffixes get re-calculated.
+        """
+        self._memo = {}
+        self.src_builder.append(builder)
+
+    def _get_sdict(self, env):
+        """
+        Returns a dictionary mapping all of the source suffixes of all
+        src_builders of this Builder to the underlying Builder that
+        should be called first.
+
+        This dictionary is used for each target specified, so we save a
+        lot of extra computation by memoizing it for each construction
+        environment.
+
+        Note that this is re-computed each time, not cached, because there
+        might be changes to one of our source Builders (or one of their
+        source Builders, and so on, and so on...) that we can't "see."
+
+        The underlying methods we call cache their computed values,
+        though, so we hope repeatedly aggregating them into a dictionary
+        like this won't be too big a hit.  We may need to look for a
+        better way to do this if performance data show this has turned
+        into a significant bottleneck.
+        """
+        sdict = {}
+        for bld in self.get_src_builders(env):
+            for suf in bld.src_suffixes(env):
+                sdict[suf] = bld
+        return sdict
+
+    def src_builder_sources(self, env, source, overwarn={}):
+        sdict = self._get_sdict(env)
+
+        src_suffixes = self.src_suffixes(env)
+
+        lengths = list(set(map(len, src_suffixes)))
+
+        def match_src_suffix(name, src_suffixes=src_suffixes, lengths=lengths):
+            node_suffixes = [name[-l:] for l in lengths]
+            for suf in src_suffixes:
+                if suf in node_suffixes:
+                    return suf
+            return None
+
+        result = []
+        for s in SCons.Util.flatten(source):
+            if SCons.Util.is_String(s):
+                match_suffix = match_src_suffix(env.subst(s))
+                if not match_suffix and not '.' in s:
+                    src_suf = self.get_src_suffix(env)
+                    s = self._adjustixes(s, None, src_suf)[0]
+            else:
+                match_suffix = match_src_suffix(s.name)
+            if match_suffix:
+                try:
+                    bld = sdict[match_suffix]
+                except KeyError:
+                    result.append(s)
+                else:
+                    tlist = bld._execute(env, None, [s], overwarn)
+                    # If the subsidiary Builder returned more than one
+                    # target, then filter out any sources that this
+                    # Builder isn't capable of building.
+                    if len(tlist) > 1:
+                        tlist = [t for t in tlist if match_src_suffix(t.name)]
+                    result.extend(tlist)
+            else:
+                result.append(s)
+
+        source_factory = env.get_factory(self.source_factory)
+
+        return env.arg2nodes(result, source_factory)
+
+    def _get_src_builders_key(self, env):
+        return id(env)
+
+    memoizer_counters.append(SCons.Memoize.CountDict('get_src_builders', _get_src_builders_key))
+
+    def get_src_builders(self, env):
+        """
+        Returns the list of source Builders for this Builder.
+
+        This exists mainly to look up Builders referenced as
+        strings in the 'BUILDER' variable of the construction
+        environment and cache the result.
+        """
+        memo_key = id(env)
+        try:
+            memo_dict = self._memo['get_src_builders']
+        except KeyError:
+            memo_dict = {}
+            self._memo['get_src_builders'] = memo_dict
+        else:
+            try:
+                return memo_dict[memo_key]
+            except KeyError:
+                pass
+
+        builders = []
+        for bld in self.src_builder:
+            if SCons.Util.is_String(bld):
+                try:
+                    bld = env['BUILDERS'][bld]
+                except KeyError:
+                    continue
+            builders.append(bld)
+
+        memo_dict[memo_key] = builders
+        return builders
+
+    def _subst_src_suffixes_key(self, env):
+        return id(env)
+
+    memoizer_counters.append(SCons.Memoize.CountDict('subst_src_suffixes', _subst_src_suffixes_key))
+
+    def subst_src_suffixes(self, env):
+        """
+        The suffix list may contain construction variable expansions,
+        so we have to evaluate the individual strings.  To avoid doing
+        this over and over, we memoize the results for each construction
+        environment.
+        """
+        memo_key = id(env)
+        try:
+            memo_dict = self._memo['subst_src_suffixes']
+        except KeyError:
+            memo_dict = {}
+            self._memo['subst_src_suffixes'] = memo_dict
+        else:
+            try:
+                return memo_dict[memo_key]
+            except KeyError:
+                pass
+        suffixes = [env.subst(x) for x in self.src_suffix]
+        memo_dict[memo_key] = suffixes
+        return suffixes
+
+    def src_suffixes(self, env):
+        """
+        Returns the list of source suffixes for all src_builders of this
+        Builder.
+
+        This is essentially a recursive descent of the src_builder "tree."
+        (This value isn't cached because there may be changes in a
+        src_builder many levels deep that we can't see.)
+        """
+        sdict = {}
+        suffixes = self.subst_src_suffixes(env)
+        for s in suffixes:
+            sdict[s] = 1
+        for builder in self.get_src_builders(env):
+            for s in builder.src_suffixes(env):
+                if s not in sdict:
+                    sdict[s] = 1
+                    suffixes.append(s)
+        return suffixes
+
+class CompositeBuilder(SCons.Util.Proxy):
+    """A Builder Proxy whose main purpose is to always have
+    a DictCmdGenerator as its action, and to provide access
+    to the DictCmdGenerator's add_action() method.
+    """
+
+    def __init__(self, builder, cmdgen):
+        if __debug__: logInstanceCreation(self, 'Builder.CompositeBuilder')
+        SCons.Util.Proxy.__init__(self, builder)
+
+        # cmdgen should always be an instance of DictCmdGenerator.
+        self.cmdgen = cmdgen
+        self.builder = builder
+
+    __call__ = SCons.Util.Delegate('__call__')
+
+    def add_action(self, suffix, action):
+        self.cmdgen.add_action(suffix, action)
+        self.set_src_suffix(self.cmdgen.src_suffixes())
+
+def is_a_Builder(obj):
+    """"Returns True iff the specified obj is one of our Builder classes.
+
+    The test is complicated a bit by the fact that CompositeBuilder
+    is a proxy, not a subclass of BuilderBase.
+    """
+    return (isinstance(obj, BuilderBase)
+            or isinstance(obj, CompositeBuilder)
+            or callable(obj))
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/CacheDir.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/CacheDir.py
new file mode 100644
index 0000000..5fd7f60
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/CacheDir.py
@@ -0,0 +1,216 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/CacheDir.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__doc__ = """
+CacheDir support
+"""
+
+import os.path
+import stat
+import sys
+
+import SCons.Action
+
+cache_enabled = True
+cache_debug = False
+cache_force = False
+cache_show = False
+
+def CacheRetrieveFunc(target, source, env):
+    t = target[0]
+    fs = t.fs
+    cd = env.get_CacheDir()
+    cachedir, cachefile = cd.cachepath(t)
+    if not fs.exists(cachefile):
+        cd.CacheDebug('CacheRetrieve(%s):  %s not in cache\n', t, cachefile)
+        return 1
+    cd.CacheDebug('CacheRetrieve(%s):  retrieving from %s\n', t, cachefile)
+    if SCons.Action.execute_actions:
+        if fs.islink(cachefile):
+            fs.symlink(fs.readlink(cachefile), t.path)
+        else:
+            env.copy_from_cache(cachefile, t.path)
+        st = fs.stat(cachefile)
+        fs.chmod(t.path, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
+    return 0
+
+def CacheRetrieveString(target, source, env):
+    t = target[0]
+    fs = t.fs
+    cd = env.get_CacheDir()
+    cachedir, cachefile = cd.cachepath(t)
+    if t.fs.exists(cachefile):
+        return "Retrieved `%s' from cache" % t.path
+    return None
+
+CacheRetrieve = SCons.Action.Action(CacheRetrieveFunc, CacheRetrieveString)
+
+CacheRetrieveSilent = SCons.Action.Action(CacheRetrieveFunc, None)
+
+def CachePushFunc(target, source, env):
+    t = target[0]
+    if t.nocache:
+        return
+    fs = t.fs
+    cd = env.get_CacheDir()
+    cachedir, cachefile = cd.cachepath(t)
+    if fs.exists(cachefile):
+        # Don't bother copying it if it's already there.  Note that
+        # usually this "shouldn't happen" because if the file already
+        # existed in cache, we'd have retrieved the file from there,
+        # not built it.  This can happen, though, in a race, if some
+        # other person running the same build pushes their copy to
+        # the cache after we decide we need to build it but before our
+        # build completes.
+        cd.CacheDebug('CachePush(%s):  %s already exists in cache\n', t, cachefile)
+        return
+
+    cd.CacheDebug('CachePush(%s):  pushing to %s\n', t, cachefile)
+
+    tempfile = cachefile+'.tmp'+str(os.getpid())
+    errfmt = "Unable to copy %s to cache. Cache file is %s"
+
+    if not fs.isdir(cachedir):
+        try:
+            fs.makedirs(cachedir)
+        except EnvironmentError:
+            # We may have received an exception because another process
+            # has beaten us creating the directory.
+            if not fs.isdir(cachedir):
+                msg = errfmt % (str(target), cachefile)
+                raise SCons.Errors.EnvironmentError(msg)
+
+    try:
+        if fs.islink(t.path):
+            fs.symlink(fs.readlink(t.path), tempfile)
+        else:
+            fs.copy2(t.path, tempfile)
+        fs.rename(tempfile, cachefile)
+        st = fs.stat(t.path)
+        fs.chmod(cachefile, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
+    except EnvironmentError:
+        # It's possible someone else tried writing the file at the
+        # same time we did, or else that there was some problem like
+        # the CacheDir being on a separate file system that's full.
+        # In any case, inability to push a file to cache doesn't affect
+        # the correctness of the build, so just print a warning.
+        msg = errfmt % (str(target), cachefile)
+        SCons.Warnings.warn(SCons.Warnings.CacheWriteErrorWarning, msg)
+
+CachePush = SCons.Action.Action(CachePushFunc, None)
+
+class CacheDir(object):
+
+    def __init__(self, path):
+        try:
+            import hashlib
+        except ImportError:
+            msg = "No hashlib or MD5 module available, CacheDir() not supported"
+            SCons.Warnings.warn(SCons.Warnings.NoMD5ModuleWarning, msg)
+            self.path = None
+        else:
+            self.path = path
+        self.current_cache_debug = None
+        self.debugFP = None
+
+    def CacheDebug(self, fmt, target, cachefile):
+        if cache_debug != self.current_cache_debug:
+            if cache_debug == '-':
+                self.debugFP = sys.stdout
+            elif cache_debug:
+                self.debugFP = open(cache_debug, 'w')
+            else:
+                self.debugFP = None
+            self.current_cache_debug = cache_debug
+        if self.debugFP:
+            self.debugFP.write(fmt % (target, os.path.split(cachefile)[1]))
+
+    def is_enabled(self):
+        return (cache_enabled and not self.path is None)
+
+    def cachepath(self, node):
+        """
+        """
+        if not self.is_enabled():
+            return None, None
+
+        sig = node.get_cachedir_bsig()
+        subdir = sig[0].upper()
+        dir = os.path.join(self.path, subdir)
+        return dir, os.path.join(dir, sig)
+
+    def retrieve(self, node):
+        """
+        This method is called from multiple threads in a parallel build,
+        so only do thread safe stuff here. Do thread unsafe stuff in
+        built().
+
+        Note that there's a special trick here with the execute flag
+        (one that's not normally done for other actions).  Basically
+        if the user requested a no_exec (-n) build, then
+        SCons.Action.execute_actions is set to 0 and when any action
+        is called, it does its showing but then just returns zero
+        instead of actually calling the action execution operation.
+        The problem for caching is that if the file does NOT exist in
+        cache then the CacheRetrieveString won't return anything to
+        show for the task, but the Action.__call__ won't call
+        CacheRetrieveFunc; instead it just returns zero, which makes
+        the code below think that the file *was* successfully
+        retrieved from the cache, therefore it doesn't do any
+        subsequent building.  However, the CacheRetrieveString didn't
+        print anything because it didn't actually exist in the cache,
+        and no more build actions will be performed, so the user just
+        sees nothing.  The fix is to tell Action.__call__ to always
+        execute the CacheRetrieveFunc and then have the latter
+        explicitly check SCons.Action.execute_actions itself.
+        """
+        if not self.is_enabled():
+            return False
+
+        env = node.get_build_env()
+        if cache_show:
+            if CacheRetrieveSilent(node, [], env, execute=1) == 0:
+                node.build(presub=0, execute=0)
+                return True
+        else:
+            if CacheRetrieve(node, [], env, execute=1) == 0:
+                return True
+
+        return False
+
+    def push(self, node):
+        if not self.is_enabled():
+            return
+        return CachePush(node, [], node.get_build_env())
+
+    def push_if_forced(self, node):
+        if cache_force:
+            return self.push(node)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Conftest.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Conftest.py
new file mode 100644
index 0000000..04a6bc2
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Conftest.py
@@ -0,0 +1,793 @@
+"""SCons.Conftest
+
+Autoconf-like configuration support; low level implementation of tests.
+"""
+
+#
+# Copyright (c) 2003 Stichting NLnet Labs
+# Copyright (c) 2001, 2002, 2003 Steven Knight
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+#
+# The purpose of this module is to define how a check is to be performed.
+# Use one of the Check...() functions below.
+#
+
+#
+# A context class is used that defines functions for carrying out the tests,
+# logging and messages.  The following methods and members must be present:
+#
+# context.Display(msg)  Function called to print messages that are normally
+#                       displayed for the user.  Newlines are explicitly used.
+#                       The text should also be written to the logfile!
+#
+# context.Log(msg)      Function called to write to a log file.
+#
+# context.BuildProg(text, ext)
+#                       Function called to build a program, using "ext" for the
+#                       file extention.  Must return an empty string for
+#                       success, an error message for failure.
+#                       For reliable test results building should be done just
+#                       like an actual program would be build, using the same
+#                       command and arguments (including configure results so
+#                       far).
+#
+# context.CompileProg(text, ext)
+#                       Function called to compile a program, using "ext" for
+#                       the file extention.  Must return an empty string for
+#                       success, an error message for failure.
+#                       For reliable test results compiling should be done just
+#                       like an actual source file would be compiled, using the
+#                       same command and arguments (including configure results
+#                       so far).
+#
+# context.AppendLIBS(lib_name_list)
+#                       Append "lib_name_list" to the value of LIBS.
+#                       "lib_namelist" is a list of strings.
+#                       Return the value of LIBS before changing it (any type
+#                       can be used, it is passed to SetLIBS() later.)
+#
+# context.PrependLIBS(lib_name_list)
+#                       Prepend "lib_name_list" to the value of LIBS.
+#                       "lib_namelist" is a list of strings.
+#                       Return the value of LIBS before changing it (any type
+#                       can be used, it is passed to SetLIBS() later.)
+#
+# context.SetLIBS(value)
+#                       Set LIBS to "value".  The type of "value" is what
+#                       AppendLIBS() returned.
+#                       Return the value of LIBS before changing it (any type
+#                       can be used, it is passed to SetLIBS() later.)
+#
+# context.headerfilename
+#                       Name of file to append configure results to, usually
+#                       "confdefs.h".
+#                       The file must not exist or be empty when starting.
+#                       Empty or None to skip this (some tests will not work!).
+#
+# context.config_h      (may be missing). If present, must be a string, which
+#                       will be filled with the contents of a config_h file.
+#
+# context.vardict       Dictionary holding variables used for the tests and
+#                       stores results from the tests, used for the build
+#                       commands.
+#                       Normally contains "CC", "LIBS", "CPPFLAGS", etc.
+#
+# context.havedict      Dictionary holding results from the tests that are to
+#                       be used inside a program.
+#                       Names often start with "HAVE_".  These are zero
+#                       (feature not present) or one (feature present).  Other
+#                       variables may have any value, e.g., "PERLVERSION" can
+#                       be a number and "SYSTEMNAME" a string.
+#
+
+import re
+from types import IntType
+
+#
+# PUBLIC VARIABLES
+#
+
+LogInputFiles = 1    # Set that to log the input files in case of a failed test
+LogErrorMessages = 1 # Set that to log Conftest-generated error messages
+
+#
+# PUBLIC FUNCTIONS
+#
+
+# Generic remarks:
+# - When a language is specified which is not supported the test fails.  The
+#   message is a bit different, because not all the arguments for the normal
+#   message are available yet (chicken-egg problem).
+
+
+def CheckBuilder(context, text = None, language = None):
+    """
+    Configure check to see if the compiler works.
+    Note that this uses the current value of compiler and linker flags, make
+    sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly.
+    "language" should be "C" or "C++" and is used to select the compiler.
+    Default is "C".
+    "text" may be used to specify the code to be build.
+    Returns an empty string for success, an error message for failure.
+    """
+    lang, suffix, msg = _lang2suffix(language)
+    if msg:
+        context.Display("%s\n" % msg)
+        return msg
+
+    if not text:
+        text = """
+int main() {
+    return 0;
+}
+"""
+
+    context.Display("Checking if building a %s file works... " % lang)
+    ret = context.BuildProg(text, suffix)
+    _YesNoResult(context, ret, None, text)
+    return ret
+
+def CheckCC(context):
+    """
+    Configure check for a working C compiler.
+
+    This checks whether the C compiler, as defined in the $CC construction
+    variable, can compile a C source file. It uses the current $CCCOM value
+    too, so that it can test against non working flags.
+
+    """
+    context.Display("Checking whether the C compiler works")
+    text = """
+int main()
+{
+    return 0;
+}
+"""
+    ret = _check_empty_program(context, 'CC', text, 'C')
+    _YesNoResult(context, ret, None, text)
+    return ret
+
+def CheckSHCC(context):
+    """
+    Configure check for a working shared C compiler.
+
+    This checks whether the C compiler, as defined in the $SHCC construction
+    variable, can compile a C source file. It uses the current $SHCCCOM value
+    too, so that it can test against non working flags.
+
+    """
+    context.Display("Checking whether the (shared) C compiler works")
+    text = """
+int foo()
+{
+    return 0;
+}
+"""
+    ret = _check_empty_program(context, 'SHCC', text, 'C', use_shared = True)
+    _YesNoResult(context, ret, None, text)
+    return ret
+
+def CheckCXX(context):
+    """
+    Configure check for a working CXX compiler.
+
+    This checks whether the CXX compiler, as defined in the $CXX construction
+    variable, can compile a CXX source file. It uses the current $CXXCOM value
+    too, so that it can test against non working flags.
+
+    """
+    context.Display("Checking whether the C++ compiler works")
+    text = """
+int main()
+{
+    return 0;
+}
+"""
+    ret = _check_empty_program(context, 'CXX', text, 'C++')
+    _YesNoResult(context, ret, None, text)
+    return ret
+
+def CheckSHCXX(context):
+    """
+    Configure check for a working shared CXX compiler.
+
+    This checks whether the CXX compiler, as defined in the $SHCXX construction
+    variable, can compile a CXX source file. It uses the current $SHCXXCOM value
+    too, so that it can test against non working flags.
+
+    """
+    context.Display("Checking whether the (shared) C++ compiler works")
+    text = """
+int main()
+{
+    return 0;
+}
+"""
+    ret = _check_empty_program(context, 'SHCXX', text, 'C++', use_shared = True)
+    _YesNoResult(context, ret, None, text)
+    return ret
+
+def _check_empty_program(context, comp, text, language, use_shared = False):
+    """Return 0 on success, 1 otherwise."""
+    if comp not in context.env or not context.env[comp]:
+        # The compiler construction variable is not set or empty
+        return 1
+
+    lang, suffix, msg = _lang2suffix(language)
+    if msg:
+        return 1
+
+    if use_shared:
+        return context.CompileSharedObject(text, suffix)
+    else:
+        return context.CompileProg(text, suffix)
+
+
+def CheckFunc(context, function_name, header = None, language = None):
+    """
+    Configure check for a function "function_name".
+    "language" should be "C" or "C++" and is used to select the compiler.
+    Default is "C".
+    Optional "header" can be defined to define a function prototype, include a
+    header file or anything else that comes before main().
+    Sets HAVE_function_name in context.havedict according to the result.
+    Note that this uses the current value of compiler and linker flags, make
+    sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly.
+    Returns an empty string for success, an error message for failure.
+    """
+
+    # Remarks from autoconf:
+    # - Don't include <ctype.h> because on OSF/1 3.0 it includes <sys/types.h>
+    #   which includes <sys/select.h> which contains a prototype for select.
+    #   Similarly for bzero.
+    # - assert.h is included to define __stub macros and hopefully few
+    #   prototypes, which can conflict with char $1(); below.
+    # - Override any gcc2 internal prototype to avoid an error.
+    # - We use char for the function declaration because int might match the
+    #   return type of a gcc2 builtin and then its argument prototype would
+    #   still apply.
+    # - The GNU C library defines this for functions which it implements to
+    #   always fail with ENOSYS.  Some functions are actually named something
+    #   starting with __ and the normal name is an alias.
+
+    if context.headerfilename:
+        includetext = '#include "%s"' % context.headerfilename
+    else:
+        includetext = ''
+    if not header:
+        header = """
+#ifdef __cplusplus
+extern "C"
+#endif
+char %s();""" % function_name
+
+    lang, suffix, msg = _lang2suffix(language)
+    if msg:
+        context.Display("Cannot check for %s(): %s\n" % (function_name, msg))
+        return msg
+
+    text = """
+%(include)s
+#include <assert.h>
+%(hdr)s
+
+int main() {
+#if defined (__stub_%(name)s) || defined (__stub___%(name)s)
+  fail fail fail
+#else
+  %(name)s();
+#endif
+
+  return 0;
+}
+""" % { 'name': function_name,
+        'include': includetext,
+        'hdr': header }
+
+    context.Display("Checking for %s function %s()... " % (lang, function_name))
+    ret = context.BuildProg(text, suffix)
+    _YesNoResult(context, ret, "HAVE_" + function_name, text,
+                 "Define to 1 if the system has the function `%s'." %\
+                 function_name)
+    return ret
+
+
+def CheckHeader(context, header_name, header = None, language = None,
+                                                        include_quotes = None):
+    """
+    Configure check for a C or C++ header file "header_name".
+    Optional "header" can be defined to do something before including the
+    header file (unusual, supported for consistency).
+    "language" should be "C" or "C++" and is used to select the compiler.
+    Default is "C".
+    Sets HAVE_header_name in context.havedict according to the result.
+    Note that this uses the current value of compiler and linker flags, make
+    sure $CFLAGS and $CPPFLAGS are set correctly.
+    Returns an empty string for success, an error message for failure.
+    """
+    # Why compile the program instead of just running the preprocessor?
+    # It is possible that the header file exists, but actually using it may
+    # fail (e.g., because it depends on other header files).  Thus this test is
+    # more strict.  It may require using the "header" argument.
+    #
+    # Use <> by default, because the check is normally used for system header
+    # files.  SCons passes '""' to overrule this.
+
+    # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H.
+    if context.headerfilename:
+        includetext = '#include "%s"\n' % context.headerfilename
+    else:
+        includetext = ''
+    if not header:
+        header = ""
+
+    lang, suffix, msg = _lang2suffix(language)
+    if msg:
+        context.Display("Cannot check for header file %s: %s\n"
+                                                          % (header_name, msg))
+        return msg
+
+    if not include_quotes:
+        include_quotes = "<>"
+
+    text = "%s%s\n#include %s%s%s\n\n" % (includetext, header,
+                             include_quotes[0], header_name, include_quotes[1])
+
+    context.Display("Checking for %s header file %s... " % (lang, header_name))
+    ret = context.CompileProg(text, suffix)
+    _YesNoResult(context, ret, "HAVE_" + header_name, text, 
+                 "Define to 1 if you have the <%s> header file." % header_name)
+    return ret
+
+
+def CheckType(context, type_name, fallback = None,
+                                               header = None, language = None):
+    """
+    Configure check for a C or C++ type "type_name".
+    Optional "header" can be defined to include a header file.
+    "language" should be "C" or "C++" and is used to select the compiler.
+    Default is "C".
+    Sets HAVE_type_name in context.havedict according to the result.
+    Note that this uses the current value of compiler and linker flags, make
+    sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly.
+    Returns an empty string for success, an error message for failure.
+    """
+
+    # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H.
+    if context.headerfilename:
+        includetext = '#include "%s"' % context.headerfilename
+    else:
+        includetext = ''
+    if not header:
+        header = ""
+
+    lang, suffix, msg = _lang2suffix(language)
+    if msg:
+        context.Display("Cannot check for %s type: %s\n" % (type_name, msg))
+        return msg
+
+    # Remarks from autoconf about this test:
+    # - Grepping for the type in include files is not reliable (grep isn't
+    #   portable anyway).
+    # - Using "TYPE my_var;" doesn't work for const qualified types in C++.
+    #   Adding an initializer is not valid for some C++ classes.
+    # - Using the type as parameter to a function either fails for K&$ C or for
+    #   C++.
+    # - Using "TYPE *my_var;" is valid in C for some types that are not
+    #   declared (struct something).
+    # - Using "sizeof(TYPE)" is valid when TYPE is actually a variable.
+    # - Using the previous two together works reliably.
+    text = """
+%(include)s
+%(header)s
+
+int main() {
+  if ((%(name)s *) 0)
+    return 0;
+  if (sizeof (%(name)s))
+    return 0;
+}
+""" % { 'include': includetext,
+        'header': header,
+        'name': type_name }
+
+    context.Display("Checking for %s type %s... " % (lang, type_name))
+    ret = context.BuildProg(text, suffix)
+    _YesNoResult(context, ret, "HAVE_" + type_name, text,
+                 "Define to 1 if the system has the type `%s'." % type_name)
+    if ret and fallback and context.headerfilename:
+        f = open(context.headerfilename, "a")
+        f.write("typedef %s %s;\n" % (fallback, type_name))
+        f.close()
+
+    return ret
+
+def CheckTypeSize(context, type_name, header = None, language = None, expect = None):
+    """This check can be used to get the size of a given type, or to check whether
+    the type is of expected size.
+
+    Arguments:
+        - type : str
+            the type to check
+        - includes : sequence
+            list of headers to include in the test code before testing the type
+        - language : str
+            'C' or 'C++'
+        - expect : int
+            if given, will test wether the type has the given number of bytes.
+            If not given, will automatically find the size.
+
+        Returns:
+            status : int
+                0 if the check failed, or the found size of the type if the check succeeded."""
+    
+    # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H.
+    if context.headerfilename:
+        includetext = '#include "%s"' % context.headerfilename
+    else:
+        includetext = ''
+
+    if not header:
+        header = ""
+
+    lang, suffix, msg = _lang2suffix(language)
+    if msg:
+        context.Display("Cannot check for %s type: %s\n" % (type_name, msg))
+        return msg
+
+    src = includetext + header 
+    if not expect is None:
+        # Only check if the given size is the right one
+        context.Display('Checking %s is %d bytes... ' % (type_name, expect))
+
+        # test code taken from autoconf: this is a pretty clever hack to find that
+        # a type is of a given size using only compilation. This speeds things up
+        # quite a bit compared to straightforward code using TryRun
+        src = src + r"""
+typedef %s scons_check_type;
+
+int main()
+{
+    static int test_array[1 - 2 * !(((long int) (sizeof(scons_check_type))) == %d)];
+    test_array[0] = 0;
+
+    return 0;
+}
+"""
+
+        st = context.CompileProg(src % (type_name, expect), suffix)
+        if not st:
+            context.Display("yes\n")
+            _Have(context, "SIZEOF_%s" % type_name, expect, 
+                  "The size of `%s', as computed by sizeof." % type_name)
+            return expect
+        else:
+            context.Display("no\n")
+            _LogFailed(context, src, st)
+            return 0
+    else:
+        # Only check if the given size is the right one
+        context.Message('Checking size of %s ... ' % type_name)
+
+        # We have to be careful with the program we wish to test here since
+        # compilation will be attempted using the current environment's flags.
+        # So make sure that the program will compile without any warning. For
+        # example using: 'int main(int argc, char** argv)' will fail with the
+        # '-Wall -Werror' flags since the variables argc and argv would not be
+        # used in the program...
+        #
+        src = src + """
+#include <stdlib.h>
+#include <stdio.h>
+int main() {
+    printf("%d", (int)sizeof(""" + type_name + """));
+    return 0;
+}
+    """
+        st, out = context.RunProg(src, suffix)
+        try:
+            size = int(out)
+        except ValueError:
+            # If cannot convert output of test prog to an integer (the size),
+            # something went wront, so just fail
+            st = 1
+            size = 0
+
+        if not st:
+            context.Display("yes\n")
+            _Have(context, "SIZEOF_%s" % type_name, size,
+                  "The size of `%s', as computed by sizeof." % type_name)
+            return size
+        else:
+            context.Display("no\n")
+            _LogFailed(context, src, st)
+            return 0
+
+    return 0
+
+def CheckDeclaration(context, symbol, includes = None, language = None):
+    """Checks whether symbol is declared.
+
+    Use the same test as autoconf, that is test whether the symbol is defined
+    as a macro or can be used as an r-value.
+
+    Arguments:
+        symbol : str
+            the symbol to check
+        includes : str
+            Optional "header" can be defined to include a header file.
+        language : str
+            only C and C++ supported.
+
+    Returns:
+        status : bool
+            True if the check failed, False if succeeded."""
+    
+    # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H.
+    if context.headerfilename:
+        includetext = '#include "%s"' % context.headerfilename
+    else:
+        includetext = ''
+
+    if not includes:
+        includes = ""
+
+    lang, suffix, msg = _lang2suffix(language)
+    if msg:
+        context.Display("Cannot check for declaration %s: %s\n" % (type_name, msg))
+        return msg
+
+    src = includetext + includes 
+    context.Display('Checking whether %s is declared... ' % symbol)
+
+    src = src + r"""
+int main()
+{
+#ifndef %s
+    (void) %s;
+#endif
+    ;
+    return 0;
+}
+""" % (symbol, symbol)
+
+    st = context.CompileProg(src, suffix)
+    _YesNoResult(context, st, "HAVE_DECL_" + symbol, src,
+                 "Set to 1 if %s is defined." % symbol)
+    return st
+
+def CheckLib(context, libs, func_name = None, header = None,
+             extra_libs = None, call = None, language = None, autoadd = 1,
+             append = True):
+    """
+    Configure check for a C or C++ libraries "libs".  Searches through
+    the list of libraries, until one is found where the test succeeds.
+    Tests if "func_name" or "call" exists in the library.  Note: if it exists
+    in another library the test succeeds anyway!
+    Optional "header" can be defined to include a header file.  If not given a
+    default prototype for "func_name" is added.
+    Optional "extra_libs" is a list of library names to be added after
+    "lib_name" in the build command.  To be used for libraries that "lib_name"
+    depends on.
+    Optional "call" replaces the call to "func_name" in the test code.  It must
+    consist of complete C statements, including a trailing ";".
+    Both "func_name" and "call" arguments are optional, and in that case, just
+    linking against the libs is tested.
+    "language" should be "C" or "C++" and is used to select the compiler.
+    Default is "C".
+    Note that this uses the current value of compiler and linker flags, make
+    sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly.
+    Returns an empty string for success, an error message for failure.
+    """
+    # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H.
+    if context.headerfilename:
+        includetext = '#include "%s"' % context.headerfilename
+    else:
+        includetext = ''
+    if not header:
+        header = ""
+
+    text = """
+%s
+%s""" % (includetext, header)
+
+    # Add a function declaration if needed.
+    if func_name and func_name != "main":
+        if not header:
+            text = text + """
+#ifdef __cplusplus
+extern "C"
+#endif
+char %s();
+""" % func_name
+
+        # The actual test code.
+        if not call:
+            call = "%s();" % func_name
+
+    # if no function to test, leave main() blank
+    text = text + """
+int
+main() {
+  %s
+return 0;
+}
+""" % (call or "")
+
+    if call:
+        i = call.find("\n")
+        if i > 0:
+            calltext = call[:i] + ".."
+        elif call[-1] == ';':
+            calltext = call[:-1]
+        else:
+            calltext = call
+
+    for lib_name in libs:
+
+        lang, suffix, msg = _lang2suffix(language)
+        if msg:
+            context.Display("Cannot check for library %s: %s\n" % (lib_name, msg))
+            return msg
+
+        # if a function was specified to run in main(), say it
+        if call:
+                context.Display("Checking for %s in %s library %s... "
+                                % (calltext, lang, lib_name))
+        # otherwise, just say the name of library and language
+        else:
+                context.Display("Checking for %s library %s... "
+                                % (lang, lib_name))
+
+        if lib_name:
+            l = [ lib_name ]
+            if extra_libs:
+                l.extend(extra_libs)
+            if append:
+                oldLIBS = context.AppendLIBS(l)
+            else:
+                oldLIBS = context.PrependLIBS(l)
+            sym = "HAVE_LIB" + lib_name
+        else:
+            oldLIBS = -1
+            sym = None
+
+        ret = context.BuildProg(text, suffix)
+
+        _YesNoResult(context, ret, sym, text,
+                     "Define to 1 if you have the `%s' library." % lib_name)
+        if oldLIBS != -1 and (ret or not autoadd):
+            context.SetLIBS(oldLIBS)
+            
+        if not ret:
+            return ret
+
+    return ret
+
+#
+# END OF PUBLIC FUNCTIONS
+#
+
+def _YesNoResult(context, ret, key, text, comment = None):
+    """
+    Handle the result of a test with a "yes" or "no" result.
+    "ret" is the return value: empty if OK, error message when not.
+    "key" is the name of the symbol to be defined (HAVE_foo).
+    "text" is the source code of the program used for testing.
+    "comment" is the C comment to add above the line defining the symbol (the
+    comment is automatically put inside a /* */). If None, no comment is added.
+    """
+    if key:
+        _Have(context, key, not ret, comment)
+    if ret:
+        context.Display("no\n")
+        _LogFailed(context, text, ret)
+    else:
+        context.Display("yes\n")
+
+
+def _Have(context, key, have, comment = None):
+    """
+    Store result of a test in context.havedict and context.headerfilename.
+    "key" is a "HAVE_abc" name.  It is turned into all CAPITALS and non-
+    alphanumerics are replaced by an underscore.
+    The value of "have" can be:
+    1      - Feature is defined, add "#define key".
+    0      - Feature is not defined, add "/* #undef key */".
+             Adding "undef" is what autoconf does.  Not useful for the
+             compiler, but it shows that the test was done.
+    number - Feature is defined to this number "#define key have".
+             Doesn't work for 0 or 1, use a string then.
+    string - Feature is defined to this string "#define key have".
+             Give "have" as is should appear in the header file, include quotes
+             when desired and escape special characters!
+    """
+    key_up = key.upper()
+    key_up = re.sub('[^A-Z0-9_]', '_', key_up)
+    context.havedict[key_up] = have
+    if have == 1:
+        line = "#define %s 1\n" % key_up
+    elif have == 0:
+        line = "/* #undef %s */\n" % key_up
+    elif isinstance(have, IntType):
+        line = "#define %s %d\n" % (key_up, have)
+    else:
+        line = "#define %s %s\n" % (key_up, str(have))
+    
+    if comment is not None:
+        lines = "\n/* %s */\n" % comment + line
+    else:
+        lines = "\n" + line
+
+    if context.headerfilename:
+        f = open(context.headerfilename, "a")
+        f.write(lines)
+        f.close()
+    elif hasattr(context,'config_h'):
+        context.config_h = context.config_h + lines
+
+
+def _LogFailed(context, text, msg):
+    """
+    Write to the log about a failed program.
+    Add line numbers, so that error messages can be understood.
+    """
+    if LogInputFiles:
+        context.Log("Failed program was:\n")
+        lines = text.split('\n')
+        if len(lines) and lines[-1] == '':
+            lines = lines[:-1]              # remove trailing empty line
+        n = 1
+        for line in lines:
+            context.Log("%d: %s\n" % (n, line))
+            n = n + 1
+    if LogErrorMessages:
+        context.Log("Error message: %s\n" % msg)
+
+
+def _lang2suffix(lang):
+    """
+    Convert a language name to a suffix.
+    When "lang" is empty or None C is assumed.
+    Returns a tuple (lang, suffix, None) when it works.
+    For an unrecognized language returns (None, None, msg).
+    Where:
+        lang   = the unified language name
+        suffix = the suffix, including the leading dot
+        msg    = an error message
+    """
+    if not lang or lang in ["C", "c"]:
+        return ("C", ".c", None)
+    if lang in ["c++", "C++", "cpp", "CXX", "cxx"]:
+        return ("C++", ".cpp", None)
+
+    return None, None, "Unsupported language: %s" % lang
+
+
+# vim: set sw=4 et sts=4 tw=79 fo+=l:
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Debug.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Debug.py
new file mode 100644
index 0000000..59f4987
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Debug.py
@@ -0,0 +1,220 @@
+"""SCons.Debug
+
+Code for debugging SCons internal things.  Shouldn't be
+needed by most users.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Debug.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+import sys
+import time
+import weakref
+
+tracked_classes = {}
+
+def logInstanceCreation(instance, name=None):
+    if name is None:
+        name = instance.__class__.__name__
+    if name not in tracked_classes:
+        tracked_classes[name] = []
+    tracked_classes[name].append(weakref.ref(instance))
+
+def string_to_classes(s):
+    if s == '*':
+        return sorted(tracked_classes.keys())
+    else:
+        return s.split()
+
+def fetchLoggedInstances(classes="*"):
+    classnames = string_to_classes(classes)
+    return [(cn, len(tracked_classes[cn])) for cn in classnames]
+  
+def countLoggedInstances(classes, file=sys.stdout):
+    for classname in string_to_classes(classes):
+        file.write("%s: %d\n" % (classname, len(tracked_classes[classname])))
+
+def listLoggedInstances(classes, file=sys.stdout):
+    for classname in string_to_classes(classes):
+        file.write('\n%s:\n' % classname)
+        for ref in tracked_classes[classname]:
+            obj = ref()
+            if obj is not None:
+                file.write('    %s\n' % repr(obj))
+
+def dumpLoggedInstances(classes, file=sys.stdout):
+    for classname in string_to_classes(classes):
+        file.write('\n%s:\n' % classname)
+        for ref in tracked_classes[classname]:
+            obj = ref()
+            if obj is not None:
+                file.write('    %s:\n' % obj)
+                for key, value in obj.__dict__.items():
+                    file.write('        %20s : %s\n' % (key, value))
+
+
+
+if sys.platform[:5] == "linux":
+    # Linux doesn't actually support memory usage stats from getrusage().
+    def memory():
+        mstr = open('/proc/self/stat').read()
+        mstr = mstr.split()[22]
+        return int(mstr)
+elif sys.platform[:6] == 'darwin':
+    #TODO really get memory stats for OS X
+    def memory():
+        return 0
+else:
+    try:
+        import resource
+    except ImportError:
+        try:
+            import win32process
+            import win32api
+        except ImportError:
+            def memory():
+                return 0
+        else:
+            def memory():
+                process_handle = win32api.GetCurrentProcess()
+                memory_info = win32process.GetProcessMemoryInfo( process_handle )
+                return memory_info['PeakWorkingSetSize']
+    else:
+        def memory():
+            res = resource.getrusage(resource.RUSAGE_SELF)
+            return res[4]
+
+# returns caller's stack
+def caller_stack(*backlist):
+    import traceback
+    if not backlist:
+        backlist = [0]
+    result = []
+    for back in backlist:
+        tb = traceback.extract_stack(limit=3+back)
+        key = tb[0][:3]
+        result.append('%s:%d(%s)' % func_shorten(key))
+    return result
+
+caller_bases = {}
+caller_dicts = {}
+
+# trace a caller's stack
+def caller_trace(back=0):
+    import traceback
+    tb = traceback.extract_stack(limit=3+back)
+    tb.reverse()
+    callee = tb[1][:3]
+    caller_bases[callee] = caller_bases.get(callee, 0) + 1
+    for caller in tb[2:]:
+        caller = callee + caller[:3]
+        try:
+            entry = caller_dicts[callee]
+        except KeyError:
+            caller_dicts[callee] = entry = {}
+        entry[caller] = entry.get(caller, 0) + 1
+        callee = caller
+
+# print a single caller and its callers, if any
+def _dump_one_caller(key, file, level=0):
+    leader = '      '*level
+    for v,c in sorted([(-v,c) for c,v in caller_dicts[key].items()]):
+        file.write("%s  %6d %s:%d(%s)\n" % ((leader,-v) + func_shorten(c[-3:])))
+        if c in caller_dicts:
+            _dump_one_caller(c, file, level+1)
+
+# print each call tree
+def dump_caller_counts(file=sys.stdout):
+    for k in sorted(caller_bases.keys()):
+        file.write("Callers of %s:%d(%s), %d calls:\n"
+                    % (func_shorten(k) + (caller_bases[k],)))
+        _dump_one_caller(k, file)
+
+shorten_list = [
+    ( '/scons/SCons/',          1),
+    ( '/src/engine/SCons/',     1),
+    ( '/usr/lib/python',        0),
+]
+
+if os.sep != '/':
+    shorten_list = [(t[0].replace('/', os.sep), t[1]) for t in shorten_list]
+
+def func_shorten(func_tuple):
+    f = func_tuple[0]
+    for t in shorten_list:
+        i = f.find(t[0])
+        if i >= 0:
+            if t[1]:
+                i = i + len(t[0])
+            return (f[i:],)+func_tuple[1:]
+    return func_tuple
+
+
+TraceFP = {}
+if sys.platform == 'win32':
+    TraceDefault = 'con'
+else:
+    TraceDefault = '/dev/tty'
+
+TimeStampDefault = None
+StartTime = time.time()
+PreviousTime = StartTime
+
+def Trace(msg, file=None, mode='w', tstamp=None):
+    """Write a trace message to a file.  Whenever a file is specified,
+    it becomes the default for the next call to Trace()."""
+    global TraceDefault
+    global TimeStampDefault
+    global PreviousTime
+    if file is None:
+        file = TraceDefault
+    else:
+        TraceDefault = file
+    if tstamp is None:
+        tstamp = TimeStampDefault
+    else:
+        TimeStampDefault = tstamp
+    try:
+        fp = TraceFP[file]
+    except KeyError:
+        try:
+            fp = TraceFP[file] = open(file, mode)
+        except TypeError:
+            # Assume we were passed an open file pointer.
+            fp = file
+    if tstamp:
+        now = time.time()
+        fp.write('%8.4f %8.4f:  ' % (now - StartTime, now - PreviousTime))
+        PreviousTime = now
+    fp.write(msg)
+    fp.flush()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Defaults.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Defaults.py
new file mode 100644
index 0000000..24428c4
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Defaults.py
@@ -0,0 +1,493 @@
+"""SCons.Defaults
+
+Builders and other things for the local site.  Here's where we'll
+duplicate the functionality of autoconf until we move it into the
+installation procedure or use something like qmconf.
+
+The code that reads the registry to find MSVC components was borrowed
+from distutils.msvccompiler.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import division
+
+__revision__ = "src/engine/SCons/Defaults.py 5183 2010/11/25 14:46:21 bdeegan"
+
+
+import os
+import errno
+import shutil
+import stat
+import time
+import sys
+
+import SCons.Action
+import SCons.Builder
+import SCons.CacheDir
+import SCons.Environment
+import SCons.PathList
+import SCons.Subst
+import SCons.Tool
+
+# A placeholder for a default Environment (for fetching source files
+# from source code management systems and the like).  This must be
+# initialized later, after the top-level directory is set by the calling
+# interface.
+_default_env = None
+
+# Lazily instantiate the default environment so the overhead of creating
+# it doesn't apply when it's not needed.
+def _fetch_DefaultEnvironment(*args, **kw):
+    """
+    Returns the already-created default construction environment.
+    """
+    global _default_env
+    return _default_env
+
+def DefaultEnvironment(*args, **kw):
+    """
+    Initial public entry point for creating the default construction
+    Environment.
+
+    After creating the environment, we overwrite our name
+    (DefaultEnvironment) with the _fetch_DefaultEnvironment() function,
+    which more efficiently returns the initialized default construction
+    environment without checking for its existence.
+
+    (This function still exists with its _default_check because someone
+    else (*cough* Script/__init__.py *cough*) may keep a reference
+    to this function.  So we can't use the fully functional idiom of
+    having the name originally be a something that *only* creates the
+    construction environment and then overwrites the name.)
+    """
+    global _default_env
+    if not _default_env:
+        import SCons.Util
+        _default_env = SCons.Environment.Environment(*args, **kw)
+        if SCons.Util.md5:
+            _default_env.Decider('MD5')
+        else:
+            _default_env.Decider('timestamp-match')
+        global DefaultEnvironment
+        DefaultEnvironment = _fetch_DefaultEnvironment
+        _default_env._CacheDir_path = None
+    return _default_env
+
+# Emitters for setting the shared attribute on object files,
+# and an action for checking that all of the source files
+# going into a shared library are, in fact, shared.
+def StaticObjectEmitter(target, source, env):
+    for tgt in target:
+        tgt.attributes.shared = None
+    return (target, source)
+
+def SharedObjectEmitter(target, source, env):
+    for tgt in target:
+        tgt.attributes.shared = 1
+    return (target, source)
+
+def SharedFlagChecker(source, target, env):
+    same = env.subst('$STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME')
+    if same == '0' or same == '' or same == 'False':
+        for src in source:
+            try:
+                shared = src.attributes.shared
+            except AttributeError:
+                shared = None
+            if not shared:
+                raise SCons.Errors.UserError("Source file: %s is static and is not compatible with shared target: %s" % (src, target[0]))
+
+SharedCheck = SCons.Action.Action(SharedFlagChecker, None)
+
+# Some people were using these variable name before we made
+# SourceFileScanner part of the public interface.  Don't break their
+# SConscript files until we've given them some fair warning and a
+# transition period.
+CScan = SCons.Tool.CScanner
+DScan = SCons.Tool.DScanner
+LaTeXScan = SCons.Tool.LaTeXScanner
+ObjSourceScan = SCons.Tool.SourceFileScanner
+ProgScan = SCons.Tool.ProgramScanner
+
+# These aren't really tool scanners, so they don't quite belong with
+# the rest of those in Tool/__init__.py, but I'm not sure where else
+# they should go.  Leave them here for now.
+import SCons.Scanner.Dir
+DirScanner = SCons.Scanner.Dir.DirScanner()
+DirEntryScanner = SCons.Scanner.Dir.DirEntryScanner()
+
+# Actions for common languages.
+CAction = SCons.Action.Action("$CCCOM", "$CCCOMSTR")
+ShCAction = SCons.Action.Action("$SHCCCOM", "$SHCCCOMSTR")
+CXXAction = SCons.Action.Action("$CXXCOM", "$CXXCOMSTR")
+ShCXXAction = SCons.Action.Action("$SHCXXCOM", "$SHCXXCOMSTR")
+
+ASAction = SCons.Action.Action("$ASCOM", "$ASCOMSTR")
+ASPPAction = SCons.Action.Action("$ASPPCOM", "$ASPPCOMSTR")
+
+LinkAction = SCons.Action.Action("$LINKCOM", "$LINKCOMSTR")
+ShLinkAction = SCons.Action.Action("$SHLINKCOM", "$SHLINKCOMSTR")
+
+LdModuleLinkAction = SCons.Action.Action("$LDMODULECOM", "$LDMODULECOMSTR")
+
+# Common tasks that we allow users to perform in platform-independent
+# ways by creating ActionFactory instances.
+ActionFactory = SCons.Action.ActionFactory
+
+def get_paths_str(dest):
+    # If dest is a list, we need to manually call str() on each element
+    if SCons.Util.is_List(dest):
+        elem_strs = []
+        for element in dest:
+            elem_strs.append('"' + str(element) + '"')
+        return '[' + ', '.join(elem_strs) + ']'
+    else:
+        return '"' + str(dest) + '"'
+
+def chmod_func(dest, mode):
+    SCons.Node.FS.invalidate_node_memos(dest)
+    if not SCons.Util.is_List(dest):
+        dest = [dest]
+    for element in dest:
+        os.chmod(str(element), mode)
+
+def chmod_strfunc(dest, mode):
+    return 'Chmod(%s, 0%o)' % (get_paths_str(dest), mode)
+
+Chmod = ActionFactory(chmod_func, chmod_strfunc)
+
+def copy_func(dest, src):
+    SCons.Node.FS.invalidate_node_memos(dest)
+    if SCons.Util.is_List(src) and os.path.isdir(dest):
+        for file in src:
+            shutil.copy2(file, dest)
+        return 0
+    elif os.path.isfile(src):
+        return shutil.copy2(src, dest)
+    else:
+        return shutil.copytree(src, dest, 1)
+
+Copy = ActionFactory(copy_func,
+                     lambda dest, src: 'Copy("%s", "%s")' % (dest, src),
+                     convert=str)
+
+def delete_func(dest, must_exist=0):
+    SCons.Node.FS.invalidate_node_memos(dest)
+    if not SCons.Util.is_List(dest):
+        dest = [dest]
+    for entry in dest:
+        entry = str(entry)
+        if not must_exist and not os.path.exists(entry):
+            continue
+        if not os.path.exists(entry) or os.path.isfile(entry):
+            os.unlink(entry)
+            continue
+        else:
+            shutil.rmtree(entry, 1)
+            continue
+
+def delete_strfunc(dest, must_exist=0):
+    return 'Delete(%s)' % get_paths_str(dest)
+
+Delete = ActionFactory(delete_func, delete_strfunc)
+
+def mkdir_func(dest):
+    SCons.Node.FS.invalidate_node_memos(dest)
+    if not SCons.Util.is_List(dest):
+        dest = [dest]
+    for entry in dest:
+        try:
+            os.makedirs(str(entry))
+        except os.error, e:
+            p = str(entry)
+            if (e.args[0] == errno.EEXIST or
+                    (sys.platform=='win32' and e.args[0]==183)) \
+                    and os.path.isdir(str(entry)):
+                pass            # not an error if already exists
+            else:
+                raise
+
+Mkdir = ActionFactory(mkdir_func,
+                      lambda dir: 'Mkdir(%s)' % get_paths_str(dir))
+
+def move_func(dest, src):
+    SCons.Node.FS.invalidate_node_memos(dest)
+    SCons.Node.FS.invalidate_node_memos(src)
+    shutil.move(src, dest)
+
+Move = ActionFactory(move_func,
+                     lambda dest, src: 'Move("%s", "%s")' % (dest, src),
+                     convert=str)
+
+def touch_func(dest):
+    SCons.Node.FS.invalidate_node_memos(dest)
+    if not SCons.Util.is_List(dest):
+        dest = [dest]
+    for file in dest:
+        file = str(file)
+        mtime = int(time.time())
+        if os.path.exists(file):
+            atime = os.path.getatime(file)
+        else:
+            open(file, 'w')
+            atime = mtime
+        os.utime(file, (atime, mtime))
+
+Touch = ActionFactory(touch_func,
+                      lambda file: 'Touch(%s)' % get_paths_str(file))
+
+# Internal utility functions
+
+def _concat(prefix, list, suffix, env, f=lambda x: x, target=None, source=None):
+    """
+    Creates a new list from 'list' by first interpolating each element
+    in the list using the 'env' dictionary and then calling f on the
+    list, and finally calling _concat_ixes to concatenate 'prefix' and
+    'suffix' onto each element of the list.
+    """
+    if not list:
+        return list
+
+    l = f(SCons.PathList.PathList(list).subst_path(env, target, source))
+    if l is not None:
+        list = l
+
+    return _concat_ixes(prefix, list, suffix, env)
+
+def _concat_ixes(prefix, list, suffix, env):
+    """
+    Creates a new list from 'list' by concatenating the 'prefix' and
+    'suffix' arguments onto each element of the list.  A trailing space
+    on 'prefix' or leading space on 'suffix' will cause them to be put
+    into separate list elements rather than being concatenated.
+    """
+
+    result = []
+
+    # ensure that prefix and suffix are strings
+    prefix = str(env.subst(prefix, SCons.Subst.SUBST_RAW))
+    suffix = str(env.subst(suffix, SCons.Subst.SUBST_RAW))
+
+    for x in list:
+        if isinstance(x, SCons.Node.FS.File):
+            result.append(x)
+            continue
+        x = str(x)
+        if x:
+
+            if prefix:
+                if prefix[-1] == ' ':
+                    result.append(prefix[:-1])
+                elif x[:len(prefix)] != prefix:
+                    x = prefix + x
+
+            result.append(x)
+
+            if suffix:
+                if suffix[0] == ' ':
+                    result.append(suffix[1:])
+                elif x[-len(suffix):] != suffix:
+                    result[-1] = result[-1]+suffix
+
+    return result
+
+def _stripixes(prefix, itms, suffix, stripprefixes, stripsuffixes, env, c=None):
+    """
+    This is a wrapper around _concat()/_concat_ixes() that checks for
+    the existence of prefixes or suffixes on list items and strips them
+    where it finds them.  This is used by tools (like the GNU linker)
+    that need to turn something like 'libfoo.a' into '-lfoo'.
+    """
+    
+    if not itms:
+        return itms
+
+    if not callable(c):
+        env_c = env['_concat']
+        if env_c != _concat and callable(env_c):
+            # There's a custom _concat() method in the construction
+            # environment, and we've allowed people to set that in
+            # the past (see test/custom-concat.py), so preserve the
+            # backwards compatibility.
+            c = env_c
+        else:
+            c = _concat_ixes
+    
+    stripprefixes = list(map(env.subst, SCons.Util.flatten(stripprefixes)))
+    stripsuffixes = list(map(env.subst, SCons.Util.flatten(stripsuffixes)))
+
+    stripped = []
+    for l in SCons.PathList.PathList(itms).subst_path(env, None, None):
+        if isinstance(l, SCons.Node.FS.File):
+            stripped.append(l)
+            continue
+
+        if not SCons.Util.is_String(l):
+            l = str(l)
+
+        for stripprefix in stripprefixes:
+            lsp = len(stripprefix)
+            if l[:lsp] == stripprefix:
+                l = l[lsp:]
+                # Do not strip more than one prefix
+                break
+
+        for stripsuffix in stripsuffixes:
+            lss = len(stripsuffix)
+            if l[-lss:] == stripsuffix:
+                l = l[:-lss]
+                # Do not strip more than one suffix
+                break
+
+        stripped.append(l)
+
+    return c(prefix, stripped, suffix, env)
+
+def processDefines(defs):
+    """process defines, resolving strings, lists, dictionaries, into a list of
+    strings
+    """
+    if SCons.Util.is_List(defs):
+        l = []
+        for d in defs:
+            if d is None:
+                continue
+            elif SCons.Util.is_List(d) or isinstance(d, tuple):
+                if len(d) >= 2:
+                    l.append(str(d[0]) + '=' + str(d[1]))
+                else:
+                    l.append(str(d[0]))
+            elif SCons.Util.is_Dict(d):
+                for macro,value in d.iteritems():
+                    if value is not None:
+                        l.append(str(macro) + '=' + str(value))
+                    else:
+                        l.append(str(macro))
+            elif SCons.Util.is_String(d):
+                l.append(str(d))
+            else:
+                raise SCons.Errors.UserError("DEFINE %s is not a list, dict, string or None."%repr(d))
+    elif SCons.Util.is_Dict(defs):
+        # The items in a dictionary are stored in random order, but
+        # if the order of the command-line options changes from
+        # invocation to invocation, then the signature of the command
+        # line will change and we'll get random unnecessary rebuilds.
+        # Consequently, we have to sort the keys to ensure a
+        # consistent order...
+        l = []
+        for k,v in sorted(defs.items()):
+            if v is None:
+                l.append(str(k))
+            else:
+                l.append(str(k) + '=' + str(v))
+    else:
+        l = [str(defs)]
+    return l
+
+def _defines(prefix, defs, suffix, env, c=_concat_ixes):
+    """A wrapper around _concat_ixes that turns a list or string
+    into a list of C preprocessor command-line definitions.
+    """
+
+    return c(prefix, env.subst_path(processDefines(defs)), suffix, env)
+    
+class NullCmdGenerator(object):
+    """This is a callable class that can be used in place of other
+    command generators if you don't want them to do anything.
+
+    The __call__ method for this class simply returns the thing
+    you instantiated it with.
+
+    Example usage:
+    env["DO_NOTHING"] = NullCmdGenerator
+    env["LINKCOM"] = "${DO_NOTHING('$LINK $SOURCES $TARGET')}"
+    """
+
+    def __init__(self, cmd):
+        self.cmd = cmd
+
+    def __call__(self, target, source, env, for_signature=None):
+        return self.cmd
+
+class Variable_Method_Caller(object):
+    """A class for finding a construction variable on the stack and
+    calling one of its methods.
+
+    We use this to support "construction variables" in our string
+    eval()s that actually stand in for methods--specifically, use
+    of "RDirs" in call to _concat that should actually execute the
+    "TARGET.RDirs" method.  (We used to support this by creating a little
+    "build dictionary" that mapped RDirs to the method, but this got in
+    the way of Memoizing construction environments, because we had to
+    create new environment objects to hold the variables.)
+    """
+    def __init__(self, variable, method):
+        self.variable = variable
+        self.method = method
+    def __call__(self, *args, **kw):
+        try: 1//0
+        except ZeroDivisionError: 
+            # Don't start iterating with the current stack-frame to
+            # prevent creating reference cycles (f_back is safe).
+            frame = sys.exc_info()[2].tb_frame.f_back
+        variable = self.variable
+        while frame:
+            if variable in frame.f_locals:
+                v = frame.f_locals[variable]
+                if v:
+                    method = getattr(v, self.method)
+                    return method(*args, **kw)
+            frame = frame.f_back
+        return None
+
+ConstructionEnvironment = {
+    'BUILDERS'      : {},
+    'SCANNERS'      : [],
+    'CONFIGUREDIR'  : '#/.sconf_temp',
+    'CONFIGURELOG'  : '#/config.log',
+    'CPPSUFFIXES'   : SCons.Tool.CSuffixes,
+    'DSUFFIXES'     : SCons.Tool.DSuffixes,
+    'ENV'           : {},
+    'IDLSUFFIXES'   : SCons.Tool.IDLSuffixes,
+#    'LATEXSUFFIXES' : SCons.Tool.LaTeXSuffixes, # moved to the TeX tools generate functions
+    '_concat'       : _concat,
+    '_defines'      : _defines,
+    '_stripixes'    : _stripixes,
+    '_LIBFLAGS'     : '${_concat(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, __env__)}',
+    '_LIBDIRFLAGS'  : '$( ${_concat(LIBDIRPREFIX, LIBPATH, LIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)',
+    '_CPPINCFLAGS'  : '$( ${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)',
+    '_CPPDEFFLAGS'  : '${_defines(CPPDEFPREFIX, CPPDEFINES, CPPDEFSUFFIX, __env__)}',
+    'TEMPFILE'      : NullCmdGenerator,
+    'Dir'           : Variable_Method_Caller('TARGET', 'Dir'),
+    'Dirs'          : Variable_Method_Caller('TARGET', 'Dirs'),
+    'File'          : Variable_Method_Caller('TARGET', 'File'),
+    'RDirs'         : Variable_Method_Caller('TARGET', 'RDirs'),
+}
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Environment.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Environment.py
new file mode 100644
index 0000000..5de36e2
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Environment.py
@@ -0,0 +1,2409 @@
+"""SCons.Environment
+
+Base class for construction Environments.  These are
+the primary objects used to communicate dependency and
+construction information to the build engine.
+
+Keyword arguments supplied when the construction Environment
+is created are construction variables used to initialize the
+Environment
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Environment.py 5183 2010/11/25 14:46:21 bdeegan"
+
+
+import copy
+import os
+import sys
+import re
+import shlex
+from collections import UserDict
+
+import SCons.Action
+import SCons.Builder
+from SCons.Debug import logInstanceCreation
+import SCons.Defaults
+import SCons.Errors
+import SCons.Memoize
+import SCons.Node
+import SCons.Node.Alias
+import SCons.Node.FS
+import SCons.Node.Python
+import SCons.Platform
+import SCons.SConf
+import SCons.SConsign
+import SCons.Subst
+import SCons.Tool
+import SCons.Util
+import SCons.Warnings
+
+class _Null(object):
+    pass
+
+_null = _Null
+
+_warn_copy_deprecated = True
+_warn_source_signatures_deprecated = True
+_warn_target_signatures_deprecated = True
+
+CleanTargets = {}
+CalculatorArgs = {}
+
+semi_deepcopy = SCons.Util.semi_deepcopy
+
+# Pull UserError into the global name space for the benefit of
+# Environment().SourceSignatures(), which has some import statements
+# which seem to mess up its ability to reference SCons directly.
+UserError = SCons.Errors.UserError
+
+def alias_builder(env, target, source):
+    pass
+
+AliasBuilder = SCons.Builder.Builder(action = alias_builder,
+                                     target_factory = SCons.Node.Alias.default_ans.Alias,
+                                     source_factory = SCons.Node.FS.Entry,
+                                     multi = 1,
+                                     is_explicit = None,
+                                     name='AliasBuilder')
+
+def apply_tools(env, tools, toolpath):
+    # Store the toolpath in the Environment.
+    if toolpath is not None:
+        env['toolpath'] = toolpath
+
+    if not tools:
+        return
+    # Filter out null tools from the list.
+    for tool in [_f for _f in tools if _f]:
+        if SCons.Util.is_List(tool) or isinstance(tool, tuple):
+            toolname = tool[0]
+            toolargs = tool[1] # should be a dict of kw args
+            tool = env.Tool(toolname, **toolargs)
+        else:
+            env.Tool(tool)
+
+# These names are (or will be) controlled by SCons; users should never
+# set or override them.  This warning can optionally be turned off,
+# but scons will still ignore the illegal variable names even if it's off.
+reserved_construction_var_names = [
+    'CHANGED_SOURCES',
+    'CHANGED_TARGETS',
+    'SOURCE',
+    'SOURCES',
+    'TARGET',
+    'TARGETS',
+    'UNCHANGED_SOURCES',
+    'UNCHANGED_TARGETS',
+]
+
+future_reserved_construction_var_names = [
+    #'HOST_OS',
+    #'HOST_ARCH',
+    #'HOST_CPU',
+    ]
+
+def copy_non_reserved_keywords(dict):
+    result = semi_deepcopy(dict)
+    for k in result.keys():
+        if k in reserved_construction_var_names:
+            msg = "Ignoring attempt to set reserved variable `$%s'"
+            SCons.Warnings.warn(SCons.Warnings.ReservedVariableWarning, msg % k)
+            del result[k]
+    return result
+
+def _set_reserved(env, key, value):
+    msg = "Ignoring attempt to set reserved variable `$%s'"
+    SCons.Warnings.warn(SCons.Warnings.ReservedVariableWarning, msg % key)
+
+def _set_future_reserved(env, key, value):
+    env._dict[key] = value
+    msg = "`$%s' will be reserved in a future release and setting it will become ignored"
+    SCons.Warnings.warn(SCons.Warnings.FutureReservedVariableWarning, msg % key)
+
+def _set_BUILDERS(env, key, value):
+    try:
+        bd = env._dict[key]
+        for k in bd.keys():
+            del bd[k]
+    except KeyError:
+        bd = BuilderDict(kwbd, env)
+        env._dict[key] = bd
+    for k, v in value.items():
+        if not SCons.Builder.is_a_Builder(v):
+            raise SCons.Errors.UserError('%s is not a Builder.' % repr(v))
+    bd.update(value)
+
+def _del_SCANNERS(env, key):
+    del env._dict[key]
+    env.scanner_map_delete()
+
+def _set_SCANNERS(env, key, value):
+    env._dict[key] = value
+    env.scanner_map_delete()
+
+def _delete_duplicates(l, keep_last):
+    """Delete duplicates from a sequence, keeping the first or last."""
+    seen={}
+    result=[]
+    if keep_last:           # reverse in & out, then keep first
+        l.reverse()
+    for i in l:
+        try:
+            if i not in seen:
+                result.append(i)
+                seen[i]=1
+        except TypeError:
+            # probably unhashable.  Just keep it.
+            result.append(i)
+    if keep_last:
+        result.reverse()
+    return result
+
+
+
+# The following is partly based on code in a comment added by Peter
+# Shannon at the following page (there called the "transplant" class):
+#
+# ASPN : Python Cookbook : Dynamically added methods to a class
+# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/81732
+#
+# We had independently been using the idiom as BuilderWrapper, but
+# factoring out the common parts into this base class, and making
+# BuilderWrapper a subclass that overrides __call__() to enforce specific
+# Builder calling conventions, simplified some of our higher-layer code.
+
+class MethodWrapper(object):
+    """
+    A generic Wrapper class that associates a method (which can
+    actually be any callable) with an object.  As part of creating this
+    MethodWrapper object an attribute with the specified (by default,
+    the name of the supplied method) is added to the underlying object.
+    When that new "method" is called, our __call__() method adds the
+    object as the first argument, simulating the Python behavior of
+    supplying "self" on method calls.
+
+    We hang on to the name by which the method was added to the underlying
+    base class so that we can provide a method to "clone" ourselves onto
+    a new underlying object being copied (without which we wouldn't need
+    to save that info).
+    """
+    def __init__(self, object, method, name=None):
+        if name is None:
+            name = method.__name__
+        self.object = object
+        self.method = method
+        self.name = name
+        setattr(self.object, name, self)
+
+    def __call__(self, *args, **kwargs):
+        nargs = (self.object,) + args
+        return self.method(*nargs, **kwargs)
+
+    def clone(self, new_object):
+        """
+        Returns an object that re-binds the underlying "method" to
+        the specified new object.
+        """
+        return self.__class__(new_object, self.method, self.name)
+
+class BuilderWrapper(MethodWrapper):
+    """
+    A MethodWrapper subclass that that associates an environment with
+    a Builder.
+
+    This mainly exists to wrap the __call__() function so that all calls
+    to Builders can have their argument lists massaged in the same way
+    (treat a lone argument as the source, treat two arguments as target
+    then source, make sure both target and source are lists) without
+    having to have cut-and-paste code to do it.
+
+    As a bit of obsessive backwards compatibility, we also intercept
+    attempts to get or set the "env" or "builder" attributes, which were
+    the names we used before we put the common functionality into the
+    MethodWrapper base class.  We'll keep this around for a while in case
+    people shipped Tool modules that reached into the wrapper (like the
+    Tool/qt.py module does, or did).  There shouldn't be a lot attribute
+    fetching or setting on these, so a little extra work shouldn't hurt.
+    """
+    def __call__(self, target=None, source=_null, *args, **kw):
+        if source is _null:
+            source = target
+            target = None
+        if target is not None and not SCons.Util.is_List(target):
+            target = [target]
+        if source is not None and not SCons.Util.is_List(source):
+            source = [source]
+        return MethodWrapper.__call__(self, target, source, *args, **kw)
+
+    def __repr__(self):
+        return '<BuilderWrapper %s>' % repr(self.name)
+
+    def __str__(self):
+        return self.__repr__()
+
+    def __getattr__(self, name):
+        if name == 'env':
+            return self.object
+        elif name == 'builder':
+            return self.method
+        else:
+            raise AttributeError(name)
+
+    def __setattr__(self, name, value):
+        if name == 'env':
+            self.object = value
+        elif name == 'builder':
+            self.method = value
+        else:
+            self.__dict__[name] = value
+
+    # This allows a Builder to be executed directly
+    # through the Environment to which it's attached.
+    # In practice, we shouldn't need this, because
+    # builders actually get executed through a Node.
+    # But we do have a unit test for this, and can't
+    # yet rule out that it would be useful in the
+    # future, so leave it for now.
+    #def execute(self, **kw):
+    #    kw['env'] = self.env
+    #    self.builder.execute(**kw)
+
+class BuilderDict(UserDict):
+    """This is a dictionary-like class used by an Environment to hold
+    the Builders.  We need to do this because every time someone changes
+    the Builders in the Environment's BUILDERS dictionary, we must
+    update the Environment's attributes."""
+    def __init__(self, dict, env):
+        # Set self.env before calling the superclass initialization,
+        # because it will end up calling our other methods, which will
+        # need to point the values in this dictionary to self.env.
+        self.env = env
+        UserDict.__init__(self, dict)
+
+    def __semi_deepcopy__(self):
+        return self.__class__(self.data, self.env)
+
+    def __setitem__(self, item, val):
+        try:
+            method = getattr(self.env, item).method
+        except AttributeError:
+            pass
+        else:
+            self.env.RemoveMethod(method)
+        UserDict.__setitem__(self, item, val)
+        BuilderWrapper(self.env, val, item)
+
+    def __delitem__(self, item):
+        UserDict.__delitem__(self, item)
+        delattr(self.env, item)
+
+    def update(self, dict):
+        for i, v in dict.items():
+            self.__setitem__(i, v)
+
+
+
+_is_valid_var = re.compile(r'[_a-zA-Z]\w*$')
+
+def is_valid_construction_var(varstr):
+    """Return if the specified string is a legitimate construction
+    variable.
+    """
+    return _is_valid_var.match(varstr)
+
+
+
+class SubstitutionEnvironment(object):
+    """Base class for different flavors of construction environments.
+
+    This class contains a minimal set of methods that handle contruction
+    variable expansion and conversion of strings to Nodes, which may or
+    may not be actually useful as a stand-alone class.  Which methods
+    ended up in this class is pretty arbitrary right now.  They're
+    basically the ones which we've empirically determined are common to
+    the different construction environment subclasses, and most of the
+    others that use or touch the underlying dictionary of construction
+    variables.
+
+    Eventually, this class should contain all the methods that we
+    determine are necessary for a "minimal" interface to the build engine.
+    A full "native Python" SCons environment has gotten pretty heavyweight
+    with all of the methods and Tools and construction variables we've
+    jammed in there, so it would be nice to have a lighter weight
+    alternative for interfaces that don't need all of the bells and
+    whistles.  (At some point, we'll also probably rename this class
+    "Base," since that more reflects what we want this class to become,
+    but because we've released comments that tell people to subclass
+    Environment.Base to create their own flavors of construction
+    environment, we'll save that for a future refactoring when this
+    class actually becomes useful.)
+    """
+
+    if SCons.Memoize.use_memoizer:
+        __metaclass__ = SCons.Memoize.Memoized_Metaclass
+
+    def __init__(self, **kw):
+        """Initialization of an underlying SubstitutionEnvironment class.
+        """
+        if __debug__: logInstanceCreation(self, 'Environment.SubstitutionEnvironment')
+        self.fs = SCons.Node.FS.get_default_fs()
+        self.ans = SCons.Node.Alias.default_ans
+        self.lookup_list = SCons.Node.arg2nodes_lookups
+        self._dict = kw.copy()
+        self._init_special()
+        self.added_methods = []
+        #self._memo = {}
+
+    def _init_special(self):
+        """Initial the dispatch tables for special handling of
+        special construction variables."""
+        self._special_del = {}
+        self._special_del['SCANNERS'] = _del_SCANNERS
+
+        self._special_set = {}
+        for key in reserved_construction_var_names:
+            self._special_set[key] = _set_reserved
+        for key in future_reserved_construction_var_names:
+            self._special_set[key] = _set_future_reserved
+        self._special_set['BUILDERS'] = _set_BUILDERS
+        self._special_set['SCANNERS'] = _set_SCANNERS
+
+        # Freeze the keys of self._special_set in a list for use by
+        # methods that need to check.  (Empirically, list scanning has
+        # gotten better than dict.has_key() in Python 2.5.)
+        self._special_set_keys = list(self._special_set.keys())
+
+    def __cmp__(self, other):
+        return cmp(self._dict, other._dict)
+
+    def __delitem__(self, key):
+        special = self._special_del.get(key)
+        if special:
+            special(self, key)
+        else:
+            del self._dict[key]
+
+    def __getitem__(self, key):
+        return self._dict[key]
+
+    def __setitem__(self, key, value):
+        # This is heavily used.  This implementation is the best we have
+        # according to the timings in bench/env.__setitem__.py.
+        #
+        # The "key in self._special_set_keys" test here seems to perform
+        # pretty well for the number of keys we have.  A hard-coded
+        # list works a little better in Python 2.5, but that has the
+        # disadvantage of maybe getting out of sync if we ever add more
+        # variable names.  Using self._special_set.has_key() works a
+        # little better in Python 2.4, but is worse than this test.
+        # So right now it seems like a good trade-off, but feel free to
+        # revisit this with bench/env.__setitem__.py as needed (and
+        # as newer versions of Python come out).
+        if key in self._special_set_keys:
+            self._special_set[key](self, key, value)
+        else:
+            # If we already have the entry, then it's obviously a valid
+            # key and we don't need to check.  If we do check, using a
+            # global, pre-compiled regular expression directly is more
+            # efficient than calling another function or a method.
+            if key not in self._dict \
+               and not _is_valid_var.match(key):
+                    raise SCons.Errors.UserError("Illegal construction variable `%s'" % key)
+            self._dict[key] = value
+
+    def get(self, key, default=None):
+        """Emulates the get() method of dictionaries."""
+        return self._dict.get(key, default)
+
+    def has_key(self, key):
+        return key in self._dict
+
+    def __contains__(self, key):
+        return self._dict.__contains__(key)
+
+    def items(self):
+        return list(self._dict.items())
+
+    def arg2nodes(self, args, node_factory=_null, lookup_list=_null, **kw):
+        if node_factory is _null:
+            node_factory = self.fs.File
+        if lookup_list is _null:
+            lookup_list = self.lookup_list
+
+        if not args:
+            return []
+
+        args = SCons.Util.flatten(args)
+
+        nodes = []
+        for v in args:
+            if SCons.Util.is_String(v):
+                n = None
+                for l in lookup_list:
+                    n = l(v)
+                    if n is not None:
+                        break
+                if n is not None:
+                    if SCons.Util.is_String(n):
+                        # n = self.subst(n, raw=1, **kw)
+                        kw['raw'] = 1
+                        n = self.subst(n, **kw)
+                        if node_factory:
+                            n = node_factory(n)
+                    if SCons.Util.is_List(n):
+                        nodes.extend(n)
+                    else:
+                        nodes.append(n)
+                elif node_factory:
+                    # v = node_factory(self.subst(v, raw=1, **kw))
+                    kw['raw'] = 1
+                    v = node_factory(self.subst(v, **kw))
+                    if SCons.Util.is_List(v):
+                        nodes.extend(v)
+                    else:
+                        nodes.append(v)
+            else:
+                nodes.append(v)
+
+        return nodes
+
+    def gvars(self):
+        return self._dict
+
+    def lvars(self):
+        return {}
+
+    def subst(self, string, raw=0, target=None, source=None, conv=None, executor=None):
+        """Recursively interpolates construction variables from the
+        Environment into the specified string, returning the expanded
+        result.  Construction variables are specified by a $ prefix
+        in the string and begin with an initial underscore or
+        alphabetic character followed by any number of underscores
+        or alphanumeric characters.  The construction variable names
+        may be surrounded by curly braces to separate the name from
+        trailing characters.
+        """
+        gvars = self.gvars()
+        lvars = self.lvars()
+        lvars['__env__'] = self
+        if executor:
+            lvars.update(executor.get_lvars())
+        return SCons.Subst.scons_subst(string, self, raw, target, source, gvars, lvars, conv)
+
+    def subst_kw(self, kw, raw=0, target=None, source=None):
+        nkw = {}
+        for k, v in kw.items():
+            k = self.subst(k, raw, target, source)
+            if SCons.Util.is_String(v):
+                v = self.subst(v, raw, target, source)
+            nkw[k] = v
+        return nkw
+
+    def subst_list(self, string, raw=0, target=None, source=None, conv=None, executor=None):
+        """Calls through to SCons.Subst.scons_subst_list().  See
+        the documentation for that function."""
+        gvars = self.gvars()
+        lvars = self.lvars()
+        lvars['__env__'] = self
+        if executor:
+            lvars.update(executor.get_lvars())
+        return SCons.Subst.scons_subst_list(string, self, raw, target, source, gvars, lvars, conv)
+
+    def subst_path(self, path, target=None, source=None):
+        """Substitute a path list, turning EntryProxies into Nodes
+        and leaving Nodes (and other objects) as-is."""
+
+        if not SCons.Util.is_List(path):
+            path = [path]
+
+        def s(obj):
+            """This is the "string conversion" routine that we have our
+            substitutions use to return Nodes, not strings.  This relies
+            on the fact that an EntryProxy object has a get() method that
+            returns the underlying Node that it wraps, which is a bit of
+            architectural dependence that we might need to break or modify
+            in the future in response to additional requirements."""
+            try:
+                get = obj.get
+            except AttributeError:
+                obj = SCons.Util.to_String_for_subst(obj)
+            else:
+                obj = get()
+            return obj
+
+        r = []
+        for p in path:
+            if SCons.Util.is_String(p):
+                p = self.subst(p, target=target, source=source, conv=s)
+                if SCons.Util.is_List(p):
+                    if len(p) == 1:
+                        p = p[0]
+                    else:
+                        # We have an object plus a string, or multiple
+                        # objects that we need to smush together.  No choice
+                        # but to make them into a string.
+                        p = ''.join(map(SCons.Util.to_String_for_subst, p))
+            else:
+                p = s(p)
+            r.append(p)
+        return r
+
+    subst_target_source = subst
+
+    def backtick(self, command):
+        import subprocess
+        # common arguments
+        kw = { 'stdin' : 'devnull',
+               'stdout' : subprocess.PIPE,
+               'stderr' : subprocess.PIPE,
+               'universal_newlines' : True,
+             }
+        # if the command is a list, assume it's been quoted
+        # othewise force a shell
+        if not SCons.Util.is_List(command): kw['shell'] = True
+        # run constructed command
+        p = SCons.Action._subproc(self, command, **kw)
+        out,err = p.communicate()
+        status = p.wait()
+        if err:
+            sys.stderr.write(unicode(err))
+        if status:
+            raise OSError("'%s' exited %d" % (command, status))
+        return out
+
+    def AddMethod(self, function, name=None):
+        """
+        Adds the specified function as a method of this construction
+        environment with the specified name.  If the name is omitted,
+        the default name is the name of the function itself.
+        """
+        method = MethodWrapper(self, function, name)
+        self.added_methods.append(method)
+
+    def RemoveMethod(self, function):
+        """
+        Removes the specified function's MethodWrapper from the
+        added_methods list, so we don't re-bind it when making a clone.
+        """
+        self.added_methods = [dm for dm in self.added_methods if not dm.method is function]
+
+    def Override(self, overrides):
+        """
+        Produce a modified environment whose variables are overriden by
+        the overrides dictionaries.  "overrides" is a dictionary that
+        will override the variables of this environment.
+
+        This function is much more efficient than Clone() or creating
+        a new Environment because it doesn't copy the construction
+        environment dictionary, it just wraps the underlying construction
+        environment, and doesn't even create a wrapper object if there
+        are no overrides.
+        """
+        if not overrides: return self
+        o = copy_non_reserved_keywords(overrides)
+        if not o: return self
+        overrides = {}
+        merges = None
+        for key, value in o.items():
+            if key == 'parse_flags':
+                merges = value
+            else:
+                overrides[key] = SCons.Subst.scons_subst_once(value, self, key)
+        env = OverrideEnvironment(self, overrides)
+        if merges: env.MergeFlags(merges)
+        return env
+
+    def ParseFlags(self, *flags):
+        """
+        Parse the set of flags and return a dict with the flags placed
+        in the appropriate entry.  The flags are treated as a typical
+        set of command-line flags for a GNU-like toolchain and used to
+        populate the entries in the dict immediately below.  If one of
+        the flag strings begins with a bang (exclamation mark), it is
+        assumed to be a command and the rest of the string is executed;
+        the result of that evaluation is then added to the dict.
+        """
+        dict = {
+            'ASFLAGS'       : SCons.Util.CLVar(''),
+            'CFLAGS'        : SCons.Util.CLVar(''),
+            'CCFLAGS'       : SCons.Util.CLVar(''),
+            'CPPDEFINES'    : [],
+            'CPPFLAGS'      : SCons.Util.CLVar(''),
+            'CPPPATH'       : [],
+            'FRAMEWORKPATH' : SCons.Util.CLVar(''),
+            'FRAMEWORKS'    : SCons.Util.CLVar(''),
+            'LIBPATH'       : [],
+            'LIBS'          : [],
+            'LINKFLAGS'     : SCons.Util.CLVar(''),
+            'RPATH'         : [],
+        }
+
+        def do_parse(arg):
+            # if arg is a sequence, recurse with each element
+            if not arg:
+                return
+
+            if not SCons.Util.is_String(arg):
+                for t in arg: do_parse(t)
+                return
+
+            # if arg is a command, execute it
+            if arg[0] == '!':
+                arg = self.backtick(arg[1:])
+
+            # utility function to deal with -D option
+            def append_define(name, dict = dict):
+                t = name.split('=')
+                if len(t) == 1:
+                    dict['CPPDEFINES'].append(name)
+                else:
+                    dict['CPPDEFINES'].append([t[0], '='.join(t[1:])])
+
+            # Loop through the flags and add them to the appropriate option.
+            # This tries to strike a balance between checking for all possible
+            # flags and keeping the logic to a finite size, so it doesn't
+            # check for some that don't occur often.  It particular, if the
+            # flag is not known to occur in a config script and there's a way
+            # of passing the flag to the right place (by wrapping it in a -W
+            # flag, for example) we don't check for it.  Note that most
+            # preprocessor options are not handled, since unhandled options
+            # are placed in CCFLAGS, so unless the preprocessor is invoked
+            # separately, these flags will still get to the preprocessor.
+            # Other options not currently handled:
+            #  -iqoutedir      (preprocessor search path)
+            #  -u symbol       (linker undefined symbol)
+            #  -s              (linker strip files)
+            #  -static*        (linker static binding)
+            #  -shared*        (linker dynamic binding)
+            #  -symbolic       (linker global binding)
+            #  -R dir          (deprecated linker rpath)
+            # IBM compilers may also accept -qframeworkdir=foo
+    
+            params = shlex.split(arg)
+            append_next_arg_to = None   # for multi-word args
+            for arg in params:
+                if append_next_arg_to:
+                   if append_next_arg_to == 'CPPDEFINES':
+                       append_define(arg)
+                   elif append_next_arg_to == '-include':
+                       t = ('-include', self.fs.File(arg))
+                       dict['CCFLAGS'].append(t)
+                   elif append_next_arg_to == '-isysroot':
+                       t = ('-isysroot', arg)
+                       dict['CCFLAGS'].append(t)
+                       dict['LINKFLAGS'].append(t)
+                   elif append_next_arg_to == '-arch':
+                       t = ('-arch', arg)
+                       dict['CCFLAGS'].append(t)
+                       dict['LINKFLAGS'].append(t)
+                   else:
+                       dict[append_next_arg_to].append(arg)
+                   append_next_arg_to = None
+                elif not arg[0] in ['-', '+']:
+                    dict['LIBS'].append(self.fs.File(arg))
+                elif arg[:2] == '-L':
+                    if arg[2:]:
+                        dict['LIBPATH'].append(arg[2:])
+                    else:
+                        append_next_arg_to = 'LIBPATH'
+                elif arg[:2] == '-l':
+                    if arg[2:]:
+                        dict['LIBS'].append(arg[2:])
+                    else:
+                        append_next_arg_to = 'LIBS'
+                elif arg[:2] == '-I':
+                    if arg[2:]:
+                        dict['CPPPATH'].append(arg[2:])
+                    else:
+                        append_next_arg_to = 'CPPPATH'
+                elif arg[:4] == '-Wa,':
+                    dict['ASFLAGS'].append(arg[4:])
+                    dict['CCFLAGS'].append(arg)
+                elif arg[:4] == '-Wl,':
+                    if arg[:11] == '-Wl,-rpath=':
+                        dict['RPATH'].append(arg[11:])
+                    elif arg[:7] == '-Wl,-R,':
+                        dict['RPATH'].append(arg[7:])
+                    elif arg[:6] == '-Wl,-R':
+                        dict['RPATH'].append(arg[6:])
+                    else:
+                        dict['LINKFLAGS'].append(arg)
+                elif arg[:4] == '-Wp,':
+                    dict['CPPFLAGS'].append(arg)
+                elif arg[:2] == '-D':
+                    if arg[2:]:
+                        append_define(arg[2:])
+                    else:
+                        append_next_arg_to = 'CPPDEFINES'
+                elif arg == '-framework':
+                    append_next_arg_to = 'FRAMEWORKS'
+                elif arg[:14] == '-frameworkdir=':
+                    dict['FRAMEWORKPATH'].append(arg[14:])
+                elif arg[:2] == '-F':
+                    if arg[2:]:
+                        dict['FRAMEWORKPATH'].append(arg[2:])
+                    else:
+                        append_next_arg_to = 'FRAMEWORKPATH'
+                elif arg == '-mno-cygwin':
+                    dict['CCFLAGS'].append(arg)
+                    dict['LINKFLAGS'].append(arg)
+                elif arg == '-mwindows':
+                    dict['LINKFLAGS'].append(arg)
+                elif arg == '-pthread':
+                    dict['CCFLAGS'].append(arg)
+                    dict['LINKFLAGS'].append(arg)
+                elif arg[:5] == '-std=':
+                    dict['CFLAGS'].append(arg) # C only
+                elif arg[0] == '+':
+                    dict['CCFLAGS'].append(arg)
+                    dict['LINKFLAGS'].append(arg)
+                elif arg in ['-include', '-isysroot', '-arch']:
+                    append_next_arg_to = arg
+                else:
+                    dict['CCFLAGS'].append(arg)
+    
+        for arg in flags:
+            do_parse(arg)
+        return dict
+
+    def MergeFlags(self, args, unique=1, dict=None):
+        """
+        Merge the dict in args into the construction variables of this
+        env, or the passed-in dict.  If args is not a dict, it is
+        converted into a dict using ParseFlags.  If unique is not set,
+        the flags are appended rather than merged.
+        """
+
+        if dict is None:
+            dict = self
+        if not SCons.Util.is_Dict(args):
+            args = self.ParseFlags(args)
+        if not unique:
+            self.Append(**args)
+            return self
+        for key, value in args.items():
+            if not value:
+                continue
+            try:
+                orig = self[key]
+            except KeyError:
+                orig = value
+            else:
+                if not orig:
+                    orig = value
+                elif value:
+                    # Add orig and value.  The logic here was lifted from
+                    # part of env.Append() (see there for a lot of comments
+                    # about the order in which things are tried) and is
+                    # used mainly to handle coercion of strings to CLVar to
+                    # "do the right thing" given (e.g.) an original CCFLAGS
+                    # string variable like '-pipe -Wall'.
+                    try:
+                        orig = orig + value
+                    except (KeyError, TypeError):
+                        try:
+                            add_to_orig = orig.append
+                        except AttributeError:
+                            value.insert(0, orig)
+                            orig = value
+                        else:
+                            add_to_orig(value)
+            t = []
+            if key[-4:] == 'PATH':
+                ### keep left-most occurence
+                for v in orig:
+                    if v not in t:
+                        t.append(v)
+            else:
+                ### keep right-most occurence
+                orig.reverse()
+                for v in orig:
+                    if v not in t:
+                        t.insert(0, v)
+            self[key] = t
+        return self
+
+#     def MergeShellPaths(self, args, prepend=1):
+#         """
+#         Merge the dict in args into the shell environment in env['ENV'].  
+#         Shell path elements are appended or prepended according to prepend.
+
+#         Uses Pre/AppendENVPath, so it always appends or prepends uniquely.
+
+#         Example: env.MergeShellPaths({'LIBPATH': '/usr/local/lib'})
+#         prepends /usr/local/lib to env['ENV']['LIBPATH'].
+#         """
+
+#         for pathname, pathval in args.items():
+#             if not pathval:
+#                 continue
+#             if prepend:
+#                 self.PrependENVPath(pathname, pathval)
+#             else:
+#                 self.AppendENVPath(pathname, pathval)
+
+
+def default_decide_source(dependency, target, prev_ni):
+    f = SCons.Defaults.DefaultEnvironment().decide_source
+    return f(dependency, target, prev_ni)
+
+def default_decide_target(dependency, target, prev_ni):
+    f = SCons.Defaults.DefaultEnvironment().decide_target
+    return f(dependency, target, prev_ni)
+
+def default_copy_from_cache(src, dst):
+    f = SCons.Defaults.DefaultEnvironment().copy_from_cache
+    return f(src, dst)
+
+class Base(SubstitutionEnvironment):
+    """Base class for "real" construction Environments.  These are the
+    primary objects used to communicate dependency and construction
+    information to the build engine.
+
+    Keyword arguments supplied when the construction Environment
+    is created are construction variables used to initialize the
+    Environment.
+    """
+
+    memoizer_counters = []
+
+    #######################################################################
+    # This is THE class for interacting with the SCons build engine,
+    # and it contains a lot of stuff, so we're going to try to keep this
+    # a little organized by grouping the methods.
+    #######################################################################
+
+    #######################################################################
+    # Methods that make an Environment act like a dictionary.  These have
+    # the expected standard names for Python mapping objects.  Note that
+    # we don't actually make an Environment a subclass of UserDict for
+    # performance reasons.  Note also that we only supply methods for
+    # dictionary functionality that we actually need and use.
+    #######################################################################
+
+    def __init__(self,
+                 platform=None,
+                 tools=None,
+                 toolpath=None,
+                 variables=None,
+                 parse_flags = None,
+                 **kw):
+        """
+        Initialization of a basic SCons construction environment,
+        including setting up special construction variables like BUILDER,
+        PLATFORM, etc., and searching for and applying available Tools.
+
+        Note that we do *not* call the underlying base class
+        (SubsitutionEnvironment) initialization, because we need to
+        initialize things in a very specific order that doesn't work
+        with the much simpler base class initialization.
+        """
+        if __debug__: logInstanceCreation(self, 'Environment.Base')
+        self._memo = {}
+        self.fs = SCons.Node.FS.get_default_fs()
+        self.ans = SCons.Node.Alias.default_ans
+        self.lookup_list = SCons.Node.arg2nodes_lookups
+        self._dict = semi_deepcopy(SCons.Defaults.ConstructionEnvironment)
+        self._init_special()
+        self.added_methods = []
+
+        # We don't use AddMethod, or define these as methods in this
+        # class, because we *don't* want these functions to be bound
+        # methods.  They need to operate independently so that the
+        # settings will work properly regardless of whether a given
+        # target ends up being built with a Base environment or an
+        # OverrideEnvironment or what have you.
+        self.decide_target = default_decide_target
+        self.decide_source = default_decide_source
+
+        self.copy_from_cache = default_copy_from_cache
+
+        self._dict['BUILDERS'] = BuilderDict(self._dict['BUILDERS'], self)
+
+        if platform is None:
+            platform = self._dict.get('PLATFORM', None)
+            if platform is None:
+                platform = SCons.Platform.Platform()
+        if SCons.Util.is_String(platform):
+            platform = SCons.Platform.Platform(platform)
+        self._dict['PLATFORM'] = str(platform)
+        platform(self)
+        
+        self._dict['HOST_OS']      = self._dict.get('HOST_OS',None)
+        self._dict['HOST_ARCH']    = self._dict.get('HOST_ARCH',None)
+        
+        # Now set defaults for TARGET_{OS|ARCH}
+        self._dict['TARGET_OS']      = self._dict.get('HOST_OS',None)
+        self._dict['TARGET_ARCH']    = self._dict.get('HOST_ARCH',None)
+        
+
+        # Apply the passed-in and customizable variables to the
+        # environment before calling the tools, because they may use
+        # some of them during initialization.
+        if 'options' in kw:
+            # Backwards compatibility:  they may stll be using the
+            # old "options" keyword.
+            variables = kw['options']
+            del kw['options']
+        self.Replace(**kw)
+        keys = list(kw.keys())
+        if variables:
+            keys = keys + list(variables.keys())
+            variables.Update(self)
+
+        save = {}
+        for k in keys:
+            try:
+                save[k] = self._dict[k]
+            except KeyError:
+                # No value may have been set if they tried to pass in a
+                # reserved variable name like TARGETS.
+                pass
+
+        SCons.Tool.Initializers(self)
+
+        if tools is None:
+            tools = self._dict.get('TOOLS', None)
+            if tools is None:
+                tools = ['default']
+        apply_tools(self, tools, toolpath)
+
+        # Now restore the passed-in and customized variables
+        # to the environment, since the values the user set explicitly
+        # should override any values set by the tools.
+        for key, val in save.items():
+            self._dict[key] = val
+
+        # Finally, apply any flags to be merged in
+        if parse_flags: self.MergeFlags(parse_flags)
+
+    #######################################################################
+    # Utility methods that are primarily for internal use by SCons.
+    # These begin with lower-case letters.
+    #######################################################################
+
+    def get_builder(self, name):
+        """Fetch the builder with the specified name from the environment.
+        """
+        try:
+            return self._dict['BUILDERS'][name]
+        except KeyError:
+            return None
+
+    def get_CacheDir(self):
+        try:
+            path = self._CacheDir_path
+        except AttributeError:
+            path = SCons.Defaults.DefaultEnvironment()._CacheDir_path
+        try:
+            if path == self._last_CacheDir_path:
+                return self._last_CacheDir
+        except AttributeError:
+            pass
+        cd = SCons.CacheDir.CacheDir(path)
+        self._last_CacheDir_path = path
+        self._last_CacheDir = cd
+        return cd
+
+    def get_factory(self, factory, default='File'):
+        """Return a factory function for creating Nodes for this
+        construction environment.
+        """
+        name = default
+        try:
+            is_node = issubclass(factory, SCons.Node.FS.Base)
+        except TypeError:
+            # The specified factory isn't a Node itself--it's
+            # most likely None, or possibly a callable.
+            pass
+        else:
+            if is_node:
+                # The specified factory is a Node (sub)class.  Try to
+                # return the FS method that corresponds to the Node's
+                # name--that is, we return self.fs.Dir if they want a Dir,
+                # self.fs.File for a File, etc.
+                try: name = factory.__name__
+                except AttributeError: pass
+                else: factory = None
+        if not factory:
+            # They passed us None, or we picked up a name from a specified
+            # class, so return the FS method.  (Note that we *don't*
+            # use our own self.{Dir,File} methods because that would
+            # cause env.subst() to be called twice on the file name,
+            # interfering with files that have $$ in them.)
+            factory = getattr(self.fs, name)
+        return factory
+
+    memoizer_counters.append(SCons.Memoize.CountValue('_gsm'))
+
+    def _gsm(self):
+        try:
+            return self._memo['_gsm']
+        except KeyError:
+            pass
+
+        result = {}
+
+        try:
+            scanners = self._dict['SCANNERS']
+        except KeyError:
+            pass
+        else:
+            # Reverse the scanner list so that, if multiple scanners
+            # claim they can scan the same suffix, earlier scanners
+            # in the list will overwrite later scanners, so that
+            # the result looks like a "first match" to the user.
+            if not SCons.Util.is_List(scanners):
+                scanners = [scanners]
+            else:
+                scanners = scanners[:] # copy so reverse() doesn't mod original
+            scanners.reverse()
+            for scanner in scanners:
+                for k in scanner.get_skeys(self):
+                    if k and self['PLATFORM'] == 'win32':
+                        k = k.lower()
+                    result[k] = scanner
+
+        self._memo['_gsm'] = result
+
+        return result
+
+    def get_scanner(self, skey):
+        """Find the appropriate scanner given a key (usually a file suffix).
+        """
+        if skey and self['PLATFORM'] == 'win32':
+            skey = skey.lower()
+        return self._gsm().get(skey)
+
+    def scanner_map_delete(self, kw=None):
+        """Delete the cached scanner map (if we need to).
+        """
+        try:
+            del self._memo['_gsm']
+        except KeyError:
+            pass
+
+    def _update(self, dict):
+        """Update an environment's values directly, bypassing the normal
+        checks that occur when users try to set items.
+        """
+        self._dict.update(dict)
+
+    def get_src_sig_type(self):
+        try:
+            return self.src_sig_type
+        except AttributeError:
+            t = SCons.Defaults.DefaultEnvironment().src_sig_type
+            self.src_sig_type = t
+            return t
+
+    def get_tgt_sig_type(self):
+        try:
+            return self.tgt_sig_type
+        except AttributeError:
+            t = SCons.Defaults.DefaultEnvironment().tgt_sig_type
+            self.tgt_sig_type = t
+            return t
+
+    #######################################################################
+    # Public methods for manipulating an Environment.  These begin with
+    # upper-case letters.  The essential characteristic of methods in
+    # this section is that they do *not* have corresponding same-named
+    # global functions.  For example, a stand-alone Append() function
+    # makes no sense, because Append() is all about appending values to
+    # an Environment's construction variables.
+    #######################################################################
+
+    def Append(self, **kw):
+        """Append values to existing construction variables
+        in an Environment.
+        """
+        kw = copy_non_reserved_keywords(kw)
+        for key, val in kw.items():
+            # It would be easier on the eyes to write this using
+            # "continue" statements whenever we finish processing an item,
+            # but Python 1.5.2 apparently doesn't let you use "continue"
+            # within try:-except: blocks, so we have to nest our code.
+            try:                
+                if key == 'CPPDEFINES' and SCons.Util.is_String(self._dict[key]):
+                    self._dict[key] = [self._dict[key]]
+                orig = self._dict[key]
+            except KeyError:
+                # No existing variable in the environment, so just set
+                # it to the new value.
+                if key == 'CPPDEFINES' and SCons.Util.is_String(val):
+                    self._dict[key] = [val]
+                else:
+                    self._dict[key] = val
+            else:
+                try:
+                    # Check if the original looks like a dictionary.
+                    # If it is, we can't just try adding the value because
+                    # dictionaries don't have __add__() methods, and
+                    # things like UserList will incorrectly coerce the
+                    # original dict to a list (which we don't want).
+                    update_dict = orig.update
+                except AttributeError:
+                    try:
+                        # Most straightforward:  just try to add them
+                        # together.  This will work in most cases, when the
+                        # original and new values are of compatible types.
+                        self._dict[key] = orig + val
+                    except (KeyError, TypeError):
+                        try:
+                            # Check if the original is a list.
+                            add_to_orig = orig.append
+                        except AttributeError:
+                            # The original isn't a list, but the new
+                            # value is (by process of elimination),
+                            # so insert the original in the new value
+                            # (if there's one to insert) and replace
+                            # the variable with it.
+                            if orig:
+                                val.insert(0, orig)
+                            self._dict[key] = val
+                        else:
+                            # The original is a list, so append the new
+                            # value to it (if there's a value to append).
+                            if val:
+                                add_to_orig(val)
+                else:
+                    # The original looks like a dictionary, so update it
+                    # based on what we think the value looks like.
+                    if SCons.Util.is_List(val):
+                        if key == 'CPPDEFINES':
+                            orig = orig.items()
+                            orig += val
+                            self._dict[key] = orig
+                        else:    
+                            for v in val:
+                                orig[v] = None
+                    else:
+                        try:
+                            update_dict(val)
+                        except (AttributeError, TypeError, ValueError):
+                            if SCons.Util.is_Dict(val):
+                                for k, v in val.items():
+                                    orig[k] = v
+                            else:
+                                orig[val] = None
+        self.scanner_map_delete(kw)
+
+    # allow Dirs and strings beginning with # for top-relative
+    # Note this uses the current env's fs (in self).
+    def _canonicalize(self, path):
+        if not SCons.Util.is_String(path): # typically a Dir
+            path = str(path)
+        if path and path[0] == '#':
+            path = str(self.fs.Dir(path))
+        return path
+
+    def AppendENVPath(self, name, newpath, envname = 'ENV', 
+                      sep = os.pathsep, delete_existing=1):
+        """Append path elements to the path 'name' in the 'ENV'
+        dictionary for this environment.  Will only add any particular
+        path once, and will normpath and normcase all paths to help
+        assure this.  This can also handle the case where the env
+        variable is a list instead of a string.
+
+        If delete_existing is 0, a newpath which is already in the path
+        will not be moved to the end (it will be left where it is).
+        """
+
+        orig = ''
+        if envname in self._dict and name in self._dict[envname]:
+            orig = self._dict[envname][name]
+
+        nv = SCons.Util.AppendPath(orig, newpath, sep, delete_existing,
+                                   canonicalize=self._canonicalize)
+
+        if envname not in self._dict:
+            self._dict[envname] = {}
+
+        self._dict[envname][name] = nv
+
+    def AppendUnique(self, delete_existing=0, **kw):
+        """Append values to existing construction variables
+        in an Environment, if they're not already there.
+        If delete_existing is 1, removes existing values first, so
+        values move to end.
+        """
+        kw = copy_non_reserved_keywords(kw)
+        for key, val in kw.items():
+            if SCons.Util.is_List(val):
+                val = _delete_duplicates(val, delete_existing)
+            if key not in self._dict or self._dict[key] in ('', None):
+                self._dict[key] = val
+            elif SCons.Util.is_Dict(self._dict[key]) and \
+                 SCons.Util.is_Dict(val):
+                self._dict[key].update(val)
+            elif SCons.Util.is_List(val):
+                dk = self._dict[key]
+                if key == 'CPPDEFINES':
+                    tmp = []
+                    for i in val:
+                        if SCons.Util.is_List(i):
+                            if len(i) >= 2:
+                                tmp.append((i[0], i[1]))
+                            else:
+                                tmp.append((i[0],))
+                        elif SCons.Util.is_Tuple(i):
+                            tmp.append(i)
+                        else:
+                            tmp.append((i,))
+                    val = tmp
+                    if SCons.Util.is_Dict(dk):
+                        dk = dk.items()
+                    elif SCons.Util.is_String(dk):
+                        dk = [(dk,)]
+                    else:                    
+                        tmp = []
+                        for i in dk:
+                            if SCons.Util.is_List(i):
+                                if len(i) >= 2:
+                                    tmp.append((i[0], i[1]))
+                                else:
+                                    tmp.append((i[0],))
+                            elif SCons.Util.is_Tuple(i):
+                                tmp.append(i)
+                            else:
+                                tmp.append((i,))
+                        dk = tmp
+                else:
+                    if not SCons.Util.is_List(dk):
+                        dk = [dk]
+                if delete_existing:
+                    dk = [x for x in dk if x not in val]
+                else:
+                    val = [x for x in val if x not in dk]
+                self._dict[key] = dk + val
+            else:
+                dk = self._dict[key]
+                if SCons.Util.is_List(dk):
+                    if key == 'CPPDEFINES':
+                        tmp = []
+                        for i in dk:
+                            if SCons.Util.is_List(i):
+                                if len(i) >= 2:
+                                    tmp.append((i[0], i[1]))
+                                else:
+                                    tmp.append((i[0],))
+                            elif SCons.Util.is_Tuple(i):
+                                tmp.append(i)
+                            else:
+                                tmp.append((i,))
+                        dk = tmp
+                        if SCons.Util.is_Dict(val):
+                            val = val.items()
+                        elif SCons.Util.is_String(val):
+                            val = [(val,)]
+                        if delete_existing:
+                            dk = filter(lambda x, val=val: x not in val, dk)
+                            self._dict[key] = dk + val
+                        else:
+                            dk = [x for x in dk if x not in val]                
+                            self._dict[key] = dk + val
+                    else:
+                        # By elimination, val is not a list.  Since dk is a
+                        # list, wrap val in a list first.
+                        if delete_existing:
+                            dk = filter(lambda x, val=val: x not in val, dk)
+                            self._dict[key] = dk + [val]
+                        else:
+                            if not val in dk:
+                                self._dict[key] = dk + [val]
+                else:
+                    if key == 'CPPDEFINES':
+                        if SCons.Util.is_String(dk):
+                            dk = [dk]
+                        elif SCons.Util.is_Dict(dk):
+                            dk = dk.items()
+                        if SCons.Util.is_String(val):
+                            if val in dk:
+                                val = []
+                            else:
+                                val = [val]
+                        elif SCons.Util.is_Dict(val):
+                            tmp = []
+                            for i,j in val.iteritems():
+                                if j is not None:
+                                    tmp.append((i,j))
+                                else:
+                                    tmp.append(i)
+                            val = tmp
+                    if delete_existing:
+                        dk = [x for x in dk if x not in val]
+                    self._dict[key] = dk + val
+        self.scanner_map_delete(kw)
+
+    def Clone(self, tools=[], toolpath=None, parse_flags = None, **kw):
+        """Return a copy of a construction Environment.  The
+        copy is like a Python "deep copy"--that is, independent
+        copies are made recursively of each objects--except that
+        a reference is copied when an object is not deep-copyable
+        (like a function).  There are no references to any mutable
+        objects in the original Environment.
+        """
+        clone = copy.copy(self)
+        clone._dict = semi_deepcopy(self._dict)
+
+        try:
+            cbd = clone._dict['BUILDERS']
+        except KeyError:
+            pass
+        else:
+            clone._dict['BUILDERS'] = BuilderDict(cbd, clone)
+
+        # Check the methods added via AddMethod() and re-bind them to
+        # the cloned environment.  Only do this if the attribute hasn't
+        # been overwritten by the user explicitly and still points to
+        # the added method.
+        clone.added_methods = []
+        for mw in self.added_methods:
+            if mw == getattr(self, mw.name):
+                clone.added_methods.append(mw.clone(clone))
+
+        clone._memo = {}
+
+        # Apply passed-in variables before the tools
+        # so the tools can use the new variables
+        kw = copy_non_reserved_keywords(kw)
+        new = {}
+        for key, value in kw.items():
+            new[key] = SCons.Subst.scons_subst_once(value, self, key)
+        clone.Replace(**new)
+
+        apply_tools(clone, tools, toolpath)
+
+        # apply them again in case the tools overwrote them
+        clone.Replace(**new)        
+
+        # Finally, apply any flags to be merged in
+        if parse_flags: clone.MergeFlags(parse_flags)
+
+        if __debug__: logInstanceCreation(self, 'Environment.EnvironmentClone')
+        return clone
+
+    def Copy(self, *args, **kw):
+        global _warn_copy_deprecated
+        if _warn_copy_deprecated:
+            msg = "The env.Copy() method is deprecated; use the env.Clone() method instead."
+            SCons.Warnings.warn(SCons.Warnings.DeprecatedCopyWarning, msg)
+            _warn_copy_deprecated = False
+        return self.Clone(*args, **kw)
+
+    def _changed_build(self, dependency, target, prev_ni):
+        if dependency.changed_state(target, prev_ni):
+            return 1
+        return self.decide_source(dependency, target, prev_ni)
+
+    def _changed_content(self, dependency, target, prev_ni):
+        return dependency.changed_content(target, prev_ni)
+
+    def _changed_source(self, dependency, target, prev_ni):
+        target_env = dependency.get_build_env()
+        type = target_env.get_tgt_sig_type()
+        if type == 'source':
+            return target_env.decide_source(dependency, target, prev_ni)
+        else:
+            return target_env.decide_target(dependency, target, prev_ni)
+
+    def _changed_timestamp_then_content(self, dependency, target, prev_ni):
+        return dependency.changed_timestamp_then_content(target, prev_ni)
+
+    def _changed_timestamp_newer(self, dependency, target, prev_ni):
+        return dependency.changed_timestamp_newer(target, prev_ni)
+
+    def _changed_timestamp_match(self, dependency, target, prev_ni):
+        return dependency.changed_timestamp_match(target, prev_ni)
+
+    def _copy_from_cache(self, src, dst):
+        return self.fs.copy(src, dst)
+
+    def _copy2_from_cache(self, src, dst):
+        return self.fs.copy2(src, dst)
+
+    def Decider(self, function):
+        copy_function = self._copy2_from_cache
+        if function in ('MD5', 'content'):
+            if not SCons.Util.md5:
+                raise UserError("MD5 signatures are not available in this version of Python.")
+            function = self._changed_content
+        elif function == 'MD5-timestamp':
+            function = self._changed_timestamp_then_content
+        elif function in ('timestamp-newer', 'make'):
+            function = self._changed_timestamp_newer
+            copy_function = self._copy_from_cache
+        elif function == 'timestamp-match':
+            function = self._changed_timestamp_match
+        elif not callable(function):
+            raise UserError("Unknown Decider value %s" % repr(function))
+
+        # We don't use AddMethod because we don't want to turn the
+        # function, which only expects three arguments, into a bound
+        # method, which would add self as an initial, fourth argument.
+        self.decide_target = function
+        self.decide_source = function
+
+        self.copy_from_cache = copy_function
+
+    def Detect(self, progs):
+        """Return the first available program in progs.
+        """
+        if not SCons.Util.is_List(progs):
+            progs = [ progs ]
+        for prog in progs:
+            path = self.WhereIs(prog)
+            if path: return prog
+        return None
+
+    def Dictionary(self, *args):
+        if not args:
+            return self._dict
+        dlist = [self._dict[x] for x in args]
+        if len(dlist) == 1:
+            dlist = dlist[0]
+        return dlist
+
+    def Dump(self, key = None):
+        """
+        Using the standard Python pretty printer, dump the contents of the
+        scons build environment to stdout.
+
+        If the key passed in is anything other than None, then that will
+        be used as an index into the build environment dictionary and
+        whatever is found there will be fed into the pretty printer. Note
+        that this key is case sensitive.
+        """
+        import pprint
+        pp = pprint.PrettyPrinter(indent=2)
+        if key:
+            dict = self.Dictionary(key)
+        else:
+            dict = self.Dictionary()
+        return pp.pformat(dict)
+
+    def FindIxes(self, paths, prefix, suffix):
+        """
+        Search a list of paths for something that matches the prefix and suffix.
+
+        paths - the list of paths or nodes.
+        prefix - construction variable for the prefix.
+        suffix - construction variable for the suffix.
+        """
+
+        suffix = self.subst('$'+suffix)
+        prefix = self.subst('$'+prefix)
+
+        for path in paths:
+            dir,name = os.path.split(str(path))
+            if name[:len(prefix)] == prefix and name[-len(suffix):] == suffix:
+                return path
+
+    def ParseConfig(self, command, function=None, unique=1):
+        """
+        Use the specified function to parse the output of the command
+        in order to modify the current environment.  The 'command' can
+        be a string or a list of strings representing a command and
+        its arguments.  'Function' is an optional argument that takes
+        the environment, the output of the command, and the unique flag.
+        If no function is specified, MergeFlags, which treats the output
+        as the result of a typical 'X-config' command (i.e. gtk-config),
+        will merge the output into the appropriate variables.
+        """
+        if function is None:
+            def parse_conf(env, cmd, unique=unique):
+                return env.MergeFlags(cmd, unique)
+            function = parse_conf
+        if SCons.Util.is_List(command):
+            command = ' '.join(command)
+        command = self.subst(command)
+        return function(self, self.backtick(command))
+
+    def ParseDepends(self, filename, must_exist=None, only_one=0):
+        """
+        Parse a mkdep-style file for explicit dependencies.  This is
+        completely abusable, and should be unnecessary in the "normal"
+        case of proper SCons configuration, but it may help make
+        the transition from a Make hierarchy easier for some people
+        to swallow.  It can also be genuinely useful when using a tool
+        that can write a .d file, but for which writing a scanner would
+        be too complicated.
+        """
+        filename = self.subst(filename)
+        try:
+            fp = open(filename, 'r')
+        except IOError:
+            if must_exist:
+                raise
+            return
+        lines = SCons.Util.LogicalLines(fp).readlines()
+        lines = [l for l in lines if l[0] != '#']
+        tdlist = []
+        for line in lines:
+            try:
+                target, depends = line.split(':', 1)
+            except (AttributeError, ValueError):
+                # Throws AttributeError if line isn't a string.  Can throw
+                # ValueError if line doesn't split into two or more elements.
+                pass
+            else:
+                tdlist.append((target.split(), depends.split()))
+        if only_one:
+            targets = []
+            for td in tdlist:
+                targets.extend(td[0])
+            if len(targets) > 1:
+                raise SCons.Errors.UserError(
+                            "More than one dependency target found in `%s':  %s"
+                                            % (filename, targets))
+        for target, depends in tdlist:
+            self.Depends(target, depends)
+
+    def Platform(self, platform):
+        platform = self.subst(platform)
+        return SCons.Platform.Platform(platform)(self)
+
+    def Prepend(self, **kw):
+        """Prepend values to existing construction variables
+        in an Environment.
+        """
+        kw = copy_non_reserved_keywords(kw)
+        for key, val in kw.items():
+            # It would be easier on the eyes to write this using
+            # "continue" statements whenever we finish processing an item,
+            # but Python 1.5.2 apparently doesn't let you use "continue"
+            # within try:-except: blocks, so we have to nest our code.
+            try:
+                orig = self._dict[key]
+            except KeyError:
+                # No existing variable in the environment, so just set
+                # it to the new value.
+                self._dict[key] = val
+            else:
+                try:
+                    # Check if the original looks like a dictionary.
+                    # If it is, we can't just try adding the value because
+                    # dictionaries don't have __add__() methods, and
+                    # things like UserList will incorrectly coerce the
+                    # original dict to a list (which we don't want).
+                    update_dict = orig.update
+                except AttributeError:
+                    try:
+                        # Most straightforward:  just try to add them
+                        # together.  This will work in most cases, when the
+                        # original and new values are of compatible types.
+                        self._dict[key] = val + orig
+                    except (KeyError, TypeError):
+                        try:
+                            # Check if the added value is a list.
+                            add_to_val = val.append
+                        except AttributeError:
+                            # The added value isn't a list, but the
+                            # original is (by process of elimination),
+                            # so insert the the new value in the original
+                            # (if there's one to insert).
+                            if val:
+                                orig.insert(0, val)
+                        else:
+                            # The added value is a list, so append
+                            # the original to it (if there's a value
+                            # to append).
+                            if orig:
+                                add_to_val(orig)
+                            self._dict[key] = val
+                else:
+                    # The original looks like a dictionary, so update it
+                    # based on what we think the value looks like.
+                    if SCons.Util.is_List(val):
+                        for v in val:
+                            orig[v] = None
+                    else:
+                        try:
+                            update_dict(val)
+                        except (AttributeError, TypeError, ValueError):
+                            if SCons.Util.is_Dict(val):
+                                for k, v in val.items():
+                                    orig[k] = v
+                            else:
+                                orig[val] = None
+        self.scanner_map_delete(kw)
+
+    def PrependENVPath(self, name, newpath, envname = 'ENV', sep = os.pathsep,
+                       delete_existing=1):
+        """Prepend path elements to the path 'name' in the 'ENV'
+        dictionary for this environment.  Will only add any particular
+        path once, and will normpath and normcase all paths to help
+        assure this.  This can also handle the case where the env
+        variable is a list instead of a string.
+
+        If delete_existing is 0, a newpath which is already in the path
+        will not be moved to the front (it will be left where it is).
+        """
+
+        orig = ''
+        if envname in self._dict and name in self._dict[envname]:
+            orig = self._dict[envname][name]
+
+        nv = SCons.Util.PrependPath(orig, newpath, sep, delete_existing,
+                                    canonicalize=self._canonicalize)
+
+        if envname not in self._dict:
+            self._dict[envname] = {}
+
+        self._dict[envname][name] = nv
+
+    def PrependUnique(self, delete_existing=0, **kw):
+        """Prepend values to existing construction variables
+        in an Environment, if they're not already there.
+        If delete_existing is 1, removes existing values first, so
+        values move to front.
+        """
+        kw = copy_non_reserved_keywords(kw)
+        for key, val in kw.items():
+            if SCons.Util.is_List(val):
+                val = _delete_duplicates(val, not delete_existing)
+            if key not in self._dict or self._dict[key] in ('', None):
+                self._dict[key] = val
+            elif SCons.Util.is_Dict(self._dict[key]) and \
+                 SCons.Util.is_Dict(val):
+                self._dict[key].update(val)
+            elif SCons.Util.is_List(val):
+                dk = self._dict[key]
+                if not SCons.Util.is_List(dk):
+                    dk = [dk]
+                if delete_existing:
+                    dk = [x for x in dk if x not in val]
+                else:
+                    val = [x for x in val if x not in dk]
+                self._dict[key] = val + dk
+            else:
+                dk = self._dict[key]
+                if SCons.Util.is_List(dk):
+                    # By elimination, val is not a list.  Since dk is a
+                    # list, wrap val in a list first.
+                    if delete_existing:
+                        dk = [x for x in dk if x not in val]
+                        self._dict[key] = [val] + dk
+                    else:
+                        if not val in dk:
+                            self._dict[key] = [val] + dk
+                else:
+                    if delete_existing:
+                        dk = [x for x in dk if x not in val]
+                    self._dict[key] = val + dk
+        self.scanner_map_delete(kw)
+
+    def Replace(self, **kw):
+        """Replace existing construction variables in an Environment
+        with new construction variables and/or values.
+        """
+        try:
+            kwbd = kw['BUILDERS']
+        except KeyError:
+            pass
+        else:
+            kwbd = semi_deepcopy(kwbd)
+            del kw['BUILDERS']
+            self.__setitem__('BUILDERS', kwbd)
+        kw = copy_non_reserved_keywords(kw)
+        self._update(semi_deepcopy(kw))
+        self.scanner_map_delete(kw)
+
+    def ReplaceIxes(self, path, old_prefix, old_suffix, new_prefix, new_suffix):
+        """
+        Replace old_prefix with new_prefix and old_suffix with new_suffix.
+
+        env - Environment used to interpolate variables.
+        path - the path that will be modified.
+        old_prefix - construction variable for the old prefix.
+        old_suffix - construction variable for the old suffix.
+        new_prefix - construction variable for the new prefix.
+        new_suffix - construction variable for the new suffix.
+        """
+        old_prefix = self.subst('$'+old_prefix)
+        old_suffix = self.subst('$'+old_suffix)
+
+        new_prefix = self.subst('$'+new_prefix)
+        new_suffix = self.subst('$'+new_suffix)
+
+        dir,name = os.path.split(str(path))
+        if name[:len(old_prefix)] == old_prefix:
+            name = name[len(old_prefix):]
+        if name[-len(old_suffix):] == old_suffix:
+            name = name[:-len(old_suffix)]
+        return os.path.join(dir, new_prefix+name+new_suffix)
+
+    def SetDefault(self, **kw):
+        for k in kw.keys():
+            if k in self._dict:
+                del kw[k]
+        self.Replace(**kw)
+
+    def _find_toolpath_dir(self, tp):
+        return self.fs.Dir(self.subst(tp)).srcnode().abspath
+
+    def Tool(self, tool, toolpath=None, **kw):
+        if SCons.Util.is_String(tool):
+            tool = self.subst(tool)
+            if toolpath is None:
+                toolpath = self.get('toolpath', [])
+            toolpath = list(map(self._find_toolpath_dir, toolpath))
+            tool = SCons.Tool.Tool(tool, toolpath, **kw)
+        tool(self)
+
+    def WhereIs(self, prog, path=None, pathext=None, reject=[]):
+        """Find prog in the path.
+        """
+        if path is None:
+            try:
+                path = self['ENV']['PATH']
+            except KeyError:
+                pass
+        elif SCons.Util.is_String(path):
+            path = self.subst(path)
+        if pathext is None:
+            try:
+                pathext = self['ENV']['PATHEXT']
+            except KeyError:
+                pass
+        elif SCons.Util.is_String(pathext):
+            pathext = self.subst(pathext)
+        prog = self.subst(prog)
+        path = SCons.Util.WhereIs(prog, path, pathext, reject)
+        if path: return path
+        return None
+
+    #######################################################################
+    # Public methods for doing real "SCons stuff" (manipulating
+    # dependencies, setting attributes on targets, etc.).  These begin
+    # with upper-case letters.  The essential characteristic of methods
+    # in this section is that they all *should* have corresponding
+    # same-named global functions.
+    #######################################################################
+
+    def Action(self, *args, **kw):
+        def subst_string(a, self=self):
+            if SCons.Util.is_String(a):
+                a = self.subst(a)
+            return a
+        nargs = list(map(subst_string, args))
+        nkw = self.subst_kw(kw)
+        return SCons.Action.Action(*nargs, **nkw)
+
+    def AddPreAction(self, files, action):
+        nodes = self.arg2nodes(files, self.fs.Entry)
+        action = SCons.Action.Action(action)
+        uniq = {}
+        for executor in [n.get_executor() for n in nodes]:
+            uniq[executor] = 1
+        for executor in uniq.keys():
+            executor.add_pre_action(action)
+        return nodes
+
+    def AddPostAction(self, files, action):
+        nodes = self.arg2nodes(files, self.fs.Entry)
+        action = SCons.Action.Action(action)
+        uniq = {}
+        for executor in [n.get_executor() for n in nodes]:
+            uniq[executor] = 1
+        for executor in uniq.keys():
+            executor.add_post_action(action)
+        return nodes
+
+    def Alias(self, target, source=[], action=None, **kw):
+        tlist = self.arg2nodes(target, self.ans.Alias)
+        if not SCons.Util.is_List(source):
+            source = [source]
+        source = [_f for _f in source if _f]
+
+        if not action:
+            if not source:
+                # There are no source files and no action, so just
+                # return a target list of classic Alias Nodes, without
+                # any builder.  The externally visible effect is that
+                # this will make the wrapping Script.BuildTask class
+                # say that there's "Nothing to be done" for this Alias,
+                # instead of that it's "up to date."
+                return tlist
+
+            # No action, but there are sources.  Re-call all the target
+            # builders to add the sources to each target.
+            result = []
+            for t in tlist:
+                bld = t.get_builder(AliasBuilder)
+                result.extend(bld(self, t, source))
+            return result
+
+        nkw = self.subst_kw(kw)
+        nkw.update({
+            'action'            : SCons.Action.Action(action),
+            'source_factory'    : self.fs.Entry,
+            'multi'             : 1,
+            'is_explicit'       : None,
+        })
+        bld = SCons.Builder.Builder(**nkw)
+
+        # Apply the Builder separately to each target so that the Aliases
+        # stay separate.  If we did one "normal" Builder call with the
+        # whole target list, then all of the target Aliases would be
+        # associated under a single Executor.
+        result = []
+        for t in tlist:
+            # Calling the convert() method will cause a new Executor to be
+            # created from scratch, so we have to explicitly initialize
+            # it with the target's existing sources, plus our new ones,
+            # so nothing gets lost.
+            b = t.get_builder()
+            if b is None or b is AliasBuilder:
+                b = bld
+            else:
+                nkw['action'] = b.action + action
+                b = SCons.Builder.Builder(**nkw)
+            t.convert()
+            result.extend(b(self, t, t.sources + source))
+        return result
+
+    def AlwaysBuild(self, *targets):
+        tlist = []
+        for t in targets:
+            tlist.extend(self.arg2nodes(t, self.fs.Entry))
+        for t in tlist:
+            t.set_always_build()
+        return tlist
+
+    def BuildDir(self, *args, **kw):
+        msg = """BuildDir() and the build_dir keyword have been deprecated;\n\tuse VariantDir() and the variant_dir keyword instead."""
+        SCons.Warnings.warn(SCons.Warnings.DeprecatedBuildDirWarning, msg)
+        if 'build_dir' in kw:
+            kw['variant_dir'] = kw['build_dir']
+            del kw['build_dir']
+        return self.VariantDir(*args, **kw)
+
+    def Builder(self, **kw):
+        nkw = self.subst_kw(kw)
+        return SCons.Builder.Builder(**nkw)
+
+    def CacheDir(self, path):
+        import SCons.CacheDir
+        if path is not None:
+            path = self.subst(path)
+        self._CacheDir_path = path
+
+    def Clean(self, targets, files):
+        global CleanTargets
+        tlist = self.arg2nodes(targets, self.fs.Entry)
+        flist = self.arg2nodes(files, self.fs.Entry)
+        for t in tlist:
+            try:
+                CleanTargets[t].extend(flist)
+            except KeyError:
+                CleanTargets[t] = flist
+
+    def Configure(self, *args, **kw):
+        nargs = [self]
+        if args:
+            nargs = nargs + self.subst_list(args)[0]
+        nkw = self.subst_kw(kw)
+        nkw['_depth'] = kw.get('_depth', 0) + 1
+        try:
+            nkw['custom_tests'] = self.subst_kw(nkw['custom_tests'])
+        except KeyError:
+            pass
+        return SCons.SConf.SConf(*nargs, **nkw)
+
+    def Command(self, target, source, action, **kw):
+        """Builds the supplied target files from the supplied
+        source files using the supplied action.  Action may
+        be any type that the Builder constructor will accept
+        for an action."""
+        bkw = {
+            'action' : action,
+            'target_factory' : self.fs.Entry,
+            'source_factory' : self.fs.Entry,
+        }
+        try: bkw['source_scanner'] = kw['source_scanner']
+        except KeyError: pass
+        else: del kw['source_scanner']
+        bld = SCons.Builder.Builder(**bkw)
+        return bld(self, target, source, **kw)
+
+    def Depends(self, target, dependency):
+        """Explicity specify that 'target's depend on 'dependency'."""
+        tlist = self.arg2nodes(target, self.fs.Entry)
+        dlist = self.arg2nodes(dependency, self.fs.Entry)
+        for t in tlist:
+            t.add_dependency(dlist)
+        return tlist
+
+    def Dir(self, name, *args, **kw):
+        """
+        """
+        s = self.subst(name)
+        if SCons.Util.is_Sequence(s):
+            result=[]
+            for e in s:
+                result.append(self.fs.Dir(e, *args, **kw))
+            return result
+        return self.fs.Dir(s, *args, **kw)
+
+    def NoClean(self, *targets):
+        """Tags a target so that it will not be cleaned by -c"""
+        tlist = []
+        for t in targets:
+            tlist.extend(self.arg2nodes(t, self.fs.Entry))
+        for t in tlist:
+            t.set_noclean()
+        return tlist
+
+    def NoCache(self, *targets):
+        """Tags a target so that it will not be cached"""
+        tlist = []
+        for t in targets:
+            tlist.extend(self.arg2nodes(t, self.fs.Entry))
+        for t in tlist:
+            t.set_nocache()
+        return tlist
+
+    def Entry(self, name, *args, **kw):
+        """
+        """
+        s = self.subst(name)
+        if SCons.Util.is_Sequence(s):
+            result=[]
+            for e in s:
+                result.append(self.fs.Entry(e, *args, **kw))
+            return result
+        return self.fs.Entry(s, *args, **kw)
+
+    def Environment(self, **kw):
+        return SCons.Environment.Environment(**self.subst_kw(kw))
+
+    def Execute(self, action, *args, **kw):
+        """Directly execute an action through an Environment
+        """
+        action = self.Action(action, *args, **kw)
+        result = action([], [], self)
+        if isinstance(result, SCons.Errors.BuildError):
+            errstr = result.errstr
+            if result.filename:
+                errstr = result.filename + ': ' + errstr
+            sys.stderr.write("scons: *** %s\n" % errstr)
+            return result.status
+        else:
+            return result
+
+    def File(self, name, *args, **kw):
+        """
+        """
+        s = self.subst(name)
+        if SCons.Util.is_Sequence(s):
+            result=[]
+            for e in s:
+                result.append(self.fs.File(e, *args, **kw))
+            return result
+        return self.fs.File(s, *args, **kw)
+
+    def FindFile(self, file, dirs):
+        file = self.subst(file)
+        nodes = self.arg2nodes(dirs, self.fs.Dir)
+        return SCons.Node.FS.find_file(file, tuple(nodes))
+
+    def Flatten(self, sequence):
+        return SCons.Util.flatten(sequence)
+
+    def GetBuildPath(self, files):
+        result = list(map(str, self.arg2nodes(files, self.fs.Entry)))
+        if SCons.Util.is_List(files):
+            return result
+        else:
+            return result[0]
+
+    def Glob(self, pattern, ondisk=True, source=False, strings=False):
+        return self.fs.Glob(self.subst(pattern), ondisk, source, strings)
+
+    def Ignore(self, target, dependency):
+        """Ignore a dependency."""
+        tlist = self.arg2nodes(target, self.fs.Entry)
+        dlist = self.arg2nodes(dependency, self.fs.Entry)
+        for t in tlist:
+            t.add_ignore(dlist)
+        return tlist
+
+    def Literal(self, string):
+        return SCons.Subst.Literal(string)
+
+    def Local(self, *targets):
+        ret = []
+        for targ in targets:
+            if isinstance(targ, SCons.Node.Node):
+                targ.set_local()
+                ret.append(targ)
+            else:
+                for t in self.arg2nodes(targ, self.fs.Entry):
+                   t.set_local()
+                   ret.append(t)
+        return ret
+
+    def Precious(self, *targets):
+        tlist = []
+        for t in targets:
+            tlist.extend(self.arg2nodes(t, self.fs.Entry))
+        for t in tlist:
+            t.set_precious()
+        return tlist
+
+    def Repository(self, *dirs, **kw):
+        dirs = self.arg2nodes(list(dirs), self.fs.Dir)
+        self.fs.Repository(*dirs, **kw)
+
+    def Requires(self, target, prerequisite):
+        """Specify that 'prerequisite' must be built before 'target',
+        (but 'target' does not actually depend on 'prerequisite'
+        and need not be rebuilt if it changes)."""
+        tlist = self.arg2nodes(target, self.fs.Entry)
+        plist = self.arg2nodes(prerequisite, self.fs.Entry)
+        for t in tlist:
+            t.add_prerequisite(plist)
+        return tlist
+
+    def Scanner(self, *args, **kw):
+        nargs = []
+        for arg in args:
+            if SCons.Util.is_String(arg):
+                arg = self.subst(arg)
+            nargs.append(arg)
+        nkw = self.subst_kw(kw)
+        return SCons.Scanner.Base(*nargs, **nkw)
+
+    def SConsignFile(self, name=".sconsign", dbm_module=None):
+        if name is not None:
+            name = self.subst(name)
+            if not os.path.isabs(name):
+                name = os.path.join(str(self.fs.SConstruct_dir), name)
+        if name:
+            name = os.path.normpath(name)
+            sconsign_dir = os.path.dirname(name)
+            if sconsign_dir and not os.path.exists(sconsign_dir):
+                self.Execute(SCons.Defaults.Mkdir(sconsign_dir))
+        SCons.SConsign.File(name, dbm_module)
+
+    def SideEffect(self, side_effect, target):
+        """Tell scons that side_effects are built as side
+        effects of building targets."""
+        side_effects = self.arg2nodes(side_effect, self.fs.Entry)
+        targets = self.arg2nodes(target, self.fs.Entry)
+
+        for side_effect in side_effects:
+            if side_effect.multiple_side_effect_has_builder():
+                raise SCons.Errors.UserError("Multiple ways to build the same target were specified for: %s" % str(side_effect))
+            side_effect.add_source(targets)
+            side_effect.side_effect = 1
+            self.Precious(side_effect)
+            for target in targets:
+                target.side_effects.append(side_effect)
+        return side_effects
+
+    def SourceCode(self, entry, builder):
+        """Arrange for a source code builder for (part of) a tree."""
+        msg = """SourceCode() has been deprecated and there is no replacement.
+\tIf you need this function, please contact dev at scons.tigris.org."""
+        SCons.Warnings.warn(SCons.Warnings.DeprecatedSourceCodeWarning, msg)
+        entries = self.arg2nodes(entry, self.fs.Entry)
+        for entry in entries:
+            entry.set_src_builder(builder)
+        return entries
+
+    def SourceSignatures(self, type):
+        global _warn_source_signatures_deprecated
+        if _warn_source_signatures_deprecated:
+            msg = "The env.SourceSignatures() method is deprecated;\n" + \
+                  "\tconvert your build to use the env.Decider() method instead."
+            SCons.Warnings.warn(SCons.Warnings.DeprecatedSourceSignaturesWarning, msg)
+            _warn_source_signatures_deprecated = False
+        type = self.subst(type)
+        self.src_sig_type = type
+        if type == 'MD5':
+            if not SCons.Util.md5:
+                raise UserError("MD5 signatures are not available in this version of Python.")
+            self.decide_source = self._changed_content
+        elif type == 'timestamp':
+            self.decide_source = self._changed_timestamp_match
+        else:
+            raise UserError("Unknown source signature type '%s'" % type)
+
+    def Split(self, arg):
+        """This function converts a string or list into a list of strings
+        or Nodes.  This makes things easier for users by allowing files to
+        be specified as a white-space separated list to be split.
+        The input rules are:
+            - A single string containing names separated by spaces. These will be
+              split apart at the spaces.
+            - A single Node instance
+            - A list containing either strings or Node instances. Any strings
+              in the list are not split at spaces.
+        In all cases, the function returns a list of Nodes and strings."""
+        if SCons.Util.is_List(arg):
+            return list(map(self.subst, arg))
+        elif SCons.Util.is_String(arg):
+            return self.subst(arg).split()
+        else:
+            return [self.subst(arg)]
+
+    def TargetSignatures(self, type):
+        global _warn_target_signatures_deprecated
+        if _warn_target_signatures_deprecated:
+            msg = "The env.TargetSignatures() method is deprecated;\n" + \
+                  "\tconvert your build to use the env.Decider() method instead."
+            SCons.Warnings.warn(SCons.Warnings.DeprecatedTargetSignaturesWarning, msg)
+            _warn_target_signatures_deprecated = False
+        type = self.subst(type)
+        self.tgt_sig_type = type
+        if type in ('MD5', 'content'):
+            if not SCons.Util.md5:
+                raise UserError("MD5 signatures are not available in this version of Python.")
+            self.decide_target = self._changed_content
+        elif type == 'timestamp':
+            self.decide_target = self._changed_timestamp_match
+        elif type == 'build':
+            self.decide_target = self._changed_build
+        elif type == 'source':
+            self.decide_target = self._changed_source
+        else:
+            raise UserError("Unknown target signature type '%s'"%type)
+
+    def Value(self, value, built_value=None):
+        """
+        """
+        return SCons.Node.Python.Value(value, built_value)
+
+    def VariantDir(self, variant_dir, src_dir, duplicate=1):
+        variant_dir = self.arg2nodes(variant_dir, self.fs.Dir)[0]
+        src_dir = self.arg2nodes(src_dir, self.fs.Dir)[0]
+        self.fs.VariantDir(variant_dir, src_dir, duplicate)
+
+    def FindSourceFiles(self, node='.'):
+        """ returns a list of all source files.
+        """
+        node = self.arg2nodes(node, self.fs.Entry)[0]
+
+        sources = []
+        def build_source(ss):
+            for s in ss:
+                if isinstance(s, SCons.Node.FS.Dir):
+                    build_source(s.all_children())
+                elif s.has_builder():
+                    build_source(s.sources)
+                elif isinstance(s.disambiguate(), SCons.Node.FS.File):
+                    sources.append(s)
+        build_source(node.all_children())
+
+    # THIS CODE APPEARS TO HAVE NO EFFECT
+    #    # get the final srcnode for all nodes, this means stripping any
+    #    # attached build node by calling the srcnode function
+    #    for file in sources:
+    #        srcnode = file.srcnode()
+    #        while srcnode != file.srcnode():
+    #            srcnode = file.srcnode()
+
+        # remove duplicates
+        return list(set(sources))
+
+    def FindInstalledFiles(self):
+        """ returns the list of all targets of the Install and InstallAs Builder.
+        """
+        from SCons.Tool import install
+        if install._UNIQUE_INSTALLED_FILES is None:
+            install._UNIQUE_INSTALLED_FILES = SCons.Util.uniquer_hashables(install._INSTALLED_FILES)
+        return install._UNIQUE_INSTALLED_FILES
+
+class OverrideEnvironment(Base):
+    """A proxy that overrides variables in a wrapped construction
+    environment by returning values from an overrides dictionary in
+    preference to values from the underlying subject environment.
+
+    This is a lightweight (I hope) proxy that passes through most use of
+    attributes to the underlying Environment.Base class, but has just
+    enough additional methods defined to act like a real construction
+    environment with overridden values.  It can wrap either a Base
+    construction environment, or another OverrideEnvironment, which
+    can in turn nest arbitrary OverrideEnvironments...
+
+    Note that we do *not* call the underlying base class
+    (SubsitutionEnvironment) initialization, because we get most of those
+    from proxying the attributes of the subject construction environment.
+    But because we subclass SubstitutionEnvironment, this class also
+    has inherited arg2nodes() and subst*() methods; those methods can't
+    be proxied because they need *this* object's methods to fetch the
+    values from the overrides dictionary.
+    """
+
+    def __init__(self, subject, overrides={}):
+        if __debug__: logInstanceCreation(self, 'Environment.OverrideEnvironment')
+        self.__dict__['__subject'] = subject
+        self.__dict__['overrides'] = overrides
+
+    # Methods that make this class act like a proxy.
+    def __getattr__(self, name):
+        return getattr(self.__dict__['__subject'], name)
+    def __setattr__(self, name, value):
+        setattr(self.__dict__['__subject'], name, value)
+
+    # Methods that make this class act like a dictionary.
+    def __getitem__(self, key):
+        try:
+            return self.__dict__['overrides'][key]
+        except KeyError:
+            return self.__dict__['__subject'].__getitem__(key)
+    def __setitem__(self, key, value):
+        if not is_valid_construction_var(key):
+            raise SCons.Errors.UserError("Illegal construction variable `%s'" % key)
+        self.__dict__['overrides'][key] = value
+    def __delitem__(self, key):
+        try:
+            del self.__dict__['overrides'][key]
+        except KeyError:
+            deleted = 0
+        else:
+            deleted = 1
+        try:
+            result = self.__dict__['__subject'].__delitem__(key)
+        except KeyError:
+            if not deleted:
+                raise
+            result = None
+        return result
+    def get(self, key, default=None):
+        """Emulates the get() method of dictionaries."""
+        try:
+            return self.__dict__['overrides'][key]
+        except KeyError:
+            return self.__dict__['__subject'].get(key, default)
+    def has_key(self, key):
+        try:
+            self.__dict__['overrides'][key]
+            return 1
+        except KeyError:
+            return key in self.__dict__['__subject']
+    def __contains__(self, key):
+        if self.__dict__['overrides'].__contains__(key):
+            return 1
+        return self.__dict__['__subject'].__contains__(key)
+    def Dictionary(self):
+        """Emulates the items() method of dictionaries."""
+        d = self.__dict__['__subject'].Dictionary().copy()
+        d.update(self.__dict__['overrides'])
+        return d
+    def items(self):
+        """Emulates the items() method of dictionaries."""
+        return list(self.Dictionary().items())
+
+    # Overridden private construction environment methods.
+    def _update(self, dict):
+        """Update an environment's values directly, bypassing the normal
+        checks that occur when users try to set items.
+        """
+        self.__dict__['overrides'].update(dict)
+
+    def gvars(self):
+        return self.__dict__['__subject'].gvars()
+
+    def lvars(self):
+        lvars = self.__dict__['__subject'].lvars()
+        lvars.update(self.__dict__['overrides'])
+        return lvars
+
+    # Overridden public construction environment methods.
+    def Replace(self, **kw):
+        kw = copy_non_reserved_keywords(kw)
+        self.__dict__['overrides'].update(semi_deepcopy(kw))
+
+# The entry point that will be used by the external world
+# to refer to a construction environment.  This allows the wrapper
+# interface to extend a construction environment for its own purposes
+# by subclassing SCons.Environment.Base and then assigning the
+# class to SCons.Environment.Environment.
+
+Environment = Base
+
+# An entry point for returning a proxy subclass instance that overrides
+# the subst*() methods so they don't actually perform construction
+# variable substitution.  This is specifically intended to be the shim
+# layer in between global function calls (which don't want construction
+# variable substitution) and the DefaultEnvironment() (which would
+# substitute variables if left to its own devices)."""
+#
+# We have to wrap this in a function that allows us to delay definition of
+# the class until it's necessary, so that when it subclasses Environment
+# it will pick up whatever Environment subclass the wrapper interface
+# might have assigned to SCons.Environment.Environment.
+
+def NoSubstitutionProxy(subject):
+    class _NoSubstitutionProxy(Environment):
+        def __init__(self, subject):
+            self.__dict__['__subject'] = subject
+        def __getattr__(self, name):
+            return getattr(self.__dict__['__subject'], name)
+        def __setattr__(self, name, value):
+            return setattr(self.__dict__['__subject'], name, value)
+        def executor_to_lvars(self, kwdict):
+            if kwdict.has_key('executor'):
+                kwdict['lvars'] = kwdict['executor'].get_lvars()
+                del kwdict['executor']
+            else:
+                kwdict['lvars'] = {}
+        def raw_to_mode(self, dict):
+            try:
+                raw = dict['raw']
+            except KeyError:
+                pass
+            else:
+                del dict['raw']
+                dict['mode'] = raw
+        def subst(self, string, *args, **kwargs):
+            return string
+        def subst_kw(self, kw, *args, **kwargs):
+            return kw
+        def subst_list(self, string, *args, **kwargs):
+            nargs = (string, self,) + args
+            nkw = kwargs.copy()
+            nkw['gvars'] = {}
+            self.executor_to_lvars(nkw)
+            self.raw_to_mode(nkw)
+            return SCons.Subst.scons_subst_list(*nargs, **nkw)
+        def subst_target_source(self, string, *args, **kwargs):
+            nargs = (string, self,) + args
+            nkw = kwargs.copy()
+            nkw['gvars'] = {}
+            self.executor_to_lvars(nkw)
+            self.raw_to_mode(nkw)
+            return SCons.Subst.scons_subst(*nargs, **nkw)
+    return _NoSubstitutionProxy(subject)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Errors.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Errors.py
new file mode 100644
index 0000000..69a55ec
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Errors.py
@@ -0,0 +1,205 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+"""SCons.Errors
+
+This file contains the exception classes used to handle internal
+and user errors in SCons.
+
+"""
+
+__revision__ = "src/engine/SCons/Errors.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Util
+
+import exceptions
+
+class BuildError(Exception):
+    """ Errors occuring while building.
+
+    BuildError have the following attributes:
+
+        Information about the cause of the build error:
+        -----------------------------------------------
+
+        errstr : a description of the error message
+
+        status : the return code of the action that caused the build
+                 error. Must be set to a non-zero value even if the
+                 build error is not due to an action returning a
+                 non-zero returned code.
+
+        exitstatus : SCons exit status due to this build error.
+                     Must be nonzero unless due to an explicit Exit()
+                     call.  Not always the same as status, since
+                     actions return a status code that should be
+                     respected, but SCons typically exits with 2
+                     irrespective of the return value of the failed
+                     action.
+
+        filename : The name of the file or directory that caused the
+                   build error. Set to None if no files are associated with
+                   this error. This might be different from the target
+                   being built. For example, failure to create the
+                   directory in which the target file will appear. It
+                   can be None if the error is not due to a particular
+                   filename.
+
+        exc_info : Info about exception that caused the build
+                   error. Set to (None, None, None) if this build
+                   error is not due to an exception.
+
+
+        Information about the cause of the location of the error:
+        ---------------------------------------------------------
+
+        node : the error occured while building this target node(s)
+        
+        executor : the executor that caused the build to fail (might
+                   be None if the build failures is not due to the
+                   executor failing)
+        
+        action : the action that caused the build to fail (might be
+                 None if the build failures is not due to the an
+                 action failure)
+
+        command : the command line for the action that caused the
+                  build to fail (might be None if the build failures
+                  is not due to the an action failure)
+        """
+
+    def __init__(self, 
+                 node=None, errstr="Unknown error", status=2, exitstatus=2,
+                 filename=None, executor=None, action=None, command=None,
+                 exc_info=(None, None, None)):
+        
+        self.errstr = errstr
+        self.status = status
+        self.exitstatus = exitstatus
+        self.filename = filename
+        self.exc_info = exc_info
+
+        self.node = node
+        self.executor = executor
+        self.action = action
+        self.command = command
+
+        Exception.__init__(self, node, errstr, status, exitstatus, filename, 
+                           executor, action, command, exc_info)
+
+    def __str__(self):
+        if self.filename:
+            return self.filename + ': ' + self.errstr
+        else:
+            return self.errstr
+
+class InternalError(Exception):
+    pass
+
+class UserError(Exception):
+    pass
+
+class StopError(Exception):
+    pass
+
+class EnvironmentError(Exception):
+    pass
+
+class MSVCError(IOError):
+    pass
+
+class ExplicitExit(Exception):
+    def __init__(self, node=None, status=None, *args):
+        self.node = node
+        self.status = status
+        self.exitstatus = status
+        Exception.__init__(self, *args)
+
+def convert_to_BuildError(status, exc_info=None):
+    """
+    Convert any return code a BuildError Exception.
+
+    `status' can either be a return code or an Exception.
+    The buildError.status we set here will normally be
+    used as the exit status of the "scons" process.
+    """
+    if not exc_info and isinstance(status, Exception):
+        exc_info = (status.__class__, status, None)
+
+    if isinstance(status, BuildError):
+        buildError = status
+        buildError.exitstatus = 2   # always exit with 2 on build errors
+    elif isinstance(status, ExplicitExit):
+        status = status.status
+        errstr = 'Explicit exit, status %s' % status
+        buildError = BuildError(
+            errstr=errstr,
+            status=status,      # might be 0, OK here
+            exitstatus=status,      # might be 0, OK here
+            exc_info=exc_info)
+    elif isinstance(status, (StopError, UserError)):
+        buildError = BuildError(
+            errstr=str(status),
+            status=2,
+            exitstatus=2,
+            exc_info=exc_info)
+    elif isinstance(status, exceptions.EnvironmentError):
+        # If an IOError/OSError happens, raise a BuildError.
+        # Report the name of the file or directory that caused the
+        # error, which might be different from the target being built
+        # (for example, failure to create the directory in which the
+        # target file will appear).
+        try: filename = status.filename
+        except AttributeError: filename = None
+        buildError = BuildError( 
+            errstr=status.strerror,
+            status=status.errno,
+            exitstatus=2,
+            filename=filename,
+            exc_info=exc_info)
+    elif isinstance(status, Exception):
+        buildError = BuildError(
+            errstr='%s : %s' % (status.__class__.__name__, status),
+            status=2,
+            exitstatus=2,
+            exc_info=exc_info)
+    elif SCons.Util.is_String(status):
+        buildError = BuildError(
+            errstr=status,
+            status=2,
+            exitstatus=2)
+    else:
+        buildError = BuildError(
+            errstr="Error %s" % status,
+            status=status,
+            exitstatus=2)
+    
+    #import sys
+    #sys.stderr.write("convert_to_BuildError: status %s => (errstr %s, status %s)"%(status,buildError.errstr, buildError.status))
+    return buildError
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Executor.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Executor.py
new file mode 100644
index 0000000..59711b2
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Executor.py
@@ -0,0 +1,633 @@
+"""SCons.Executor
+
+A module for executing actions with specific lists of target and source
+Nodes.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Executor.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import collections
+
+from SCons.Debug import logInstanceCreation
+import SCons.Errors
+import SCons.Memoize
+
+
+class Batch(object):
+    """Remembers exact association between targets
+    and sources of executor."""
+    def __init__(self, targets=[], sources=[]):
+        self.targets = targets
+        self.sources = sources
+
+
+
+class TSList(collections.UserList):
+    """A class that implements $TARGETS or $SOURCES expansions by wrapping
+    an executor Method.  This class is used in the Executor.lvars()
+    to delay creation of NodeList objects until they're needed.
+
+    Note that we subclass collections.UserList purely so that the
+    is_Sequence() function will identify an object of this class as
+    a list during variable expansion.  We're not really using any
+    collections.UserList methods in practice.
+    """
+    def __init__(self, func):
+        self.func = func
+    def __getattr__(self, attr):
+        nl = self.func()
+        return getattr(nl, attr)
+    def __getitem__(self, i):
+        nl = self.func()
+        return nl[i]
+    def __getslice__(self, i, j):
+        nl = self.func()
+        i = max(i, 0); j = max(j, 0)
+        return nl[i:j]
+    def __str__(self):
+        nl = self.func()
+        return str(nl)
+    def __repr__(self):
+        nl = self.func()
+        return repr(nl)
+
+class TSObject(object):
+    """A class that implements $TARGET or $SOURCE expansions by wrapping
+    an Executor method.
+    """
+    def __init__(self, func):
+        self.func = func
+    def __getattr__(self, attr):
+        n = self.func()
+        return getattr(n, attr)
+    def __str__(self):
+        n = self.func()
+        if n:
+            return str(n)
+        return ''
+    def __repr__(self):
+        n = self.func()
+        if n:
+            return repr(n)
+        return ''
+
+def rfile(node):
+    """
+    A function to return the results of a Node's rfile() method,
+    if it exists, and the Node itself otherwise (if it's a Value
+    Node, e.g.).
+    """
+    try:
+        rfile = node.rfile
+    except AttributeError:
+        return node
+    else:
+        return rfile()
+
+
+class Executor(object):
+    """A class for controlling instances of executing an action.
+
+    This largely exists to hold a single association of an action,
+    environment, list of environment override dictionaries, targets
+    and sources for later processing as needed.
+    """
+
+    if SCons.Memoize.use_memoizer:
+        __metaclass__ = SCons.Memoize.Memoized_Metaclass
+
+    memoizer_counters = []
+
+    def __init__(self, action, env=None, overridelist=[{}],
+                 targets=[], sources=[], builder_kw={}):
+        if __debug__: logInstanceCreation(self, 'Executor.Executor')
+        self.set_action_list(action)
+        self.pre_actions = []
+        self.post_actions = []
+        self.env = env
+        self.overridelist = overridelist
+        if targets or sources:
+            self.batches = [Batch(targets[:], sources[:])]
+        else:
+            self.batches = []
+        self.builder_kw = builder_kw
+        self._memo = {}
+
+    def get_lvars(self):
+        try:
+            return self.lvars
+        except AttributeError:
+            self.lvars = {
+                'CHANGED_SOURCES' : TSList(self._get_changed_sources),
+                'CHANGED_TARGETS' : TSList(self._get_changed_targets),
+                'SOURCE' : TSObject(self._get_source),
+                'SOURCES' : TSList(self._get_sources),
+                'TARGET' : TSObject(self._get_target),
+                'TARGETS' : TSList(self._get_targets),
+                'UNCHANGED_SOURCES' : TSList(self._get_unchanged_sources),
+                'UNCHANGED_TARGETS' : TSList(self._get_unchanged_targets),
+            }
+            return self.lvars
+
+    def _get_changes(self):
+        cs = []
+        ct = []
+        us = []
+        ut = []
+        for b in self.batches:
+            if b.targets[0].is_up_to_date():
+                us.extend(list(map(rfile, b.sources)))
+                ut.extend(b.targets)
+            else:
+                cs.extend(list(map(rfile, b.sources)))
+                ct.extend(b.targets)
+        self._changed_sources_list = SCons.Util.NodeList(cs)
+        self._changed_targets_list = SCons.Util.NodeList(ct)
+        self._unchanged_sources_list = SCons.Util.NodeList(us)
+        self._unchanged_targets_list = SCons.Util.NodeList(ut)
+
+    def _get_changed_sources(self, *args, **kw):
+        try:
+            return self._changed_sources_list
+        except AttributeError:
+            self._get_changes()
+            return self._changed_sources_list
+
+    def _get_changed_targets(self, *args, **kw):
+        try:
+            return self._changed_targets_list
+        except AttributeError:
+            self._get_changes()
+            return self._changed_targets_list
+
+    def _get_source(self, *args, **kw):
+        #return SCons.Util.NodeList([rfile(self.batches[0].sources[0]).get_subst_proxy()])
+        return rfile(self.batches[0].sources[0]).get_subst_proxy()
+
+    def _get_sources(self, *args, **kw):
+        return SCons.Util.NodeList([rfile(n).get_subst_proxy() for n in self.get_all_sources()])
+
+    def _get_target(self, *args, **kw):
+        #return SCons.Util.NodeList([self.batches[0].targets[0].get_subst_proxy()])
+        return self.batches[0].targets[0].get_subst_proxy()
+
+    def _get_targets(self, *args, **kw):
+        return SCons.Util.NodeList([n.get_subst_proxy() for n in self.get_all_targets()])
+
+    def _get_unchanged_sources(self, *args, **kw):
+        try:
+            return self._unchanged_sources_list
+        except AttributeError:
+            self._get_changes()
+            return self._unchanged_sources_list
+
+    def _get_unchanged_targets(self, *args, **kw):
+        try:
+            return self._unchanged_targets_list
+        except AttributeError:
+            self._get_changes()
+            return self._unchanged_targets_list
+
+    def get_action_targets(self):
+        if not self.action_list:
+            return []
+        targets_string = self.action_list[0].get_targets(self.env, self)
+        if targets_string[0] == '$':
+            targets_string = targets_string[1:]
+        return self.get_lvars()[targets_string]
+
+    def set_action_list(self, action):
+        import SCons.Util
+        if not SCons.Util.is_List(action):
+            if not action:
+                import SCons.Errors
+                raise SCons.Errors.UserError("Executor must have an action.")
+            action = [action]
+        self.action_list = action
+
+    def get_action_list(self):
+        return self.pre_actions + self.action_list + self.post_actions
+
+    def get_all_targets(self):
+        """Returns all targets for all batches of this Executor."""
+        result = []
+        for batch in self.batches:
+            result.extend(batch.targets)
+        return result
+
+    def get_all_sources(self):
+        """Returns all sources for all batches of this Executor."""
+        result = []
+        for batch in self.batches:
+            result.extend(batch.sources)
+        return result
+
+    def get_all_children(self):
+        """Returns all unique children (dependencies) for all batches
+        of this Executor.
+
+        The Taskmaster can recognize when it's already evaluated a
+        Node, so we don't have to make this list unique for its intended
+        canonical use case, but we expect there to be a lot of redundancy
+        (long lists of batched .cc files #including the same .h files
+        over and over), so removing the duplicates once up front should
+        save the Taskmaster a lot of work.
+        """
+        result = SCons.Util.UniqueList([])
+        for target in self.get_all_targets():
+            result.extend(target.children())
+        return result
+
+    def get_all_prerequisites(self):
+        """Returns all unique (order-only) prerequisites for all batches
+        of this Executor.
+        """
+        result = SCons.Util.UniqueList([])
+        for target in self.get_all_targets():
+            result.extend(target.prerequisites)
+        return result
+
+    def get_action_side_effects(self):
+
+        """Returns all side effects for all batches of this
+        Executor used by the underlying Action.
+        """
+        result = SCons.Util.UniqueList([])
+        for target in self.get_action_targets():
+            result.extend(target.side_effects)
+        return result
+
+    memoizer_counters.append(SCons.Memoize.CountValue('get_build_env'))
+
+    def get_build_env(self):
+        """Fetch or create the appropriate build Environment
+        for this Executor.
+        """
+        try:
+            return self._memo['get_build_env']
+        except KeyError:
+            pass
+
+        # Create the build environment instance with appropriate
+        # overrides.  These get evaluated against the current
+        # environment's construction variables so that users can
+        # add to existing values by referencing the variable in
+        # the expansion.
+        overrides = {}
+        for odict in self.overridelist:
+            overrides.update(odict)
+
+        import SCons.Defaults
+        env = self.env or SCons.Defaults.DefaultEnvironment()
+        build_env = env.Override(overrides)
+
+        self._memo['get_build_env'] = build_env
+
+        return build_env
+
+    def get_build_scanner_path(self, scanner):
+        """Fetch the scanner path for this executor's targets and sources.
+        """
+        env = self.get_build_env()
+        try:
+            cwd = self.batches[0].targets[0].cwd
+        except (IndexError, AttributeError):
+            cwd = None
+        return scanner.path(env, cwd,
+                            self.get_all_targets(),
+                            self.get_all_sources())
+
+    def get_kw(self, kw={}):
+        result = self.builder_kw.copy()
+        result.update(kw)
+        result['executor'] = self
+        return result
+
+    def do_nothing(self, target, kw):
+        return 0
+
+    def do_execute(self, target, kw):
+        """Actually execute the action list."""
+        env = self.get_build_env()
+        kw = self.get_kw(kw)
+        status = 0
+        for act in self.get_action_list():
+            #args = (self.get_all_targets(), self.get_all_sources(), env)
+            args = ([], [], env)
+            status = act(*args, **kw)
+            if isinstance(status, SCons.Errors.BuildError):
+                status.executor = self
+                raise status
+            elif status:
+                msg = "Error %s" % status
+                raise SCons.Errors.BuildError(
+                    errstr=msg, 
+                    node=self.batches[0].targets,
+                    executor=self, 
+                    action=act)
+        return status
+
+    # use extra indirection because with new-style objects (Python 2.2
+    # and above) we can't override special methods, and nullify() needs
+    # to be able to do this.
+
+    def __call__(self, target, **kw):
+        return self.do_execute(target, kw)
+
+    def cleanup(self):
+        self._memo = {}
+
+    def add_sources(self, sources):
+        """Add source files to this Executor's list.  This is necessary
+        for "multi" Builders that can be called repeatedly to build up
+        a source file list for a given target."""
+        # TODO(batch):  extend to multiple batches
+        assert (len(self.batches) == 1)
+        # TODO(batch):  remove duplicates?
+        sources = [x for x in sources if x not in self.batches[0].sources]
+        self.batches[0].sources.extend(sources)
+
+    def get_sources(self):
+        return self.batches[0].sources
+
+    def add_batch(self, targets, sources):
+        """Add pair of associated target and source to this Executor's list.
+        This is necessary for "batch" Builders that can be called repeatedly
+        to build up a list of matching target and source files that will be
+        used in order to update multiple target files at once from multiple
+        corresponding source files, for tools like MSVC that support it."""
+        self.batches.append(Batch(targets, sources))
+
+    def prepare(self):
+        """
+        Preparatory checks for whether this Executor can go ahead
+        and (try to) build its targets.
+        """
+        for s in self.get_all_sources():
+            if s.missing():
+                msg = "Source `%s' not found, needed by target `%s'."
+                raise SCons.Errors.StopError(msg % (s, self.batches[0].targets[0]))
+
+    def add_pre_action(self, action):
+        self.pre_actions.append(action)
+
+    def add_post_action(self, action):
+        self.post_actions.append(action)
+
+    # another extra indirection for new-style objects and nullify...
+
+    def my_str(self):
+        env = self.get_build_env()
+        return "\n".join([action.genstring(self.get_all_targets(),
+                                           self.get_all_sources(),
+                                           env)
+                          for action in self.get_action_list()])
+
+
+    def __str__(self):
+        return self.my_str()
+
+    def nullify(self):
+        self.cleanup()
+        self.do_execute = self.do_nothing
+        self.my_str     = lambda: ''
+
+    memoizer_counters.append(SCons.Memoize.CountValue('get_contents'))
+
+    def get_contents(self):
+        """Fetch the signature contents.  This is the main reason this
+        class exists, so we can compute this once and cache it regardless
+        of how many target or source Nodes there are.
+        """
+        try:
+            return self._memo['get_contents']
+        except KeyError:
+            pass
+        env = self.get_build_env()
+        result = "".join([action.get_contents(self.get_all_targets(),
+                                              self.get_all_sources(),
+                                              env)
+                          for action in self.get_action_list()])
+        self._memo['get_contents'] = result
+        return result
+
+    def get_timestamp(self):
+        """Fetch a time stamp for this Executor.  We don't have one, of
+        course (only files do), but this is the interface used by the
+        timestamp module.
+        """
+        return 0
+
+    def scan_targets(self, scanner):
+        # TODO(batch):  scan by batches
+        self.scan(scanner, self.get_all_targets())
+
+    def scan_sources(self, scanner):
+        # TODO(batch):  scan by batches
+        if self.batches[0].sources:
+            self.scan(scanner, self.get_all_sources())
+
+    def scan(self, scanner, node_list):
+        """Scan a list of this Executor's files (targets or sources) for
+        implicit dependencies and update all of the targets with them.
+        This essentially short-circuits an N*M scan of the sources for
+        each individual target, which is a hell of a lot more efficient.
+        """
+        env = self.get_build_env()
+
+        # TODO(batch):  scan by batches)
+        deps = []
+        if scanner:
+            for node in node_list:
+                node.disambiguate()
+                s = scanner.select(node)
+                if not s:
+                    continue
+                path = self.get_build_scanner_path(s)
+                deps.extend(node.get_implicit_deps(env, s, path))
+        else:
+            kw = self.get_kw()
+            for node in node_list:
+                node.disambiguate()
+                scanner = node.get_env_scanner(env, kw)
+                if not scanner:
+                    continue
+                scanner = scanner.select(node)
+                if not scanner:
+                    continue
+                path = self.get_build_scanner_path(scanner)
+                deps.extend(node.get_implicit_deps(env, scanner, path))
+
+        deps.extend(self.get_implicit_deps())
+
+        for tgt in self.get_all_targets():
+            tgt.add_to_implicit(deps)
+
+    def _get_unignored_sources_key(self, node, ignore=()):
+        return (node,) + tuple(ignore)
+
+    memoizer_counters.append(SCons.Memoize.CountDict('get_unignored_sources', _get_unignored_sources_key))
+
+    def get_unignored_sources(self, node, ignore=()):
+        key = (node,) + tuple(ignore)
+        try:
+            memo_dict = self._memo['get_unignored_sources']
+        except KeyError:
+            memo_dict = {}
+            self._memo['get_unignored_sources'] = memo_dict
+        else:
+            try:
+                return memo_dict[key]
+            except KeyError:
+                pass
+
+        if node:
+            # TODO:  better way to do this (it's a linear search,
+            # but it may not be critical path)?
+            sourcelist = []
+            for b in self.batches:
+                if node in b.targets:
+                    sourcelist = b.sources
+                    break
+        else:
+            sourcelist = self.get_all_sources()
+        if ignore:
+            idict = {}
+            for i in ignore:
+                idict[i] = 1
+            sourcelist = [s for s in sourcelist if s not in idict]
+
+        memo_dict[key] = sourcelist
+
+        return sourcelist
+
+    def get_implicit_deps(self):
+        """Return the executor's implicit dependencies, i.e. the nodes of
+        the commands to be executed."""
+        result = []
+        build_env = self.get_build_env()
+        for act in self.get_action_list():
+            deps = act.get_implicit_deps(self.get_all_targets(),
+                                         self.get_all_sources(),
+                                         build_env)
+            result.extend(deps)
+        return result
+
+
+
+_batch_executors = {}
+
+def GetBatchExecutor(key):
+    return _batch_executors[key]
+
+def AddBatchExecutor(key, executor):
+    assert key not in _batch_executors
+    _batch_executors[key] = executor
+
+nullenv = None
+
+
+def get_NullEnvironment():
+    """Use singleton pattern for Null Environments."""
+    global nullenv
+
+    import SCons.Util
+    class NullEnvironment(SCons.Util.Null):
+        import SCons.CacheDir
+        _CacheDir_path = None
+        _CacheDir = SCons.CacheDir.CacheDir(None)
+        def get_CacheDir(self):
+            return self._CacheDir
+
+    if not nullenv:
+        nullenv = NullEnvironment()
+    return nullenv
+
+class Null(object):
+    """A null Executor, with a null build Environment, that does
+    nothing when the rest of the methods call it.
+
+    This might be able to disapper when we refactor things to
+    disassociate Builders from Nodes entirely, so we're not
+    going to worry about unit tests for this--at least for now.
+    """
+    def __init__(self, *args, **kw):
+        if __debug__: logInstanceCreation(self, 'Executor.Null')
+        self.batches = [Batch(kw['targets'][:], [])]
+    def get_build_env(self):
+        return get_NullEnvironment()
+    def get_build_scanner_path(self):
+        return None
+    def cleanup(self):
+        pass
+    def prepare(self):
+        pass
+    def get_unignored_sources(self, *args, **kw):
+        return tuple(())
+    def get_action_targets(self):
+        return []
+    def get_action_list(self):
+        return []
+    def get_all_targets(self):
+        return self.batches[0].targets
+    def get_all_sources(self):
+        return self.batches[0].targets[0].sources
+    def get_all_children(self):
+        return self.batches[0].targets[0].children()
+    def get_all_prerequisites(self):
+        return []
+    def get_action_side_effects(self):
+        return []
+    def __call__(self, *args, **kw):
+        return 0
+    def get_contents(self):
+        return ''
+    def _morph(self):
+        """Morph this Null executor to a real Executor object."""
+        batches = self.batches
+        self.__class__ = Executor
+        self.__init__([])            
+        self.batches = batches
+
+    # The following methods require morphing this Null Executor to a
+    # real Executor object.
+
+    def add_pre_action(self, action):
+        self._morph()
+        self.add_pre_action(action)
+    def add_post_action(self, action):
+        self._morph()
+        self.add_post_action(action)
+    def set_action_list(self, action):
+        self._morph()
+        self.set_action_list(action)
+
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Job.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Job.py
new file mode 100644
index 0000000..76a256f
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Job.py
@@ -0,0 +1,435 @@
+"""SCons.Job
+
+This module defines the Serial and Parallel classes that execute tasks to
+complete a build. The Jobs class provides a higher level interface to start,
+stop, and wait on jobs.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Job.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.compat
+
+import os
+import signal
+
+import SCons.Errors
+
+# The default stack size (in kilobytes) of the threads used to execute
+# jobs in parallel.
+#
+# We use a stack size of 256 kilobytes. The default on some platforms
+# is too large and prevents us from creating enough threads to fully
+# parallelized the build. For example, the default stack size on linux
+# is 8 MBytes.
+
+explicit_stack_size = None
+default_stack_size = 256
+
+interrupt_msg = 'Build interrupted.'
+
+
+class InterruptState(object):
+   def __init__(self):
+       self.interrupted = False
+
+   def set(self):
+       self.interrupted = True
+
+   def __call__(self):
+       return self.interrupted
+
+
+class Jobs(object):
+    """An instance of this class initializes N jobs, and provides
+    methods for starting, stopping, and waiting on all N jobs.
+    """
+
+    def __init__(self, num, taskmaster):
+        """
+        create 'num' jobs using the given taskmaster.
+
+        If 'num' is 1 or less, then a serial job will be used,
+        otherwise a parallel job with 'num' worker threads will
+        be used.
+
+        The 'num_jobs' attribute will be set to the actual number of jobs
+        allocated.  If more than one job is requested but the Parallel
+        class can't do it, it gets reset to 1.  Wrapping interfaces that
+        care should check the value of 'num_jobs' after initialization.
+        """
+
+        self.job = None
+        if num > 1:
+            stack_size = explicit_stack_size
+            if stack_size is None:
+                stack_size = default_stack_size
+                
+            try:
+                self.job = Parallel(taskmaster, num, stack_size)
+                self.num_jobs = num
+            except NameError:
+                pass
+        if self.job is None:
+            self.job = Serial(taskmaster)
+            self.num_jobs = 1
+
+    def run(self, postfunc=lambda: None):
+        """Run the jobs.
+
+        postfunc() will be invoked after the jobs has run. It will be
+        invoked even if the jobs are interrupted by a keyboard
+        interrupt (well, in fact by a signal such as either SIGINT,
+        SIGTERM or SIGHUP). The execution of postfunc() is protected
+        against keyboard interrupts and is guaranteed to run to
+        completion."""
+        self._setup_sig_handler()
+        try:
+            self.job.start()
+        finally:
+            postfunc()
+            self._reset_sig_handler()
+
+    def were_interrupted(self):
+        """Returns whether the jobs were interrupted by a signal."""
+        return self.job.interrupted()
+
+    def _setup_sig_handler(self):
+        """Setup an interrupt handler so that SCons can shutdown cleanly in
+        various conditions:
+
+          a) SIGINT: Keyboard interrupt
+          b) SIGTERM: kill or system shutdown
+          c) SIGHUP: Controlling shell exiting
+
+        We handle all of these cases by stopping the taskmaster. It
+        turns out that it very difficult to stop the build process
+        by throwing asynchronously an exception such as
+        KeyboardInterrupt. For example, the python Condition
+        variables (threading.Condition) and queue's do not seem to
+        asynchronous-exception-safe. It would require adding a whole
+        bunch of try/finally block and except KeyboardInterrupt all
+        over the place.
+
+        Note also that we have to be careful to handle the case when
+        SCons forks before executing another process. In that case, we
+        want the child to exit immediately.
+        """
+        def handler(signum, stack, self=self, parentpid=os.getpid()):
+            if os.getpid() == parentpid:
+                self.job.taskmaster.stop()
+                self.job.interrupted.set()
+            else:
+                os._exit(2)
+
+        self.old_sigint  = signal.signal(signal.SIGINT, handler)
+        self.old_sigterm = signal.signal(signal.SIGTERM, handler)
+        try:
+            self.old_sighup = signal.signal(signal.SIGHUP, handler)
+        except AttributeError:
+            pass
+
+    def _reset_sig_handler(self):
+        """Restore the signal handlers to their previous state (before the
+         call to _setup_sig_handler()."""
+
+        signal.signal(signal.SIGINT, self.old_sigint)
+        signal.signal(signal.SIGTERM, self.old_sigterm)
+        try:
+            signal.signal(signal.SIGHUP, self.old_sighup)
+        except AttributeError:
+            pass
+
+class Serial(object):
+    """This class is used to execute tasks in series, and is more efficient
+    than Parallel, but is only appropriate for non-parallel builds. Only
+    one instance of this class should be in existence at a time.
+
+    This class is not thread safe.
+    """
+
+    def __init__(self, taskmaster):
+        """Create a new serial job given a taskmaster. 
+
+        The taskmaster's next_task() method should return the next task
+        that needs to be executed, or None if there are no more tasks. The
+        taskmaster's executed() method will be called for each task when it
+        is successfully executed or failed() will be called if it failed to
+        execute (e.g. execute() raised an exception)."""
+        
+        self.taskmaster = taskmaster
+        self.interrupted = InterruptState()
+
+    def start(self):
+        """Start the job. This will begin pulling tasks from the taskmaster
+        and executing them, and return when there are no more tasks. If a task
+        fails to execute (i.e. execute() raises an exception), then the job will
+        stop."""
+        
+        while True:
+            task = self.taskmaster.next_task()
+
+            if task is None:
+                break
+
+            try:
+                task.prepare()
+                if task.needs_execute():
+                    task.execute()
+            except:
+                if self.interrupted():
+                    try:
+                        raise SCons.Errors.BuildError(
+                            task.targets[0], errstr=interrupt_msg)
+                    except:
+                        task.exception_set()
+                else:
+                    task.exception_set()
+
+                # Let the failed() callback function arrange for the
+                # build to stop if that's appropriate.
+                task.failed()
+            else:
+                task.executed()
+
+            task.postprocess()
+        self.taskmaster.cleanup()
+
+
+# Trap import failure so that everything in the Job module but the
+# Parallel class (and its dependent classes) will work if the interpreter
+# doesn't support threads.
+try:
+    import queue
+    import threading
+except ImportError:
+    pass
+else:
+    class Worker(threading.Thread):
+        """A worker thread waits on a task to be posted to its request queue,
+        dequeues the task, executes it, and posts a tuple including the task
+        and a boolean indicating whether the task executed successfully. """
+
+        def __init__(self, requestQueue, resultsQueue, interrupted):
+            threading.Thread.__init__(self)
+            self.setDaemon(1)
+            self.requestQueue = requestQueue
+            self.resultsQueue = resultsQueue
+            self.interrupted = interrupted
+            self.start()
+
+        def run(self):
+            while True:
+                task = self.requestQueue.get()
+
+                if task is None:
+                    # The "None" value is used as a sentinel by
+                    # ThreadPool.cleanup().  This indicates that there
+                    # are no more tasks, so we should quit.
+                    break
+
+                try:
+                    if self.interrupted():
+                        raise SCons.Errors.BuildError(
+                            task.targets[0], errstr=interrupt_msg)
+                    task.execute()
+                except:
+                    task.exception_set()
+                    ok = False
+                else:
+                    ok = True
+
+                self.resultsQueue.put((task, ok))
+
+    class ThreadPool(object):
+        """This class is responsible for spawning and managing worker threads."""
+
+        def __init__(self, num, stack_size, interrupted):
+            """Create the request and reply queues, and 'num' worker threads.
+            
+            One must specify the stack size of the worker threads. The
+            stack size is specified in kilobytes.
+            """
+            self.requestQueue = queue.Queue(0)
+            self.resultsQueue = queue.Queue(0)
+
+            try:
+                prev_size = threading.stack_size(stack_size*1024) 
+            except AttributeError, e:
+                # Only print a warning if the stack size has been
+                # explicitly set.
+                if not explicit_stack_size is None:
+                    msg = "Setting stack size is unsupported by this version of Python:\n    " + \
+                        e.args[0]
+                    SCons.Warnings.warn(SCons.Warnings.StackSizeWarning, msg)
+            except ValueError, e:
+                msg = "Setting stack size failed:\n    " + str(e)
+                SCons.Warnings.warn(SCons.Warnings.StackSizeWarning, msg)
+
+            # Create worker threads
+            self.workers = []
+            for _ in range(num):
+                worker = Worker(self.requestQueue, self.resultsQueue, interrupted)
+                self.workers.append(worker)
+
+            if 'prev_size' in locals():
+                threading.stack_size(prev_size)
+
+        def put(self, task):
+            """Put task into request queue."""
+            self.requestQueue.put(task)
+
+        def get(self):
+            """Remove and return a result tuple from the results queue."""
+            return self.resultsQueue.get()
+
+        def preparation_failed(self, task):
+            self.resultsQueue.put((task, False))
+
+        def cleanup(self):
+            """
+            Shuts down the thread pool, giving each worker thread a
+            chance to shut down gracefully.
+            """
+            # For each worker thread, put a sentinel "None" value
+            # on the requestQueue (indicating that there's no work
+            # to be done) so that each worker thread will get one and
+            # terminate gracefully.
+            for _ in self.workers:
+                self.requestQueue.put(None)
+
+            # Wait for all of the workers to terminate.
+            # 
+            # If we don't do this, later Python versions (2.4, 2.5) often
+            # seem to raise exceptions during shutdown.  This happens
+            # in requestQueue.get(), as an assertion failure that
+            # requestQueue.not_full is notified while not acquired,
+            # seemingly because the main thread has shut down (or is
+            # in the process of doing so) while the workers are still
+            # trying to pull sentinels off the requestQueue.
+            #
+            # Normally these terminations should happen fairly quickly,
+            # but we'll stick a one-second timeout on here just in case
+            # someone gets hung.
+            for worker in self.workers:
+                worker.join(1.0)
+            self.workers = []
+
+    class Parallel(object):
+        """This class is used to execute tasks in parallel, and is somewhat 
+        less efficient than Serial, but is appropriate for parallel builds.
+
+        This class is thread safe.
+        """
+
+        def __init__(self, taskmaster, num, stack_size):
+            """Create a new parallel job given a taskmaster.
+
+            The taskmaster's next_task() method should return the next
+            task that needs to be executed, or None if there are no more
+            tasks. The taskmaster's executed() method will be called
+            for each task when it is successfully executed or failed()
+            will be called if the task failed to execute (i.e. execute()
+            raised an exception).
+
+            Note: calls to taskmaster are serialized, but calls to
+            execute() on distinct tasks are not serialized, because
+            that is the whole point of parallel jobs: they can execute
+            multiple tasks simultaneously. """
+
+            self.taskmaster = taskmaster
+            self.interrupted = InterruptState()
+            self.tp = ThreadPool(num, stack_size, self.interrupted)
+
+            self.maxjobs = num
+
+        def start(self):
+            """Start the job. This will begin pulling tasks from the
+            taskmaster and executing them, and return when there are no
+            more tasks. If a task fails to execute (i.e. execute() raises
+            an exception), then the job will stop."""
+
+            jobs = 0
+            
+            while True:
+                # Start up as many available tasks as we're
+                # allowed to.
+                while jobs < self.maxjobs:
+                    task = self.taskmaster.next_task()
+                    if task is None:
+                        break
+
+                    try:
+                        # prepare task for execution
+                        task.prepare()
+                    except:
+                        task.exception_set()
+                        task.failed()
+                        task.postprocess()
+                    else:
+                        if task.needs_execute():
+                            # dispatch task
+                            self.tp.put(task)
+                            jobs = jobs + 1
+                        else:
+                            task.executed()
+                            task.postprocess()
+
+                if not task and not jobs: break
+
+                # Let any/all completed tasks finish up before we go
+                # back and put the next batch of tasks on the queue.
+                while True:
+                    task, ok = self.tp.get()
+                    jobs = jobs - 1
+
+                    if ok:
+                        task.executed()
+                    else:
+                        if self.interrupted():
+                            try:
+                                raise SCons.Errors.BuildError(
+                                    task.targets[0], errstr=interrupt_msg)
+                            except:
+                                task.exception_set()
+
+                        # Let the failed() callback function arrange
+                        # for the build to stop if that's appropriate.
+                        task.failed()
+
+                    task.postprocess()
+
+                    if self.tp.resultsQueue.empty():
+                        break
+
+            self.tp.cleanup()
+            self.taskmaster.cleanup()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Memoize.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Memoize.py
new file mode 100644
index 0000000..c7afecd
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Memoize.py
@@ -0,0 +1,244 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Memoize.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__doc__ = """Memoizer
+
+A metaclass implementation to count hits and misses of the computed
+values that various methods cache in memory.
+
+Use of this modules assumes that wrapped methods be coded to cache their
+values in a consistent way.  Here is an example of wrapping a method
+that returns a computed value, with no input parameters:
+
+    memoizer_counters = []                                      # Memoization
+
+    memoizer_counters.append(SCons.Memoize.CountValue('foo'))   # Memoization
+
+    def foo(self):
+
+        try:                                                    # Memoization
+            return self._memo['foo']                            # Memoization
+        except KeyError:                                        # Memoization
+            pass                                                # Memoization
+
+        result = self.compute_foo_value()
+
+        self._memo['foo'] = result                              # Memoization
+
+        return result
+
+Here is an example of wrapping a method that will return different values
+based on one or more input arguments:
+
+    def _bar_key(self, argument):                               # Memoization
+        return argument                                         # Memoization
+
+    memoizer_counters.append(SCons.Memoize.CountDict('bar', _bar_key)) # Memoization
+
+    def bar(self, argument):
+
+        memo_key = argument                                     # Memoization
+        try:                                                    # Memoization
+            memo_dict = self._memo['bar']                       # Memoization
+        except KeyError:                                        # Memoization
+            memo_dict = {}                                      # Memoization
+            self._memo['dict'] = memo_dict                      # Memoization
+        else:                                                   # Memoization
+            try:                                                # Memoization
+                return memo_dict[memo_key]                      # Memoization
+            except KeyError:                                    # Memoization
+                pass                                            # Memoization
+
+        result = self.compute_bar_value(argument)
+
+        memo_dict[memo_key] = result                            # Memoization
+
+        return result
+
+At one point we avoided replicating this sort of logic in all the methods
+by putting it right into this module, but we've moved away from that at
+present (see the "Historical Note," below.).
+
+Deciding what to cache is tricky, because different configurations
+can have radically different performance tradeoffs, and because the
+tradeoffs involved are often so non-obvious.  Consequently, deciding
+whether or not to cache a given method will likely be more of an art than
+a science, but should still be based on available data from this module.
+Here are some VERY GENERAL guidelines about deciding whether or not to
+cache return values from a method that's being called a lot:
+
+    --  The first question to ask is, "Can we change the calling code
+        so this method isn't called so often?"  Sometimes this can be
+        done by changing the algorithm.  Sometimes the *caller* should
+        be memoized, not the method you're looking at.
+
+    --  The memoized function should be timed with multiple configurations
+        to make sure it doesn't inadvertently slow down some other
+        configuration.
+
+    --  When memoizing values based on a dictionary key composed of
+        input arguments, you don't need to use all of the arguments
+        if some of them don't affect the return values.
+
+Historical Note:  The initial Memoizer implementation actually handled
+the caching of values for the wrapped methods, based on a set of generic
+algorithms for computing hashable values based on the method's arguments.
+This collected caching logic nicely, but had two drawbacks:
+
+    Running arguments through a generic key-conversion mechanism is slower
+    (and less flexible) than just coding these things directly.  Since the
+    methods that need memoized values are generally performance-critical,
+    slowing them down in order to collect the logic isn't the right
+    tradeoff.
+
+    Use of the memoizer really obscured what was being called, because
+    all the memoized methods were wrapped with re-used generic methods.
+    This made it more difficult, for example, to use the Python profiler
+    to figure out how to optimize the underlying methods.
+"""
+
+import types
+
+# A flag controlling whether or not we actually use memoization.
+use_memoizer = None
+
+CounterList = []
+
+class Counter(object):
+    """
+    Base class for counting memoization hits and misses.
+
+    We expect that the metaclass initialization will have filled in
+    the .name attribute that represents the name of the function
+    being counted.
+    """
+    def __init__(self, method_name):
+        """
+        """
+        self.method_name = method_name
+        self.hit = 0
+        self.miss = 0
+        CounterList.append(self)
+    def display(self):
+        fmt = "    %7d hits %7d misses    %s()"
+        print fmt % (self.hit, self.miss, self.name)
+    def __cmp__(self, other):
+        try:
+            return cmp(self.name, other.name)
+        except AttributeError:
+            return 0
+
+class CountValue(Counter):
+    """
+    A counter class for simple, atomic memoized values.
+
+    A CountValue object should be instantiated in a class for each of
+    the class's methods that memoizes its return value by simply storing
+    the return value in its _memo dictionary.
+
+    We expect that the metaclass initialization will fill in the
+    .underlying_method attribute with the method that we're wrapping.
+    We then call the underlying_method method after counting whether
+    its memoized value has already been set (a hit) or not (a miss).
+    """
+    def __call__(self, *args, **kw):
+        obj = args[0]
+        if self.method_name in obj._memo:
+            self.hit = self.hit + 1
+        else:
+            self.miss = self.miss + 1
+        return self.underlying_method(*args, **kw)
+
+class CountDict(Counter):
+    """
+    A counter class for memoized values stored in a dictionary, with
+    keys based on the method's input arguments.
+
+    A CountDict object is instantiated in a class for each of the
+    class's methods that memoizes its return value in a dictionary,
+    indexed by some key that can be computed from one or more of
+    its input arguments.
+
+    We expect that the metaclass initialization will fill in the
+    .underlying_method attribute with the method that we're wrapping.
+    We then call the underlying_method method after counting whether the
+    computed key value is already present in the memoization dictionary
+    (a hit) or not (a miss).
+    """
+    def __init__(self, method_name, keymaker):
+        """
+        """
+        Counter.__init__(self, method_name)
+        self.keymaker = keymaker
+    def __call__(self, *args, **kw):
+        obj = args[0]
+        try:
+            memo_dict = obj._memo[self.method_name]
+        except KeyError:
+            self.miss = self.miss + 1
+        else:
+            key = self.keymaker(*args, **kw)
+            if key in memo_dict:
+                self.hit = self.hit + 1
+            else:
+                self.miss = self.miss + 1
+        return self.underlying_method(*args, **kw)
+
+class Memoizer(object):
+    """Object which performs caching of method calls for its 'primary'
+    instance."""
+
+    def __init__(self):
+        pass
+
+def Dump(title=None):
+    if title:
+        print title
+    CounterList.sort()
+    for counter in CounterList:
+        counter.display()
+
+class Memoized_Metaclass(type):
+    def __init__(cls, name, bases, cls_dict):
+        super(Memoized_Metaclass, cls).__init__(name, bases, cls_dict)
+
+        for counter in cls_dict.get('memoizer_counters', []):
+            method_name = counter.method_name
+
+            counter.name = cls.__name__ + '.' + method_name
+            counter.underlying_method = cls_dict[method_name]
+
+            replacement_method = types.MethodType(counter, None, cls)
+            setattr(cls, method_name, replacement_method)
+
+def EnableMemoization():
+    global use_memoizer
+    use_memoizer = 1
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Node/Alias.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Node/Alias.py
new file mode 100644
index 0000000..708ce49
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Node/Alias.py
@@ -0,0 +1,152 @@
+
+"""scons.Node.Alias
+
+Alias nodes.
+
+This creates a hash of global Aliases (dummy targets).
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Node/Alias.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import collections
+
+import SCons.Errors
+import SCons.Node
+import SCons.Util
+
+class AliasNameSpace(collections.UserDict):
+    def Alias(self, name, **kw):
+        if isinstance(name, SCons.Node.Alias.Alias):
+            return name
+        try:
+            a = self[name]
+        except KeyError:
+            a = SCons.Node.Alias.Alias(name, **kw)
+            self[name] = a
+        return a
+
+    def lookup(self, name, **kw):
+        try:
+            return self[name]
+        except KeyError:
+            return None
+
+class AliasNodeInfo(SCons.Node.NodeInfoBase):
+    current_version_id = 1
+    field_list = ['csig']
+    def str_to_node(self, s):
+        return default_ans.Alias(s)
+
+class AliasBuildInfo(SCons.Node.BuildInfoBase):
+    current_version_id = 1
+
+class Alias(SCons.Node.Node):
+
+    NodeInfo = AliasNodeInfo
+    BuildInfo = AliasBuildInfo
+
+    def __init__(self, name):
+        SCons.Node.Node.__init__(self)
+        self.name = name
+
+    def str_for_display(self):
+        return '"' + self.__str__() + '"'
+
+    def __str__(self):
+        return self.name
+
+    def make_ready(self):
+        self.get_csig()
+
+    really_build = SCons.Node.Node.build
+    is_up_to_date = SCons.Node.Node.children_are_up_to_date
+
+    def is_under(self, dir):
+        # Make Alias nodes get built regardless of
+        # what directory scons was run from. Alias nodes
+        # are outside the filesystem:
+        return 1
+
+    def get_contents(self):
+        """The contents of an alias is the concatenation
+        of the content signatures of all its sources."""
+        childsigs = [n.get_csig() for n in self.children()]
+        return ''.join(childsigs)
+
+    def sconsign(self):
+        """An Alias is not recorded in .sconsign files"""
+        pass
+
+    #
+    #
+    #
+
+    def changed_since_last_build(self, target, prev_ni):
+        cur_csig = self.get_csig()
+        try:
+            return cur_csig != prev_ni.csig
+        except AttributeError:
+            return 1
+
+    def build(self):
+        """A "builder" for aliases."""
+        pass
+
+    def convert(self):
+        try: del self.builder
+        except AttributeError: pass
+        self.reset_executor()
+        self.build = self.really_build
+
+    def get_csig(self):
+        """
+        Generate a node's content signature, the digested signature
+        of its content.
+
+        node - the node
+        cache - alternate node to use for the signature cache
+        returns - the content signature
+        """
+        try:
+            return self.ninfo.csig
+        except AttributeError:
+            pass
+
+        contents = self.get_contents()
+        csig = SCons.Util.MD5signature(contents)
+        self.get_ninfo().csig = csig
+        return csig
+
+default_ans = AliasNameSpace()
+
+SCons.Node.arg2nodes_lookups.append(default_ans.lookup)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Node/FS.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Node/FS.py
new file mode 100644
index 0000000..c48384b
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Node/FS.py
@@ -0,0 +1,3291 @@
+"""scons.Node.FS
+
+File system nodes.
+
+These Nodes represent the canonical external objects that people think
+of when they think of building software: files and directories.
+
+This holds a "default_fs" variable that should be initialized with an FS
+that can be used by scripts or modules looking for the canonical default.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Node/FS.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import fnmatch
+import os
+import re
+import shutil
+import stat
+import sys
+import time
+import codecs
+
+import SCons.Action
+from SCons.Debug import logInstanceCreation
+import SCons.Errors
+import SCons.Memoize
+import SCons.Node
+import SCons.Node.Alias
+import SCons.Subst
+import SCons.Util
+import SCons.Warnings
+
+from SCons.Debug import Trace
+
+do_store_info = True
+
+
+class EntryProxyAttributeError(AttributeError):
+    """
+    An AttributeError subclass for recording and displaying the name
+    of the underlying Entry involved in an AttributeError exception.
+    """
+    def __init__(self, entry_proxy, attribute):
+        AttributeError.__init__(self)
+        self.entry_proxy = entry_proxy
+        self.attribute = attribute
+    def __str__(self):
+        entry = self.entry_proxy.get()
+        fmt = "%s instance %s has no attribute %s"
+        return fmt % (entry.__class__.__name__,
+                      repr(entry.name),
+                      repr(self.attribute))
+
+# The max_drift value:  by default, use a cached signature value for
+# any file that's been untouched for more than two days.
+default_max_drift = 2*24*60*60
+
+#
+# We stringify these file system Nodes a lot.  Turning a file system Node
+# into a string is non-trivial, because the final string representation
+# can depend on a lot of factors:  whether it's a derived target or not,
+# whether it's linked to a repository or source directory, and whether
+# there's duplication going on.  The normal technique for optimizing
+# calculations like this is to memoize (cache) the string value, so you
+# only have to do the calculation once.
+#
+# A number of the above factors, however, can be set after we've already
+# been asked to return a string for a Node, because a Repository() or
+# VariantDir() call or the like may not occur until later in SConscript
+# files.  So this variable controls whether we bother trying to save
+# string values for Nodes.  The wrapper interface can set this whenever
+# they're done mucking with Repository and VariantDir and the other stuff,
+# to let this module know it can start returning saved string values
+# for Nodes.
+#
+Save_Strings = None
+
+def save_strings(val):
+    global Save_Strings
+    Save_Strings = val
+
+#
+# Avoid unnecessary function calls by recording a Boolean value that
+# tells us whether or not os.path.splitdrive() actually does anything
+# on this system, and therefore whether we need to bother calling it
+# when looking up path names in various methods below.
+# 
+
+do_splitdrive = None
+_my_splitdrive =None
+
+def initialize_do_splitdrive():
+    global do_splitdrive
+    global has_unc
+    drive, path = os.path.splitdrive('X:/foo')
+    has_unc = hasattr(os.path, 'splitunc')
+
+    do_splitdrive = not not drive or has_unc
+
+    global _my_splitdrive
+    if has_unc:
+        def splitdrive(p):
+            if p[1:2] == ':':
+                return p[:2], p[2:]
+            if p[0:2] == '//':
+                # Note that we leave a leading slash in the path
+                # because UNC paths are always absolute.
+                return '//', p[1:]
+            return '', p
+    else:
+        def splitdrive(p):
+            if p[1:2] == ':':
+                return p[:2], p[2:]
+            return '', p
+    _my_splitdrive = splitdrive
+
+    # Keep some commonly used values in global variables to skip to
+    # module look-up costs.
+    global OS_SEP
+    global UNC_PREFIX
+    global os_sep_is_slash
+    
+    OS_SEP = os.sep
+    UNC_PREFIX = OS_SEP + OS_SEP
+    os_sep_is_slash = OS_SEP == '/'
+
+initialize_do_splitdrive()
+
+# Used to avoid invoking os.path.normpath if not necessary.
+needs_normpath_check = re.compile(
+    r'''
+      # We need to renormalize the path if it contains any consecutive
+      # '/' characters.
+      .*// |
+
+      # We need to renormalize the path if it contains a '..' directory.
+      # Note that we check for all the following cases:
+      #
+      #    a) The path is a single '..'
+      #    b) The path starts with '..'. E.g. '../' or '../moredirs'
+      #       but we not match '..abc/'.
+      #    c) The path ends with '..'. E.g. '/..' or 'dirs/..'
+      #    d) The path contains a '..' in the middle. 
+      #       E.g. dirs/../moredirs
+
+      (.*/)?\.\.(?:/|$) |
+
+      # We need to renormalize the path if it contains a '.'
+      # directory, but NOT if it is a single '.'  '/' characters. We
+      # do not want to match a single '.' because this case is checked
+      # for explicitely since this is common enough case.
+      #
+      # Note that we check for all the following cases:
+      #
+      #    a) We don't match a single '.'
+      #    b) We match if the path starts with '.'. E.g. './' or
+      #       './moredirs' but we not match '.abc/'.
+      #    c) We match if the path ends with '.'. E.g. '/.' or
+      #    'dirs/.'
+      #    d) We match if the path contains a '.' in the middle.
+      #       E.g. dirs/./moredirs
+
+      \./|.*/\.(?:/|$)
+
+    ''', 
+    re.VERBOSE
+    )
+needs_normpath_match = needs_normpath_check.match
+
+#
+# SCons.Action objects for interacting with the outside world.
+#
+# The Node.FS methods in this module should use these actions to
+# create and/or remove files and directories; they should *not* use
+# os.{link,symlink,unlink,mkdir}(), etc., directly.
+#
+# Using these SCons.Action objects ensures that descriptions of these
+# external activities are properly displayed, that the displays are
+# suppressed when the -s (silent) option is used, and (most importantly)
+# the actions are disabled when the the -n option is used, in which case
+# there should be *no* changes to the external file system(s)...
+#
+
+if hasattr(os, 'link'):
+    def _hardlink_func(fs, src, dst):
+        # If the source is a symlink, we can't just hard-link to it
+        # because a relative symlink may point somewhere completely
+        # different.  We must disambiguate the symlink and then
+        # hard-link the final destination file.
+        while fs.islink(src):
+            link = fs.readlink(src)
+            if not os.path.isabs(link):
+                src = link
+            else:
+                src = os.path.join(os.path.dirname(src), link)
+        fs.link(src, dst)
+else:
+    _hardlink_func = None
+
+if hasattr(os, 'symlink'):
+    def _softlink_func(fs, src, dst):
+        fs.symlink(src, dst)
+else:
+    _softlink_func = None
+
+def _copy_func(fs, src, dest):
+    shutil.copy2(src, dest)
+    st = fs.stat(src)
+    fs.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
+
+
+Valid_Duplicates = ['hard-soft-copy', 'soft-hard-copy',
+                    'hard-copy', 'soft-copy', 'copy']
+
+Link_Funcs = [] # contains the callables of the specified duplication style
+
+def set_duplicate(duplicate):
+    # Fill in the Link_Funcs list according to the argument
+    # (discarding those not available on the platform).
+
+    # Set up the dictionary that maps the argument names to the
+    # underlying implementations.  We do this inside this function,
+    # not in the top-level module code, so that we can remap os.link
+    # and os.symlink for testing purposes.
+    link_dict = {
+        'hard' : _hardlink_func,
+        'soft' : _softlink_func,
+        'copy' : _copy_func
+    }
+
+    if not duplicate in Valid_Duplicates:
+        raise SCons.Errors.InternalError("The argument of set_duplicate "
+                                           "should be in Valid_Duplicates")
+    global Link_Funcs
+    Link_Funcs = []
+    for func in duplicate.split('-'):
+        if link_dict[func]:
+            Link_Funcs.append(link_dict[func])
+
+def LinkFunc(target, source, env):
+    # Relative paths cause problems with symbolic links, so
+    # we use absolute paths, which may be a problem for people
+    # who want to move their soft-linked src-trees around. Those
+    # people should use the 'hard-copy' mode, softlinks cannot be
+    # used for that; at least I have no idea how ...
+    src = source[0].abspath
+    dest = target[0].abspath
+    dir, file = os.path.split(dest)
+    if dir and not target[0].fs.isdir(dir):
+        os.makedirs(dir)
+    if not Link_Funcs:
+        # Set a default order of link functions.
+        set_duplicate('hard-soft-copy')
+    fs = source[0].fs
+    # Now link the files with the previously specified order.
+    for func in Link_Funcs:
+        try:
+            func(fs, src, dest)
+            break
+        except (IOError, OSError):
+            # An OSError indicates something happened like a permissions
+            # problem or an attempt to symlink across file-system
+            # boundaries.  An IOError indicates something like the file
+            # not existing.  In either case, keeping trying additional
+            # functions in the list and only raise an error if the last
+            # one failed.
+            if func == Link_Funcs[-1]:
+                # exception of the last link method (copy) are fatal
+                raise
+    return 0
+
+Link = SCons.Action.Action(LinkFunc, None)
+def LocalString(target, source, env):
+    return 'Local copy of %s from %s' % (target[0], source[0])
+
+LocalCopy = SCons.Action.Action(LinkFunc, LocalString)
+
+def UnlinkFunc(target, source, env):
+    t = target[0]
+    t.fs.unlink(t.abspath)
+    return 0
+
+Unlink = SCons.Action.Action(UnlinkFunc, None)
+
+def MkdirFunc(target, source, env):
+    t = target[0]
+    if not t.exists():
+        t.fs.mkdir(t.abspath)
+    return 0
+
+Mkdir = SCons.Action.Action(MkdirFunc, None, presub=None)
+
+MkdirBuilder = None
+
+def get_MkdirBuilder():
+    global MkdirBuilder
+    if MkdirBuilder is None:
+        import SCons.Builder
+        import SCons.Defaults
+        # "env" will get filled in by Executor.get_build_env()
+        # calling SCons.Defaults.DefaultEnvironment() when necessary.
+        MkdirBuilder = SCons.Builder.Builder(action = Mkdir,
+                                             env = None,
+                                             explain = None,
+                                             is_explicit = None,
+                                             target_scanner = SCons.Defaults.DirEntryScanner,
+                                             name = "MkdirBuilder")
+    return MkdirBuilder
+
+class _Null(object):
+    pass
+
+_null = _Null()
+
+DefaultSCCSBuilder = None
+DefaultRCSBuilder = None
+
+def get_DefaultSCCSBuilder():
+    global DefaultSCCSBuilder
+    if DefaultSCCSBuilder is None:
+        import SCons.Builder
+        # "env" will get filled in by Executor.get_build_env()
+        # calling SCons.Defaults.DefaultEnvironment() when necessary.
+        act = SCons.Action.Action('$SCCSCOM', '$SCCSCOMSTR')
+        DefaultSCCSBuilder = SCons.Builder.Builder(action = act,
+                                                   env = None,
+                                                   name = "DefaultSCCSBuilder")
+    return DefaultSCCSBuilder
+
+def get_DefaultRCSBuilder():
+    global DefaultRCSBuilder
+    if DefaultRCSBuilder is None:
+        import SCons.Builder
+        # "env" will get filled in by Executor.get_build_env()
+        # calling SCons.Defaults.DefaultEnvironment() when necessary.
+        act = SCons.Action.Action('$RCS_COCOM', '$RCS_COCOMSTR')
+        DefaultRCSBuilder = SCons.Builder.Builder(action = act,
+                                                  env = None,
+                                                  name = "DefaultRCSBuilder")
+    return DefaultRCSBuilder
+
+# Cygwin's os.path.normcase pretends it's on a case-sensitive filesystem.
+_is_cygwin = sys.platform == "cygwin"
+if os.path.normcase("TeSt") == os.path.normpath("TeSt") and not _is_cygwin:
+    def _my_normcase(x):
+        return x
+else:
+    def _my_normcase(x):
+        return x.upper()
+
+
+
+class DiskChecker(object):
+    def __init__(self, type, do, ignore):
+        self.type = type
+        self.do = do
+        self.ignore = ignore
+        self.func = do
+    def __call__(self, *args, **kw):
+        return self.func(*args, **kw)
+    def set(self, list):
+        if self.type in list:
+            self.func = self.do
+        else:
+            self.func = self.ignore
+
+def do_diskcheck_match(node, predicate, errorfmt):
+    result = predicate()
+    try:
+        # If calling the predicate() cached a None value from stat(),
+        # remove it so it doesn't interfere with later attempts to
+        # build this Node as we walk the DAG.  (This isn't a great way
+        # to do this, we're reaching into an interface that doesn't
+        # really belong to us, but it's all about performance, so
+        # for now we'll just document the dependency...)
+        if node._memo['stat'] is None:
+            del node._memo['stat']
+    except (AttributeError, KeyError):
+        pass
+    if result:
+        raise TypeError(errorfmt % node.abspath)
+
+def ignore_diskcheck_match(node, predicate, errorfmt):
+    pass
+
+def do_diskcheck_rcs(node, name):
+    try:
+        rcs_dir = node.rcs_dir
+    except AttributeError:
+        if node.entry_exists_on_disk('RCS'):
+            rcs_dir = node.Dir('RCS')
+        else:
+            rcs_dir = None
+        node.rcs_dir = rcs_dir
+    if rcs_dir:
+        return rcs_dir.entry_exists_on_disk(name+',v')
+    return None
+
+def ignore_diskcheck_rcs(node, name):
+    return None
+
+def do_diskcheck_sccs(node, name):
+    try:
+        sccs_dir = node.sccs_dir
+    except AttributeError:
+        if node.entry_exists_on_disk('SCCS'):
+            sccs_dir = node.Dir('SCCS')
+        else:
+            sccs_dir = None
+        node.sccs_dir = sccs_dir
+    if sccs_dir:
+        return sccs_dir.entry_exists_on_disk('s.'+name)
+    return None
+
+def ignore_diskcheck_sccs(node, name):
+    return None
+
+diskcheck_match = DiskChecker('match', do_diskcheck_match, ignore_diskcheck_match)
+diskcheck_rcs = DiskChecker('rcs', do_diskcheck_rcs, ignore_diskcheck_rcs)
+diskcheck_sccs = DiskChecker('sccs', do_diskcheck_sccs, ignore_diskcheck_sccs)
+
+diskcheckers = [
+    diskcheck_match,
+    diskcheck_rcs,
+    diskcheck_sccs,
+]
+
+def set_diskcheck(list):
+    for dc in diskcheckers:
+        dc.set(list)
+
+def diskcheck_types():
+    return [dc.type for dc in diskcheckers]
+
+
+
+class EntryProxy(SCons.Util.Proxy):
+
+    __str__ = SCons.Util.Delegate('__str__')
+
+    def __get_abspath(self):
+        entry = self.get()
+        return SCons.Subst.SpecialAttrWrapper(entry.get_abspath(),
+                                             entry.name + "_abspath")
+
+    def __get_filebase(self):
+        name = self.get().name
+        return SCons.Subst.SpecialAttrWrapper(SCons.Util.splitext(name)[0],
+                                             name + "_filebase")
+
+    def __get_suffix(self):
+        name = self.get().name
+        return SCons.Subst.SpecialAttrWrapper(SCons.Util.splitext(name)[1],
+                                             name + "_suffix")
+
+    def __get_file(self):
+        name = self.get().name
+        return SCons.Subst.SpecialAttrWrapper(name, name + "_file")
+
+    def __get_base_path(self):
+        """Return the file's directory and file name, with the
+        suffix stripped."""
+        entry = self.get()
+        return SCons.Subst.SpecialAttrWrapper(SCons.Util.splitext(entry.get_path())[0],
+                                             entry.name + "_base")
+
+    def __get_posix_path(self):
+        """Return the path with / as the path separator,
+        regardless of platform."""
+        if os_sep_is_slash:
+            return self
+        else:
+            entry = self.get()
+            r = entry.get_path().replace(OS_SEP, '/')
+            return SCons.Subst.SpecialAttrWrapper(r, entry.name + "_posix")
+
+    def __get_windows_path(self):
+        """Return the path with \ as the path separator,
+        regardless of platform."""
+        if OS_SEP == '\\':
+            return self
+        else:
+            entry = self.get()
+            r = entry.get_path().replace(OS_SEP, '\\')
+            return SCons.Subst.SpecialAttrWrapper(r, entry.name + "_windows")
+
+    def __get_srcnode(self):
+        return EntryProxy(self.get().srcnode())
+
+    def __get_srcdir(self):
+        """Returns the directory containing the source node linked to this
+        node via VariantDir(), or the directory of this node if not linked."""
+        return EntryProxy(self.get().srcnode().dir)
+
+    def __get_rsrcnode(self):
+        return EntryProxy(self.get().srcnode().rfile())
+
+    def __get_rsrcdir(self):
+        """Returns the directory containing the source node linked to this
+        node via VariantDir(), or the directory of this node if not linked."""
+        return EntryProxy(self.get().srcnode().rfile().dir)
+
+    def __get_dir(self):
+        return EntryProxy(self.get().dir)
+
+    dictSpecialAttrs = { "base"     : __get_base_path,
+                         "posix"    : __get_posix_path,
+                         "windows"  : __get_windows_path,
+                         "win32"    : __get_windows_path,
+                         "srcpath"  : __get_srcnode,
+                         "srcdir"   : __get_srcdir,
+                         "dir"      : __get_dir,
+                         "abspath"  : __get_abspath,
+                         "filebase" : __get_filebase,
+                         "suffix"   : __get_suffix,
+                         "file"     : __get_file,
+                         "rsrcpath" : __get_rsrcnode,
+                         "rsrcdir"  : __get_rsrcdir,
+                       }
+
+    def __getattr__(self, name):
+        # This is how we implement the "special" attributes
+        # such as base, posix, srcdir, etc.
+        try:
+            attr_function = self.dictSpecialAttrs[name]
+        except KeyError:
+            try:
+                attr = SCons.Util.Proxy.__getattr__(self, name)
+            except AttributeError, e:
+                # Raise our own AttributeError subclass with an
+                # overridden __str__() method that identifies the
+                # name of the entry that caused the exception.
+                raise EntryProxyAttributeError(self, name)
+            return attr
+        else:
+            return attr_function(self)
+
+class Base(SCons.Node.Node):
+    """A generic class for file system entries.  This class is for
+    when we don't know yet whether the entry being looked up is a file
+    or a directory.  Instances of this class can morph into either
+    Dir or File objects by a later, more precise lookup.
+
+    Note: this class does not define __cmp__ and __hash__ for
+    efficiency reasons.  SCons does a lot of comparing of
+    Node.FS.{Base,Entry,File,Dir} objects, so those operations must be
+    as fast as possible, which means we want to use Python's built-in
+    object identity comparisons.
+    """
+
+    memoizer_counters = []
+
+    def __init__(self, name, directory, fs):
+        """Initialize a generic Node.FS.Base object.
+
+        Call the superclass initialization, take care of setting up
+        our relative and absolute paths, identify our parent
+        directory, and indicate that this node should use
+        signatures."""
+        if __debug__: logInstanceCreation(self, 'Node.FS.Base')
+        SCons.Node.Node.__init__(self)
+
+        # Filenames and paths are probably reused and are intern'ed to
+        # save some memory.
+        self.name = SCons.Util.silent_intern(name)
+        self.suffix = SCons.Util.silent_intern(SCons.Util.splitext(name)[1])
+        self.fs = fs
+
+        assert directory, "A directory must be provided"
+
+        self.abspath = SCons.Util.silent_intern(directory.entry_abspath(name))
+        self.labspath = SCons.Util.silent_intern(directory.entry_labspath(name))
+        if directory.path == '.':
+            self.path = SCons.Util.silent_intern(name)
+        else:
+            self.path = SCons.Util.silent_intern(directory.entry_path(name))
+        if directory.tpath == '.':
+            self.tpath = SCons.Util.silent_intern(name)
+        else:
+            self.tpath = SCons.Util.silent_intern(directory.entry_tpath(name))
+        self.path_elements = directory.path_elements + [self]
+
+        self.dir = directory
+        self.cwd = None # will hold the SConscript directory for target nodes
+        self.duplicate = directory.duplicate
+
+    def str_for_display(self):
+        return '"' + self.__str__() + '"'
+
+    def must_be_same(self, klass):
+        """
+        This node, which already existed, is being looked up as the
+        specified klass.  Raise an exception if it isn't.
+        """
+        if isinstance(self, klass) or klass is Entry:
+            return
+        raise TypeError("Tried to lookup %s '%s' as a %s." %\
+              (self.__class__.__name__, self.path, klass.__name__))
+
+    def get_dir(self):
+        return self.dir
+
+    def get_suffix(self):
+        return self.suffix
+
+    def rfile(self):
+        return self
+
+    def __str__(self):
+        """A Node.FS.Base object's string representation is its path
+        name."""
+        global Save_Strings
+        if Save_Strings:
+            return self._save_str()
+        return self._get_str()
+
+    memoizer_counters.append(SCons.Memoize.CountValue('_save_str'))
+
+    def _save_str(self):
+        try:
+            return self._memo['_save_str']
+        except KeyError:
+            pass
+        result = sys.intern(self._get_str())
+        self._memo['_save_str'] = result
+        return result
+
+    def _get_str(self):
+        global Save_Strings
+        if self.duplicate or self.is_derived():
+            return self.get_path()
+        srcnode = self.srcnode()
+        if srcnode.stat() is None and self.stat() is not None:
+            result = self.get_path()
+        else:
+            result = srcnode.get_path()
+        if not Save_Strings:
+            # We're not at the point where we're saving the string string
+            # representations of FS Nodes (because we haven't finished
+            # reading the SConscript files and need to have str() return
+            # things relative to them).  That also means we can't yet
+            # cache values returned (or not returned) by stat(), since
+            # Python code in the SConscript files might still create
+            # or otherwise affect the on-disk file.  So get rid of the
+            # values that the underlying stat() method saved.
+            try: del self._memo['stat']
+            except KeyError: pass
+            if self is not srcnode:
+                try: del srcnode._memo['stat']
+                except KeyError: pass
+        return result
+
+    rstr = __str__
+
+    memoizer_counters.append(SCons.Memoize.CountValue('stat'))
+
+    def stat(self):
+        try: return self._memo['stat']
+        except KeyError: pass
+        try: result = self.fs.stat(self.abspath)
+        except os.error: result = None
+        self._memo['stat'] = result
+        return result
+
+    def exists(self):
+        return self.stat() is not None
+
+    def rexists(self):
+        return self.rfile().exists()
+
+    def getmtime(self):
+        st = self.stat()
+        if st: return st[stat.ST_MTIME]
+        else: return None
+
+    def getsize(self):
+        st = self.stat()
+        if st: return st[stat.ST_SIZE]
+        else: return None
+
+    def isdir(self):
+        st = self.stat()
+        return st is not None and stat.S_ISDIR(st[stat.ST_MODE])
+
+    def isfile(self):
+        st = self.stat()
+        return st is not None and stat.S_ISREG(st[stat.ST_MODE])
+
+    if hasattr(os, 'symlink'):
+        def islink(self):
+            try: st = self.fs.lstat(self.abspath)
+            except os.error: return 0
+            return stat.S_ISLNK(st[stat.ST_MODE])
+    else:
+        def islink(self):
+            return 0                    # no symlinks
+
+    def is_under(self, dir):
+        if self is dir:
+            return 1
+        else:
+            return self.dir.is_under(dir)
+
+    def set_local(self):
+        self._local = 1
+
+    def srcnode(self):
+        """If this node is in a build path, return the node
+        corresponding to its source file.  Otherwise, return
+        ourself.
+        """
+        srcdir_list = self.dir.srcdir_list()
+        if srcdir_list:
+            srcnode = srcdir_list[0].Entry(self.name)
+            srcnode.must_be_same(self.__class__)
+            return srcnode
+        return self
+
+    def get_path(self, dir=None):
+        """Return path relative to the current working directory of the
+        Node.FS.Base object that owns us."""
+        if not dir:
+            dir = self.fs.getcwd()
+        if self == dir:
+            return '.'
+        path_elems = self.path_elements
+        pathname = ''
+        try: i = path_elems.index(dir)
+        except ValueError: 
+            for p in path_elems[:-1]:
+                pathname += p.dirname
+        else:
+            for p in path_elems[i+1:-1]:
+                pathname += p.dirname
+        return pathname + path_elems[-1].name
+
+    def set_src_builder(self, builder):
+        """Set the source code builder for this node."""
+        self.sbuilder = builder
+        if not self.has_builder():
+            self.builder_set(builder)
+
+    def src_builder(self):
+        """Fetch the source code builder for this node.
+
+        If there isn't one, we cache the source code builder specified
+        for the directory (which in turn will cache the value from its
+        parent directory, and so on up to the file system root).
+        """
+        try:
+            scb = self.sbuilder
+        except AttributeError:
+            scb = self.dir.src_builder()
+            self.sbuilder = scb
+        return scb
+
+    def get_abspath(self):
+        """Get the absolute path of the file."""
+        return self.abspath
+
+    def for_signature(self):
+        # Return just our name.  Even an absolute path would not work,
+        # because that can change thanks to symlinks or remapped network
+        # paths.
+        return self.name
+
+    def get_subst_proxy(self):
+        try:
+            return self._proxy
+        except AttributeError:
+            ret = EntryProxy(self)
+            self._proxy = ret
+            return ret
+
+    def target_from_source(self, prefix, suffix, splitext=SCons.Util.splitext):
+        """
+
+        Generates a target entry that corresponds to this entry (usually
+        a source file) with the specified prefix and suffix.
+
+        Note that this method can be overridden dynamically for generated
+        files that need different behavior.  See Tool/swig.py for
+        an example.
+        """
+        return self.dir.Entry(prefix + splitext(self.name)[0] + suffix)
+
+    def _Rfindalldirs_key(self, pathlist):
+        return pathlist
+
+    memoizer_counters.append(SCons.Memoize.CountDict('Rfindalldirs', _Rfindalldirs_key))
+
+    def Rfindalldirs(self, pathlist):
+        """
+        Return all of the directories for a given path list, including
+        corresponding "backing" directories in any repositories.
+
+        The Node lookups are relative to this Node (typically a
+        directory), so memoizing result saves cycles from looking
+        up the same path for each target in a given directory.
+        """
+        try:
+            memo_dict = self._memo['Rfindalldirs']
+        except KeyError:
+            memo_dict = {}
+            self._memo['Rfindalldirs'] = memo_dict
+        else:
+            try:
+                return memo_dict[pathlist]
+            except KeyError:
+                pass
+
+        create_dir_relative_to_self = self.Dir
+        result = []
+        for path in pathlist:
+            if isinstance(path, SCons.Node.Node):
+                result.append(path)
+            else:
+                dir = create_dir_relative_to_self(path)
+                result.extend(dir.get_all_rdirs())
+
+        memo_dict[pathlist] = result
+
+        return result
+
+    def RDirs(self, pathlist):
+        """Search for a list of directories in the Repository list."""
+        cwd = self.cwd or self.fs._cwd
+        return cwd.Rfindalldirs(pathlist)
+
+    memoizer_counters.append(SCons.Memoize.CountValue('rentry'))
+
+    def rentry(self):
+        try:
+            return self._memo['rentry']
+        except KeyError:
+            pass
+        result = self
+        if not self.exists():
+            norm_name = _my_normcase(self.name)
+            for dir in self.dir.get_all_rdirs():
+                try:
+                    node = dir.entries[norm_name]
+                except KeyError:
+                    if dir.entry_exists_on_disk(self.name):
+                        result = dir.Entry(self.name)
+                        break
+        self._memo['rentry'] = result
+        return result
+
+    def _glob1(self, pattern, ondisk=True, source=False, strings=False):
+        return []
+
+class Entry(Base):
+    """This is the class for generic Node.FS entries--that is, things
+    that could be a File or a Dir, but we're just not sure yet.
+    Consequently, the methods in this class really exist just to
+    transform their associated object into the right class when the
+    time comes, and then call the same-named method in the transformed
+    class."""
+
+    def diskcheck_match(self):
+        pass
+
+    def disambiguate(self, must_exist=None):
+        """
+        """
+        if self.isdir():
+            self.__class__ = Dir
+            self._morph()
+        elif self.isfile():
+            self.__class__ = File
+            self._morph()
+            self.clear()
+        else:
+            # There was nothing on-disk at this location, so look in
+            # the src directory.
+            #
+            # We can't just use self.srcnode() straight away because
+            # that would create an actual Node for this file in the src
+            # directory, and there might not be one.  Instead, use the
+            # dir_on_disk() method to see if there's something on-disk
+            # with that name, in which case we can go ahead and call
+            # self.srcnode() to create the right type of entry.
+            srcdir = self.dir.srcnode()
+            if srcdir != self.dir and \
+               srcdir.entry_exists_on_disk(self.name) and \
+               self.srcnode().isdir():
+                self.__class__ = Dir
+                self._morph()
+            elif must_exist:
+                msg = "No such file or directory: '%s'" % self.abspath
+                raise SCons.Errors.UserError(msg)
+            else:
+                self.__class__ = File
+                self._morph()
+                self.clear()
+        return self
+
+    def rfile(self):
+        """We're a generic Entry, but the caller is actually looking for
+        a File at this point, so morph into one."""
+        self.__class__ = File
+        self._morph()
+        self.clear()
+        return File.rfile(self)
+
+    def scanner_key(self):
+        return self.get_suffix()
+
+    def get_contents(self):
+        """Fetch the contents of the entry.  Returns the exact binary
+        contents of the file."""
+        try:
+            self = self.disambiguate(must_exist=1)
+        except SCons.Errors.UserError:
+            # There was nothing on disk with which to disambiguate
+            # this entry.  Leave it as an Entry, but return a null
+            # string so calls to get_contents() in emitters and the
+            # like (e.g. in qt.py) don't have to disambiguate by hand
+            # or catch the exception.
+            return ''
+        else:
+            return self.get_contents()
+
+    def get_text_contents(self):
+        """Fetch the decoded text contents of a Unicode encoded Entry.
+
+        Since this should return the text contents from the file
+        system, we check to see into what sort of subclass we should
+        morph this Entry."""
+        try:
+            self = self.disambiguate(must_exist=1)
+        except SCons.Errors.UserError:
+            # There was nothing on disk with which to disambiguate
+            # this entry.  Leave it as an Entry, but return a null
+            # string so calls to get_text_contents() in emitters and
+            # the like (e.g. in qt.py) don't have to disambiguate by
+            # hand or catch the exception.
+            return ''
+        else:
+            return self.get_text_contents()
+
+    def must_be_same(self, klass):
+        """Called to make sure a Node is a Dir.  Since we're an
+        Entry, we can morph into one."""
+        if self.__class__ is not klass:
+            self.__class__ = klass
+            self._morph()
+            self.clear()
+
+    # The following methods can get called before the Taskmaster has
+    # had a chance to call disambiguate() directly to see if this Entry
+    # should really be a Dir or a File.  We therefore use these to call
+    # disambiguate() transparently (from our caller's point of view).
+    #
+    # Right now, this minimal set of methods has been derived by just
+    # looking at some of the methods that will obviously be called early
+    # in any of the various Taskmasters' calling sequences, and then
+    # empirically figuring out which additional methods are necessary
+    # to make various tests pass.
+
+    def exists(self):
+        """Return if the Entry exists.  Check the file system to see
+        what we should turn into first.  Assume a file if there's no
+        directory."""
+        return self.disambiguate().exists()
+
+    def rel_path(self, other):
+        d = self.disambiguate()
+        if d.__class__ is Entry:
+            raise Exception("rel_path() could not disambiguate File/Dir")
+        return d.rel_path(other)
+
+    def new_ninfo(self):
+        return self.disambiguate().new_ninfo()
+
+    def changed_since_last_build(self, target, prev_ni):
+        return self.disambiguate().changed_since_last_build(target, prev_ni)
+
+    def _glob1(self, pattern, ondisk=True, source=False, strings=False):
+        return self.disambiguate()._glob1(pattern, ondisk, source, strings)
+
+    def get_subst_proxy(self):
+        return self.disambiguate().get_subst_proxy()
+
+# This is for later so we can differentiate between Entry the class and Entry
+# the method of the FS class.
+_classEntry = Entry
+
+
+class LocalFS(object):
+
+    if SCons.Memoize.use_memoizer:
+        __metaclass__ = SCons.Memoize.Memoized_Metaclass
+
+    # This class implements an abstraction layer for operations involving
+    # a local file system.  Essentially, this wraps any function in
+    # the os, os.path or shutil modules that we use to actually go do
+    # anything with or to the local file system.
+    #
+    # Note that there's a very good chance we'll refactor this part of
+    # the architecture in some way as we really implement the interface(s)
+    # for remote file system Nodes.  For example, the right architecture
+    # might be to have this be a subclass instead of a base class.
+    # Nevertheless, we're using this as a first step in that direction.
+    #
+    # We're not using chdir() yet because the calling subclass method
+    # needs to use os.chdir() directly to avoid recursion.  Will we
+    # really need this one?
+    #def chdir(self, path):
+    #    return os.chdir(path)
+    def chmod(self, path, mode):
+        return os.chmod(path, mode)
+    def copy(self, src, dst):
+        return shutil.copy(src, dst)
+    def copy2(self, src, dst):
+        return shutil.copy2(src, dst)
+    def exists(self, path):
+        return os.path.exists(path)
+    def getmtime(self, path):
+        return os.path.getmtime(path)
+    def getsize(self, path):
+        return os.path.getsize(path)
+    def isdir(self, path):
+        return os.path.isdir(path)
+    def isfile(self, path):
+        return os.path.isfile(path)
+    def link(self, src, dst):
+        return os.link(src, dst)
+    def lstat(self, path):
+        return os.lstat(path)
+    def listdir(self, path):
+        return os.listdir(path)
+    def makedirs(self, path):
+        return os.makedirs(path)
+    def mkdir(self, path):
+        return os.mkdir(path)
+    def rename(self, old, new):
+        return os.rename(old, new)
+    def stat(self, path):
+        return os.stat(path)
+    def symlink(self, src, dst):
+        return os.symlink(src, dst)
+    def open(self, path):
+        return open(path)
+    def unlink(self, path):
+        return os.unlink(path)
+
+    if hasattr(os, 'symlink'):
+        def islink(self, path):
+            return os.path.islink(path)
+    else:
+        def islink(self, path):
+            return 0                    # no symlinks
+
+    if hasattr(os, 'readlink'):
+        def readlink(self, file):
+            return os.readlink(file)
+    else:
+        def readlink(self, file):
+            return ''
+
+
+#class RemoteFS:
+#    # Skeleton for the obvious methods we might need from the
+#    # abstraction layer for a remote filesystem.
+#    def upload(self, local_src, remote_dst):
+#        pass
+#    def download(self, remote_src, local_dst):
+#        pass
+
+
+class FS(LocalFS):
+
+    memoizer_counters = []
+
+    def __init__(self, path = None):
+        """Initialize the Node.FS subsystem.
+
+        The supplied path is the top of the source tree, where we
+        expect to find the top-level build file.  If no path is
+        supplied, the current directory is the default.
+
+        The path argument must be a valid absolute path.
+        """
+        if __debug__: logInstanceCreation(self, 'Node.FS')
+
+        self._memo = {}
+
+        self.Root = {}
+        self.SConstruct_dir = None
+        self.max_drift = default_max_drift
+
+        self.Top = None
+        if path is None:
+            self.pathTop = os.getcwd()
+        else:
+            self.pathTop = path
+        self.defaultDrive = _my_normcase(_my_splitdrive(self.pathTop)[0])
+
+        self.Top = self.Dir(self.pathTop)
+        self.Top.path = '.'
+        self.Top.tpath = '.'
+        self._cwd = self.Top
+
+        DirNodeInfo.fs = self
+        FileNodeInfo.fs = self
+    
+    def set_SConstruct_dir(self, dir):
+        self.SConstruct_dir = dir
+
+    def get_max_drift(self):
+        return self.max_drift
+
+    def set_max_drift(self, max_drift):
+        self.max_drift = max_drift
+
+    def getcwd(self):
+        if hasattr(self, "_cwd"):
+           return self._cwd
+        else:
+           return "<no cwd>"
+
+    def chdir(self, dir, change_os_dir=0):
+        """Change the current working directory for lookups.
+        If change_os_dir is true, we will also change the "real" cwd
+        to match.
+        """
+        curr=self._cwd
+        try:
+            if dir is not None:
+                self._cwd = dir
+                if change_os_dir:
+                    os.chdir(dir.abspath)
+        except OSError:
+            self._cwd = curr
+            raise
+
+    def get_root(self, drive):
+        """
+        Returns the root directory for the specified drive, creating
+        it if necessary.
+        """
+        drive = _my_normcase(drive)
+        try:
+            return self.Root[drive]
+        except KeyError:
+            root = RootDir(drive, self)
+            self.Root[drive] = root
+            if not drive:
+                self.Root[self.defaultDrive] = root
+            elif drive == self.defaultDrive:
+                self.Root[''] = root
+            return root
+
+    def _lookup(self, p, directory, fsclass, create=1):
+        """
+        The generic entry point for Node lookup with user-supplied data.
+
+        This translates arbitrary input into a canonical Node.FS object
+        of the specified fsclass.  The general approach for strings is
+        to turn it into a fully normalized absolute path and then call
+        the root directory's lookup_abs() method for the heavy lifting.
+
+        If the path name begins with '#', it is unconditionally
+        interpreted relative to the top-level directory of this FS.  '#'
+        is treated as a synonym for the top-level SConstruct directory,
+        much like '~' is treated as a synonym for the user's home
+        directory in a UNIX shell.  So both '#foo' and '#/foo' refer
+        to the 'foo' subdirectory underneath the top-level SConstruct
+        directory.
+
+        If the path name is relative, then the path is looked up relative
+        to the specified directory, or the current directory (self._cwd,
+        typically the SConscript directory) if the specified directory
+        is None.
+        """
+        if isinstance(p, Base):
+            # It's already a Node.FS object.  Make sure it's the right
+            # class and return.
+            p.must_be_same(fsclass)
+            return p
+        # str(p) in case it's something like a proxy object
+        p = str(p)
+
+        if not os_sep_is_slash:
+            p = p.replace(OS_SEP, '/')
+
+        if p[0:1] == '#':
+            # There was an initial '#', so we strip it and override
+            # whatever directory they may have specified with the
+            # top-level SConstruct directory.
+            p = p[1:]
+            directory = self.Top
+
+            # There might be a drive letter following the
+            # '#'. Although it is not described in the SCons man page,
+            # the regression test suite explicitly tests for that
+            # syntax. It seems to mean the following thing:
+            #
+            #   Assuming the the SCons top dir is in C:/xxx/yyy,
+            #   '#X:/toto' means X:/xxx/yyy/toto.
+            #
+            # i.e. it assumes that the X: drive has a directory
+            # structure similar to the one found on drive C:.
+            if do_splitdrive:
+                drive, p = _my_splitdrive(p)
+                if drive:
+                    root = self.get_root(drive)
+                else:
+                    root = directory.root
+            else:
+                root = directory.root
+
+            # We can only strip trailing after splitting the drive
+            # since the drive might the UNC '//' prefix.
+            p = p.strip('/')
+
+            needs_normpath = needs_normpath_match(p)
+            
+            # The path is relative to the top-level SCons directory.
+            if p in ('', '.'):
+                p = directory.labspath
+            else:
+                p = directory.labspath + '/' + p
+        else:
+            if do_splitdrive:
+                drive, p = _my_splitdrive(p)
+                if drive and not p:
+                    # This causes a naked drive letter to be treated
+                    # as a synonym for the root directory on that
+                    # drive.
+                    p = '/'
+            else:
+                drive = ''
+
+            # We can only strip trailing '/' since the drive might the
+            # UNC '//' prefix.
+            if p != '/':
+                p = p.rstrip('/')
+
+            needs_normpath = needs_normpath_match(p)
+
+            if p[0:1] == '/':
+                # Absolute path
+                root = self.get_root(drive)
+            else:
+                # This is a relative lookup or to the current directory
+                # (the path name is not absolute).  Add the string to the
+                # appropriate directory lookup path, after which the whole
+                # thing gets normalized.
+                if directory:
+                    if not isinstance(directory, Dir):
+                        directory = self.Dir(directory)
+                else:
+                    directory = self._cwd
+
+                if p in ('', '.'):
+                    p = directory.labspath
+                else:
+                    p = directory.labspath + '/' + p
+
+                if drive:
+                    root = self.get_root(drive)
+                else:
+                    root = directory.root
+
+        if needs_normpath is not None:
+            # Normalize a pathname. Will return the same result for
+            # equivalent paths.
+            #
+            # We take advantage of the fact that we have an absolute
+            # path here for sure. In addition, we know that the
+            # components of lookup path are separated by slashes at
+            # this point. Because of this, this code is about 2X
+            # faster than calling os.path.normpath() followed by
+            # replacing os.sep with '/' again.
+            ins = p.split('/')[1:]
+            outs = []
+            for d in ins:
+                if d == '..':
+                    try:
+                        outs.pop()
+                    except IndexError:
+                        pass
+                elif d not in ('', '.'):
+                    outs.append(d)
+            p = '/' + '/'.join(outs)
+
+        return root._lookup_abs(p, fsclass, create)
+
+    def Entry(self, name, directory = None, create = 1):
+        """Look up or create a generic Entry node with the specified name.
+        If the name is a relative path (begins with ./, ../, or a file
+        name), then it is looked up relative to the supplied directory
+        node, or to the top level directory of the FS (supplied at
+        construction time) if no directory is supplied.
+        """
+        return self._lookup(name, directory, Entry, create)
+
+    def File(self, name, directory = None, create = 1):
+        """Look up or create a File node with the specified name.  If
+        the name is a relative path (begins with ./, ../, or a file name),
+        then it is looked up relative to the supplied directory node,
+        or to the top level directory of the FS (supplied at construction
+        time) if no directory is supplied.
+
+        This method will raise TypeError if a directory is found at the
+        specified path.
+        """
+        return self._lookup(name, directory, File, create)
+
+    def Dir(self, name, directory = None, create = True):
+        """Look up or create a Dir node with the specified name.  If
+        the name is a relative path (begins with ./, ../, or a file name),
+        then it is looked up relative to the supplied directory node,
+        or to the top level directory of the FS (supplied at construction
+        time) if no directory is supplied.
+
+        This method will raise TypeError if a normal file is found at the
+        specified path.
+        """
+        return self._lookup(name, directory, Dir, create)
+
+    def VariantDir(self, variant_dir, src_dir, duplicate=1):
+        """Link the supplied variant directory to the source directory
+        for purposes of building files."""
+
+        if not isinstance(src_dir, SCons.Node.Node):
+            src_dir = self.Dir(src_dir)
+        if not isinstance(variant_dir, SCons.Node.Node):
+            variant_dir = self.Dir(variant_dir)
+        if src_dir.is_under(variant_dir):
+            raise SCons.Errors.UserError("Source directory cannot be under variant directory.")
+        if variant_dir.srcdir:
+            if variant_dir.srcdir == src_dir:
+                return # We already did this.
+            raise SCons.Errors.UserError("'%s' already has a source directory: '%s'."%(variant_dir, variant_dir.srcdir))
+        variant_dir.link(src_dir, duplicate)
+
+    def Repository(self, *dirs):
+        """Specify Repository directories to search."""
+        for d in dirs:
+            if not isinstance(d, SCons.Node.Node):
+                d = self.Dir(d)
+            self.Top.addRepository(d)
+
+    def variant_dir_target_climb(self, orig, dir, tail):
+        """Create targets in corresponding variant directories
+
+        Climb the directory tree, and look up path names
+        relative to any linked variant directories we find.
+
+        Even though this loops and walks up the tree, we don't memoize
+        the return value because this is really only used to process
+        the command-line targets.
+        """
+        targets = []
+        message = None
+        fmt = "building associated VariantDir targets: %s"
+        start_dir = dir
+        while dir:
+            for bd in dir.variant_dirs:
+                if start_dir.is_under(bd):
+                    # If already in the build-dir location, don't reflect
+                    return [orig], fmt % str(orig)
+                p = os.path.join(bd.path, *tail)
+                targets.append(self.Entry(p))
+            tail = [dir.name] + tail
+            dir = dir.up()
+        if targets:
+            message = fmt % ' '.join(map(str, targets))
+        return targets, message
+
+    def Glob(self, pathname, ondisk=True, source=True, strings=False, cwd=None):
+        """
+        Globs
+
+        This is mainly a shim layer 
+        """
+        if cwd is None:
+            cwd = self.getcwd()
+        return cwd.glob(pathname, ondisk, source, strings)
+
+class DirNodeInfo(SCons.Node.NodeInfoBase):
+    # This should get reset by the FS initialization.
+    current_version_id = 1
+
+    fs = None
+
+    def str_to_node(self, s):
+        top = self.fs.Top
+        root = top.root
+        if do_splitdrive:
+            drive, s = _my_splitdrive(s)
+            if drive:
+                root = self.fs.get_root(drive)
+        if not os.path.isabs(s):
+            s = top.labspath + '/' + s
+        return root._lookup_abs(s, Entry)
+
+class DirBuildInfo(SCons.Node.BuildInfoBase):
+    current_version_id = 1
+
+glob_magic_check = re.compile('[*?[]')
+
+def has_glob_magic(s):
+    return glob_magic_check.search(s) is not None
+
+class Dir(Base):
+    """A class for directories in a file system.
+    """
+
+    memoizer_counters = []
+
+    NodeInfo = DirNodeInfo
+    BuildInfo = DirBuildInfo
+
+    def __init__(self, name, directory, fs):
+        if __debug__: logInstanceCreation(self, 'Node.FS.Dir')
+        Base.__init__(self, name, directory, fs)
+        self._morph()
+
+    def _morph(self):
+        """Turn a file system Node (either a freshly initialized directory
+        object or a separate Entry object) into a proper directory object.
+
+        Set up this directory's entries and hook it into the file
+        system tree.  Specify that directories (this Node) don't use
+        signatures for calculating whether they're current.
+        """
+
+        self.repositories = []
+        self.srcdir = None
+
+        self.entries = {}
+        self.entries['.'] = self
+        self.entries['..'] = self.dir
+        self.cwd = self
+        self.searched = 0
+        self._sconsign = None
+        self.variant_dirs = []
+        self.root = self.dir.root
+
+        # For directories, we make a difference between the directory
+        # 'name' and the directory 'dirname'. The 'name' attribute is
+        # used when we need to print the 'name' of the directory or
+        # when we it is used as the last part of a path. The 'dirname'
+        # is used when the directory is not the last element of the
+        # path. The main reason for making that distinction is that
+        # for RoorDir's the dirname can not be easily inferred from
+        # the name. For example, we have to add a '/' after a drive
+        # letter but not after a UNC path prefix ('//').
+        self.dirname = self.name + OS_SEP
+
+        # Don't just reset the executor, replace its action list,
+        # because it might have some pre-or post-actions that need to
+        # be preserved.
+        #
+        # But don't reset the executor if there is a non-null executor
+        # attached already. The existing executor might have other
+        # targets, in which case replacing the action list with a
+        # Mkdir action is a big mistake.
+        if not hasattr(self, 'executor'):
+            self.builder = get_MkdirBuilder()
+            self.get_executor().set_action_list(self.builder.action)
+        else:
+            # Prepend MkdirBuilder action to existing action list
+            l = self.get_executor().action_list
+            a = get_MkdirBuilder().action
+            l.insert(0, a) 
+            self.get_executor().set_action_list(l)
+
+    def diskcheck_match(self):
+        diskcheck_match(self, self.isfile,
+                        "File %s found where directory expected.")
+
+    def __clearRepositoryCache(self, duplicate=None):
+        """Called when we change the repository(ies) for a directory.
+        This clears any cached information that is invalidated by changing
+        the repository."""
+
+        for node in self.entries.values():
+            if node != self.dir:
+                if node != self and isinstance(node, Dir):
+                    node.__clearRepositoryCache(duplicate)
+                else:
+                    node.clear()
+                    try:
+                        del node._srcreps
+                    except AttributeError:
+                        pass
+                    if duplicate is not None:
+                        node.duplicate=duplicate
+
+    def __resetDuplicate(self, node):
+        if node != self:
+            node.duplicate = node.get_dir().duplicate
+
+    def Entry(self, name):
+        """
+        Looks up or creates an entry node named 'name' relative to
+        this directory.
+        """
+        return self.fs.Entry(name, self)
+
+    def Dir(self, name, create=True):
+        """
+        Looks up or creates a directory node named 'name' relative to
+        this directory.
+        """
+        return self.fs.Dir(name, self, create)
+
+    def File(self, name):
+        """
+        Looks up or creates a file node named 'name' relative to
+        this directory.
+        """
+        return self.fs.File(name, self)
+
+    def link(self, srcdir, duplicate):
+        """Set this directory as the variant directory for the
+        supplied source directory."""
+        self.srcdir = srcdir
+        self.duplicate = duplicate
+        self.__clearRepositoryCache(duplicate)
+        srcdir.variant_dirs.append(self)
+
+    def getRepositories(self):
+        """Returns a list of repositories for this directory.
+        """
+        if self.srcdir and not self.duplicate:
+            return self.srcdir.get_all_rdirs() + self.repositories
+        return self.repositories
+
+    memoizer_counters.append(SCons.Memoize.CountValue('get_all_rdirs'))
+
+    def get_all_rdirs(self):
+        try:
+            return list(self._memo['get_all_rdirs'])
+        except KeyError:
+            pass
+
+        result = [self]
+        fname = '.'
+        dir = self
+        while dir:
+            for rep in dir.getRepositories():
+                result.append(rep.Dir(fname))
+            if fname == '.':
+                fname = dir.name
+            else:
+                fname = dir.name + OS_SEP + fname
+            dir = dir.up()
+
+        self._memo['get_all_rdirs'] = list(result)
+
+        return result
+
+    def addRepository(self, dir):
+        if dir != self and not dir in self.repositories:
+            self.repositories.append(dir)
+            dir.tpath = '.'
+            self.__clearRepositoryCache()
+
+    def up(self):
+        return self.dir
+
+    def _rel_path_key(self, other):
+        return str(other)
+
+    memoizer_counters.append(SCons.Memoize.CountDict('rel_path', _rel_path_key))
+
+    def rel_path(self, other):
+        """Return a path to "other" relative to this directory.
+        """
+
+        # This complicated and expensive method, which constructs relative
+        # paths between arbitrary Node.FS objects, is no longer used
+        # by SCons itself.  It was introduced to store dependency paths
+        # in .sconsign files relative to the target, but that ended up
+        # being significantly inefficient.
+        #
+        # We're continuing to support the method because some SConstruct
+        # files out there started using it when it was available, and
+        # we're all about backwards compatibility..
+
+        try:
+            memo_dict = self._memo['rel_path']
+        except KeyError:
+            memo_dict = {}
+            self._memo['rel_path'] = memo_dict
+        else:
+            try:
+                return memo_dict[other]
+            except KeyError:
+                pass
+
+        if self is other:
+            result = '.'
+
+        elif not other in self.path_elements:
+            try:
+                other_dir = other.get_dir()
+            except AttributeError:
+                result = str(other)
+            else:
+                if other_dir is None:
+                    result = other.name
+                else:
+                    dir_rel_path = self.rel_path(other_dir)
+                    if dir_rel_path == '.':
+                        result = other.name
+                    else:
+                        result = dir_rel_path + OS_SEP + other.name
+        else:
+            i = self.path_elements.index(other) + 1
+
+            path_elems = ['..'] * (len(self.path_elements) - i) \
+                         + [n.name for n in other.path_elements[i:]]
+             
+            result = OS_SEP.join(path_elems)
+
+        memo_dict[other] = result
+
+        return result
+
+    def get_env_scanner(self, env, kw={}):
+        import SCons.Defaults
+        return SCons.Defaults.DirEntryScanner
+
+    def get_target_scanner(self):
+        import SCons.Defaults
+        return SCons.Defaults.DirEntryScanner
+
+    def get_found_includes(self, env, scanner, path):
+        """Return this directory's implicit dependencies.
+
+        We don't bother caching the results because the scan typically
+        shouldn't be requested more than once (as opposed to scanning
+        .h file contents, which can be requested as many times as the
+        files is #included by other files).
+        """
+        if not scanner:
+            return []
+        # Clear cached info for this Dir.  If we already visited this
+        # directory on our walk down the tree (because we didn't know at
+        # that point it was being used as the source for another Node)
+        # then we may have calculated build signature before realizing
+        # we had to scan the disk.  Now that we have to, though, we need
+        # to invalidate the old calculated signature so that any node
+        # dependent on our directory structure gets one that includes
+        # info about everything on disk.
+        self.clear()
+        return scanner(self, env, path)
+
+    #
+    # Taskmaster interface subsystem
+    #
+
+    def prepare(self):
+        pass
+
+    def build(self, **kw):
+        """A null "builder" for directories."""
+        global MkdirBuilder
+        if self.builder is not MkdirBuilder:
+            SCons.Node.Node.build(self, **kw)
+
+    #
+    #
+    #
+
+    def _create(self):
+        """Create this directory, silently and without worrying about
+        whether the builder is the default or not."""
+        listDirs = []
+        parent = self
+        while parent:
+            if parent.exists():
+                break
+            listDirs.append(parent)
+            p = parent.up()
+            if p is None:
+                # Don't use while: - else: for this condition because
+                # if so, then parent is None and has no .path attribute.
+                raise SCons.Errors.StopError(parent.path)
+            parent = p
+        listDirs.reverse()
+        for dirnode in listDirs:
+            try:
+                # Don't call dirnode.build(), call the base Node method
+                # directly because we definitely *must* create this
+                # directory.  The dirnode.build() method will suppress
+                # the build if it's the default builder.
+                SCons.Node.Node.build(dirnode)
+                dirnode.get_executor().nullify()
+                # The build() action may or may not have actually
+                # created the directory, depending on whether the -n
+                # option was used or not.  Delete the _exists and
+                # _rexists attributes so they can be reevaluated.
+                dirnode.clear()
+            except OSError:
+                pass
+
+    def multiple_side_effect_has_builder(self):
+        global MkdirBuilder
+        return self.builder is not MkdirBuilder and self.has_builder()
+
+    def alter_targets(self):
+        """Return any corresponding targets in a variant directory.
+        """
+        return self.fs.variant_dir_target_climb(self, self, [])
+
+    def scanner_key(self):
+        """A directory does not get scanned."""
+        return None
+
+    def get_text_contents(self):
+        """We already emit things in text, so just return the binary
+        version."""
+        return self.get_contents()
+
+    def get_contents(self):
+        """Return content signatures and names of all our children
+        separated by new-lines. Ensure that the nodes are sorted."""
+        contents = []
+        for node in sorted(self.children(), key=lambda t: t.name):
+            contents.append('%s %s\n' % (node.get_csig(), node.name))
+        return ''.join(contents)
+
+    def get_csig(self):
+        """Compute the content signature for Directory nodes. In
+        general, this is not needed and the content signature is not
+        stored in the DirNodeInfo. However, if get_contents on a Dir
+        node is called which has a child directory, the child
+        directory should return the hash of its contents."""
+        contents = self.get_contents()
+        return SCons.Util.MD5signature(contents)
+
+    def do_duplicate(self, src):
+        pass
+
+    changed_since_last_build = SCons.Node.Node.state_has_changed
+
+    def is_up_to_date(self):
+        """If any child is not up-to-date, then this directory isn't,
+        either."""
+        if self.builder is not MkdirBuilder and not self.exists():
+            return 0
+        up_to_date = SCons.Node.up_to_date
+        for kid in self.children():
+            if kid.get_state() > up_to_date:
+                return 0
+        return 1
+
+    def rdir(self):
+        if not self.exists():
+            norm_name = _my_normcase(self.name)
+            for dir in self.dir.get_all_rdirs():
+                try: node = dir.entries[norm_name]
+                except KeyError: node = dir.dir_on_disk(self.name)
+                if node and node.exists() and \
+                    (isinstance(dir, Dir) or isinstance(dir, Entry)):
+                        return node
+        return self
+
+    def sconsign(self):
+        """Return the .sconsign file info for this directory,
+        creating it first if necessary."""
+        if not self._sconsign:
+            import SCons.SConsign
+            self._sconsign = SCons.SConsign.ForDirectory(self)
+        return self._sconsign
+
+    def srcnode(self):
+        """Dir has a special need for srcnode()...if we
+        have a srcdir attribute set, then that *is* our srcnode."""
+        if self.srcdir:
+            return self.srcdir
+        return Base.srcnode(self)
+
+    def get_timestamp(self):
+        """Return the latest timestamp from among our children"""
+        stamp = 0
+        for kid in self.children():
+            if kid.get_timestamp() > stamp:
+                stamp = kid.get_timestamp()
+        return stamp
+
+    def entry_abspath(self, name):
+        return self.abspath + OS_SEP + name
+
+    def entry_labspath(self, name):
+        return self.labspath + '/' + name
+
+    def entry_path(self, name):
+        return self.path + OS_SEP + name
+
+    def entry_tpath(self, name):
+        return self.tpath + OS_SEP + name
+
+    def entry_exists_on_disk(self, name):
+        try:
+            d = self.on_disk_entries
+        except AttributeError:
+            d = {}
+            try:
+                entries = os.listdir(self.abspath)
+            except OSError:
+                pass
+            else:
+                for entry in map(_my_normcase, entries):
+                    d[entry] = True
+            self.on_disk_entries = d
+        if sys.platform == 'win32':
+            name = _my_normcase(name)
+            result = d.get(name)
+            if result is None:
+                # Belt-and-suspenders for Windows:  check directly for
+                # 8.3 file names that don't show up in os.listdir().
+                result = os.path.exists(self.abspath + OS_SEP + name)
+                d[name] = result
+            return result
+        else:
+            return name in d
+
+    memoizer_counters.append(SCons.Memoize.CountValue('srcdir_list'))
+
+    def srcdir_list(self):
+        try:
+            return self._memo['srcdir_list']
+        except KeyError:
+            pass
+
+        result = []
+
+        dirname = '.'
+        dir = self
+        while dir:
+            if dir.srcdir:
+                result.append(dir.srcdir.Dir(dirname))
+            dirname = dir.name + OS_SEP + dirname
+            dir = dir.up()
+
+        self._memo['srcdir_list'] = result
+
+        return result
+
+    def srcdir_duplicate(self, name):
+        for dir in self.srcdir_list():
+            if self.is_under(dir):
+                # We shouldn't source from something in the build path;
+                # variant_dir is probably under src_dir, in which case
+                # we are reflecting.
+                break
+            if dir.entry_exists_on_disk(name):
+                srcnode = dir.Entry(name).disambiguate()
+                if self.duplicate:
+                    node = self.Entry(name).disambiguate()
+                    node.do_duplicate(srcnode)
+                    return node
+                else:
+                    return srcnode
+        return None
+
+    def _srcdir_find_file_key(self, filename):
+        return filename
+
+    memoizer_counters.append(SCons.Memoize.CountDict('srcdir_find_file', _srcdir_find_file_key))
+
+    def srcdir_find_file(self, filename):
+        try:
+            memo_dict = self._memo['srcdir_find_file']
+        except KeyError:
+            memo_dict = {}
+            self._memo['srcdir_find_file'] = memo_dict
+        else:
+            try:
+                return memo_dict[filename]
+            except KeyError:
+                pass
+
+        def func(node):
+            if (isinstance(node, File) or isinstance(node, Entry)) and \
+               (node.is_derived() or node.exists()):
+                    return node
+            return None
+
+        norm_name = _my_normcase(filename)
+
+        for rdir in self.get_all_rdirs():
+            try: node = rdir.entries[norm_name]
+            except KeyError: node = rdir.file_on_disk(filename)
+            else: node = func(node)
+            if node:
+                result = (node, self)
+                memo_dict[filename] = result
+                return result
+
+        for srcdir in self.srcdir_list():
+            for rdir in srcdir.get_all_rdirs():
+                try: node = rdir.entries[norm_name]
+                except KeyError: node = rdir.file_on_disk(filename)
+                else: node = func(node)
+                if node:
+                    result = (File(filename, self, self.fs), srcdir)
+                    memo_dict[filename] = result
+                    return result
+
+        result = (None, None)
+        memo_dict[filename] = result
+        return result
+
+    def dir_on_disk(self, name):
+        if self.entry_exists_on_disk(name):
+            try: return self.Dir(name)
+            except TypeError: pass
+        node = self.srcdir_duplicate(name)
+        if isinstance(node, File):
+            return None
+        return node
+
+    def file_on_disk(self, name):
+        if self.entry_exists_on_disk(name) or \
+           diskcheck_rcs(self, name) or \
+           diskcheck_sccs(self, name):
+            try: return self.File(name)
+            except TypeError: pass
+        node = self.srcdir_duplicate(name)
+        if isinstance(node, Dir):
+            return None
+        return node
+
+    def walk(self, func, arg):
+        """
+        Walk this directory tree by calling the specified function
+        for each directory in the tree.
+
+        This behaves like the os.path.walk() function, but for in-memory
+        Node.FS.Dir objects.  The function takes the same arguments as
+        the functions passed to os.path.walk():
+
+                func(arg, dirname, fnames)
+
+        Except that "dirname" will actually be the directory *Node*,
+        not the string.  The '.' and '..' entries are excluded from
+        fnames.  The fnames list may be modified in-place to filter the
+        subdirectories visited or otherwise impose a specific order.
+        The "arg" argument is always passed to func() and may be used
+        in any way (or ignored, passing None is common).
+        """
+        entries = self.entries
+        names = list(entries.keys())
+        names.remove('.')
+        names.remove('..')
+        func(arg, self, names)
+        for dirname in [n for n in names if isinstance(entries[n], Dir)]:
+            entries[dirname].walk(func, arg)
+
+    def glob(self, pathname, ondisk=True, source=False, strings=False):
+        """
+        Returns a list of Nodes (or strings) matching a specified
+        pathname pattern.
+
+        Pathname patterns follow UNIX shell semantics:  * matches
+        any-length strings of any characters, ? matches any character,
+        and [] can enclose lists or ranges of characters.  Matches do
+        not span directory separators.
+
+        The matches take into account Repositories, returning local
+        Nodes if a corresponding entry exists in a Repository (either
+        an in-memory Node or something on disk).
+
+        By defafult, the glob() function matches entries that exist
+        on-disk, in addition to in-memory Nodes.  Setting the "ondisk"
+        argument to False (or some other non-true value) causes the glob()
+        function to only match in-memory Nodes.  The default behavior is
+        to return both the on-disk and in-memory Nodes.
+
+        The "source" argument, when true, specifies that corresponding
+        source Nodes must be returned if you're globbing in a build
+        directory (initialized with VariantDir()).  The default behavior
+        is to return Nodes local to the VariantDir().
+
+        The "strings" argument, when true, returns the matches as strings,
+        not Nodes.  The strings are path names relative to this directory.
+
+        The underlying algorithm is adapted from the glob.glob() function
+        in the Python library (but heavily modified), and uses fnmatch()
+        under the covers.
+        """
+        dirname, basename = os.path.split(pathname)
+        if not dirname:
+            return sorted(self._glob1(basename, ondisk, source, strings),
+                          key=lambda t: str(t))
+        if has_glob_magic(dirname):
+            list = self.glob(dirname, ondisk, source, strings=False)
+        else:
+            list = [self.Dir(dirname, create=True)]
+        result = []
+        for dir in list:
+            r = dir._glob1(basename, ondisk, source, strings)
+            if strings:
+                r = [os.path.join(str(dir), x) for x in r]
+            result.extend(r)
+        return sorted(result, key=lambda a: str(a))
+
+    def _glob1(self, pattern, ondisk=True, source=False, strings=False):
+        """
+        Globs for and returns a list of entry names matching a single
+        pattern in this directory.
+
+        This searches any repositories and source directories for
+        corresponding entries and returns a Node (or string) relative
+        to the current directory if an entry is found anywhere.
+
+        TODO: handle pattern with no wildcard
+        """
+        search_dir_list = self.get_all_rdirs()
+        for srcdir in self.srcdir_list():
+            search_dir_list.extend(srcdir.get_all_rdirs())
+
+        selfEntry = self.Entry
+        names = []
+        for dir in search_dir_list:
+            # We use the .name attribute from the Node because the keys of
+            # the dir.entries dictionary are normalized (that is, all upper
+            # case) on case-insensitive systems like Windows.
+            node_names = [ v.name for k, v in dir.entries.items()
+                           if k not in ('.', '..') ]
+            names.extend(node_names)
+            if not strings:
+                # Make sure the working directory (self) actually has
+                # entries for all Nodes in repositories or variant dirs.
+                for name in node_names: selfEntry(name)
+            if ondisk:
+                try:
+                    disk_names = os.listdir(dir.abspath)
+                except os.error:
+                    continue
+                names.extend(disk_names)
+                if not strings:
+                    # We're going to return corresponding Nodes in
+                    # the local directory, so we need to make sure
+                    # those Nodes exist.  We only want to create
+                    # Nodes for the entries that will match the
+                    # specified pattern, though, which means we
+                    # need to filter the list here, even though
+                    # the overall list will also be filtered later,
+                    # after we exit this loop.
+                    if pattern[0] != '.':
+                        #disk_names = [ d for d in disk_names if d[0] != '.' ]
+                        disk_names = [x for x in disk_names if x[0] != '.']
+                    disk_names = fnmatch.filter(disk_names, pattern)
+                    dirEntry = dir.Entry
+                    for name in disk_names:
+                        # Add './' before disk filename so that '#' at
+                        # beginning of filename isn't interpreted.
+                        name = './' + name
+                        node = dirEntry(name).disambiguate()
+                        n = selfEntry(name)
+                        if n.__class__ != node.__class__:
+                            n.__class__ = node.__class__
+                            n._morph()
+
+        names = set(names)
+        if pattern[0] != '.':
+            #names = [ n for n in names if n[0] != '.' ]
+            names = [x for x in names if x[0] != '.']
+        names = fnmatch.filter(names, pattern)
+
+        if strings:
+            return names
+
+        #return [ self.entries[_my_normcase(n)] for n in names ]
+        return [self.entries[_my_normcase(n)] for n in names]
+
+class RootDir(Dir):
+    """A class for the root directory of a file system.
+
+    This is the same as a Dir class, except that the path separator
+    ('/' or '\\') is actually part of the name, so we don't need to
+    add a separator when creating the path names of entries within
+    this directory.
+    """
+    def __init__(self, drive, fs):
+        if __debug__: logInstanceCreation(self, 'Node.FS.RootDir')
+        # We're going to be our own parent directory (".." entry and .dir
+        # attribute) so we have to set up some values so Base.__init__()
+        # won't gag won't it calls some of our methods.
+        self.abspath = ''
+        self.labspath = ''
+        self.path = ''
+        self.tpath = ''
+        self.path_elements = []
+        self.duplicate = 0
+        self.root = self
+
+        # Handle all the types of drives:
+        if drive == '':
+            # No drive, regular UNIX root or Windows default drive.
+            name = OS_SEP 
+            dirname = OS_SEP
+        elif drive == '//':
+            # UNC path
+            name = UNC_PREFIX
+            dirname = UNC_PREFIX
+        else:
+            # Windows drive letter
+            name = drive
+            dirname = drive + OS_SEP
+
+        Base.__init__(self, name, self, fs)
+
+        # Now set our paths to what we really want them to be. The
+        # name should already contain any necessary separators, such
+        # as the initial drive letter (the name) plus the directory
+        # separator, except for the "lookup abspath," which does not
+        # have the drive letter.
+        self.abspath = dirname
+        self.labspath = ''
+        self.path = dirname
+        self.tpath = dirname
+        self._morph()
+
+        # Must be reset after Dir._morph() is invoked...
+        self.dirname = dirname
+
+        self._lookupDict = {}
+
+        self._lookupDict[''] = self
+        self._lookupDict['/'] = self
+
+        # The // entry is necessary because os.path.normpath()
+        # preserves double slashes at the beginning of a path on Posix
+        # platforms.
+        if not has_unc:
+            self._lookupDict['//'] = self
+
+    def must_be_same(self, klass):
+        if klass is Dir:
+            return
+        Base.must_be_same(self, klass)
+
+    def _lookup_abs(self, p, klass, create=1):
+        """
+        Fast (?) lookup of a *normalized* absolute path.
+
+        This method is intended for use by internal lookups with
+        already-normalized path data.  For general-purpose lookups,
+        use the FS.Entry(), FS.Dir() or FS.File() methods.
+
+        The caller is responsible for making sure we're passed a
+        normalized absolute path; we merely let Python's dictionary look
+        up and return the One True Node.FS object for the path.
+
+        If a Node for the specified "p" doesn't already exist, and
+        "create" is specified, the Node may be created after recursive
+        invocation to find or create the parent directory or directories.
+        """
+        k = _my_normcase(p)
+        try:
+            result = self._lookupDict[k]
+        except KeyError:
+            if not create:
+                msg = "No such file or directory: '%s' in '%s' (and create is False)" % (p, str(self))
+                raise SCons.Errors.UserError(msg)
+            # There is no Node for this path name, and we're allowed
+            # to create it.
+            # (note: would like to use p.rsplit('/',1) here but
+            # that's not in python 2.3)
+            # e.g.: dir_name, file_name = p.rsplit('/',1)
+            last_slash = p.rindex('/')
+            if (last_slash >= 0):
+                dir_name  = p[:last_slash]
+                file_name = p[last_slash+1:]
+            else:
+                dir_name  = p         # shouldn't happen, just in case
+                file_name = ''
+
+            dir_node = self._lookup_abs(dir_name, Dir)
+            result = klass(file_name, dir_node, self.fs)
+
+            # Double-check on disk (as configured) that the Node we
+            # created matches whatever is out there in the real world.
+            result.diskcheck_match()
+
+            self._lookupDict[k] = result
+            dir_node.entries[_my_normcase(file_name)] = result
+            dir_node.implicit = None
+        else:
+            # There is already a Node for this path name.  Allow it to
+            # complain if we were looking for an inappropriate type.
+            result.must_be_same(klass)
+        return result
+
+    def __str__(self):
+        return self.abspath
+
+    def entry_abspath(self, name):
+        return self.abspath + name
+
+    def entry_labspath(self, name):
+        return '/' + name
+
+    def entry_path(self, name):
+        return self.path + name
+
+    def entry_tpath(self, name):
+        return self.tpath + name
+
+    def is_under(self, dir):
+        if self is dir:
+            return 1
+        else:
+            return 0
+
+    def up(self):
+        return None
+
+    def get_dir(self):
+        return None
+
+    def src_builder(self):
+        return _null
+
+class FileNodeInfo(SCons.Node.NodeInfoBase):
+    current_version_id = 1
+
+    field_list = ['csig', 'timestamp', 'size']
+
+    # This should get reset by the FS initialization.
+    fs = None
+
+    def str_to_node(self, s):
+        top = self.fs.Top
+        root = top.root
+        if do_splitdrive:
+            drive, s = _my_splitdrive(s)
+            if drive:
+                root = self.fs.get_root(drive)
+        if not os.path.isabs(s):
+            s = top.labspath + '/' + s
+        return root._lookup_abs(s, Entry)
+
+class FileBuildInfo(SCons.Node.BuildInfoBase):
+    current_version_id = 1
+
+    def convert_to_sconsign(self):
+        """
+        Converts this FileBuildInfo object for writing to a .sconsign file
+
+        This replaces each Node in our various dependency lists with its
+        usual string representation: relative to the top-level SConstruct
+        directory, or an absolute path if it's outside.
+        """
+        if os_sep_is_slash:
+            node_to_str = str
+        else:
+            def node_to_str(n):
+                try:
+                    s = n.path
+                except AttributeError:
+                    s = str(n)
+                else:
+                    s = s.replace(OS_SEP, '/')
+                return s
+        for attr in ['bsources', 'bdepends', 'bimplicit']:
+            try:
+                val = getattr(self, attr)
+            except AttributeError:
+                pass
+            else:
+                setattr(self, attr, list(map(node_to_str, val)))
+    def convert_from_sconsign(self, dir, name):
+        """
+        Converts a newly-read FileBuildInfo object for in-SCons use
+
+        For normal up-to-date checking, we don't have any conversion to
+        perform--but we're leaving this method here to make that clear.
+        """
+        pass
+    def prepare_dependencies(self):
+        """
+        Prepares a FileBuildInfo object for explaining what changed
+
+        The bsources, bdepends and bimplicit lists have all been
+        stored on disk as paths relative to the top-level SConstruct
+        directory.  Convert the strings to actual Nodes (for use by the
+        --debug=explain code and --implicit-cache).
+        """
+        attrs = [
+            ('bsources', 'bsourcesigs'),
+            ('bdepends', 'bdependsigs'),
+            ('bimplicit', 'bimplicitsigs'),
+        ]
+        for (nattr, sattr) in attrs:
+            try:
+                strings = getattr(self, nattr)
+                nodeinfos = getattr(self, sattr)
+            except AttributeError:
+                continue
+            nodes = []
+            for s, ni in zip(strings, nodeinfos):
+                if not isinstance(s, SCons.Node.Node):
+                    s = ni.str_to_node(s)
+                nodes.append(s)
+            setattr(self, nattr, nodes)
+    def format(self, names=0):
+        result = []
+        bkids = self.bsources + self.bdepends + self.bimplicit
+        bkidsigs = self.bsourcesigs + self.bdependsigs + self.bimplicitsigs
+        for bkid, bkidsig in zip(bkids, bkidsigs):
+            result.append(str(bkid) + ': ' +
+                          ' '.join(bkidsig.format(names=names)))
+        result.append('%s [%s]' % (self.bactsig, self.bact))
+        return '\n'.join(result)
+
+class File(Base):
+    """A class for files in a file system.
+    """
+
+    memoizer_counters = []
+
+    NodeInfo = FileNodeInfo
+    BuildInfo = FileBuildInfo
+
+    md5_chunksize = 64
+
+    def diskcheck_match(self):
+        diskcheck_match(self, self.isdir,
+                        "Directory %s found where file expected.")
+
+    def __init__(self, name, directory, fs):
+        if __debug__: logInstanceCreation(self, 'Node.FS.File')
+        Base.__init__(self, name, directory, fs)
+        self._morph()
+
+    def Entry(self, name):
+        """Create an entry node named 'name' relative to
+        the directory of this file."""
+        return self.dir.Entry(name)
+
+    def Dir(self, name, create=True):
+        """Create a directory node named 'name' relative to
+        the directory of this file."""
+        return self.dir.Dir(name, create=create)
+
+    def Dirs(self, pathlist):
+        """Create a list of directories relative to the SConscript
+        directory of this file."""
+        return [self.Dir(p) for p in pathlist]
+
+    def File(self, name):
+        """Create a file node named 'name' relative to
+        the directory of this file."""
+        return self.dir.File(name)
+
+    #def generate_build_dict(self):
+    #    """Return an appropriate dictionary of values for building
+    #    this File."""
+    #    return {'Dir' : self.Dir,
+    #            'File' : self.File,
+    #            'RDirs' : self.RDirs}
+
+    def _morph(self):
+        """Turn a file system node into a File object."""
+        self.scanner_paths = {}
+        if not hasattr(self, '_local'):
+            self._local = 0
+
+        # If there was already a Builder set on this entry, then
+        # we need to make sure we call the target-decider function,
+        # not the source-decider.  Reaching in and doing this by hand
+        # is a little bogus.  We'd prefer to handle this by adding
+        # an Entry.builder_set() method that disambiguates like the
+        # other methods, but that starts running into problems with the
+        # fragile way we initialize Dir Nodes with their Mkdir builders,
+        # yet still allow them to be overridden by the user.  Since it's
+        # not clear right now how to fix that, stick with what works
+        # until it becomes clear...
+        if self.has_builder():
+            self.changed_since_last_build = self.decide_target
+
+    def scanner_key(self):
+        return self.get_suffix()
+
+    def get_contents(self):
+        if not self.rexists():
+            return ''
+        fname = self.rfile().abspath
+        try:
+            contents = open(fname, "rb").read()
+        except EnvironmentError, e:
+            if not e.filename:
+                e.filename = fname
+            raise
+        return contents
+
+    # This attempts to figure out what the encoding of the text is
+    # based upon the BOM bytes, and then decodes the contents so that
+    # it's a valid python string.
+    def get_text_contents(self):
+        contents = self.get_contents()
+        # The behavior of various decode() methods and functions
+        # w.r.t. the initial BOM bytes is different for different
+        # encodings and/or Python versions.  ('utf-8' does not strip
+        # them, but has a 'utf-8-sig' which does; 'utf-16' seems to
+        # strip them; etc.)  Just sidestep all the complication by
+        # explicitly stripping the BOM before we decode().
+        if contents.startswith(codecs.BOM_UTF8):
+            return contents[len(codecs.BOM_UTF8):].decode('utf-8')
+        if contents.startswith(codecs.BOM_UTF16_LE):
+            return contents[len(codecs.BOM_UTF16_LE):].decode('utf-16-le')
+        if contents.startswith(codecs.BOM_UTF16_BE):
+            return contents[len(codecs.BOM_UTF16_BE):].decode('utf-16-be')
+        return contents
+
+    def get_content_hash(self):
+        """
+        Compute and return the MD5 hash for this file.
+        """
+        if not self.rexists():
+            return SCons.Util.MD5signature('')
+        fname = self.rfile().abspath
+        try:
+            cs = SCons.Util.MD5filesignature(fname,
+                chunksize=SCons.Node.FS.File.md5_chunksize*1024)
+        except EnvironmentError, e:
+            if not e.filename:
+                e.filename = fname
+            raise
+        return cs
+        
+
+    memoizer_counters.append(SCons.Memoize.CountValue('get_size'))
+
+    def get_size(self):
+        try:
+            return self._memo['get_size']
+        except KeyError:
+            pass
+
+        if self.rexists():
+            size = self.rfile().getsize()
+        else:
+            size = 0
+
+        self._memo['get_size'] = size
+
+        return size
+
+    memoizer_counters.append(SCons.Memoize.CountValue('get_timestamp'))
+
+    def get_timestamp(self):
+        try:
+            return self._memo['get_timestamp']
+        except KeyError:
+            pass
+
+        if self.rexists():
+            timestamp = self.rfile().getmtime()
+        else:
+            timestamp = 0
+
+        self._memo['get_timestamp'] = timestamp
+
+        return timestamp
+
+    def store_info(self):
+        # Merge our build information into the already-stored entry.
+        # This accomodates "chained builds" where a file that's a target
+        # in one build (SConstruct file) is a source in a different build.
+        # See test/chained-build.py for the use case.
+        if do_store_info:
+            self.dir.sconsign().store_info(self.name, self)
+
+    convert_copy_attrs = [
+        'bsources',
+        'bimplicit',
+        'bdepends',
+        'bact',
+        'bactsig',
+        'ninfo',
+    ]
+
+
+    convert_sig_attrs = [
+        'bsourcesigs',
+        'bimplicitsigs',
+        'bdependsigs',
+    ]
+
+    def convert_old_entry(self, old_entry):
+        # Convert a .sconsign entry from before the Big Signature
+        # Refactoring, doing what we can to convert its information
+        # to the new .sconsign entry format.
+        #
+        # The old format looked essentially like this:
+        #
+        #   BuildInfo
+        #       .ninfo (NodeInfo)
+        #           .bsig
+        #           .csig
+        #           .timestamp
+        #           .size
+        #       .bsources
+        #       .bsourcesigs ("signature" list)
+        #       .bdepends
+        #       .bdependsigs ("signature" list)
+        #       .bimplicit
+        #       .bimplicitsigs ("signature" list)
+        #       .bact
+        #       .bactsig
+        #
+        # The new format looks like this:
+        #
+        #   .ninfo (NodeInfo)
+        #       .bsig
+        #       .csig
+        #       .timestamp
+        #       .size
+        #   .binfo (BuildInfo)
+        #       .bsources
+        #       .bsourcesigs (NodeInfo list)
+        #           .bsig
+        #           .csig
+        #           .timestamp
+        #           .size
+        #       .bdepends
+        #       .bdependsigs (NodeInfo list)
+        #           .bsig
+        #           .csig
+        #           .timestamp
+        #           .size
+        #       .bimplicit
+        #       .bimplicitsigs (NodeInfo list)
+        #           .bsig
+        #           .csig
+        #           .timestamp
+        #           .size
+        #       .bact
+        #       .bactsig
+        #
+        # The basic idea of the new structure is that a NodeInfo always
+        # holds all available information about the state of a given Node
+        # at a certain point in time.  The various .b*sigs lists can just
+        # be a list of pointers to the .ninfo attributes of the different
+        # dependent nodes, without any copying of information until it's
+        # time to pickle it for writing out to a .sconsign file.
+        #
+        # The complicating issue is that the *old* format only stored one
+        # "signature" per dependency, based on however the *last* build
+        # was configured.  We don't know from just looking at it whether
+        # it was a build signature, a content signature, or a timestamp
+        # "signature".  Since we no longer use build signatures, the
+        # best we can do is look at the length and if it's thirty two,
+        # assume that it was (or might have been) a content signature.
+        # If it was actually a build signature, then it will cause a
+        # rebuild anyway when it doesn't match the new content signature,
+        # but that's probably the best we can do.
+        import SCons.SConsign
+        new_entry = SCons.SConsign.SConsignEntry()
+        new_entry.binfo = self.new_binfo()
+        binfo = new_entry.binfo
+        for attr in self.convert_copy_attrs:
+            try:
+                value = getattr(old_entry, attr)
+            except AttributeError:
+                continue
+            setattr(binfo, attr, value)
+            delattr(old_entry, attr)
+        for attr in self.convert_sig_attrs:
+            try:
+                sig_list = getattr(old_entry, attr)
+            except AttributeError:
+                continue
+            value = []
+            for sig in sig_list:
+                ninfo = self.new_ninfo()
+                if len(sig) == 32:
+                    ninfo.csig = sig
+                else:
+                    ninfo.timestamp = sig
+                value.append(ninfo)
+            setattr(binfo, attr, value)
+            delattr(old_entry, attr)
+        return new_entry
+
+    memoizer_counters.append(SCons.Memoize.CountValue('get_stored_info'))
+
+    def get_stored_info(self):
+        try:
+            return self._memo['get_stored_info']
+        except KeyError:
+            pass
+
+        try:
+            sconsign_entry = self.dir.sconsign().get_entry(self.name)
+        except (KeyError, EnvironmentError):
+            import SCons.SConsign
+            sconsign_entry = SCons.SConsign.SConsignEntry()
+            sconsign_entry.binfo = self.new_binfo()
+            sconsign_entry.ninfo = self.new_ninfo()
+        else:
+            if isinstance(sconsign_entry, FileBuildInfo):
+                # This is a .sconsign file from before the Big Signature
+                # Refactoring; convert it as best we can.
+                sconsign_entry = self.convert_old_entry(sconsign_entry)
+            try:
+                delattr(sconsign_entry.ninfo, 'bsig')
+            except AttributeError:
+                pass
+
+        self._memo['get_stored_info'] = sconsign_entry
+
+        return sconsign_entry
+
+    def get_stored_implicit(self):
+        binfo = self.get_stored_info().binfo
+        binfo.prepare_dependencies()
+        try: return binfo.bimplicit
+        except AttributeError: return None
+
+    def rel_path(self, other):
+        return self.dir.rel_path(other)
+
+    def _get_found_includes_key(self, env, scanner, path):
+        return (id(env), id(scanner), path)
+
+    memoizer_counters.append(SCons.Memoize.CountDict('get_found_includes', _get_found_includes_key))
+
+    def get_found_includes(self, env, scanner, path):
+        """Return the included implicit dependencies in this file.
+        Cache results so we only scan the file once per path
+        regardless of how many times this information is requested.
+        """
+        memo_key = (id(env), id(scanner), path)
+        try:
+            memo_dict = self._memo['get_found_includes']
+        except KeyError:
+            memo_dict = {}
+            self._memo['get_found_includes'] = memo_dict
+        else:
+            try:
+                return memo_dict[memo_key]
+            except KeyError:
+                pass
+
+        if scanner:
+            # result = [n.disambiguate() for n in scanner(self, env, path)]
+            result = scanner(self, env, path)
+            result = [N.disambiguate() for N in result]
+        else:
+            result = []
+
+        memo_dict[memo_key] = result
+
+        return result
+
+    def _createDir(self):
+        # ensure that the directories for this node are
+        # created.
+        self.dir._create()
+
+    def push_to_cache(self):
+        """Try to push the node into a cache
+        """
+        # This should get called before the Nodes' .built() method is
+        # called, which would clear the build signature if the file has
+        # a source scanner.
+        #
+        # We have to clear the local memoized values *before* we push
+        # the node to cache so that the memoization of the self.exists()
+        # return value doesn't interfere.
+        if self.nocache:
+            return
+        self.clear_memoized_values()
+        if self.exists():
+            self.get_build_env().get_CacheDir().push(self)
+
+    def retrieve_from_cache(self):
+        """Try to retrieve the node's content from a cache
+
+        This method is called from multiple threads in a parallel build,
+        so only do thread safe stuff here. Do thread unsafe stuff in
+        built().
+
+        Returns true iff the node was successfully retrieved.
+        """
+        if self.nocache:
+            return None
+        if not self.is_derived():
+            return None
+        return self.get_build_env().get_CacheDir().retrieve(self)
+
+    def visited(self):
+        if self.exists():
+            self.get_build_env().get_CacheDir().push_if_forced(self)
+
+        ninfo = self.get_ninfo()
+
+        csig = self.get_max_drift_csig()
+        if csig:
+            ninfo.csig = csig
+
+        ninfo.timestamp = self.get_timestamp()
+        ninfo.size      = self.get_size()
+
+        if not self.has_builder():
+            # This is a source file, but it might have been a target file
+            # in another build that included more of the DAG.  Copy
+            # any build information that's stored in the .sconsign file
+            # into our binfo object so it doesn't get lost.
+            old = self.get_stored_info()
+            self.get_binfo().__dict__.update(old.binfo.__dict__)
+
+        self.store_info()
+
+    def find_src_builder(self):
+        if self.rexists():
+            return None
+        scb = self.dir.src_builder()
+        if scb is _null:
+            if diskcheck_sccs(self.dir, self.name):
+                scb = get_DefaultSCCSBuilder()
+            elif diskcheck_rcs(self.dir, self.name):
+                scb = get_DefaultRCSBuilder()
+            else:
+                scb = None
+        if scb is not None:
+            try:
+                b = self.builder
+            except AttributeError:
+                b = None
+            if b is None:
+                self.builder_set(scb)
+        return scb
+
+    def has_src_builder(self):
+        """Return whether this Node has a source builder or not.
+
+        If this Node doesn't have an explicit source code builder, this
+        is where we figure out, on the fly, if there's a transparent
+        source code builder for it.
+
+        Note that if we found a source builder, we also set the
+        self.builder attribute, so that all of the methods that actually
+        *build* this file don't have to do anything different.
+        """
+        try:
+            scb = self.sbuilder
+        except AttributeError:
+            scb = self.sbuilder = self.find_src_builder()
+        return scb is not None
+
+    def alter_targets(self):
+        """Return any corresponding targets in a variant directory.
+        """
+        if self.is_derived():
+            return [], None
+        return self.fs.variant_dir_target_climb(self, self.dir, [self.name])
+
+    def _rmv_existing(self):
+        self.clear_memoized_values()
+        e = Unlink(self, [], None)
+        if isinstance(e, SCons.Errors.BuildError):
+            raise e
+
+    #
+    # Taskmaster interface subsystem
+    #
+
+    def make_ready(self):
+        self.has_src_builder()
+        self.get_binfo()
+
+    def prepare(self):
+        """Prepare for this file to be created."""
+        SCons.Node.Node.prepare(self)
+
+        if self.get_state() != SCons.Node.up_to_date:
+            if self.exists():
+                if self.is_derived() and not self.precious:
+                    self._rmv_existing()
+            else:
+                try:
+                    self._createDir()
+                except SCons.Errors.StopError, drive:
+                    desc = "No drive `%s' for target `%s'." % (drive, self)
+                    raise SCons.Errors.StopError(desc)
+
+    #
+    #
+    #
+
+    def remove(self):
+        """Remove this file."""
+        if self.exists() or self.islink():
+            self.fs.unlink(self.path)
+            return 1
+        return None
+
+    def do_duplicate(self, src):
+        self._createDir()
+        Unlink(self, None, None)
+        e = Link(self, src, None)
+        if isinstance(e, SCons.Errors.BuildError):
+            desc = "Cannot duplicate `%s' in `%s': %s." % (src.path, self.dir.path, e.errstr)
+            raise SCons.Errors.StopError(desc)
+        self.linked = 1
+        # The Link() action may or may not have actually
+        # created the file, depending on whether the -n
+        # option was used or not.  Delete the _exists and
+        # _rexists attributes so they can be reevaluated.
+        self.clear()
+
+    memoizer_counters.append(SCons.Memoize.CountValue('exists'))
+
+    def exists(self):
+        try:
+            return self._memo['exists']
+        except KeyError:
+            pass
+        # Duplicate from source path if we are set up to do this.
+        if self.duplicate and not self.is_derived() and not self.linked:
+            src = self.srcnode()
+            if src is not self:
+                # At this point, src is meant to be copied in a variant directory.
+                src = src.rfile()
+                if src.abspath != self.abspath:
+                    if src.exists():
+                        self.do_duplicate(src)
+                        # Can't return 1 here because the duplication might
+                        # not actually occur if the -n option is being used.
+                    else:
+                        # The source file does not exist.  Make sure no old
+                        # copy remains in the variant directory.
+                        if Base.exists(self) or self.islink():
+                            self.fs.unlink(self.path)
+                        # Return None explicitly because the Base.exists() call
+                        # above will have cached its value if the file existed.
+                        self._memo['exists'] = None
+                        return None
+        result = Base.exists(self)
+        self._memo['exists'] = result
+        return result
+
+    #
+    # SIGNATURE SUBSYSTEM
+    #
+
+    def get_max_drift_csig(self):
+        """
+        Returns the content signature currently stored for this node
+        if it's been unmodified longer than the max_drift value, or the
+        max_drift value is 0.  Returns None otherwise.
+        """
+        old = self.get_stored_info()
+        mtime = self.get_timestamp()
+
+        max_drift = self.fs.max_drift
+        if max_drift > 0:
+            if (time.time() - mtime) > max_drift:
+                try:
+                    n = old.ninfo
+                    if n.timestamp and n.csig and n.timestamp == mtime:
+                        return n.csig
+                except AttributeError:
+                    pass
+        elif max_drift == 0:
+            try:
+                return old.ninfo.csig
+            except AttributeError:
+                pass
+
+        return None
+
+    def get_csig(self):
+        """
+        Generate a node's content signature, the digested signature
+        of its content.
+
+        node - the node
+        cache - alternate node to use for the signature cache
+        returns - the content signature
+        """
+        ninfo = self.get_ninfo()
+        try:
+            return ninfo.csig
+        except AttributeError:
+            pass
+
+        csig = self.get_max_drift_csig()
+        if csig is None:
+
+            try:
+                if self.get_size() < SCons.Node.FS.File.md5_chunksize:
+                    contents = self.get_contents()
+                else:
+                    csig = self.get_content_hash()
+            except IOError:
+                # This can happen if there's actually a directory on-disk,
+                # which can be the case if they've disabled disk checks,
+                # or if an action with a File target actually happens to
+                # create a same-named directory by mistake.
+                csig = ''
+            else:
+                if not csig:
+                    csig = SCons.Util.MD5signature(contents)
+
+        ninfo.csig = csig
+
+        return csig
+
+    #
+    # DECISION SUBSYSTEM
+    #
+
+    def builder_set(self, builder):
+        SCons.Node.Node.builder_set(self, builder)
+        self.changed_since_last_build = self.decide_target
+
+    def changed_content(self, target, prev_ni):
+        cur_csig = self.get_csig()
+        try:
+            return cur_csig != prev_ni.csig
+        except AttributeError:
+            return 1
+
+    def changed_state(self, target, prev_ni):
+        return self.state != SCons.Node.up_to_date
+
+    def changed_timestamp_then_content(self, target, prev_ni):
+        if not self.changed_timestamp_match(target, prev_ni):
+            try:
+                self.get_ninfo().csig = prev_ni.csig
+            except AttributeError:
+                pass
+            return False
+        return self.changed_content(target, prev_ni)
+
+    def changed_timestamp_newer(self, target, prev_ni):
+        try:
+            return self.get_timestamp() > target.get_timestamp()
+        except AttributeError:
+            return 1
+
+    def changed_timestamp_match(self, target, prev_ni):
+        try:
+            return self.get_timestamp() != prev_ni.timestamp
+        except AttributeError:
+            return 1
+
+    def decide_source(self, target, prev_ni):
+        return target.get_build_env().decide_source(self, target, prev_ni)
+
+    def decide_target(self, target, prev_ni):
+        return target.get_build_env().decide_target(self, target, prev_ni)
+
+    # Initialize this Node's decider function to decide_source() because
+    # every file is a source file until it has a Builder attached...
+    changed_since_last_build = decide_source
+
+    def is_up_to_date(self):
+        T = 0
+        if T: Trace('is_up_to_date(%s):' % self)
+        if not self.exists():
+            if T: Trace(' not self.exists():')
+            # The file doesn't exist locally...
+            r = self.rfile()
+            if r != self:
+                # ...but there is one in a Repository...
+                if not self.changed(r):
+                    if T: Trace(' changed(%s):' % r)
+                    # ...and it's even up-to-date...
+                    if self._local:
+                        # ...and they'd like a local copy.
+                        e = LocalCopy(self, r, None)
+                        if isinstance(e, SCons.Errors.BuildError):
+                            raise 
+                        self.store_info()
+                    if T: Trace(' 1\n')
+                    return 1
+            self.changed()
+            if T: Trace(' None\n')
+            return None
+        else:
+            r = self.changed()
+            if T: Trace(' self.exists():  %s\n' % r)
+            return not r
+
+    memoizer_counters.append(SCons.Memoize.CountValue('rfile'))
+
+    def rfile(self):
+        try:
+            return self._memo['rfile']
+        except KeyError:
+            pass
+        result = self
+        if not self.exists():
+            norm_name = _my_normcase(self.name)
+            for dir in self.dir.get_all_rdirs():
+                try: node = dir.entries[norm_name]
+                except KeyError: node = dir.file_on_disk(self.name)
+                if node and node.exists() and \
+                   (isinstance(node, File) or isinstance(node, Entry) \
+                    or not node.is_derived()):
+                        result = node
+                        # Copy over our local attributes to the repository
+                        # Node so we identify shared object files in the
+                        # repository and don't assume they're static.
+                        #
+                        # This isn't perfect; the attribute would ideally
+                        # be attached to the object in the repository in
+                        # case it was built statically in the repository
+                        # and we changed it to shared locally, but that's
+                        # rarely the case and would only occur if you
+                        # intentionally used the same suffix for both
+                        # shared and static objects anyway.  So this
+                        # should work well in practice.
+                        result.attributes = self.attributes
+                        break
+        self._memo['rfile'] = result
+        return result
+
+    def rstr(self):
+        return str(self.rfile())
+
+    def get_cachedir_csig(self):
+        """
+        Fetch a Node's content signature for purposes of computing
+        another Node's cachesig.
+
+        This is a wrapper around the normal get_csig() method that handles
+        the somewhat obscure case of using CacheDir with the -n option.
+        Any files that don't exist would normally be "built" by fetching
+        them from the cache, but the normal get_csig() method will try
+        to open up the local file, which doesn't exist because the -n
+        option meant we didn't actually pull the file from cachedir.
+        But since the file *does* actually exist in the cachedir, we
+        can use its contents for the csig.
+        """
+        try:
+            return self.cachedir_csig
+        except AttributeError:
+            pass
+
+        cachedir, cachefile = self.get_build_env().get_CacheDir().cachepath(self)
+        if not self.exists() and cachefile and os.path.exists(cachefile):
+            self.cachedir_csig = SCons.Util.MD5filesignature(cachefile, \
+                SCons.Node.FS.File.md5_chunksize * 1024)
+        else:
+            self.cachedir_csig = self.get_csig()
+        return self.cachedir_csig
+
+    def get_cachedir_bsig(self):
+        try:
+            return self.cachesig
+        except AttributeError:
+            pass
+
+        # Add the path to the cache signature, because multiple
+        # targets built by the same action will all have the same
+        # build signature, and we have to differentiate them somehow.
+        children = self.children()
+        executor = self.get_executor()
+        # sigs = [n.get_cachedir_csig() for n in children]
+        sigs = [n.get_cachedir_csig() for n in children]
+        sigs.append(SCons.Util.MD5signature(executor.get_contents()))
+        sigs.append(self.path)
+        result = self.cachesig = SCons.Util.MD5collect(sigs)
+        return result
+
+
+default_fs = None
+
+def get_default_fs():
+    global default_fs
+    if not default_fs:
+        default_fs = FS()
+    return default_fs
+
+class FileFinder(object):
+    """
+    """
+    if SCons.Memoize.use_memoizer:
+        __metaclass__ = SCons.Memoize.Memoized_Metaclass
+
+    memoizer_counters = []
+
+    def __init__(self):
+        self._memo = {}
+
+    def filedir_lookup(self, p, fd=None):
+        """
+        A helper method for find_file() that looks up a directory for
+        a file we're trying to find.  This only creates the Dir Node if
+        it exists on-disk, since if the directory doesn't exist we know
+        we won't find any files in it...  :-)
+
+        It would be more compact to just use this as a nested function
+        with a default keyword argument (see the commented-out version
+        below), but that doesn't work unless you have nested scopes,
+        so we define it here just so this work under Python 1.5.2.
+        """
+        if fd is None:
+            fd = self.default_filedir
+        dir, name = os.path.split(fd)
+        drive, d = _my_splitdrive(dir)
+        if not name and d[:1] in ('/', OS_SEP):
+            #return p.fs.get_root(drive).dir_on_disk(name)
+            return p.fs.get_root(drive)
+        if dir:
+            p = self.filedir_lookup(p, dir)
+            if not p:
+                return None
+        norm_name = _my_normcase(name)
+        try:
+            node = p.entries[norm_name]
+        except KeyError:
+            return p.dir_on_disk(name)
+        if isinstance(node, Dir):
+            return node
+        if isinstance(node, Entry):
+            node.must_be_same(Dir)
+            return node
+        return None
+
+    def _find_file_key(self, filename, paths, verbose=None):
+        return (filename, paths)
+        
+    memoizer_counters.append(SCons.Memoize.CountDict('find_file', _find_file_key))
+
+    def find_file(self, filename, paths, verbose=None):
+        """
+        find_file(str, [Dir()]) -> [nodes]
+
+        filename - a filename to find
+        paths - a list of directory path *nodes* to search in.  Can be
+                represented as a list, a tuple, or a callable that is
+                called with no arguments and returns the list or tuple.
+
+        returns - the node created from the found file.
+
+        Find a node corresponding to either a derived file or a file
+        that exists already.
+
+        Only the first file found is returned, and none is returned
+        if no file is found.
+        """
+        memo_key = self._find_file_key(filename, paths)
+        try:
+            memo_dict = self._memo['find_file']
+        except KeyError:
+            memo_dict = {}
+            self._memo['find_file'] = memo_dict
+        else:
+            try:
+                return memo_dict[memo_key]
+            except KeyError:
+                pass
+
+        if verbose and not callable(verbose):
+            if not SCons.Util.is_String(verbose):
+                verbose = "find_file"
+            _verbose = u'  %s: ' % verbose
+            verbose = lambda s: sys.stdout.write(_verbose + s)
+
+        filedir, filename = os.path.split(filename)
+        if filedir:
+            # More compact code that we can't use until we drop
+            # support for Python 1.5.2:
+            #
+            #def filedir_lookup(p, fd=filedir):
+            #    """
+            #    A helper function that looks up a directory for a file
+            #    we're trying to find.  This only creates the Dir Node
+            #    if it exists on-disk, since if the directory doesn't
+            #    exist we know we won't find any files in it...  :-)
+            #    """
+            #    dir, name = os.path.split(fd)
+            #    if dir:
+            #        p = filedir_lookup(p, dir)
+            #        if not p:
+            #            return None
+            #    norm_name = _my_normcase(name)
+            #    try:
+            #        node = p.entries[norm_name]
+            #    except KeyError:
+            #        return p.dir_on_disk(name)
+            #    if isinstance(node, Dir):
+            #        return node
+            #    if isinstance(node, Entry):
+            #        node.must_be_same(Dir)
+            #        return node
+            #    if isinstance(node, Dir) or isinstance(node, Entry):
+            #        return node
+            #    return None
+            #paths = [_f for _f in map(filedir_lookup, paths) if _f]
+
+            self.default_filedir = filedir
+            paths = [_f for _f in map(self.filedir_lookup, paths) if _f]
+
+        result = None
+        for dir in paths:
+            if verbose:
+                verbose("looking for '%s' in '%s' ...\n" % (filename, dir))
+            node, d = dir.srcdir_find_file(filename)
+            if node:
+                if verbose:
+                    verbose("... FOUND '%s' in '%s'\n" % (filename, d))
+                result = node
+                break
+
+        memo_dict[memo_key] = result
+
+        return result
+
+find_file = FileFinder().find_file
+
+
+def invalidate_node_memos(targets):
+    """
+    Invalidate the memoized values of all Nodes (files or directories)
+    that are associated with the given entries. Has been added to
+    clear the cache of nodes affected by a direct execution of an
+    action (e.g.  Delete/Copy/Chmod). Existing Node caches become
+    inconsistent if the action is run through Execute().  The argument
+    `targets` can be a single Node object or filename, or a sequence
+    of Nodes/filenames.
+    """
+    from traceback import extract_stack
+
+    # First check if the cache really needs to be flushed. Only
+    # actions run in the SConscript with Execute() seem to be
+    # affected. XXX The way to check if Execute() is in the stacktrace
+    # is a very dirty hack and should be replaced by a more sensible
+    # solution.
+    for f in extract_stack():
+        if f[2] == 'Execute' and f[0][-14:] == 'Environment.py':
+            break
+    else:
+        # Dont have to invalidate, so return
+        return
+
+    if not SCons.Util.is_List(targets):
+        targets = [targets]
+    
+    for entry in targets:
+        # If the target is a Node object, clear the cache. If it is a
+        # filename, look up potentially existing Node object first.
+        try:
+            entry.clear_memoized_values()
+        except AttributeError:
+            # Not a Node object, try to look up Node by filename.  XXX
+            # This creates Node objects even for those filenames which
+            # do not correspond to an existing Node object.
+            node = get_default_fs().Entry(entry)
+            if node:
+                node.clear_memoized_values()                        
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Node/Python.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Node/Python.py
new file mode 100644
index 0000000..5c07a9d
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Node/Python.py
@@ -0,0 +1,128 @@
+"""scons.Node.Python
+
+Python nodes.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Node/Python.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Node
+
+class ValueNodeInfo(SCons.Node.NodeInfoBase):
+    current_version_id = 1
+
+    field_list = ['csig']
+
+    def str_to_node(self, s):
+        return Value(s)
+
+class ValueBuildInfo(SCons.Node.BuildInfoBase):
+    current_version_id = 1
+
+class Value(SCons.Node.Node):
+    """A class for Python variables, typically passed on the command line 
+    or generated by a script, but not from a file or some other source.
+    """
+
+    NodeInfo = ValueNodeInfo
+    BuildInfo = ValueBuildInfo
+
+    def __init__(self, value, built_value=None):
+        SCons.Node.Node.__init__(self)
+        self.value = value
+        if built_value is not None:
+            self.built_value = built_value
+
+    def str_for_display(self):
+        return repr(self.value)
+
+    def __str__(self):
+        return str(self.value)
+
+    def make_ready(self):
+        self.get_csig()
+
+    def build(self, **kw):
+        if not hasattr(self, 'built_value'):
+            SCons.Node.Node.build(self, **kw)
+
+    is_up_to_date = SCons.Node.Node.children_are_up_to_date
+
+    def is_under(self, dir):
+        # Make Value nodes get built regardless of 
+        # what directory scons was run from. Value nodes
+        # are outside the filesystem:
+        return 1
+
+    def write(self, built_value):
+        """Set the value of the node."""
+        self.built_value = built_value
+
+    def read(self):
+        """Return the value. If necessary, the value is built."""
+        self.build()
+        if not hasattr(self, 'built_value'):
+            self.built_value = self.value
+        return self.built_value
+
+    def get_text_contents(self):
+        """By the assumption that the node.built_value is a
+        deterministic product of the sources, the contents of a Value
+        are the concatenation of all the contents of its sources.  As
+        the value need not be built when get_contents() is called, we
+        cannot use the actual node.built_value."""
+        ###TODO: something reasonable about universal newlines
+        contents = str(self.value)
+        for kid in self.children(None):
+            contents = contents + kid.get_contents()
+        return contents
+
+    get_contents = get_text_contents    ###TODO should return 'bytes' value
+
+    def changed_since_last_build(self, target, prev_ni):
+        cur_csig = self.get_csig()
+        try:
+            return cur_csig != prev_ni.csig
+        except AttributeError:
+            return 1
+
+    def get_csig(self, calc=None):
+        """Because we're a Python value node and don't have a real
+        timestamp, we get to ignore the calculator and just use the
+        value contents."""
+        try:
+            return self.ninfo.csig
+        except AttributeError:
+            pass
+        contents = self.get_contents()
+        self.get_ninfo().csig = contents
+        return contents
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Node/__init__.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Node/__init__.py
new file mode 100644
index 0000000..20339a1
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Node/__init__.py
@@ -0,0 +1,1329 @@
+"""SCons.Node
+
+The Node package for the SCons software construction utility.
+
+This is, in many ways, the heart of SCons.
+
+A Node is where we encapsulate all of the dependency information about
+any thing that SCons can build, or about any thing which SCons can use
+to build some other thing.  The canonical "thing," of course, is a file,
+but a Node can also represent something remote (like a web page) or
+something completely abstract (like an Alias).
+
+Each specific type of "thing" is specifically represented by a subclass
+of the Node base class:  Node.FS.File for files, Node.Alias for aliases,
+etc.  Dependency information is kept here in the base class, and
+information specific to files/aliases/etc. is in the subclass.  The
+goal, if we've done this correctly, is that any type of "thing" should
+be able to depend on any other type of "thing."
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Node/__init__.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import collections
+import copy
+from itertools import chain
+
+from SCons.Debug import logInstanceCreation
+import SCons.Executor
+import SCons.Memoize
+import SCons.Util
+
+from SCons.Debug import Trace
+
+def classname(obj):
+    return str(obj.__class__).split('.')[-1]
+
+# Node states
+#
+# These are in "priority" order, so that the maximum value for any
+# child/dependency of a node represents the state of that node if
+# it has no builder of its own.  The canonical example is a file
+# system directory, which is only up to date if all of its children
+# were up to date.
+no_state = 0
+pending = 1
+executing = 2
+up_to_date = 3
+executed = 4
+failed = 5
+
+StateString = {
+    0 : "no_state",
+    1 : "pending",
+    2 : "executing",
+    3 : "up_to_date",
+    4 : "executed",
+    5 : "failed",
+}
+
+# controls whether implicit dependencies are cached:
+implicit_cache = 0
+
+# controls whether implicit dep changes are ignored:
+implicit_deps_unchanged = 0
+
+# controls whether the cached implicit deps are ignored:
+implicit_deps_changed = 0
+
+# A variable that can be set to an interface-specific function be called
+# to annotate a Node with information about its creation.
+def do_nothing(node): pass
+
+Annotate = do_nothing
+
+# Classes for signature info for Nodes.
+
+class NodeInfoBase(object):
+    """
+    The generic base class for signature information for a Node.
+
+    Node subclasses should subclass NodeInfoBase to provide their own
+    logic for dealing with their own Node-specific signature information.
+    """
+    current_version_id = 1
+    def __init__(self, node=None):
+        # Create an object attribute from the class attribute so it ends up
+        # in the pickled data in the .sconsign file.
+        self._version_id = self.current_version_id
+    def update(self, node):
+        try:
+            field_list = self.field_list
+        except AttributeError:
+            return
+        for f in field_list:
+            try:
+                delattr(self, f)
+            except AttributeError:
+                pass
+            try:
+                func = getattr(node, 'get_' + f)
+            except AttributeError:
+                pass
+            else:
+                setattr(self, f, func())
+    def convert(self, node, val):
+        pass
+    def merge(self, other):
+        self.__dict__.update(other.__dict__)
+    def format(self, field_list=None, names=0):
+        if field_list is None:
+            try:
+                field_list = self.field_list
+            except AttributeError:
+                field_list = sorted(self.__dict__.keys())
+        fields = []
+        for field in field_list:
+            try:
+                f = getattr(self, field)
+            except AttributeError:
+                f = None
+            f = str(f)
+            if names:
+                f = field + ': ' + f
+            fields.append(f)
+        return fields
+
+class BuildInfoBase(object):
+    """
+    The generic base class for build information for a Node.
+
+    This is what gets stored in a .sconsign file for each target file.
+    It contains a NodeInfo instance for this node (signature information
+    that's specific to the type of Node) and direct attributes for the
+    generic build stuff we have to track:  sources, explicit dependencies,
+    implicit dependencies, and action information.
+    """
+    current_version_id = 1
+    def __init__(self, node=None):
+        # Create an object attribute from the class attribute so it ends up
+        # in the pickled data in the .sconsign file.
+        self._version_id = self.current_version_id
+        self.bsourcesigs = []
+        self.bdependsigs = []
+        self.bimplicitsigs = []
+        self.bactsig = None
+    def merge(self, other):
+        self.__dict__.update(other.__dict__)
+
+class Node(object):
+    """The base Node class, for entities that we know how to
+    build, or use to build other Nodes.
+    """
+
+    if SCons.Memoize.use_memoizer:
+        __metaclass__ = SCons.Memoize.Memoized_Metaclass
+
+    memoizer_counters = []
+
+    class Attrs(object):
+        pass
+
+    def __init__(self):
+        if __debug__: logInstanceCreation(self, 'Node.Node')
+        # Note that we no longer explicitly initialize a self.builder
+        # attribute to None here.  That's because the self.builder
+        # attribute may be created on-the-fly later by a subclass (the
+        # canonical example being a builder to fetch a file from a
+        # source code system like CVS or Subversion).
+
+        # Each list of children that we maintain is accompanied by a
+        # dictionary used to look up quickly whether a node is already
+        # present in the list.  Empirical tests showed that it was
+        # fastest to maintain them as side-by-side Node attributes in
+        # this way, instead of wrapping up each list+dictionary pair in
+        # a class.  (Of course, we could always still do that in the
+        # future if we had a good reason to...).
+        self.sources = []       # source files used to build node
+        self.sources_set = set()
+        self._specific_sources = False
+        self.depends = []       # explicit dependencies (from Depends)
+        self.depends_set = set()
+        self.ignore = []        # dependencies to ignore
+        self.ignore_set = set()
+        self.prerequisites = SCons.Util.UniqueList()
+        self.implicit = None    # implicit (scanned) dependencies (None means not scanned yet)
+        self.waiting_parents = set()
+        self.waiting_s_e = set()
+        self.ref_count = 0
+        self.wkids = None       # Kids yet to walk, when it's an array
+
+        self.env = None
+        self.state = no_state
+        self.precious = None
+        self.noclean = 0
+        self.nocache = 0
+        self.always_build = None
+        self.includes = None
+        self.attributes = self.Attrs() # Generic place to stick information about the Node.
+        self.side_effect = 0 # true iff this node is a side effect
+        self.side_effects = [] # the side effects of building this target
+        self.linked = 0 # is this node linked to the variant directory?
+
+        self.clear_memoized_values()
+
+        # Let the interface in which the build engine is embedded
+        # annotate this Node with its own info (like a description of
+        # what line in what file created the node, for example).
+        Annotate(self)
+
+    def disambiguate(self, must_exist=None):
+        return self
+
+    def get_suffix(self):
+        return ''
+
+    memoizer_counters.append(SCons.Memoize.CountValue('get_build_env'))
+
+    def get_build_env(self):
+        """Fetch the appropriate Environment to build this node.
+        """
+        try:
+            return self._memo['get_build_env']
+        except KeyError:
+            pass
+        result = self.get_executor().get_build_env()
+        self._memo['get_build_env'] = result
+        return result
+
+    def get_build_scanner_path(self, scanner):
+        """Fetch the appropriate scanner path for this node."""
+        return self.get_executor().get_build_scanner_path(scanner)
+
+    def set_executor(self, executor):
+        """Set the action executor for this node."""
+        self.executor = executor
+
+    def get_executor(self, create=1):
+        """Fetch the action executor for this node.  Create one if
+        there isn't already one, and requested to do so."""
+        try:
+            executor = self.executor
+        except AttributeError:
+            if not create:
+                raise
+            try:
+                act = self.builder.action
+            except AttributeError:
+                executor = SCons.Executor.Null(targets=[self])
+            else:
+                executor = SCons.Executor.Executor(act,
+                                                   self.env or self.builder.env,
+                                                   [self.builder.overrides],
+                                                   [self],
+                                                   self.sources)
+            self.executor = executor
+        return executor
+
+    def executor_cleanup(self):
+        """Let the executor clean up any cached information."""
+        try:
+            executor = self.get_executor(create=None)
+        except AttributeError:
+            pass
+        else:
+            executor.cleanup()
+
+    def reset_executor(self):
+        "Remove cached executor; forces recompute when needed."
+        try:
+            delattr(self, 'executor')
+        except AttributeError:
+            pass
+
+    def push_to_cache(self):
+        """Try to push a node into a cache
+        """
+        pass
+
+    def retrieve_from_cache(self):
+        """Try to retrieve the node's content from a cache
+
+        This method is called from multiple threads in a parallel build,
+        so only do thread safe stuff here. Do thread unsafe stuff in
+        built().
+
+        Returns true iff the node was successfully retrieved.
+        """
+        return 0
+
+    #
+    # Taskmaster interface subsystem
+    #
+
+    def make_ready(self):
+        """Get a Node ready for evaluation.
+
+        This is called before the Taskmaster decides if the Node is
+        up-to-date or not.  Overriding this method allows for a Node
+        subclass to be disambiguated if necessary, or for an implicit
+        source builder to be attached.
+        """
+        pass
+
+    def prepare(self):
+        """Prepare for this Node to be built.
+
+        This is called after the Taskmaster has decided that the Node
+        is out-of-date and must be rebuilt, but before actually calling
+        the method to build the Node.
+
+        This default implementation checks that explicit or implicit
+        dependencies either exist or are derived, and initializes the
+        BuildInfo structure that will hold the information about how
+        this node is, uh, built.
+
+        (The existence of source files is checked separately by the
+        Executor, which aggregates checks for all of the targets built
+        by a specific action.)
+
+        Overriding this method allows for for a Node subclass to remove
+        the underlying file from the file system.  Note that subclass
+        methods should call this base class method to get the child
+        check and the BuildInfo structure.
+        """
+        for d in self.depends:
+            if d.missing():
+                msg = "Explicit dependency `%s' not found, needed by target `%s'."
+                raise SCons.Errors.StopError(msg % (d, self))
+        if self.implicit is not None:
+            for i in self.implicit:
+                if i.missing():
+                    msg = "Implicit dependency `%s' not found, needed by target `%s'."
+                    raise SCons.Errors.StopError(msg % (i, self))
+        self.binfo = self.get_binfo()
+
+    def build(self, **kw):
+        """Actually build the node.
+
+        This is called by the Taskmaster after it's decided that the
+        Node is out-of-date and must be rebuilt, and after the prepare()
+        method has gotten everything, uh, prepared.
+
+        This method is called from multiple threads in a parallel build,
+        so only do thread safe stuff here. Do thread unsafe stuff
+        in built().
+
+        """
+        try:
+            self.get_executor()(self, **kw)
+        except SCons.Errors.BuildError, e:
+            e.node = self
+            raise
+
+    def built(self):
+        """Called just after this node is successfully built."""
+
+        # Clear the implicit dependency caches of any Nodes
+        # waiting for this Node to be built.
+        for parent in self.waiting_parents:
+            parent.implicit = None
+
+        self.clear()
+
+        self.ninfo.update(self)
+
+    def visited(self):
+        """Called just after this node has been visited (with or
+        without a build)."""
+        try:
+            binfo = self.binfo
+        except AttributeError:
+            # Apparently this node doesn't need build info, so
+            # don't bother calculating or storing it.
+            pass
+        else:
+            self.ninfo.update(self)
+            self.store_info()
+
+    #
+    #
+    #
+
+    def add_to_waiting_s_e(self, node):
+        self.waiting_s_e.add(node)
+
+    def add_to_waiting_parents(self, node):
+        """
+        Returns the number of nodes added to our waiting parents list:
+        1 if we add a unique waiting parent, 0 if not.  (Note that the
+        returned values are intended to be used to increment a reference
+        count, so don't think you can "clean up" this function by using
+        True and False instead...)
+        """
+        wp = self.waiting_parents
+        if node in wp:
+            return 0
+        wp.add(node)
+        return 1
+
+    def postprocess(self):
+        """Clean up anything we don't need to hang onto after we've
+        been built."""
+        self.executor_cleanup()
+        self.waiting_parents = set()
+
+    def clear(self):
+        """Completely clear a Node of all its cached state (so that it
+        can be re-evaluated by interfaces that do continuous integration
+        builds).
+        """
+        # The del_binfo() call here isn't necessary for normal execution,
+        # but is for interactive mode, where we might rebuild the same
+        # target and need to start from scratch.
+        self.del_binfo()
+        self.clear_memoized_values()
+        self.ninfo = self.new_ninfo()
+        self.executor_cleanup()
+        try:
+            delattr(self, '_calculated_sig')
+        except AttributeError:
+            pass
+        self.includes = None
+
+    def clear_memoized_values(self):
+        self._memo = {}
+
+    def builder_set(self, builder):
+        self.builder = builder
+        try:
+            del self.executor
+        except AttributeError:
+            pass
+
+    def has_builder(self):
+        """Return whether this Node has a builder or not.
+
+        In Boolean tests, this turns out to be a *lot* more efficient
+        than simply examining the builder attribute directly ("if
+        node.builder: ..."). When the builder attribute is examined
+        directly, it ends up calling __getattr__ for both the __len__
+        and __nonzero__ attributes on instances of our Builder Proxy
+        class(es), generating a bazillion extra calls and slowing
+        things down immensely.
+        """
+        try:
+            b = self.builder
+        except AttributeError:
+            # There was no explicit builder for this Node, so initialize
+            # the self.builder attribute to None now.
+            b = self.builder = None
+        return b is not None
+
+    def set_explicit(self, is_explicit):
+        self.is_explicit = is_explicit
+
+    def has_explicit_builder(self):
+        """Return whether this Node has an explicit builder
+
+        This allows an internal Builder created by SCons to be marked
+        non-explicit, so that it can be overridden by an explicit
+        builder that the user supplies (the canonical example being
+        directories)."""
+        try:
+            return self.is_explicit
+        except AttributeError:
+            self.is_explicit = None
+            return self.is_explicit
+
+    def get_builder(self, default_builder=None):
+        """Return the set builder, or a specified default value"""
+        try:
+            return self.builder
+        except AttributeError:
+            return default_builder
+
+    multiple_side_effect_has_builder = has_builder
+
+    def is_derived(self):
+        """
+        Returns true iff this node is derived (i.e. built).
+
+        This should return true only for nodes whose path should be in
+        the variant directory when duplicate=0 and should contribute their build
+        signatures when they are used as source files to other derived files. For
+        example: source with source builders are not derived in this sense,
+        and hence should not return true.
+        """
+        return self.has_builder() or self.side_effect
+
+    def alter_targets(self):
+        """Return a list of alternate targets for this Node.
+        """
+        return [], None
+
+    def get_found_includes(self, env, scanner, path):
+        """Return the scanned include lines (implicit dependencies)
+        found in this node.
+
+        The default is no implicit dependencies.  We expect this method
+        to be overridden by any subclass that can be scanned for
+        implicit dependencies.
+        """
+        return []
+
+    def get_implicit_deps(self, env, scanner, path):
+        """Return a list of implicit dependencies for this node.
+
+        This method exists to handle recursive invocation of the scanner
+        on the implicit dependencies returned by the scanner, if the
+        scanner's recursive flag says that we should.
+        """
+        if not scanner:
+            return []
+
+        # Give the scanner a chance to select a more specific scanner
+        # for this Node.
+        #scanner = scanner.select(self)
+
+        nodes = [self]
+        seen = {}
+        seen[self] = 1
+        deps = []
+        while nodes:
+            n = nodes.pop(0)
+            d = [x for x in n.get_found_includes(env, scanner, path) if x not in seen]
+            if d:
+                deps.extend(d)
+                for n in d:
+                    seen[n] = 1
+                nodes.extend(scanner.recurse_nodes(d))
+
+        return deps
+
+    def get_env_scanner(self, env, kw={}):
+        return env.get_scanner(self.scanner_key())
+
+    def get_target_scanner(self):
+        return self.builder.target_scanner
+
+    def get_source_scanner(self, node):
+        """Fetch the source scanner for the specified node
+
+        NOTE:  "self" is the target being built, "node" is
+        the source file for which we want to fetch the scanner.
+
+        Implies self.has_builder() is true; again, expect to only be
+        called from locations where this is already verified.
+
+        This function may be called very often; it attempts to cache
+        the scanner found to improve performance.
+        """
+        scanner = None
+        try:
+            scanner = self.builder.source_scanner
+        except AttributeError:
+            pass
+        if not scanner:
+            # The builder didn't have an explicit scanner, so go look up
+            # a scanner from env['SCANNERS'] based on the node's scanner
+            # key (usually the file extension).
+            scanner = self.get_env_scanner(self.get_build_env())
+        if scanner:
+            scanner = scanner.select(node)
+        return scanner
+
+    def add_to_implicit(self, deps):
+        if not hasattr(self, 'implicit') or self.implicit is None:
+            self.implicit = []
+            self.implicit_set = set()
+            self._children_reset()
+        self._add_child(self.implicit, self.implicit_set, deps)
+
+    def scan(self):
+        """Scan this node's dependents for implicit dependencies."""
+        # Don't bother scanning non-derived files, because we don't
+        # care what their dependencies are.
+        # Don't scan again, if we already have scanned.
+        if self.implicit is not None:
+            return
+        self.implicit = []
+        self.implicit_set = set()
+        self._children_reset()
+        if not self.has_builder():
+            return
+
+        build_env = self.get_build_env()
+        executor = self.get_executor()
+
+        # Here's where we implement --implicit-cache.
+        if implicit_cache and not implicit_deps_changed:
+            implicit = self.get_stored_implicit()
+            if implicit is not None:
+                # We now add the implicit dependencies returned from the
+                # stored .sconsign entry to have already been converted
+                # to Nodes for us.  (We used to run them through a
+                # source_factory function here.)
+
+                # Update all of the targets with them.  This
+                # essentially short-circuits an N*M scan of the
+                # sources for each individual target, which is a hell
+                # of a lot more efficient.
+                for tgt in executor.get_all_targets():
+                    tgt.add_to_implicit(implicit)
+
+                if implicit_deps_unchanged or self.is_up_to_date():
+                    return
+                # one of this node's sources has changed,
+                # so we must recalculate the implicit deps for all targets
+                for tgt in executor.get_all_targets():
+                    tgt.implicit = []
+                    tgt.implicit_set = set()
+
+        # Have the executor scan the sources.
+        executor.scan_sources(self.builder.source_scanner)
+
+        # If there's a target scanner, have the executor scan the target
+        # node itself and associated targets that might be built.
+        scanner = self.get_target_scanner()
+        if scanner:
+            executor.scan_targets(scanner)
+
+    def scanner_key(self):
+        return None
+
+    def select_scanner(self, scanner):
+        """Selects a scanner for this Node.
+
+        This is a separate method so it can be overridden by Node
+        subclasses (specifically, Node.FS.Dir) that *must* use their
+        own Scanner and don't select one the Scanner.Selector that's
+        configured for the target.
+        """
+        return scanner.select(self)
+
+    def env_set(self, env, safe=0):
+        if safe and self.env:
+            return
+        self.env = env
+
+    #
+    # SIGNATURE SUBSYSTEM
+    #
+
+    NodeInfo = NodeInfoBase
+    BuildInfo = BuildInfoBase
+
+    def new_ninfo(self):
+        ninfo = self.NodeInfo(self)
+        return ninfo
+
+    def get_ninfo(self):
+        try:
+            return self.ninfo
+        except AttributeError:
+            self.ninfo = self.new_ninfo()
+            return self.ninfo
+
+    def new_binfo(self):
+        binfo = self.BuildInfo(self)
+        return binfo
+
+    def get_binfo(self):
+        """
+        Fetch a node's build information.
+
+        node - the node whose sources will be collected
+        cache - alternate node to use for the signature cache
+        returns - the build signature
+
+        This no longer handles the recursive descent of the
+        node's children's signatures.  We expect that they're
+        already built and updated by someone else, if that's
+        what's wanted.
+        """
+        try:
+            return self.binfo
+        except AttributeError:
+            pass
+
+        binfo = self.new_binfo()
+        self.binfo = binfo
+
+        executor = self.get_executor()
+        ignore_set = self.ignore_set
+
+        if self.has_builder():
+            binfo.bact = str(executor)
+            binfo.bactsig = SCons.Util.MD5signature(executor.get_contents())
+
+        if self._specific_sources:
+            sources = []
+            for s in self.sources:
+                if s not in ignore_set:
+                    sources.append(s)
+        else:
+            sources = executor.get_unignored_sources(self, self.ignore)
+        seen = set()
+        bsources = []
+        bsourcesigs = []
+        for s in sources:
+            if not s in seen:
+                seen.add(s)
+                bsources.append(s)
+                bsourcesigs.append(s.get_ninfo())
+        binfo.bsources = bsources
+        binfo.bsourcesigs = bsourcesigs
+
+        depends = self.depends
+        dependsigs = []
+        for d in depends:
+            if d not in ignore_set:
+                dependsigs.append(d.get_ninfo())
+        binfo.bdepends = depends
+        binfo.bdependsigs = dependsigs
+
+        implicit = self.implicit or []
+        implicitsigs = []
+        for i in implicit:
+            if i not in ignore_set:
+                implicitsigs.append(i.get_ninfo())
+        binfo.bimplicit = implicit
+        binfo.bimplicitsigs = implicitsigs
+
+        return binfo
+
+    def del_binfo(self):
+        """Delete the build info from this node."""
+        try:
+            delattr(self, 'binfo')
+        except AttributeError:
+            pass
+
+    def get_csig(self):
+        try:
+            return self.ninfo.csig
+        except AttributeError:
+            ninfo = self.get_ninfo()
+            ninfo.csig = SCons.Util.MD5signature(self.get_contents())
+            return self.ninfo.csig
+
+    def get_cachedir_csig(self):
+        return self.get_csig()
+
+    def store_info(self):
+        """Make the build signature permanent (that is, store it in the
+        .sconsign file or equivalent)."""
+        pass
+
+    def do_not_store_info(self):
+        pass
+
+    def get_stored_info(self):
+        return None
+
+    def get_stored_implicit(self):
+        """Fetch the stored implicit dependencies"""
+        return None
+
+    #
+    #
+    #
+
+    def set_precious(self, precious = 1):
+        """Set the Node's precious value."""
+        self.precious = precious
+
+    def set_noclean(self, noclean = 1):
+        """Set the Node's noclean value."""
+        # Make sure noclean is an integer so the --debug=stree
+        # output in Util.py can use it as an index.
+        self.noclean = noclean and 1 or 0
+
+    def set_nocache(self, nocache = 1):
+        """Set the Node's nocache value."""
+        # Make sure nocache is an integer so the --debug=stree
+        # output in Util.py can use it as an index.
+        self.nocache = nocache and 1 or 0
+
+    def set_always_build(self, always_build = 1):
+        """Set the Node's always_build value."""
+        self.always_build = always_build
+
+    def exists(self):
+        """Does this node exists?"""
+        # All node exist by default:
+        return 1
+
+    def rexists(self):
+        """Does this node exist locally or in a repositiory?"""
+        # There are no repositories by default:
+        return self.exists()
+
+    def missing(self):
+        return not self.is_derived() and \
+               not self.linked and \
+               not self.rexists()
+
+    def remove(self):
+        """Remove this Node:  no-op by default."""
+        return None
+
+    def add_dependency(self, depend):
+        """Adds dependencies."""
+        try:
+            self._add_child(self.depends, self.depends_set, depend)
+        except TypeError, e:
+            e = e.args[0]
+            if SCons.Util.is_List(e):
+                s = list(map(str, e))
+            else:
+                s = str(e)
+            raise SCons.Errors.UserError("attempted to add a non-Node dependency to %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e)))
+
+    def add_prerequisite(self, prerequisite):
+        """Adds prerequisites"""
+        self.prerequisites.extend(prerequisite)
+        self._children_reset()
+
+    def add_ignore(self, depend):
+        """Adds dependencies to ignore."""
+        try:
+            self._add_child(self.ignore, self.ignore_set, depend)
+        except TypeError, e:
+            e = e.args[0]
+            if SCons.Util.is_List(e):
+                s = list(map(str, e))
+            else:
+                s = str(e)
+            raise SCons.Errors.UserError("attempted to ignore a non-Node dependency of %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e)))
+
+    def add_source(self, source):
+        """Adds sources."""
+        if self._specific_sources:
+            return
+        try:
+            self._add_child(self.sources, self.sources_set, source)
+        except TypeError, e:
+            e = e.args[0]
+            if SCons.Util.is_List(e):
+                s = list(map(str, e))
+            else:
+                s = str(e)
+            raise SCons.Errors.UserError("attempted to add a non-Node as source of %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e)))
+
+    def _add_child(self, collection, set, child):
+        """Adds 'child' to 'collection', first checking 'set' to see if it's
+        already present."""
+        #if type(child) is not type([]):
+        #    child = [child]
+        #for c in child:
+        #    if not isinstance(c, Node):
+        #        raise TypeError, c
+        added = None
+        for c in child:
+            if c not in set:
+                set.add(c)
+                collection.append(c)
+                added = 1
+        if added:
+            self._children_reset()
+
+    def set_specific_source(self, source):
+        self.add_source(source)
+        self._specific_sources = True
+
+    def add_wkid(self, wkid):
+        """Add a node to the list of kids waiting to be evaluated"""
+        if self.wkids is not None:
+            self.wkids.append(wkid)
+
+    def _children_reset(self):
+        self.clear_memoized_values()
+        # We need to let the Executor clear out any calculated
+        # build info that it's cached so we can re-calculate it.
+        self.executor_cleanup()
+
+    memoizer_counters.append(SCons.Memoize.CountValue('_children_get'))
+
+    def _children_get(self):
+        try:
+            return self._memo['children_get']
+        except KeyError:
+            pass
+
+        # The return list may contain duplicate Nodes, especially in
+        # source trees where there are a lot of repeated #includes
+        # of a tangle of .h files.  Profiling shows, however, that
+        # eliminating the duplicates with a brute-force approach that
+        # preserves the order (that is, something like:
+        #
+        #       u = []
+        #       for n in list:
+        #           if n not in u:
+        #               u.append(n)"
+        #
+        # takes more cycles than just letting the underlying methods
+        # hand back cached values if a Node's information is requested
+        # multiple times.  (Other methods of removing duplicates, like
+        # using dictionary keys, lose the order, and the only ordered
+        # dictionary patterns I found all ended up using "not in"
+        # internally anyway...)
+        if self.ignore_set:
+            if self.implicit is None:
+                iter = chain(self.sources,self.depends)
+            else:
+                iter = chain(self.sources, self.depends, self.implicit)
+
+            children = []
+            for i in iter:
+                if i not in self.ignore_set:
+                    children.append(i)
+        else:
+            if self.implicit is None:
+                children = self.sources + self.depends
+            else:
+                children = self.sources + self.depends + self.implicit
+
+        self._memo['children_get'] = children
+        return children
+
+    def all_children(self, scan=1):
+        """Return a list of all the node's direct children."""
+        if scan:
+            self.scan()
+
+        # The return list may contain duplicate Nodes, especially in
+        # source trees where there are a lot of repeated #includes
+        # of a tangle of .h files.  Profiling shows, however, that
+        # eliminating the duplicates with a brute-force approach that
+        # preserves the order (that is, something like:
+        #
+        #       u = []
+        #       for n in list:
+        #           if n not in u:
+        #               u.append(n)"
+        #
+        # takes more cycles than just letting the underlying methods
+        # hand back cached values if a Node's information is requested
+        # multiple times.  (Other methods of removing duplicates, like
+        # using dictionary keys, lose the order, and the only ordered
+        # dictionary patterns I found all ended up using "not in"
+        # internally anyway...)
+        if self.implicit is None:
+            return self.sources + self.depends
+        else:
+            return self.sources + self.depends + self.implicit
+
+    def children(self, scan=1):
+        """Return a list of the node's direct children, minus those
+        that are ignored by this node."""
+        if scan:
+            self.scan()
+        return self._children_get()
+
+    def set_state(self, state):
+        self.state = state
+
+    def get_state(self):
+        return self.state
+
+    def state_has_changed(self, target, prev_ni):
+        return (self.state != SCons.Node.up_to_date)
+
+    def get_env(self):
+        env = self.env
+        if not env:
+            import SCons.Defaults
+            env = SCons.Defaults.DefaultEnvironment()
+        return env
+
+    def changed_since_last_build(self, target, prev_ni):
+        """
+
+        Must be overridden in a specific subclass to return True if this
+        Node (a dependency) has changed since the last time it was used
+        to build the specified target.  prev_ni is this Node's state (for
+        example, its file timestamp, length, maybe content signature)
+        as of the last time the target was built.
+
+        Note that this method is called through the dependency, not the
+        target, because a dependency Node must be able to use its own
+        logic to decide if it changed.  For example, File Nodes need to
+        obey if we're configured to use timestamps, but Python Value Nodes
+        never use timestamps and always use the content.  If this method
+        were called through the target, then each Node's implementation
+        of this method would have to have more complicated logic to
+        handle all the different Node types on which it might depend.
+        """
+        raise NotImplementedError
+
+    def Decider(self, function):
+        SCons.Util.AddMethod(self, function, 'changed_since_last_build')
+
+    def changed(self, node=None):
+        """
+        Returns if the node is up-to-date with respect to the BuildInfo
+        stored last time it was built.  The default behavior is to compare
+        it against our own previously stored BuildInfo, but the stored
+        BuildInfo from another Node (typically one in a Repository)
+        can be used instead.
+
+        Note that we now *always* check every dependency.  We used to
+        short-circuit the check by returning as soon as we detected
+        any difference, but we now rely on checking every dependency
+        to make sure that any necessary Node information (for example,
+        the content signature of an #included .h file) is updated.
+        """
+        t = 0
+        if t: Trace('changed(%s [%s], %s)' % (self, classname(self), node))
+        if node is None:
+            node = self
+
+        result = False
+
+        bi = node.get_stored_info().binfo
+        then = bi.bsourcesigs + bi.bdependsigs + bi.bimplicitsigs
+        children = self.children()
+
+        diff = len(children) - len(then)
+        if diff:
+            # The old and new dependency lists are different lengths.
+            # This always indicates that the Node must be rebuilt.
+            # We also extend the old dependency list with enough None
+            # entries to equal the new dependency list, for the benefit
+            # of the loop below that updates node information.
+            then.extend([None] * diff)
+            if t: Trace(': old %s new %s' % (len(then), len(children)))
+            result = True
+
+        for child, prev_ni in zip(children, then):
+            if child.changed_since_last_build(self, prev_ni):
+                if t: Trace(': %s changed' % child)
+                result = True
+
+        contents = self.get_executor().get_contents()
+        if self.has_builder():
+            import SCons.Util
+            newsig = SCons.Util.MD5signature(contents)
+            if bi.bactsig != newsig:
+                if t: Trace(': bactsig %s != newsig %s' % (bi.bactsig, newsig))
+                result = True
+
+        if not result:
+            if t: Trace(': up to date')
+
+        if t: Trace('\n')
+
+        return result
+
+    def is_up_to_date(self):
+        """Default check for whether the Node is current: unknown Node
+        subtypes are always out of date, so they will always get built."""
+        return None
+
+    def children_are_up_to_date(self):
+        """Alternate check for whether the Node is current:  If all of
+        our children were up-to-date, then this Node was up-to-date, too.
+
+        The SCons.Node.Alias and SCons.Node.Python.Value subclasses
+        rebind their current() method to this method."""
+        # Allow the children to calculate their signatures.
+        self.binfo = self.get_binfo()
+        if self.always_build:
+            return None
+        state = 0
+        for kid in self.children(None):
+            s = kid.get_state()
+            if s and (not state or s > state):
+                state = s
+        return (state == 0 or state == SCons.Node.up_to_date)
+
+    def is_literal(self):
+        """Always pass the string representation of a Node to
+        the command interpreter literally."""
+        return 1
+
+    def render_include_tree(self):
+        """
+        Return a text representation, suitable for displaying to the
+        user, of the include tree for the sources of this node.
+        """
+        if self.is_derived() and self.env:
+            env = self.get_build_env()
+            for s in self.sources:
+                scanner = self.get_source_scanner(s)
+                if scanner:
+                    path = self.get_build_scanner_path(scanner)
+                else:
+                    path = None
+                def f(node, env=env, scanner=scanner, path=path):
+                    return node.get_found_includes(env, scanner, path)
+                return SCons.Util.render_tree(s, f, 1)
+        else:
+            return None
+
+    def get_abspath(self):
+        """
+        Return an absolute path to the Node.  This will return simply
+        str(Node) by default, but for Node types that have a concept of
+        relative path, this might return something different.
+        """
+        return str(self)
+
+    def for_signature(self):
+        """
+        Return a string representation of the Node that will always
+        be the same for this particular Node, no matter what.  This
+        is by contrast to the __str__() method, which might, for
+        instance, return a relative path for a file Node.  The purpose
+        of this method is to generate a value to be used in signature
+        calculation for the command line used to build a target, and
+        we use this method instead of str() to avoid unnecessary
+        rebuilds.  This method does not need to return something that
+        would actually work in a command line; it can return any kind of
+        nonsense, so long as it does not change.
+        """
+        return str(self)
+
+    def get_string(self, for_signature):
+        """This is a convenience function designed primarily to be
+        used in command generators (i.e., CommandGeneratorActions or
+        Environment variables that are callable), which are called
+        with a for_signature argument that is nonzero if the command
+        generator is being called to generate a signature for the
+        command line, which determines if we should rebuild or not.
+
+        Such command generators should use this method in preference
+        to str(Node) when converting a Node to a string, passing
+        in the for_signature parameter, such that we will call
+        Node.for_signature() or str(Node) properly, depending on whether
+        we are calculating a signature or actually constructing a
+        command line."""
+        if for_signature:
+            return self.for_signature()
+        return str(self)
+
+    def get_subst_proxy(self):
+        """
+        This method is expected to return an object that will function
+        exactly like this Node, except that it implements any additional
+        special features that we would like to be in effect for
+        Environment variable substitution.  The principle use is that
+        some Nodes would like to implement a __getattr__() method,
+        but putting that in the Node type itself has a tendency to kill
+        performance.  We instead put it in a proxy and return it from
+        this method.  It is legal for this method to return self
+        if no new functionality is needed for Environment substitution.
+        """
+        return self
+
+    def explain(self):
+        if not self.exists():
+            return "building `%s' because it doesn't exist\n" % self
+
+        if self.always_build:
+            return "rebuilding `%s' because AlwaysBuild() is specified\n" % self
+
+        old = self.get_stored_info()
+        if old is None:
+            return None
+
+        old = old.binfo
+        old.prepare_dependencies()
+
+        try:
+            old_bkids    = old.bsources    + old.bdepends    + old.bimplicit
+            old_bkidsigs = old.bsourcesigs + old.bdependsigs + old.bimplicitsigs
+        except AttributeError:
+            return "Cannot explain why `%s' is being rebuilt: No previous build information found\n" % self
+
+        new = self.get_binfo()
+
+        new_bkids    = new.bsources    + new.bdepends    + new.bimplicit
+        new_bkidsigs = new.bsourcesigs + new.bdependsigs + new.bimplicitsigs
+
+        osig = dict(zip(old_bkids, old_bkidsigs))
+        nsig = dict(zip(new_bkids, new_bkidsigs))
+
+        # The sources and dependencies we'll want to report are all stored
+        # as relative paths to this target's directory, but we want to
+        # report them relative to the top-level SConstruct directory,
+        # so we only print them after running them through this lambda
+        # to turn them into the right relative Node and then return
+        # its string.
+        def stringify( s, E=self.dir.Entry ) :
+            if hasattr( s, 'dir' ) :
+                return str(E(s))
+            return str(s)
+
+        lines = []
+
+        removed = [x for x in old_bkids if not x in new_bkids]
+        if removed:
+            removed = list(map(stringify, removed))
+            fmt = "`%s' is no longer a dependency\n"
+            lines.extend([fmt % s for s in removed])
+
+        for k in new_bkids:
+            if not k in old_bkids:
+                lines.append("`%s' is a new dependency\n" % stringify(k))
+            elif k.changed_since_last_build(self, osig[k]):
+                lines.append("`%s' changed\n" % stringify(k))
+
+        if len(lines) == 0 and old_bkids != new_bkids:
+            lines.append("the dependency order changed:\n" +
+                         "%sold: %s\n" % (' '*15, list(map(stringify, old_bkids))) +
+                         "%snew: %s\n" % (' '*15, list(map(stringify, new_bkids))))
+
+        if len(lines) == 0:
+            def fmt_with_title(title, strlines):
+                lines = strlines.split('\n')
+                sep = '\n' + ' '*(15 + len(title))
+                return ' '*15 + title + sep.join(lines) + '\n'
+            if old.bactsig != new.bactsig:
+                if old.bact == new.bact:
+                    lines.append("the contents of the build action changed\n" +
+                                 fmt_with_title('action: ', new.bact))
+                else:
+                    lines.append("the build action changed:\n" +
+                                 fmt_with_title('old: ', old.bact) +
+                                 fmt_with_title('new: ', new.bact))
+
+        if len(lines) == 0:
+            return "rebuilding `%s' for unknown reasons\n" % self
+
+        preamble = "rebuilding `%s' because" % self
+        if len(lines) == 1:
+            return "%s %s"  % (preamble, lines[0])
+        else:
+            lines = ["%s:\n" % preamble] + lines
+            return ( ' '*11).join(lines)
+
+class NodeList(collections.UserList):
+    def __str__(self):
+        return str(list(map(str, self.data)))
+
+def get_children(node, parent): return node.children()
+def ignore_cycle(node, stack): pass
+def do_nothing(node, parent): pass
+
+class Walker(object):
+    """An iterator for walking a Node tree.
+
+    This is depth-first, children are visited before the parent.
+    The Walker object can be initialized with any node, and
+    returns the next node on the descent with each get_next() call.
+    'kids_func' is an optional function that will be called to
+    get the children of a node instead of calling 'children'.
+    'cycle_func' is an optional function that will be called
+    when a cycle is detected.
+
+    This class does not get caught in node cycles caused, for example,
+    by C header file include loops.
+    """
+    def __init__(self, node, kids_func=get_children,
+                             cycle_func=ignore_cycle,
+                             eval_func=do_nothing):
+        self.kids_func = kids_func
+        self.cycle_func = cycle_func
+        self.eval_func = eval_func
+        node.wkids = copy.copy(kids_func(node, None))
+        self.stack = [node]
+        self.history = {} # used to efficiently detect and avoid cycles
+        self.history[node] = None
+
+    def get_next(self):
+        """Return the next node for this walk of the tree.
+
+        This function is intentionally iterative, not recursive,
+        to sidestep any issues of stack size limitations.
+        """
+
+        while self.stack:
+            if self.stack[-1].wkids:
+                node = self.stack[-1].wkids.pop(0)
+                if not self.stack[-1].wkids:
+                    self.stack[-1].wkids = None
+                if node in self.history:
+                    self.cycle_func(node, self.stack)
+                else:
+                    node.wkids = copy.copy(self.kids_func(node, self.stack[-1]))
+                    self.stack.append(node)
+                    self.history[node] = None
+            else:
+                node = self.stack.pop()
+                del self.history[node]
+                if node:
+                    if self.stack:
+                        parent = self.stack[-1]
+                    else:
+                        parent = None
+                    self.eval_func(node, parent)
+                return node
+        return None
+
+    def is_done(self):
+        return not self.stack
+
+
+arg2nodes_lookups = []
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Options/BoolOption.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Options/BoolOption.py
new file mode 100644
index 0000000..83b778d
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Options/BoolOption.py
@@ -0,0 +1,50 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Options/BoolOption.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__doc__ = """Place-holder for the old SCons.Options module hierarchy
+
+This is for backwards compatibility.  The new equivalent is the Variables/
+class hierarchy.  These will have deprecation warnings added (some day),
+and will then be removed entirely (some day).
+"""
+
+import SCons.Variables
+import SCons.Warnings
+
+warned = False
+
+def BoolOption(*args, **kw):
+    global warned
+    if not warned:
+        msg = "The BoolOption() function is deprecated; use the BoolVariable() function instead."
+        SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg)
+        warned = True
+    return SCons.Variables.BoolVariable(*args, **kw)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Options/EnumOption.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Options/EnumOption.py
new file mode 100644
index 0000000..9a808c4
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Options/EnumOption.py
@@ -0,0 +1,50 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Options/EnumOption.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__doc__ = """Place-holder for the old SCons.Options module hierarchy
+
+This is for backwards compatibility.  The new equivalent is the Variables/
+class hierarchy.  These will have deprecation warnings added (some day),
+and will then be removed entirely (some day).
+"""
+
+import SCons.Variables
+import SCons.Warnings
+
+warned = False
+
+def EnumOption(*args, **kw):
+    global warned
+    if not warned:
+        msg = "The EnumOption() function is deprecated; use the EnumVariable() function instead."
+        SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg)
+        warned = True
+    return SCons.Variables.EnumVariable(*args, **kw)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Options/ListOption.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Options/ListOption.py
new file mode 100644
index 0000000..0c81eb6
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Options/ListOption.py
@@ -0,0 +1,50 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Options/ListOption.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__doc__ = """Place-holder for the old SCons.Options module hierarchy
+
+This is for backwards compatibility.  The new equivalent is the Variables/
+class hierarchy.  These will have deprecation warnings added (some day),
+and will then be removed entirely (some day).
+"""
+
+import SCons.Variables
+import SCons.Warnings
+
+warned = False
+
+def ListOption(*args, **kw):
+    global warned
+    if not warned:
+        msg = "The ListOption() function is deprecated; use the ListVariable() function instead."
+        SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg)
+        warned = True
+    return SCons.Variables.ListVariable(*args, **kw)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Options/PackageOption.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Options/PackageOption.py
new file mode 100644
index 0000000..432765b
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Options/PackageOption.py
@@ -0,0 +1,50 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Options/PackageOption.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__doc__ = """Place-holder for the old SCons.Options module hierarchy
+
+This is for backwards compatibility.  The new equivalent is the Variables/
+class hierarchy.  These will have deprecation warnings added (some day),
+and will then be removed entirely (some day).
+"""
+
+import SCons.Variables
+import SCons.Warnings
+
+warned = False
+
+def PackageOption(*args, **kw):
+    global warned
+    if not warned:
+        msg = "The PackageOption() function is deprecated; use the PackageVariable() function instead."
+        SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg)
+        warned = True
+    return SCons.Variables.PackageVariable(*args, **kw)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Options/PathOption.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Options/PathOption.py
new file mode 100644
index 0000000..1e3282a
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Options/PathOption.py
@@ -0,0 +1,76 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Options/PathOption.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__doc__ = """Place-holder for the old SCons.Options module hierarchy
+
+This is for backwards compatibility.  The new equivalent is the Variables/
+class hierarchy.  These will have deprecation warnings added (some day),
+and will then be removed entirely (some day).
+"""
+
+import SCons.Variables
+import SCons.Warnings
+
+warned = False
+
+class _PathOptionClass(object):
+    def warn(self):
+        global warned
+        if not warned:
+            msg = "The PathOption() function is deprecated; use the PathVariable() function instead."
+            SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg)
+            warned = True
+
+    def __call__(self, *args, **kw):
+        self.warn()
+        return SCons.Variables.PathVariable(*args, **kw)
+
+    def PathAccept(self, *args, **kw):
+        self.warn()
+        return SCons.Variables.PathVariable.PathAccept(*args, **kw)
+
+    def PathIsDir(self, *args, **kw):
+        self.warn()
+        return SCons.Variables.PathVariable.PathIsDir(*args, **kw)
+
+    def PathIsDirCreate(self, *args, **kw):
+        self.warn()
+        return SCons.Variables.PathVariable.PathIsDirCreate(*args, **kw)
+
+    def PathIsFile(self, *args, **kw):
+        self.warn()
+        return SCons.Variables.PathVariable.PathIsFile(*args, **kw)
+
+    def PathExists(self, *args, **kw):
+        self.warn()
+        return SCons.Variables.PathVariable.PathExists(*args, **kw)
+
+PathOption = _PathOptionClass()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Options/__init__.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Options/__init__.py
new file mode 100644
index 0000000..dec4d2e
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Options/__init__.py
@@ -0,0 +1,67 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Options/__init__.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__doc__ = """Place-holder for the old SCons.Options module hierarchy
+
+This is for backwards compatibility.  The new equivalent is the Variables/
+class hierarchy.  These will have deprecation warnings added (some day),
+and will then be removed entirely (some day).
+"""
+
+import SCons.Variables
+import SCons.Warnings
+
+from BoolOption import BoolOption  # okay
+from EnumOption import EnumOption  # okay
+from ListOption import ListOption  # naja
+from PackageOption import PackageOption # naja
+from PathOption import PathOption # okay
+
+warned = False
+
+class Options(SCons.Variables.Variables):
+    def __init__(self, *args, **kw):
+        global warned
+        if not warned:
+            msg = "The Options class is deprecated; use the Variables class instead."
+            SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg)
+            warned = True
+        SCons.Variables.Variables.__init__(self, *args, **kw)
+
+    def AddOptions(self, *args, **kw):
+        return SCons.Variables.Variables.AddVariables(self, *args, **kw)
+
+    def UnknownOptions(self, *args, **kw):
+        return SCons.Variables.Variables.UnknownVariables(self, *args, **kw)
+
+    def FormatOptionHelpText(self, *args, **kw):
+        return SCons.Variables.Variables.FormatVariableHelpText(self, *args,
+                     **kw)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/PathList.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/PathList.py
new file mode 100644
index 0000000..4fcbaa0
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/PathList.py
@@ -0,0 +1,231 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/PathList.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__doc__ = """SCons.PathList
+
+A module for handling lists of directory paths (the sort of things
+that get set as CPPPATH, LIBPATH, etc.) with as much caching of data and
+efficiency as we can while still keeping the evaluation delayed so that we
+Do the Right Thing (almost) regardless of how the variable is specified.
+
+"""
+
+import os
+
+import SCons.Memoize
+import SCons.Node
+import SCons.Util
+
+#
+# Variables to specify the different types of entries in a PathList object:
+#
+
+TYPE_STRING_NO_SUBST = 0        # string with no '$'
+TYPE_STRING_SUBST = 1           # string containing '$'
+TYPE_OBJECT = 2                 # other object
+
+def node_conv(obj):
+    """
+    This is the "string conversion" routine that we have our substitutions
+    use to return Nodes, not strings.  This relies on the fact that an
+    EntryProxy object has a get() method that returns the underlying
+    Node that it wraps, which is a bit of architectural dependence
+    that we might need to break or modify in the future in response to
+    additional requirements.
+    """
+    try:
+        get = obj.get
+    except AttributeError:
+        if isinstance(obj, SCons.Node.Node) or SCons.Util.is_Sequence( obj ):
+            result = obj
+        else:
+            result = str(obj)
+    else:
+        result = get()
+    return result
+
+class _PathList(object):
+    """
+    An actual PathList object.
+    """
+    def __init__(self, pathlist):
+        """
+        Initializes a PathList object, canonicalizing the input and
+        pre-processing it for quicker substitution later.
+
+        The stored representation of the PathList is a list of tuples
+        containing (type, value), where the "type" is one of the TYPE_*
+        variables defined above.  We distinguish between:
+
+            strings that contain no '$' and therefore need no
+            delayed-evaluation string substitution (we expect that there
+            will be many of these and that we therefore get a pretty
+            big win from avoiding string substitution)
+
+            strings that contain '$' and therefore need substitution
+            (the hard case is things like '${TARGET.dir}/include',
+            which require re-evaluation for every target + source)
+
+            other objects (which may be something like an EntryProxy
+            that needs a method called to return a Node)
+
+        Pre-identifying the type of each element in the PathList up-front
+        and storing the type in the list of tuples is intended to reduce
+        the amount of calculation when we actually do the substitution
+        over and over for each target.
+        """
+        if SCons.Util.is_String(pathlist):
+            pathlist = pathlist.split(os.pathsep)
+        elif not SCons.Util.is_Sequence(pathlist):
+            pathlist = [pathlist]
+
+        pl = []
+        for p in pathlist:
+            try:
+                index = p.find('$')
+            except (AttributeError, TypeError):
+                type = TYPE_OBJECT
+            else:
+                if index == -1:
+                    type = TYPE_STRING_NO_SUBST
+                else:
+                    type = TYPE_STRING_SUBST
+            pl.append((type, p))
+
+        self.pathlist = tuple(pl)
+
+    def __len__(self): return len(self.pathlist)
+
+    def __getitem__(self, i): return self.pathlist[i]
+
+    def subst_path(self, env, target, source):
+        """
+        Performs construction variable substitution on a pre-digested
+        PathList for a specific target and source.
+        """
+        result = []
+        for type, value in self.pathlist:
+            if type == TYPE_STRING_SUBST:
+                value = env.subst(value, target=target, source=source,
+                                  conv=node_conv)
+                if SCons.Util.is_Sequence(value):
+                    result.extend(value)
+                    continue
+                    
+            elif type == TYPE_OBJECT:
+                value = node_conv(value)
+            if value:
+                result.append(value)
+        return tuple(result)
+
+
+class PathListCache(object):
+    """
+    A class to handle caching of PathList lookups.
+
+    This class gets instantiated once and then deleted from the namespace,
+    so it's used as a Singleton (although we don't enforce that in the
+    usual Pythonic ways).  We could have just made the cache a dictionary
+    in the module namespace, but putting it in this class allows us to
+    use the same Memoizer pattern that we use elsewhere to count cache
+    hits and misses, which is very valuable.
+
+    Lookup keys in the cache are computed by the _PathList_key() method.
+    Cache lookup should be quick, so we don't spend cycles canonicalizing
+    all forms of the same lookup key.  For example, 'x:y' and ['x',
+    'y'] logically represent the same list, but we don't bother to
+    split string representations and treat those two equivalently.
+    (Note, however, that we do, treat lists and tuples the same.)
+
+    The main type of duplication we're trying to catch will come from
+    looking up the same path list from two different clones of the
+    same construction environment.  That is, given
+    
+        env2 = env1.Clone()
+
+    both env1 and env2 will have the same CPPPATH value, and we can
+    cheaply avoid re-parsing both values of CPPPATH by using the
+    common value from this cache.
+    """
+    if SCons.Memoize.use_memoizer:
+        __metaclass__ = SCons.Memoize.Memoized_Metaclass
+
+    memoizer_counters = []
+
+    def __init__(self):
+        self._memo = {}
+
+    def _PathList_key(self, pathlist):
+        """
+        Returns the key for memoization of PathLists.
+
+        Note that we want this to be pretty quick, so we don't completely
+        canonicalize all forms of the same list.  For example,
+        'dir1:$ROOT/dir2' and ['$ROOT/dir1', 'dir'] may logically
+        represent the same list if you're executing from $ROOT, but
+        we're not going to bother splitting strings into path elements,
+        or massaging strings into Nodes, to identify that equivalence.
+        We just want to eliminate obvious redundancy from the normal
+        case of re-using exactly the same cloned value for a path.
+        """
+        if SCons.Util.is_Sequence(pathlist):
+            pathlist = tuple(SCons.Util.flatten(pathlist))
+        return pathlist
+
+    memoizer_counters.append(SCons.Memoize.CountDict('PathList', _PathList_key))
+
+    def PathList(self, pathlist):
+        """
+        Returns the cached _PathList object for the specified pathlist,
+        creating and caching a new object as necessary.
+        """
+        pathlist = self._PathList_key(pathlist)
+        try:
+            memo_dict = self._memo['PathList']
+        except KeyError:
+            memo_dict = {}
+            self._memo['PathList'] = memo_dict
+        else:
+            try:
+                return memo_dict[pathlist]
+            except KeyError:
+                pass
+
+        result = _PathList(pathlist)
+
+        memo_dict[pathlist] = result
+
+        return result
+
+PathList = PathListCache().PathList
+
+
+del PathListCache
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/__init__.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/__init__.py
new file mode 100644
index 0000000..f1188c9
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/__init__.py
@@ -0,0 +1,241 @@
+"""SCons.Platform
+
+SCons platform selection.
+
+This looks for modules that define a callable object that can modify a
+construction environment as appropriate for a given platform.
+
+Note that we take a more simplistic view of "platform" than Python does.
+We're looking for a single string that determines a set of
+tool-independent variables with which to initialize a construction
+environment.  Consequently, we'll examine both sys.platform and os.name
+(and anything else that might come in to play) in order to return some
+specification which is unique enough for our purposes.
+
+Note that because this subsysem just *selects* a callable that can
+modify a construction environment, it's possible for people to define
+their own "platform specification" in an arbitrary callable function.
+No one needs to use or tie in to this subsystem in order to roll
+their own platform definition.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# 
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Platform/__init__.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.compat
+
+import imp
+import os
+import sys
+import tempfile
+
+import SCons.Errors
+import SCons.Subst
+import SCons.Tool
+
+def platform_default():
+    """Return the platform string for our execution environment.
+
+    The returned value should map to one of the SCons/Platform/*.py
+    files.  Since we're architecture independent, though, we don't
+    care about the machine architecture.
+    """
+    osname = os.name
+    if osname == 'java':
+        osname = os._osType
+    if osname == 'posix':
+        if sys.platform == 'cygwin':
+            return 'cygwin'
+        elif sys.platform.find('irix') != -1:
+            return 'irix'
+        elif sys.platform.find('sunos') != -1:
+            return 'sunos'
+        elif sys.platform.find('hp-ux') != -1:
+            return 'hpux'
+        elif sys.platform.find('aix') != -1:
+            return 'aix'
+        elif sys.platform.find('darwin') != -1:
+            return 'darwin'
+        else:
+            return 'posix'
+    elif os.name == 'os2':
+        return 'os2'
+    else:
+        return sys.platform
+
+def platform_module(name = platform_default()):
+    """Return the imported module for the platform.
+
+    This looks for a module name that matches the specified argument.
+    If the name is unspecified, we fetch the appropriate default for
+    our execution environment.
+    """
+    full_name = 'SCons.Platform.' + name
+    if full_name not in sys.modules:
+        if os.name == 'java':
+            eval(full_name)
+        else:
+            try:
+                file, path, desc = imp.find_module(name,
+                                        sys.modules['SCons.Platform'].__path__)
+                try:
+                    mod = imp.load_module(full_name, file, path, desc)
+                finally:
+                    if file:
+                        file.close()
+            except ImportError:
+                try:
+                    import zipimport
+                    importer = zipimport.zipimporter( sys.modules['SCons.Platform'].__path__[0] )
+                    mod = importer.load_module(full_name)
+                except ImportError:
+                    raise SCons.Errors.UserError("No platform named '%s'" % name)
+            setattr(SCons.Platform, name, mod)
+    return sys.modules[full_name]
+
+def DefaultToolList(platform, env):
+    """Select a default tool list for the specified platform.
+    """
+    return SCons.Tool.tool_list(platform, env)
+
+class PlatformSpec(object):
+    def __init__(self, name, generate):
+        self.name = name
+        self.generate = generate
+
+    def __call__(self, *args, **kw):
+        return self.generate(*args, **kw)
+
+    def __str__(self):
+        return self.name
+        
+class TempFileMunge(object):
+    """A callable class.  You can set an Environment variable to this,
+    then call it with a string argument, then it will perform temporary
+    file substitution on it.  This is used to circumvent the long command
+    line limitation.
+
+    Example usage:
+    env["TEMPFILE"] = TempFileMunge
+    env["LINKCOM"] = "${TEMPFILE('$LINK $TARGET $SOURCES')}"
+
+    By default, the name of the temporary file used begins with a
+    prefix of '@'.  This may be configred for other tool chains by
+    setting '$TEMPFILEPREFIX'.
+
+    env["TEMPFILEPREFIX"] = '-@'        # diab compiler
+    env["TEMPFILEPREFIX"] = '-via'      # arm tool chain
+    """
+    def __init__(self, cmd):
+        self.cmd = cmd
+
+    def __call__(self, target, source, env, for_signature):
+        if for_signature:
+            # If we're being called for signature calculation, it's
+            # because we're being called by the string expansion in
+            # Subst.py, which has the logic to strip any $( $) that
+            # may be in the command line we squirreled away.  So we
+            # just return the raw command line and let the upper
+            # string substitution layers do their thing.
+            return self.cmd
+
+        # Now we're actually being called because someone is actually
+        # going to try to execute the command, so we have to do our
+        # own expansion.
+        cmd = env.subst_list(self.cmd, SCons.Subst.SUBST_CMD, target, source)[0]
+        try:
+            maxline = int(env.subst('$MAXLINELENGTH'))
+        except ValueError:
+            maxline = 2048
+
+        length = 0
+        for c in cmd:
+            length += len(c)
+        if length <= maxline:
+            return self.cmd
+
+        # We do a normpath because mktemp() has what appears to be
+        # a bug in Windows that will use a forward slash as a path
+        # delimiter.  Windows's link mistakes that for a command line
+        # switch and barfs.
+        #
+        # We use the .lnk suffix for the benefit of the Phar Lap
+        # linkloc linker, which likes to append an .lnk suffix if
+        # none is given.
+        (fd, tmp) = tempfile.mkstemp('.lnk', text=True)
+        native_tmp = SCons.Util.get_native_path(os.path.normpath(tmp))
+
+        if env['SHELL'] and env['SHELL'] == 'sh':
+            # The sh shell will try to escape the backslashes in the
+            # path, so unescape them.
+            native_tmp = native_tmp.replace('\\', r'\\\\')
+            # In Cygwin, we want to use rm to delete the temporary
+            # file, because del does not exist in the sh shell.
+            rm = env.Detect('rm') or 'del'
+        else:
+            # Don't use 'rm' if the shell is not sh, because rm won't
+            # work with the Windows shells (cmd.exe or command.com) or
+            # Windows path names.
+            rm = 'del'
+
+        prefix = env.subst('$TEMPFILEPREFIX')
+        if not prefix:
+            prefix = '@'
+
+        args = list(map(SCons.Subst.quote_spaces, cmd[1:]))
+        os.write(fd, " ".join(args) + "\n")
+        os.close(fd)
+        # XXX Using the SCons.Action.print_actions value directly
+        # like this is bogus, but expedient.  This class should
+        # really be rewritten as an Action that defines the
+        # __call__() and strfunction() methods and lets the
+        # normal action-execution logic handle whether or not to
+        # print/execute the action.  The problem, though, is all
+        # of that is decided before we execute this method as
+        # part of expanding the $TEMPFILE construction variable.
+        # Consequently, refactoring this will have to wait until
+        # we get more flexible with allowing Actions to exist
+        # independently and get strung together arbitrarily like
+        # Ant tasks.  In the meantime, it's going to be more
+        # user-friendly to not let obsession with architectural
+        # purity get in the way of just being helpful, so we'll
+        # reach into SCons.Action directly.
+        if SCons.Action.print_actions:
+            print("Using tempfile "+native_tmp+" for command line:\n"+
+                  str(cmd[0]) + " " + " ".join(args))
+        return [ cmd[0], prefix + native_tmp + '\n' + rm, native_tmp ]
+    
+def Platform(name = platform_default()):
+    """Select a canned Platform specification.
+    """
+    module = platform_module(name)
+    spec = PlatformSpec(name, module.generate)
+    return spec
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/aix.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/aix.py
new file mode 100644
index 0000000..3273a93
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/aix.py
@@ -0,0 +1,69 @@
+"""engine.SCons.Platform.aix
+
+Platform-specific initialization for IBM AIX systems.
+
+There normally shouldn't be any need to import this module directly.  It
+will usually be imported through the generic SCons.Platform.Platform()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Platform/aix.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+
+import posix
+
+def get_xlc(env, xlc=None, xlc_r=None, packages=[]):
+    # Use the AIX package installer tool lslpp to figure out where a
+    # given xl* compiler is installed and what version it is.
+    xlcPath = None
+    xlcVersion = None
+
+    if xlc is None:
+        xlc = env.get('CC', 'xlc')
+    if xlc_r is None:
+        xlc_r = xlc + '_r'
+    for package in packages:
+        cmd = "lslpp -fc " + package + " 2>/dev/null | egrep '" + xlc + "([^-_a-zA-Z0-9].*)?$'"
+        line = os.popen(cmd).readline()
+        if line:
+            v, p = line.split(':')[1:3]
+            xlcVersion = v.split()[1]
+            xlcPath = p.split()[0]
+            xlcPath = xlcPath[:xlcPath.rindex('/')]
+            break
+    return (xlcPath, xlc, xlc_r, xlcVersion)
+
+def generate(env):
+    posix.generate(env)
+    #Based on AIX 5.2: ARG_MAX=24576 - 3000 for environment expansion
+    env['MAXLINELENGTH']  = 21576
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/cygwin.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/cygwin.py
new file mode 100644
index 0000000..072ae9c
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/cygwin.py
@@ -0,0 +1,55 @@
+"""SCons.Platform.cygwin
+
+Platform-specific initialization for Cygwin systems.
+
+There normally shouldn't be any need to import this module directly.  It
+will usually be imported through the generic SCons.Platform.Platform()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Platform/cygwin.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import posix
+from SCons.Platform import TempFileMunge
+
+def generate(env):
+    posix.generate(env)
+
+    env['PROGPREFIX']  = ''
+    env['PROGSUFFIX']  = '.exe'
+    env['SHLIBPREFIX'] = ''
+    env['SHLIBSUFFIX'] = '.dll'
+    env['LIBPREFIXES'] = [ '$LIBPREFIX', '$SHLIBPREFIX' ]
+    env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ]
+    env['TEMPFILE']    = TempFileMunge
+    env['TEMPFILEPREFIX'] = '@'
+    env['MAXLINELENGTH']  = 2048
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/darwin.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/darwin.py
new file mode 100644
index 0000000..e30aea3
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/darwin.py
@@ -0,0 +1,46 @@
+"""engine.SCons.Platform.darwin
+
+Platform-specific initialization for Mac OS X systems.
+
+There normally shouldn't be any need to import this module directly.  It
+will usually be imported through the generic SCons.Platform.Platform()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Platform/darwin.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import posix
+
+def generate(env):
+    posix.generate(env)
+    env['SHLIBSUFFIX'] = '.dylib'
+    env['ENV']['PATH'] = env['ENV']['PATH'] + ':/sw/bin'
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/hpux.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/hpux.py
new file mode 100644
index 0000000..9c3dd95
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/hpux.py
@@ -0,0 +1,46 @@
+"""engine.SCons.Platform.hpux
+
+Platform-specific initialization for HP-UX systems.
+
+There normally shouldn't be any need to import this module directly.  It
+will usually be imported through the generic SCons.Platform.Platform()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Platform/hpux.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import posix
+
+def generate(env):
+    posix.generate(env)
+    #Based on HP-UX11i: ARG_MAX=2048000 - 3000 for environment expansion
+    env['MAXLINELENGTH']  = 2045000
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/irix.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/irix.py
new file mode 100644
index 0000000..336ff69
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/irix.py
@@ -0,0 +1,44 @@
+"""SCons.Platform.irix
+
+Platform-specific initialization for SGI IRIX systems.
+
+There normally shouldn't be any need to import this module directly.  It
+will usually be imported through the generic SCons.Platform.Platform()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Platform/irix.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import posix
+
+def generate(env):
+    posix.generate(env)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/os2.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/os2.py
new file mode 100644
index 0000000..4fc1603
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/os2.py
@@ -0,0 +1,58 @@
+"""SCons.Platform.os2
+
+Platform-specific initialization for OS/2 systems.
+
+There normally shouldn't be any need to import this module directly.  It
+will usually be imported through the generic SCons.Platform.Platform()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Platform/os2.py 5183 2010/11/25 14:46:21 bdeegan"
+import win32
+
+def generate(env):
+    if 'ENV' not in env:
+        env['ENV']        = {}
+    env['OBJPREFIX']      = ''
+    env['OBJSUFFIX']      = '.obj'
+    env['SHOBJPREFIX']    = '$OBJPREFIX'
+    env['SHOBJSUFFIX']    = '$OBJSUFFIX'
+    env['PROGPREFIX']     = ''
+    env['PROGSUFFIX']     = '.exe'
+    env['LIBPREFIX']      = ''
+    env['LIBSUFFIX']      = '.lib'
+    env['SHLIBPREFIX']    = ''
+    env['SHLIBSUFFIX']    = '.dll'
+    env['LIBPREFIXES']    = '$LIBPREFIX'
+    env['LIBSUFFIXES']    = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ]
+    env['HOST_OS']        = 'os2'
+    env['HOST_ARCH']      = win32.get_architecture().arch
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/posix.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/posix.py
new file mode 100644
index 0000000..0fd1930
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/posix.py
@@ -0,0 +1,263 @@
+"""SCons.Platform.posix
+
+Platform-specific initialization for POSIX (Linux, UNIX, etc.) systems.
+
+There normally shouldn't be any need to import this module directly.  It
+will usually be imported through the generic SCons.Platform.Platform()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Platform/posix.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import errno
+import os
+import os.path
+import subprocess
+import sys
+import select
+
+import SCons.Util
+from SCons.Platform import TempFileMunge
+
+exitvalmap = {
+    2 : 127,
+    13 : 126,
+}
+
+def escape(arg):
+    "escape shell special characters"
+    slash = '\\'
+    special = '"$()'
+
+    arg = arg.replace(slash, slash+slash)
+    for c in special:
+        arg = arg.replace(c, slash+c)
+
+    return '"' + arg + '"'
+
+def exec_system(l, env):
+    stat = os.system(' '.join(l))
+    if stat & 0xff:
+        return stat | 0x80
+    return stat >> 8
+
+def exec_spawnvpe(l, env):
+    stat = os.spawnvpe(os.P_WAIT, l[0], l, env)
+    # os.spawnvpe() returns the actual exit code, not the encoding
+    # returned by os.waitpid() or os.system().
+    return stat
+
+def exec_fork(l, env): 
+    pid = os.fork()
+    if not pid:
+        # Child process.
+        exitval = 127
+        try:
+            os.execvpe(l[0], l, env)
+        except OSError, e:
+            exitval = exitvalmap.get(e[0], e[0])
+            sys.stderr.write("scons: %s: %s\n" % (l[0], e[1]))
+        os._exit(exitval)
+    else:
+        # Parent process.
+        pid, stat = os.waitpid(pid, 0)
+        if stat & 0xff:
+            return stat | 0x80
+        return stat >> 8
+
+def _get_env_command(sh, escape, cmd, args, env):
+    s = ' '.join(args)
+    if env:
+        l = ['env', '-'] + \
+            [escape(t[0])+'='+escape(t[1]) for t in env.items()] + \
+            [sh, '-c', escape(s)]
+        s = ' '.join(l)
+    return s
+
+def env_spawn(sh, escape, cmd, args, env):
+    return exec_system([_get_env_command( sh, escape, cmd, args, env)], env)
+
+def spawnvpe_spawn(sh, escape, cmd, args, env):
+    return exec_spawnvpe([sh, '-c', ' '.join(args)], env)
+
+def fork_spawn(sh, escape, cmd, args, env):
+    return exec_fork([sh, '-c', ' '.join(args)], env)
+
+def process_cmd_output(cmd_stdout, cmd_stderr, stdout, stderr):
+    stdout_eof = stderr_eof = 0
+    while not (stdout_eof and stderr_eof):
+        try:
+            (i,o,e) = select.select([cmd_stdout, cmd_stderr], [], [])
+            if cmd_stdout in i:
+                str = cmd_stdout.read()
+                if len(str) == 0:
+                    stdout_eof = 1
+                elif stdout is not None:
+                    stdout.write(str)
+            if cmd_stderr in i:
+                str = cmd_stderr.read()
+                if len(str) == 0:
+                    #sys.__stderr__.write( "stderr_eof=1\n" )
+                    stderr_eof = 1
+                else:
+                    #sys.__stderr__.write( "str(stderr) = %s\n" % str )
+                    stderr.write(str)
+        except select.error, (_errno, _strerror):
+            if _errno != errno.EINTR:
+                raise
+
+def exec_popen3(l, env, stdout, stderr):
+    proc = subprocess.Popen(' '.join(l),
+                            stdout=stdout,
+                            stderr=stderr,
+                            shell=True)
+    stat = proc.wait()
+    if stat & 0xff:
+        return stat | 0x80
+    return stat >> 8
+
+def exec_piped_fork(l, env, stdout, stderr):
+    # spawn using fork / exec and providing a pipe for the command's
+    # stdout / stderr stream
+    if stdout != stderr:
+        (rFdOut, wFdOut) = os.pipe()
+        (rFdErr, wFdErr) = os.pipe()
+    else:
+        (rFdOut, wFdOut) = os.pipe()
+        rFdErr = rFdOut
+        wFdErr = wFdOut
+    # do the fork
+    pid = os.fork()
+    if not pid:
+        # Child process
+        os.close( rFdOut )
+        if rFdOut != rFdErr:
+            os.close( rFdErr )
+        os.dup2( wFdOut, 1 ) # is there some symbolic way to do that ?
+        os.dup2( wFdErr, 2 )
+        os.close( wFdOut )
+        if stdout != stderr:
+            os.close( wFdErr )
+        exitval = 127
+        try:
+            os.execvpe(l[0], l, env)
+        except OSError, e:
+            exitval = exitvalmap.get(e[0], e[0])
+            stderr.write("scons: %s: %s\n" % (l[0], e[1]))
+        os._exit(exitval)
+    else:
+        # Parent process
+        pid, stat = os.waitpid(pid, 0)
+        os.close( wFdOut )
+        if stdout != stderr:
+            os.close( wFdErr )
+        childOut = os.fdopen( rFdOut )
+        if stdout != stderr:
+            childErr = os.fdopen( rFdErr )
+        else:
+            childErr = childOut
+        process_cmd_output(childOut, childErr, stdout, stderr)
+        os.close( rFdOut )
+        if stdout != stderr:
+            os.close( rFdErr )
+        if stat & 0xff:
+            return stat | 0x80
+        return stat >> 8
+
+def piped_env_spawn(sh, escape, cmd, args, env, stdout, stderr):
+    # spawn using Popen3 combined with the env command
+    # the command name and the command's stdout is written to stdout
+    # the command's stderr is written to stderr
+    return exec_popen3([_get_env_command(sh, escape, cmd, args, env)],
+                       env, stdout, stderr)
+
+def piped_fork_spawn(sh, escape, cmd, args, env, stdout, stderr):
+    # spawn using fork / exec and providing a pipe for the command's
+    # stdout / stderr stream
+    return exec_piped_fork([sh, '-c', ' '.join(args)],
+                           env, stdout, stderr)
+
+
+
+def generate(env):
+    # If os.spawnvpe() exists, we use it to spawn commands.  Otherwise
+    # if the env utility exists, we use os.system() to spawn commands,
+    # finally we fall back on os.fork()/os.exec().  
+    #
+    # os.spawnvpe() is prefered because it is the most efficient.  But
+    # for Python versions without it, os.system() is prefered because it
+    # is claimed that it works better with threads (i.e. -j) and is more
+    # efficient than forking Python.
+    #
+    # NB: Other people on the scons-users mailing list have claimed that
+    # os.fork()/os.exec() works better than os.system().  There may just
+    # not be a default that works best for all users.
+
+    if 'spawnvpe' in os.__dict__:
+        spawn = spawnvpe_spawn
+    elif env.Detect('env'):
+        spawn = env_spawn
+    else:
+        spawn = fork_spawn
+
+    if env.Detect('env'):
+        pspawn = piped_env_spawn
+    else:
+        pspawn = piped_fork_spawn
+
+    if 'ENV' not in env:
+        env['ENV']        = {}
+    env['ENV']['PATH']    = '/usr/local/bin:/opt/bin:/bin:/usr/bin'
+    env['OBJPREFIX']      = ''
+    env['OBJSUFFIX']      = '.o'
+    env['SHOBJPREFIX']    = '$OBJPREFIX'
+    env['SHOBJSUFFIX']    = '$OBJSUFFIX'
+    env['PROGPREFIX']     = ''
+    env['PROGSUFFIX']     = ''
+    env['LIBPREFIX']      = 'lib'
+    env['LIBSUFFIX']      = '.a'
+    env['SHLIBPREFIX']    = '$LIBPREFIX'
+    env['SHLIBSUFFIX']    = '.so'
+    env['LIBPREFIXES']    = [ '$LIBPREFIX' ]
+    env['LIBSUFFIXES']    = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ]
+    env['PSPAWN']         = pspawn
+    env['SPAWN']          = spawn
+    env['SHELL']          = 'sh'
+    env['ESCAPE']         = escape
+    env['TEMPFILE']       = TempFileMunge
+    env['TEMPFILEPREFIX'] = '@'
+    #Based on LINUX: ARG_MAX=ARG_MAX=131072 - 3000 for environment expansion
+    #Note: specific platforms might rise or lower this value
+    env['MAXLINELENGTH']  = 128072
+
+    # This platform supports RPATH specifications.
+    env['__RPATH'] = '$_RPATH'
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/sunos.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/sunos.py
new file mode 100644
index 0000000..294799e
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/sunos.py
@@ -0,0 +1,50 @@
+"""engine.SCons.Platform.sunos
+
+Platform-specific initialization for Sun systems.
+
+There normally shouldn't be any need to import this module directly.  It
+will usually be imported through the generic SCons.Platform.Platform()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Platform/sunos.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import posix
+
+def generate(env):
+    posix.generate(env)
+    # Based on sunSparc 8:32bit
+    # ARG_MAX=1048320 - 3000 for environment expansion
+    env['MAXLINELENGTH']  = 1045320
+    env['PKGINFO'] = 'pkginfo'
+    env['PKGCHK'] = '/usr/sbin/pkgchk'
+    env['ENV']['PATH'] = env['ENV']['PATH'] + ':/opt/SUNWspro/bin:/usr/ccs/bin'
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/win32.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/win32.py
new file mode 100644
index 0000000..d9e841e
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Platform/win32.py
@@ -0,0 +1,385 @@
+"""SCons.Platform.win32
+
+Platform-specific initialization for Win32 systems.
+
+There normally shouldn't be any need to import this module directly.  It
+will usually be imported through the generic SCons.Platform.Platform()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Platform/win32.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+import os.path
+import sys
+import tempfile
+
+from SCons.Platform.posix import exitvalmap
+from SCons.Platform import TempFileMunge
+import SCons.Util
+
+try:
+    import msvcrt
+    import win32api
+    import win32con
+
+    msvcrt.get_osfhandle
+    win32api.SetHandleInformation
+    win32con.HANDLE_FLAG_INHERIT
+except ImportError:
+    parallel_msg = \
+        "you do not seem to have the pywin32 extensions installed;\n" + \
+        "\tparallel (-j) builds may not work reliably with open Python files."
+except AttributeError:
+    parallel_msg = \
+        "your pywin32 extensions do not support file handle operations;\n" + \
+        "\tparallel (-j) builds may not work reliably with open Python files."
+else:
+    parallel_msg = None
+
+    import builtins
+
+    _builtin_file = builtins.file
+    _builtin_open = builtins.open
+    
+    def _scons_file(*args, **kw):
+        fp = _builtin_file(*args, **kw)
+        win32api.SetHandleInformation(msvcrt.get_osfhandle(fp.fileno()),
+                                      win32con.HANDLE_FLAG_INHERIT,
+                                      0)
+        return fp
+
+    def _scons_open(*args, **kw):
+        fp = _builtin_open(*args, **kw)
+        win32api.SetHandleInformation(msvcrt.get_osfhandle(fp.fileno()),
+                                      win32con.HANDLE_FLAG_INHERIT,
+                                      0)
+        return fp
+
+    builtins.file = _scons_file
+    builtins.open = _scons_open
+
+
+
+# The upshot of all this is that, if you are using Python 1.5.2,
+# you had better have cmd or command.com in your PATH when you run
+# scons.
+
+def piped_spawn(sh, escape, cmd, args, env, stdout, stderr):
+    # There is no direct way to do that in python. What we do
+    # here should work for most cases:
+    #   In case stdout (stderr) is not redirected to a file,
+    #   we redirect it into a temporary file tmpFileStdout
+    #   (tmpFileStderr) and copy the contents of this file
+    #   to stdout (stderr) given in the argument
+    if not sh:
+        sys.stderr.write("scons: Could not find command interpreter, is it in your PATH?\n")
+        return 127
+    else:
+        # one temporary file for stdout and stderr
+        tmpFileStdout = os.path.normpath(tempfile.mktemp())
+        tmpFileStderr = os.path.normpath(tempfile.mktemp())
+
+        # check if output is redirected
+        stdoutRedirected = 0
+        stderrRedirected = 0
+        for arg in args:
+            # are there more possibilities to redirect stdout ?
+            if (arg.find( ">", 0, 1 ) != -1 or
+                arg.find( "1>", 0, 2 ) != -1):
+                stdoutRedirected = 1
+            # are there more possibilities to redirect stderr ?
+            if arg.find( "2>", 0, 2 ) != -1:
+                stderrRedirected = 1
+
+        # redirect output of non-redirected streams to our tempfiles
+        if stdoutRedirected == 0:
+            args.append(">" + str(tmpFileStdout))
+        if stderrRedirected == 0:
+            args.append("2>" + str(tmpFileStderr))
+
+        # actually do the spawn
+        try:
+            args = [sh, '/C', escape(' '.join(args)) ]
+            ret = os.spawnve(os.P_WAIT, sh, args, env)
+        except OSError, e:
+            # catch any error
+            try:
+                ret = exitvalmap[e[0]]
+            except KeyError:
+                sys.stderr.write("scons: unknown OSError exception code %d - %s: %s\n" % (e[0], cmd, e[1]))
+            if stderr is not None:
+                stderr.write("scons: %s: %s\n" % (cmd, e[1]))
+        # copy child output from tempfiles to our streams
+        # and do clean up stuff
+        if stdout is not None and stdoutRedirected == 0:
+            try:
+                stdout.write(open( tmpFileStdout, "r" ).read())
+                os.remove( tmpFileStdout )
+            except (IOError, OSError):
+                pass
+
+        if stderr is not None and stderrRedirected == 0:
+            try:
+                stderr.write(open( tmpFileStderr, "r" ).read())
+                os.remove( tmpFileStderr )
+            except (IOError, OSError):
+                pass
+        return ret
+
+def exec_spawn(l, env):
+    try:
+        result = os.spawnve(os.P_WAIT, l[0], l, env)
+    except OSError, e:
+        try:
+            result = exitvalmap[e[0]]
+            sys.stderr.write("scons: %s: %s\n" % (l[0], e[1]))
+        except KeyError:
+            result = 127
+            if len(l) > 2:
+                if len(l[2]) < 1000:
+                    command = ' '.join(l[0:3])
+                else:
+                    command = l[0]
+            else:
+                command = l[0]
+            sys.stderr.write("scons: unknown OSError exception code %d - '%s': %s\n" % (e[0], command, e[1]))
+    return result
+
+def spawn(sh, escape, cmd, args, env):
+    if not sh:
+        sys.stderr.write("scons: Could not find command interpreter, is it in your PATH?\n")
+        return 127
+    return exec_spawn([sh, '/C', escape(' '.join(args))], env)
+
+# Windows does not allow special characters in file names anyway, so no
+# need for a complex escape function, we will just quote the arg, except
+# that "cmd /c" requires that if an argument ends with a backslash it
+# needs to be escaped so as not to interfere with closing double quote
+# that we add.
+def escape(x):
+    if x[-1] == '\\':
+        x = x + '\\'
+    return '"' + x + '"'
+
+# Get the windows system directory name
+_system_root = None
+
+def get_system_root():
+    global _system_root
+    if _system_root is not None:
+        return _system_root
+
+    # A resonable default if we can't read the registry
+    val = os.environ.get('SystemRoot', "C:\\WINDOWS")
+
+    if SCons.Util.can_read_reg:
+        try:
+            # Look for Windows NT system root
+            k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE,
+                                      'Software\\Microsoft\\Windows NT\\CurrentVersion')
+            val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot')
+        except SCons.Util.RegError:
+            try:
+                # Okay, try the Windows 9x system root
+                k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE,
+                                          'Software\\Microsoft\\Windows\\CurrentVersion')
+                val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot')
+            except KeyboardInterrupt:
+                raise
+            except:
+                pass
+    _system_root = val
+    return val
+
+# Get the location of the program files directory
+def get_program_files_dir():
+    # Now see if we can look in the registry...
+    val = ''
+    if SCons.Util.can_read_reg:
+        try:
+            # Look for Windows Program Files directory
+            k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE,
+                                      'Software\\Microsoft\\Windows\\CurrentVersion')
+            val, tok = SCons.Util.RegQueryValueEx(k, 'ProgramFilesDir')
+        except SCons.Util.RegError:
+            val = ''
+            pass
+
+    if val == '':
+        # A reasonable default if we can't read the registry
+        # (Actually, it's pretty reasonable even if we can :-)
+        val = os.path.join(os.path.dirname(get_system_root()),"Program Files")
+        
+    return val
+
+
+
+# Determine which windows CPU were running on.
+class ArchDefinition(object):
+    """
+    A class for defining architecture-specific settings and logic.
+    """
+    def __init__(self, arch, synonyms=[]):
+        self.arch = arch
+        self.synonyms = synonyms
+
+SupportedArchitectureList = [
+    ArchDefinition(
+        'x86',
+        ['i386', 'i486', 'i586', 'i686'],
+    ),
+
+    ArchDefinition(
+        'x86_64',
+        ['AMD64', 'amd64', 'em64t', 'EM64T', 'x86_64'],
+    ),
+
+    ArchDefinition(
+        'ia64',
+        ['IA64'],
+    ),
+]
+
+SupportedArchitectureMap = {}
+for a in SupportedArchitectureList:
+    SupportedArchitectureMap[a.arch] = a
+    for s in a.synonyms:
+        SupportedArchitectureMap[s] = a
+
+def get_architecture(arch=None):
+    """Returns the definition for the specified architecture string.
+
+    If no string is specified, the system default is returned (as defined
+    by the PROCESSOR_ARCHITEW6432 or PROCESSOR_ARCHITECTURE environment
+    variables).
+    """
+    if arch is None:
+        arch = os.environ.get('PROCESSOR_ARCHITEW6432')
+        if not arch:
+            arch = os.environ.get('PROCESSOR_ARCHITECTURE')
+    return SupportedArchitectureMap.get(arch, ArchDefinition('', ['']))
+
+def generate(env):
+    # Attempt to find cmd.exe (for WinNT/2k/XP) or
+    # command.com for Win9x
+    cmd_interp = ''
+    # First see if we can look in the registry...
+    if SCons.Util.can_read_reg:
+        try:
+            # Look for Windows NT system root
+            k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE,
+                                          'Software\\Microsoft\\Windows NT\\CurrentVersion')
+            val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot')
+            cmd_interp = os.path.join(val, 'System32\\cmd.exe')
+        except SCons.Util.RegError:
+            try:
+                # Okay, try the Windows 9x system root
+                k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE,
+                                              'Software\\Microsoft\\Windows\\CurrentVersion')
+                val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot')
+                cmd_interp = os.path.join(val, 'command.com')
+            except KeyboardInterrupt:
+                raise
+            except:
+                pass
+
+    # For the special case of not having access to the registry, we
+    # use a temporary path and pathext to attempt to find the command
+    # interpreter.  If we fail, we try to find the interpreter through
+    # the env's PATH.  The problem with that is that it might not
+    # contain an ENV and a PATH.
+    if not cmd_interp:
+        systemroot = get_system_root()
+        tmp_path = systemroot + os.pathsep + \
+                   os.path.join(systemroot,'System32')
+        tmp_pathext = '.com;.exe;.bat;.cmd'
+        if 'PATHEXT' in os.environ:
+            tmp_pathext = os.environ['PATHEXT'] 
+        cmd_interp = SCons.Util.WhereIs('cmd', tmp_path, tmp_pathext)
+        if not cmd_interp:
+            cmd_interp = SCons.Util.WhereIs('command', tmp_path, tmp_pathext)
+
+    if not cmd_interp:
+        cmd_interp = env.Detect('cmd')
+        if not cmd_interp:
+            cmd_interp = env.Detect('command')
+
+    
+    if 'ENV' not in env:
+        env['ENV']        = {}
+
+    # Import things from the external environment to the construction
+    # environment's ENV.  This is a potential slippery slope, because we
+    # *don't* want to make builds dependent on the user's environment by
+    # default.  We're doing this for SystemRoot, though, because it's
+    # needed for anything that uses sockets, and seldom changes, and
+    # for SystemDrive because it's related.
+    #
+    # Weigh the impact carefully before adding other variables to this list.
+    import_env = [ 'SystemDrive', 'SystemRoot', 'TEMP', 'TMP' ]
+    for var in import_env:
+        v = os.environ.get(var)
+        if v:
+            env['ENV'][var] = v
+
+    if 'COMSPEC' not in env['ENV']:
+        v = os.environ.get("COMSPEC")
+        if v:
+            env['ENV']['COMSPEC'] = v
+
+    env.AppendENVPath('PATH', get_system_root() + '\System32')
+
+    env['ENV']['PATHEXT'] = '.COM;.EXE;.BAT;.CMD'
+    env['OBJPREFIX']      = ''
+    env['OBJSUFFIX']      = '.obj'
+    env['SHOBJPREFIX']    = '$OBJPREFIX'
+    env['SHOBJSUFFIX']    = '$OBJSUFFIX'
+    env['PROGPREFIX']     = ''
+    env['PROGSUFFIX']     = '.exe'
+    env['LIBPREFIX']      = ''
+    env['LIBSUFFIX']      = '.lib'
+    env['SHLIBPREFIX']    = ''
+    env['SHLIBSUFFIX']    = '.dll'
+    env['LIBPREFIXES']    = [ '$LIBPREFIX' ]
+    env['LIBSUFFIXES']    = [ '$LIBSUFFIX' ]
+    env['PSPAWN']         = piped_spawn
+    env['SPAWN']          = spawn
+    env['SHELL']          = cmd_interp
+    env['TEMPFILE']       = TempFileMunge
+    env['TEMPFILEPREFIX'] = '@'
+    env['MAXLINELENGTH']  = 2048
+    env['ESCAPE']         = escape
+    
+    env['HOST_OS']        = 'win32'
+    env['HOST_ARCH']      = get_architecture().arch
+    
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/SConf.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/SConf.py
new file mode 100644
index 0000000..25721c1
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/SConf.py
@@ -0,0 +1,1030 @@
+"""SCons.SConf
+
+Autoconf-like configuration support.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/SConf.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.compat
+
+import io
+import os
+import re
+import sys
+import traceback
+
+import SCons.Action
+import SCons.Builder
+import SCons.Errors
+import SCons.Job
+import SCons.Node.FS
+import SCons.Taskmaster
+import SCons.Util
+import SCons.Warnings
+import SCons.Conftest
+
+from SCons.Debug import Trace
+
+# Turn off the Conftest error logging
+SCons.Conftest.LogInputFiles = 0
+SCons.Conftest.LogErrorMessages = 0
+
+# Set
+build_type = None
+build_types = ['clean', 'help']
+
+def SetBuildType(type):
+    global build_type
+    build_type = type
+
+# to be set, if we are in dry-run mode
+dryrun = 0
+
+AUTO=0  # use SCons dependency scanning for up-to-date checks
+FORCE=1 # force all tests to be rebuilt
+CACHE=2 # force all tests to be taken from cache (raise an error, if necessary)
+cache_mode = AUTO
+
+def SetCacheMode(mode):
+    """Set the Configure cache mode. mode must be one of "auto", "force",
+    or "cache"."""
+    global cache_mode
+    if mode == "auto":
+        cache_mode = AUTO
+    elif mode == "force":
+        cache_mode = FORCE
+    elif mode == "cache":
+        cache_mode = CACHE
+    else:
+        raise ValueError("SCons.SConf.SetCacheMode: Unknown mode " + mode)
+
+progress_display = SCons.Util.display # will be overwritten by SCons.Script
+def SetProgressDisplay(display):
+    """Set the progress display to use (called from SCons.Script)"""
+    global progress_display
+    progress_display = display
+
+SConfFS = None
+
+_ac_build_counter = 0 # incremented, whenever TryBuild is called
+_ac_config_logs = {}  # all config.log files created in this build
+_ac_config_hs   = {}  # all config.h files created in this build
+sconf_global = None   # current sconf object
+
+def _createConfigH(target, source, env):
+    t = open(str(target[0]), "w")
+    defname = re.sub('[^A-Za-z0-9_]', '_', str(target[0]).upper())
+    t.write("""#ifndef %(DEFNAME)s_SEEN
+#define %(DEFNAME)s_SEEN
+
+""" % {'DEFNAME' : defname})
+    t.write(source[0].get_contents())
+    t.write("""
+#endif /* %(DEFNAME)s_SEEN */
+""" % {'DEFNAME' : defname})
+    t.close()
+
+def _stringConfigH(target, source, env):
+    return "scons: Configure: creating " + str(target[0])
+
+def CreateConfigHBuilder(env):
+    """Called just before the building targets phase begins."""
+    if len(_ac_config_hs) == 0:
+        return
+    action = SCons.Action.Action(_createConfigH,
+                                 _stringConfigH)
+    sconfigHBld = SCons.Builder.Builder(action=action)
+    env.Append( BUILDERS={'SConfigHBuilder':sconfigHBld} )
+    for k in _ac_config_hs.keys():
+        env.SConfigHBuilder(k, env.Value(_ac_config_hs[k]))
+    
+class SConfWarning(SCons.Warnings.Warning):
+    pass
+SCons.Warnings.enableWarningClass(SConfWarning)
+
+# some error definitions
+class SConfError(SCons.Errors.UserError):
+    def __init__(self,msg):
+        SCons.Errors.UserError.__init__(self,msg)
+
+class ConfigureDryRunError(SConfError):
+    """Raised when a file or directory needs to be updated during a Configure
+    process, but the user requested a dry-run"""
+    def __init__(self,target):
+        if not isinstance(target, SCons.Node.FS.File):
+            msg = 'Cannot create configure directory "%s" within a dry-run.' % str(target)
+        else:
+            msg = 'Cannot update configure test "%s" within a dry-run.' % str(target)
+        SConfError.__init__(self,msg)
+
+class ConfigureCacheError(SConfError):
+    """Raised when a use explicitely requested the cache feature, but the test
+    is run the first time."""
+    def __init__(self,target):
+        SConfError.__init__(self, '"%s" is not yet built and cache is forced.' % str(target))
+
+# define actions for building text files
+def _createSource( target, source, env ):
+    fd = open(str(target[0]), "w")
+    fd.write(source[0].get_contents())
+    fd.close()
+def _stringSource( target, source, env ):
+    return (str(target[0]) + ' <-\n  |' +
+            source[0].get_contents().replace( '\n', "\n  |" ) )
+
+class SConfBuildInfo(SCons.Node.FS.FileBuildInfo):
+    """
+    Special build info for targets of configure tests. Additional members
+    are result (did the builder succeed last time?) and string, which
+    contains messages of the original build phase.
+    """
+    result = None # -> 0/None -> no error, != 0 error
+    string = None # the stdout / stderr output when building the target
+
+    def set_build_result(self, result, string):
+        self.result = result
+        self.string = string
+
+
+class Streamer(object):
+    """
+    'Sniffer' for a file-like writable object. Similar to the unix tool tee.
+    """
+    def __init__(self, orig):
+        self.orig = orig
+        self.s = io.StringIO()
+
+    def write(self, str):
+        if self.orig:
+            self.orig.write(str)
+        self.s.write(str)
+
+    def writelines(self, lines):
+        for l in lines:
+            self.write(l + '\n')
+
+    def getvalue(self):
+        """
+        Return everything written to orig since the Streamer was created.
+        """
+        return self.s.getvalue()
+
+    def flush(self):
+        if self.orig:
+            self.orig.flush()
+        self.s.flush()
+        
+
+class SConfBuildTask(SCons.Taskmaster.AlwaysTask):
+    """
+    This is almost the same as SCons.Script.BuildTask. Handles SConfErrors
+    correctly and knows about the current cache_mode.
+    """
+    def display(self, message):
+        if sconf_global.logstream:
+            sconf_global.logstream.write("scons: Configure: " + message + "\n")
+
+    def display_cached_string(self, bi):
+        """
+        Logs the original builder messages, given the SConfBuildInfo instance
+        bi.
+        """
+        if not isinstance(bi, SConfBuildInfo):
+            SCons.Warnings.warn(SConfWarning,
+              "The stored build information has an unexpected class: %s" % bi.__class__)
+        else:
+            self.display("The original builder output was:\n" +
+                         ("  |" + str(bi.string)).replace("\n", "\n  |"))
+
+    def failed(self):
+        # check, if the reason was a ConfigureDryRunError or a
+        # ConfigureCacheError and if yes, reraise the exception
+        exc_type = self.exc_info()[0]
+        if issubclass(exc_type, SConfError):
+            raise
+        elif issubclass(exc_type, SCons.Errors.BuildError):
+            # we ignore Build Errors (occurs, when a test doesn't pass)
+            # Clear the exception to prevent the contained traceback
+            # to build a reference cycle.
+            self.exc_clear()
+        else:
+            self.display('Caught exception while building "%s":\n' %
+                         self.targets[0])
+            try:
+                excepthook = sys.excepthook
+            except AttributeError:
+                # Earlier versions of Python don't have sys.excepthook...
+                def excepthook(type, value, tb):
+                    traceback.print_tb(tb)
+                    print type, value
+            excepthook(*self.exc_info())
+        return SCons.Taskmaster.Task.failed(self)
+
+    def collect_node_states(self):
+        # returns (is_up_to_date, cached_error, cachable)
+        # where is_up_to_date is 1, if the node(s) are up_to_date
+        #       cached_error  is 1, if the node(s) are up_to_date, but the
+        #                           build will fail
+        #       cachable      is 0, if some nodes are not in our cache
+        T = 0
+        changed = False
+        cached_error = False
+        cachable = True
+        for t in self.targets:
+            if T: Trace('%s' % (t))
+            bi = t.get_stored_info().binfo
+            if isinstance(bi, SConfBuildInfo):
+                if T: Trace(': SConfBuildInfo')
+                if cache_mode == CACHE:
+                    t.set_state(SCons.Node.up_to_date)
+                    if T: Trace(': set_state(up_to-date)')
+                else:
+                    if T: Trace(': get_state() %s' % t.get_state())
+                    if T: Trace(': changed() %s' % t.changed())
+                    if (t.get_state() != SCons.Node.up_to_date and t.changed()):
+                        changed = True
+                    if T: Trace(': changed %s' % changed)
+                cached_error = cached_error or bi.result
+            else:
+                if T: Trace(': else')
+                # the node hasn't been built in a SConf context or doesn't
+                # exist
+                cachable = False
+                changed = ( t.get_state() != SCons.Node.up_to_date )
+                if T: Trace(': changed %s' % changed)
+        if T: Trace('\n')
+        return (not changed, cached_error, cachable)
+
+    def execute(self):
+        if not self.targets[0].has_builder():
+            return
+
+        sconf = sconf_global
+
+        is_up_to_date, cached_error, cachable = self.collect_node_states()
+
+        if cache_mode == CACHE and not cachable:
+            raise ConfigureCacheError(self.targets[0])
+        elif cache_mode == FORCE:
+            is_up_to_date = 0
+
+        if cached_error and is_up_to_date:
+            self.display("Building \"%s\" failed in a previous run and all "
+                         "its sources are up to date." % str(self.targets[0]))
+            binfo = self.targets[0].get_stored_info().binfo
+            self.display_cached_string(binfo)
+            raise SCons.Errors.BuildError # will be 'caught' in self.failed
+        elif is_up_to_date:            
+            self.display("\"%s\" is up to date." % str(self.targets[0]))
+            binfo = self.targets[0].get_stored_info().binfo
+            self.display_cached_string(binfo)
+        elif dryrun:
+            raise ConfigureDryRunError(self.targets[0])
+        else:
+            # note stdout and stderr are the same here
+            s = sys.stdout = sys.stderr = Streamer(sys.stdout)
+            try:
+                env = self.targets[0].get_build_env()
+                if cache_mode == FORCE:
+                    # Set up the Decider() to force rebuilds by saying
+                    # that every source has changed.  Note that we still
+                    # call the environment's underlying source decider so
+                    # that the correct .sconsign info will get calculated
+                    # and keep the build state consistent.
+                    def force_build(dependency, target, prev_ni,
+                                    env_decider=env.decide_source):
+                        env_decider(dependency, target, prev_ni)
+                        return True
+                    if env.decide_source.func_code is not force_build.func_code:
+                        env.Decider(force_build)
+                env['PSTDOUT'] = env['PSTDERR'] = s
+                try:
+                    sconf.cached = 0
+                    self.targets[0].build()
+                finally:
+                    sys.stdout = sys.stderr = env['PSTDOUT'] = \
+                                 env['PSTDERR'] = sconf.logstream
+            except KeyboardInterrupt:
+                raise
+            except SystemExit:
+                exc_value = sys.exc_info()[1]
+                raise SCons.Errors.ExplicitExit(self.targets[0],exc_value.code)
+            except Exception, e:
+                for t in self.targets:
+                    binfo = t.get_binfo()
+                    binfo.__class__ = SConfBuildInfo
+                    binfo.set_build_result(1, s.getvalue())
+                    sconsign_entry = SCons.SConsign.SConsignEntry()
+                    sconsign_entry.binfo = binfo
+                    #sconsign_entry.ninfo = self.get_ninfo()
+                    # We'd like to do this as follows:
+                    #    t.store_info(binfo)
+                    # However, we need to store it as an SConfBuildInfo
+                    # object, and store_info() will turn it into a
+                    # regular FileNodeInfo if the target is itself a
+                    # regular File.
+                    sconsign = t.dir.sconsign()
+                    sconsign.set_entry(t.name, sconsign_entry)
+                    sconsign.merge()
+                raise e
+            else:
+                for t in self.targets:
+                    binfo = t.get_binfo()
+                    binfo.__class__ = SConfBuildInfo
+                    binfo.set_build_result(0, s.getvalue())
+                    sconsign_entry = SCons.SConsign.SConsignEntry()
+                    sconsign_entry.binfo = binfo
+                    #sconsign_entry.ninfo = self.get_ninfo()
+                    # We'd like to do this as follows:
+                    #    t.store_info(binfo)
+                    # However, we need to store it as an SConfBuildInfo
+                    # object, and store_info() will turn it into a
+                    # regular FileNodeInfo if the target is itself a
+                    # regular File.
+                    sconsign = t.dir.sconsign()
+                    sconsign.set_entry(t.name, sconsign_entry)
+                    sconsign.merge()
+
+class SConfBase(object):
+    """This is simply a class to represent a configure context. After
+    creating a SConf object, you can call any tests. After finished with your
+    tests, be sure to call the Finish() method, which returns the modified
+    environment.
+    Some words about caching: In most cases, it is not necessary to cache
+    Test results explicitely. Instead, we use the scons dependency checking
+    mechanism. For example, if one wants to compile a test program
+    (SConf.TryLink), the compiler is only called, if the program dependencies
+    have changed. However, if the program could not be compiled in a former
+    SConf run, we need to explicitely cache this error.
+    """
+
+    def __init__(self, env, custom_tests = {}, conf_dir='$CONFIGUREDIR',
+                 log_file='$CONFIGURELOG', config_h = None, _depth = 0): 
+        """Constructor. Pass additional tests in the custom_tests-dictinary,
+        e.g. custom_tests={'CheckPrivate':MyPrivateTest}, where MyPrivateTest
+        defines a custom test.
+        Note also the conf_dir and log_file arguments (you may want to
+        build tests in the VariantDir, not in the SourceDir)
+        """
+        global SConfFS
+        if not SConfFS:
+            SConfFS = SCons.Node.FS.default_fs or \
+                      SCons.Node.FS.FS(env.fs.pathTop)
+        if sconf_global is not None:
+            raise SCons.Errors.UserError
+        self.env = env
+        if log_file is not None:
+            log_file = SConfFS.File(env.subst(log_file))
+        self.logfile = log_file
+        self.logstream = None
+        self.lastTarget = None
+        self.depth = _depth
+        self.cached = 0 # will be set, if all test results are cached
+
+        # add default tests
+        default_tests = {
+                 'CheckCC'            : CheckCC,
+                 'CheckCXX'           : CheckCXX,
+                 'CheckSHCC'          : CheckSHCC,
+                 'CheckSHCXX'         : CheckSHCXX,
+                 'CheckFunc'          : CheckFunc,
+                 'CheckType'          : CheckType,
+                 'CheckTypeSize'      : CheckTypeSize,
+                 'CheckDeclaration'   : CheckDeclaration,
+                 'CheckHeader'        : CheckHeader,
+                 'CheckCHeader'       : CheckCHeader,
+                 'CheckCXXHeader'     : CheckCXXHeader,
+                 'CheckLib'           : CheckLib,
+                 'CheckLibWithHeader' : CheckLibWithHeader,
+               }
+        self.AddTests(default_tests)
+        self.AddTests(custom_tests)
+        self.confdir = SConfFS.Dir(env.subst(conf_dir))
+        if config_h is not None:
+            config_h = SConfFS.File(config_h)
+        self.config_h = config_h
+        self._startup()
+
+    def Finish(self):
+        """Call this method after finished with your tests:
+                env = sconf.Finish()
+        """
+        self._shutdown()
+        return self.env
+
+    def Define(self, name, value = None, comment = None):
+        """
+        Define a pre processor symbol name, with the optional given value in the
+        current config header.
+
+        If value is None (default), then #define name is written. If value is not
+        none, then #define name value is written.
+        
+        comment is a string which will be put as a C comment in the
+        header, to explain the meaning of the value (appropriate C comments /* and
+        */ will be put automatically."""
+        lines = []
+        if comment:
+            comment_str = "/* %s */" % comment
+            lines.append(comment_str)
+
+        if value is not None:
+            define_str = "#define %s %s" % (name, value)
+        else:
+            define_str = "#define %s" % name
+        lines.append(define_str)
+        lines.append('')
+
+        self.config_h_text = self.config_h_text + '\n'.join(lines)
+
+    def BuildNodes(self, nodes):
+        """
+        Tries to build the given nodes immediately. Returns 1 on success,
+        0 on error.
+        """
+        if self.logstream is not None:
+            # override stdout / stderr to write in log file
+            oldStdout = sys.stdout
+            sys.stdout = self.logstream
+            oldStderr = sys.stderr
+            sys.stderr = self.logstream
+
+        # the engine assumes the current path is the SConstruct directory ...
+        old_fs_dir = SConfFS.getcwd()
+        old_os_dir = os.getcwd()
+        SConfFS.chdir(SConfFS.Top, change_os_dir=1)
+
+        # Because we take responsibility here for writing out our
+        # own .sconsign info (see SConfBuildTask.execute(), above),
+        # we override the store_info() method with a null place-holder
+        # so we really control how it gets written.
+        for n in nodes:
+            n.store_info = n.do_not_store_info
+
+        ret = 1
+
+        try:
+            # ToDo: use user options for calc
+            save_max_drift = SConfFS.get_max_drift()
+            SConfFS.set_max_drift(0)
+            tm = SCons.Taskmaster.Taskmaster(nodes, SConfBuildTask)
+            # we don't want to build tests in parallel
+            jobs = SCons.Job.Jobs(1, tm )
+            jobs.run()
+            for n in nodes:
+                state = n.get_state()
+                if (state != SCons.Node.executed and
+                    state != SCons.Node.up_to_date):
+                    # the node could not be built. we return 0 in this case
+                    ret = 0
+        finally:
+            SConfFS.set_max_drift(save_max_drift)
+            os.chdir(old_os_dir)
+            SConfFS.chdir(old_fs_dir, change_os_dir=0)
+            if self.logstream is not None:
+                # restore stdout / stderr
+                sys.stdout = oldStdout
+                sys.stderr = oldStderr
+        return ret
+
+    def pspawn_wrapper(self, sh, escape, cmd, args, env):
+        """Wrapper function for handling piped spawns.
+
+        This looks to the calling interface (in Action.py) like a "normal"
+        spawn, but associates the call with the PSPAWN variable from
+        the construction environment and with the streams to which we
+        want the output logged.  This gets slid into the construction
+        environment as the SPAWN variable so Action.py doesn't have to
+        know or care whether it's spawning a piped command or not.
+        """
+        return self.pspawn(sh, escape, cmd, args, env, self.logstream, self.logstream)
+
+
+    def TryBuild(self, builder, text = None, extension = ""):
+        """Low level TryBuild implementation. Normally you don't need to
+        call that - you can use TryCompile / TryLink / TryRun instead
+        """
+        global _ac_build_counter
+
+        # Make sure we have a PSPAWN value, and save the current
+        # SPAWN value.
+        try:
+            self.pspawn = self.env['PSPAWN']
+        except KeyError:
+            raise SCons.Errors.UserError('Missing PSPAWN construction variable.')
+        try:
+            save_spawn = self.env['SPAWN']
+        except KeyError:
+            raise SCons.Errors.UserError('Missing SPAWN construction variable.')
+
+        nodesToBeBuilt = []
+
+        f = "conftest_" + str(_ac_build_counter)
+        pref = self.env.subst( builder.builder.prefix )
+        suff = self.env.subst( builder.builder.suffix )
+        target = self.confdir.File(pref + f + suff)
+
+        try:
+            # Slide our wrapper into the construction environment as
+            # the SPAWN function.
+            self.env['SPAWN'] = self.pspawn_wrapper
+            sourcetext = self.env.Value(text)
+
+            if text is not None:
+                textFile = self.confdir.File(f + extension)
+                textFileNode = self.env.SConfSourceBuilder(target=textFile,
+                                                           source=sourcetext)
+                nodesToBeBuilt.extend(textFileNode)
+                source = textFileNode
+            else:
+                source = None
+
+            nodes = builder(target = target, source = source)
+            if not SCons.Util.is_List(nodes):
+                nodes = [nodes]
+            nodesToBeBuilt.extend(nodes)
+            result = self.BuildNodes(nodesToBeBuilt)
+
+        finally:
+            self.env['SPAWN'] = save_spawn
+
+        _ac_build_counter = _ac_build_counter + 1
+        if result:
+            self.lastTarget = nodes[0]
+        else:
+            self.lastTarget = None
+
+        return result
+
+    def TryAction(self, action, text = None, extension = ""):
+        """Tries to execute the given action with optional source file
+        contents <text> and optional source file extension <extension>,
+        Returns the status (0 : failed, 1 : ok) and the contents of the
+        output file.
+        """
+        builder = SCons.Builder.Builder(action=action)
+        self.env.Append( BUILDERS = {'SConfActionBuilder' : builder} )
+        ok = self.TryBuild(self.env.SConfActionBuilder, text, extension)
+        del self.env['BUILDERS']['SConfActionBuilder']
+        if ok:
+            outputStr = self.lastTarget.get_contents()
+            return (1, outputStr)
+        return (0, "")
+
+    def TryCompile( self, text, extension):
+        """Compiles the program given in text to an env.Object, using extension
+        as file extension (e.g. '.c'). Returns 1, if compilation was
+        successful, 0 otherwise. The target is saved in self.lastTarget (for
+        further processing).
+        """
+        return self.TryBuild(self.env.Object, text, extension)
+
+    def TryLink( self, text, extension ):
+        """Compiles the program given in text to an executable env.Program,
+        using extension as file extension (e.g. '.c'). Returns 1, if
+        compilation was successful, 0 otherwise. The target is saved in
+        self.lastTarget (for further processing).
+        """
+        return self.TryBuild(self.env.Program, text, extension )
+
+    def TryRun(self, text, extension ):
+        """Compiles and runs the program given in text, using extension
+        as file extension (e.g. '.c'). Returns (1, outputStr) on success,
+        (0, '') otherwise. The target (a file containing the program's stdout)
+        is saved in self.lastTarget (for further processing).
+        """
+        ok = self.TryLink(text, extension)
+        if( ok ):
+            prog = self.lastTarget
+            pname = prog.path
+            output = self.confdir.File(os.path.basename(pname)+'.out')
+            node = self.env.Command(output, prog, [ [ pname, ">", "${TARGET}"] ])
+            ok = self.BuildNodes(node)
+            if ok:
+                outputStr = output.get_contents()
+                return( 1, outputStr)
+        return (0, "")
+
+    class TestWrapper(object):
+        """A wrapper around Tests (to ensure sanity)"""
+        def __init__(self, test, sconf):
+            self.test = test
+            self.sconf = sconf
+        def __call__(self, *args, **kw):
+            if not self.sconf.active:
+                raise SCons.Errors.UserError
+            context = CheckContext(self.sconf)
+            ret = self.test(context, *args, **kw)
+            if self.sconf.config_h is not None:
+                self.sconf.config_h_text = self.sconf.config_h_text + context.config_h
+            context.Result("error: no result")
+            return ret
+
+    def AddTest(self, test_name, test_instance):
+        """Adds test_class to this SConf instance. It can be called with
+        self.test_name(...)"""
+        setattr(self, test_name, SConfBase.TestWrapper(test_instance, self))
+
+    def AddTests(self, tests):
+        """Adds all the tests given in the tests dictionary to this SConf
+        instance
+        """
+        for name in tests.keys():
+            self.AddTest(name, tests[name])
+
+    def _createDir( self, node ):
+        dirName = str(node)
+        if dryrun:
+            if not os.path.isdir( dirName ):
+                raise ConfigureDryRunError(dirName)
+        else:
+            if not os.path.isdir( dirName ):
+                os.makedirs( dirName )
+                node._exists = 1
+
+    def _startup(self):
+        """Private method. Set up logstream, and set the environment
+        variables necessary for a piped build
+        """
+        global _ac_config_logs
+        global sconf_global
+        global SConfFS
+        
+        self.lastEnvFs = self.env.fs
+        self.env.fs = SConfFS
+        self._createDir(self.confdir)
+        self.confdir.up().add_ignore( [self.confdir] )
+
+        if self.logfile is not None and not dryrun:
+            # truncate logfile, if SConf.Configure is called for the first time
+            # in a build
+            if self.logfile in _ac_config_logs:
+                log_mode = "a"
+            else:
+                _ac_config_logs[self.logfile] = None
+                log_mode = "w"
+            fp = open(str(self.logfile), log_mode)
+            self.logstream = SCons.Util.Unbuffered(fp)
+            # logfile may stay in a build directory, so we tell
+            # the build system not to override it with a eventually
+            # existing file with the same name in the source directory
+            self.logfile.dir.add_ignore( [self.logfile] )
+
+            tb = traceback.extract_stack()[-3-self.depth]
+            old_fs_dir = SConfFS.getcwd()
+            SConfFS.chdir(SConfFS.Top, change_os_dir=0)
+            self.logstream.write('file %s,line %d:\n\tConfigure(confdir = %s)\n' %
+                                 (tb[0], tb[1], str(self.confdir)) )
+            SConfFS.chdir(old_fs_dir)
+        else: 
+            self.logstream = None
+        # we use a special builder to create source files from TEXT
+        action = SCons.Action.Action(_createSource,
+                                     _stringSource)
+        sconfSrcBld = SCons.Builder.Builder(action=action)
+        self.env.Append( BUILDERS={'SConfSourceBuilder':sconfSrcBld} )
+        self.config_h_text = _ac_config_hs.get(self.config_h, "")
+        self.active = 1
+        # only one SConf instance should be active at a time ...
+        sconf_global = self
+
+    def _shutdown(self):
+        """Private method. Reset to non-piped spawn"""
+        global sconf_global, _ac_config_hs
+
+        if not self.active:
+            raise SCons.Errors.UserError("Finish may be called only once!")
+        if self.logstream is not None and not dryrun:
+            self.logstream.write("\n")
+            self.logstream.close()
+            self.logstream = None
+        # remove the SConfSourceBuilder from the environment
+        blds = self.env['BUILDERS']
+        del blds['SConfSourceBuilder']
+        self.env.Replace( BUILDERS=blds )
+        self.active = 0
+        sconf_global = None
+        if not self.config_h is None:
+            _ac_config_hs[self.config_h] = self.config_h_text
+        self.env.fs = self.lastEnvFs
+
+class CheckContext(object):
+    """Provides a context for configure tests. Defines how a test writes to the
+    screen and log file.
+
+    A typical test is just a callable with an instance of CheckContext as
+    first argument:
+
+    def CheckCustom(context, ...)
+    context.Message('Checking my weird test ... ')
+    ret = myWeirdTestFunction(...)
+    context.Result(ret)
+
+    Often, myWeirdTestFunction will be one of
+    context.TryCompile/context.TryLink/context.TryRun. The results of
+    those are cached, for they are only rebuild, if the dependencies have
+    changed.
+    """
+
+    def __init__(self, sconf):
+        """Constructor. Pass the corresponding SConf instance."""
+        self.sconf = sconf
+        self.did_show_result = 0
+
+        # for Conftest.py:
+        self.vardict = {}
+        self.havedict = {}
+        self.headerfilename = None
+        self.config_h = "" # config_h text will be stored here
+        # we don't regenerate the config.h file after each test. That means,
+        # that tests won't be able to include the config.h file, and so
+        # they can't do an #ifdef HAVE_XXX_H. This shouldn't be a major
+        # issue, though. If it turns out, that we need to include config.h
+        # in tests, we must ensure, that the dependencies are worked out
+        # correctly. Note that we can't use Conftest.py's support for config.h,
+        # cause we will need to specify a builder for the config.h file ...
+
+    def Message(self, text):
+        """Inform about what we are doing right now, e.g.
+        'Checking for SOMETHING ... '
+        """
+        self.Display(text)
+        self.sconf.cached = 1
+        self.did_show_result = 0
+
+    def Result(self, res):
+        """Inform about the result of the test. res may be an integer or a
+        string. In case of an integer, the written text will be 'yes' or 'no'.
+        The result is only displayed when self.did_show_result is not set.
+        """
+        if isinstance(res, (int, bool)):
+            if res:
+                text = "yes"
+            else:
+                text = "no"
+        elif isinstance(res, str):
+            text = res
+        else:
+            raise TypeError("Expected string, int or bool, got " + str(type(res)))
+
+        if self.did_show_result == 0:
+            # Didn't show result yet, do it now.
+            self.Display(text + "\n")
+            self.did_show_result = 1
+
+    def TryBuild(self, *args, **kw):
+        return self.sconf.TryBuild(*args, **kw)
+
+    def TryAction(self, *args, **kw):
+        return self.sconf.TryAction(*args, **kw)
+
+    def TryCompile(self, *args, **kw):
+        return self.sconf.TryCompile(*args, **kw)
+
+    def TryLink(self, *args, **kw):
+        return self.sconf.TryLink(*args, **kw)
+
+    def TryRun(self, *args, **kw):
+        return self.sconf.TryRun(*args, **kw)
+
+    def __getattr__( self, attr ):
+        if( attr == 'env' ):
+            return self.sconf.env
+        elif( attr == 'lastTarget' ):
+            return self.sconf.lastTarget
+        else:
+            raise AttributeError("CheckContext instance has no attribute '%s'" % attr)
+
+    #### Stuff used by Conftest.py (look there for explanations).
+
+    def BuildProg(self, text, ext):
+        self.sconf.cached = 1
+        # TODO: should use self.vardict for $CC, $CPPFLAGS, etc.
+        return not self.TryBuild(self.env.Program, text, ext)
+
+    def CompileProg(self, text, ext):
+        self.sconf.cached = 1
+        # TODO: should use self.vardict for $CC, $CPPFLAGS, etc.
+        return not self.TryBuild(self.env.Object, text, ext)
+
+    def CompileSharedObject(self, text, ext):
+        self.sconf.cached = 1
+        # TODO: should use self.vardict for $SHCC, $CPPFLAGS, etc.
+        return not self.TryBuild(self.env.SharedObject, text, ext)
+
+    def RunProg(self, text, ext):
+        self.sconf.cached = 1
+        # TODO: should use self.vardict for $CC, $CPPFLAGS, etc.
+        st, out = self.TryRun(text, ext)
+        return not st, out
+
+    def AppendLIBS(self, lib_name_list):
+        oldLIBS = self.env.get( 'LIBS', [] )
+        self.env.Append(LIBS = lib_name_list)
+        return oldLIBS
+
+    def PrependLIBS(self, lib_name_list):
+        oldLIBS = self.env.get( 'LIBS', [] )
+        self.env.Prepend(LIBS = lib_name_list)
+        return oldLIBS
+
+    def SetLIBS(self, val):
+        oldLIBS = self.env.get( 'LIBS', [] )
+        self.env.Replace(LIBS = val)
+        return oldLIBS
+
+    def Display(self, msg):
+        if self.sconf.cached:
+            # We assume that Display is called twice for each test here
+            # once for the Checking for ... message and once for the result.
+            # The self.sconf.cached flag can only be set between those calls
+            msg = "(cached) " + msg
+            self.sconf.cached = 0
+        progress_display(msg, append_newline=0)
+        self.Log("scons: Configure: " + msg + "\n")
+
+    def Log(self, msg):
+        if self.sconf.logstream is not None:
+            self.sconf.logstream.write(msg)
+
+    #### End of stuff used by Conftest.py.
+
+
+def SConf(*args, **kw):
+    if kw.get(build_type, True):
+        kw['_depth'] = kw.get('_depth', 0) + 1
+        for bt in build_types:
+            try:
+                del kw[bt]
+            except KeyError:
+                pass
+        return SConfBase(*args, **kw)
+    else:
+        return SCons.Util.Null()
+
+
+def CheckFunc(context, function_name, header = None, language = None):
+    res = SCons.Conftest.CheckFunc(context, function_name, header = header, language = language)
+    context.did_show_result = 1
+    return not res
+
+def CheckType(context, type_name, includes = "", language = None):
+    res = SCons.Conftest.CheckType(context, type_name,
+                                   header = includes, language = language)
+    context.did_show_result = 1
+    return not res
+
+def CheckTypeSize(context, type_name, includes = "", language = None, expect = None):
+    res = SCons.Conftest.CheckTypeSize(context, type_name,
+                                       header = includes, language = language, 
+                                       expect = expect)
+    context.did_show_result = 1
+    return res
+
+def CheckDeclaration(context, declaration, includes = "", language = None):
+    res = SCons.Conftest.CheckDeclaration(context, declaration,
+                                          includes = includes, 
+                                          language = language)
+    context.did_show_result = 1
+    return not res
+
+def createIncludesFromHeaders(headers, leaveLast, include_quotes = '""'):
+    # used by CheckHeader and CheckLibWithHeader to produce C - #include
+    # statements from the specified header (list)
+    if not SCons.Util.is_List(headers):
+        headers = [headers]
+    l = []
+    if leaveLast:
+        lastHeader = headers[-1]
+        headers = headers[:-1]
+    else:
+        lastHeader = None
+    for s in headers:
+        l.append("#include %s%s%s\n"
+                 % (include_quotes[0], s, include_quotes[1]))
+    return ''.join(l), lastHeader
+
+def CheckHeader(context, header, include_quotes = '<>', language = None):
+    """
+    A test for a C or C++ header file.
+    """
+    prog_prefix, hdr_to_check = \
+                 createIncludesFromHeaders(header, 1, include_quotes)
+    res = SCons.Conftest.CheckHeader(context, hdr_to_check, prog_prefix,
+                                     language = language,
+                                     include_quotes = include_quotes)
+    context.did_show_result = 1
+    return not res
+
+def CheckCC(context):
+    res = SCons.Conftest.CheckCC(context)
+    context.did_show_result = 1
+    return not res
+
+def CheckCXX(context):
+    res = SCons.Conftest.CheckCXX(context)
+    context.did_show_result = 1
+    return not res
+
+def CheckSHCC(context):
+    res = SCons.Conftest.CheckSHCC(context)
+    context.did_show_result = 1
+    return not res
+
+def CheckSHCXX(context):
+    res = SCons.Conftest.CheckSHCXX(context)
+    context.did_show_result = 1
+    return not res
+
+# Bram: Make this function obsolete?  CheckHeader() is more generic.
+
+def CheckCHeader(context, header, include_quotes = '""'):
+    """
+    A test for a C header file.
+    """
+    return CheckHeader(context, header, include_quotes, language = "C")
+
+
+# Bram: Make this function obsolete?  CheckHeader() is more generic.
+
+def CheckCXXHeader(context, header, include_quotes = '""'):
+    """
+    A test for a C++ header file.
+    """
+    return CheckHeader(context, header, include_quotes, language = "C++")
+
+
+def CheckLib(context, library = None, symbol = "main",
+             header = None, language = None, autoadd = 1):
+    """
+    A test for a library. See also CheckLibWithHeader.
+    Note that library may also be None to test whether the given symbol
+    compiles without flags.
+    """
+
+    if library == []:
+        library = [None]
+
+    if not SCons.Util.is_List(library):
+        library = [library]
+    
+    # ToDo: accept path for the library
+    res = SCons.Conftest.CheckLib(context, library, symbol, header = header,
+                                        language = language, autoadd = autoadd)
+    context.did_show_result = 1
+    return not res
+
+# XXX
+# Bram: Can only include one header and can't use #ifdef HAVE_HEADER_H.
+
+def CheckLibWithHeader(context, libs, header, language,
+                       call = None, autoadd = 1):
+    # ToDo: accept path for library. Support system header files.
+    """
+    Another (more sophisticated) test for a library.
+    Checks, if library and header is available for language (may be 'C'
+    or 'CXX'). Call maybe be a valid expression _with_ a trailing ';'.
+    As in CheckLib, we support library=None, to test if the call compiles
+    without extra link flags.
+    """
+    prog_prefix, dummy = \
+                 createIncludesFromHeaders(header, 0)
+    if libs == []:
+        libs = [None]
+
+    if not SCons.Util.is_List(libs):
+        libs = [libs]
+
+    res = SCons.Conftest.CheckLib(context, libs, None, prog_prefix,
+            call = call, language = language, autoadd = autoadd)
+    context.did_show_result = 1
+    return not res
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/SConsign.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/SConsign.py
new file mode 100644
index 0000000..ed3a5e5
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/SConsign.py
@@ -0,0 +1,389 @@
+"""SCons.SConsign
+
+Writing and reading information to the .sconsign file or files.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/SConsign.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.compat
+
+import os
+# compat layer imports "cPickle" for us if it's available.
+import pickle
+
+import SCons.dblite
+import SCons.Warnings
+
+def corrupt_dblite_warning(filename):
+    SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning,
+                        "Ignoring corrupt .sconsign file: %s"%filename)
+
+SCons.dblite.ignore_corrupt_dbfiles = 1
+SCons.dblite.corruption_warning = corrupt_dblite_warning
+
+#XXX Get rid of the global array so this becomes re-entrant.
+sig_files = []
+
+# Info for the database SConsign implementation (now the default):
+# "DataBase" is a dictionary that maps top-level SConstruct directories
+# to open database handles.
+# "DB_Module" is the Python database module to create the handles.
+# "DB_Name" is the base name of the database file (minus any
+# extension the underlying DB module will add).
+DataBase = {}
+DB_Module = SCons.dblite
+DB_Name = ".sconsign"
+DB_sync_list = []
+
+def Get_DataBase(dir):
+    global DataBase, DB_Module, DB_Name
+    top = dir.fs.Top
+    if not os.path.isabs(DB_Name) and top.repositories:
+        mode = "c"
+        for d in [top] + top.repositories:
+            if dir.is_under(d):
+                try:
+                    return DataBase[d], mode
+                except KeyError:
+                    path = d.entry_abspath(DB_Name)
+                    try: db = DataBase[d] = DB_Module.open(path, mode)
+                    except (IOError, OSError): pass
+                    else:
+                        if mode != "r":
+                            DB_sync_list.append(db)
+                        return db, mode
+            mode = "r"
+    try:
+        return DataBase[top], "c"
+    except KeyError:
+        db = DataBase[top] = DB_Module.open(DB_Name, "c")
+        DB_sync_list.append(db)
+        return db, "c"
+    except TypeError:
+        print "DataBase =", DataBase
+        raise
+
+def Reset():
+    """Reset global state.  Used by unit tests that end up using
+    SConsign multiple times to get a clean slate for each test."""
+    global sig_files, DB_sync_list
+    sig_files = []
+    DB_sync_list = []
+
+normcase = os.path.normcase
+
+def write():
+    global sig_files
+    for sig_file in sig_files:
+        sig_file.write(sync=0)
+    for db in DB_sync_list:
+        try:
+            syncmethod = db.sync
+        except AttributeError:
+            pass # Not all dbm modules have sync() methods.
+        else:
+            syncmethod()
+        try:
+            closemethod = db.close
+        except AttributeError:
+            pass # Not all dbm modules have close() methods.
+        else:
+            closemethod()
+
+class SConsignEntry(object):
+    """
+    Wrapper class for the generic entry in a .sconsign file.
+    The Node subclass populates it with attributes as it pleases.
+
+    XXX As coded below, we do expect a '.binfo' attribute to be added,
+    but we'll probably generalize this in the next refactorings.
+    """
+    current_version_id = 1
+    def __init__(self):
+        # Create an object attribute from the class attribute so it ends up
+        # in the pickled data in the .sconsign file.
+        _version_id = self.current_version_id
+    def convert_to_sconsign(self):
+        self.binfo.convert_to_sconsign()
+    def convert_from_sconsign(self, dir, name):
+        self.binfo.convert_from_sconsign(dir, name)
+
+class Base(object):
+    """
+    This is the controlling class for the signatures for the collection of
+    entries associated with a specific directory.  The actual directory
+    association will be maintained by a subclass that is specific to
+    the underlying storage method.  This class provides a common set of
+    methods for fetching and storing the individual bits of information
+    that make up signature entry.
+    """
+    def __init__(self):
+        self.entries = {}
+        self.dirty = False
+        self.to_be_merged = {}
+
+    def get_entry(self, filename):
+        """
+        Fetch the specified entry attribute.
+        """
+        return self.entries[filename]
+
+    def set_entry(self, filename, obj):
+        """
+        Set the entry.
+        """
+        self.entries[filename] = obj
+        self.dirty = True
+
+    def do_not_set_entry(self, filename, obj):
+        pass
+
+    def store_info(self, filename, node):
+        entry = node.get_stored_info()
+        entry.binfo.merge(node.get_binfo())
+        self.to_be_merged[filename] = node
+        self.dirty = True
+
+    def do_not_store_info(self, filename, node):
+        pass
+
+    def merge(self):
+        for key, node in self.to_be_merged.items():
+            entry = node.get_stored_info()
+            try:
+                ninfo = entry.ninfo
+            except AttributeError:
+                # This happens with SConf Nodes, because the configuration
+                # subsystem takes direct control over how the build decision
+                # is made and its information stored.
+                pass
+            else:
+                ninfo.merge(node.get_ninfo())
+            self.entries[key] = entry
+        self.to_be_merged = {}
+
+class DB(Base):
+    """
+    A Base subclass that reads and writes signature information
+    from a global .sconsign.db* file--the actual file suffix is
+    determined by the database module.
+    """
+    def __init__(self, dir):
+        Base.__init__(self)
+
+        self.dir = dir
+
+        db, mode = Get_DataBase(dir)
+
+        # Read using the path relative to the top of the Repository
+        # (self.dir.tpath) from which we're fetching the signature
+        # information.
+        path = normcase(dir.tpath)
+        try:
+            rawentries = db[path]
+        except KeyError:
+            pass
+        else:
+            try:
+                self.entries = pickle.loads(rawentries)
+                if not isinstance(self.entries, dict):
+                    self.entries = {}
+                    raise TypeError
+            except KeyboardInterrupt:
+                raise
+            except Exception, e:
+                SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning,
+                                    "Ignoring corrupt sconsign entry : %s (%s)\n"%(self.dir.tpath, e))
+            for key, entry in self.entries.items():
+                entry.convert_from_sconsign(dir, key)
+
+        if mode == "r":
+            # This directory is actually under a repository, which means
+            # likely they're reaching in directly for a dependency on
+            # a file there.  Don't actually set any entry info, so we
+            # won't try to write to that .sconsign.dblite file.
+            self.set_entry = self.do_not_set_entry
+            self.store_info = self.do_not_store_info
+
+        global sig_files
+        sig_files.append(self)
+
+    def write(self, sync=1):
+        if not self.dirty:
+            return
+
+        self.merge()
+
+        db, mode = Get_DataBase(self.dir)
+
+        # Write using the path relative to the top of the SConstruct
+        # directory (self.dir.path), not relative to the top of
+        # the Repository; we only write to our own .sconsign file,
+        # not to .sconsign files in Repositories.
+        path = normcase(self.dir.path)
+        for key, entry in self.entries.items():
+            entry.convert_to_sconsign()
+        db[path] = pickle.dumps(self.entries, 1)
+
+        if sync:
+            try:
+                syncmethod = db.sync
+            except AttributeError:
+                # Not all anydbm modules have sync() methods.
+                pass
+            else:
+                syncmethod()
+
+class Dir(Base):
+    def __init__(self, fp=None, dir=None):
+        """
+        fp - file pointer to read entries from
+        """
+        Base.__init__(self)
+
+        if not fp:
+            return
+
+        self.entries = pickle.load(fp)
+        if not isinstance(self.entries, dict):
+            self.entries = {}
+            raise TypeError
+
+        if dir:
+            for key, entry in self.entries.items():
+                entry.convert_from_sconsign(dir, key)
+
+class DirFile(Dir):
+    """
+    Encapsulates reading and writing a per-directory .sconsign file.
+    """
+    def __init__(self, dir):
+        """
+        dir - the directory for the file
+        """
+
+        self.dir = dir
+        self.sconsign = os.path.join(dir.path, '.sconsign')
+
+        try:
+            fp = open(self.sconsign, 'rb')
+        except IOError:
+            fp = None
+
+        try:
+            Dir.__init__(self, fp, dir)
+        except KeyboardInterrupt:
+            raise
+        except:
+            SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning,
+                                "Ignoring corrupt .sconsign file: %s"%self.sconsign)
+
+        global sig_files
+        sig_files.append(self)
+
+    def write(self, sync=1):
+        """
+        Write the .sconsign file to disk.
+
+        Try to write to a temporary file first, and rename it if we
+        succeed.  If we can't write to the temporary file, it's
+        probably because the directory isn't writable (and if so,
+        how did we build anything in this directory, anyway?), so
+        try to write directly to the .sconsign file as a backup.
+        If we can't rename, try to copy the temporary contents back
+        to the .sconsign file.  Either way, always try to remove
+        the temporary file at the end.
+        """
+        if not self.dirty:
+            return
+
+        self.merge()
+
+        temp = os.path.join(self.dir.path, '.scons%d' % os.getpid())
+        try:
+            file = open(temp, 'wb')
+            fname = temp
+        except IOError:
+            try:
+                file = open(self.sconsign, 'wb')
+                fname = self.sconsign
+            except IOError:
+                return
+        for key, entry in self.entries.items():
+            entry.convert_to_sconsign()
+        pickle.dump(self.entries, file, 1)
+        file.close()
+        if fname != self.sconsign:
+            try:
+                mode = os.stat(self.sconsign)[0]
+                os.chmod(self.sconsign, 0666)
+                os.unlink(self.sconsign)
+            except (IOError, OSError):
+                # Try to carry on in the face of either OSError
+                # (things like permission issues) or IOError (disk
+                # or network issues).  If there's a really dangerous
+                # issue, it should get re-raised by the calls below.
+                pass
+            try:
+                os.rename(fname, self.sconsign)
+            except OSError:
+                # An OSError failure to rename may indicate something
+                # like the directory has no write permission, but
+                # the .sconsign file itself might still be writable,
+                # so try writing on top of it directly.  An IOError
+                # here, or in any of the following calls, would get
+                # raised, indicating something like a potentially
+                # serious disk or network issue.
+                open(self.sconsign, 'wb').write(open(fname, 'rb').read())
+                os.chmod(self.sconsign, mode)
+        try:
+            os.unlink(temp)
+        except (IOError, OSError):
+            pass
+
+ForDirectory = DB
+
+def File(name, dbm_module=None):
+    """
+    Arrange for all signatures to be stored in a global .sconsign.db*
+    file.
+    """
+    global ForDirectory, DB_Name, DB_Module
+    if name is None:
+        ForDirectory = DirFile
+        DB_Module = None
+    else:
+        ForDirectory = DB
+        DB_Name = name
+        if not dbm_module is None:
+            DB_Module = dbm_module
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/C.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/C.py
new file mode 100644
index 0000000..770c4b0
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/C.py
@@ -0,0 +1,132 @@
+"""SCons.Scanner.C
+
+This module implements the depenency scanner for C/C++ code. 
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Scanner/C.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Node.FS
+import SCons.Scanner
+import SCons.Util
+
+import SCons.cpp
+
+class SConsCPPScanner(SCons.cpp.PreProcessor):
+    """
+    SCons-specific subclass of the cpp.py module's processing.
+
+    We subclass this so that: 1) we can deal with files represented
+    by Nodes, not strings; 2) we can keep track of the files that are
+    missing.
+    """
+    def __init__(self, *args, **kw):
+        SCons.cpp.PreProcessor.__init__(self, *args, **kw)
+        self.missing = []
+    def initialize_result(self, fname):
+        self.result = SCons.Util.UniqueList([fname])
+    def finalize_result(self, fname):
+        return self.result[1:]
+    def find_include_file(self, t):
+        keyword, quote, fname = t
+        result = SCons.Node.FS.find_file(fname, self.searchpath[quote])
+        if not result:
+            self.missing.append((fname, self.current_file))
+        return result
+    def read_file(self, file):
+        try:
+            fp = open(str(file.rfile()))
+        except EnvironmentError, e:
+            self.missing.append((file, self.current_file))
+            return ''
+        else:
+            return fp.read()
+
+def dictify_CPPDEFINES(env):
+    cppdefines = env.get('CPPDEFINES', {})
+    if cppdefines is None:
+        return {}
+    if SCons.Util.is_Sequence(cppdefines):
+        result = {}
+        for c in cppdefines:
+            if SCons.Util.is_Sequence(c):
+                result[c[0]] = c[1]
+            else:
+                result[c] = None
+        return result
+    if not SCons.Util.is_Dict(cppdefines):
+        return {cppdefines : None}
+    return cppdefines
+
+class SConsCPPScannerWrapper(object):
+    """
+    The SCons wrapper around a cpp.py scanner.
+
+    This is the actual glue between the calling conventions of generic
+    SCons scanners, and the (subclass of) cpp.py class that knows how
+    to look for #include lines with reasonably real C-preprocessor-like
+    evaluation of #if/#ifdef/#else/#elif lines.
+    """
+    def __init__(self, name, variable):
+        self.name = name
+        self.path = SCons.Scanner.FindPathDirs(variable)
+    def __call__(self, node, env, path = ()):
+        cpp = SConsCPPScanner(current = node.get_dir(),
+                              cpppath = path,
+                              dict = dictify_CPPDEFINES(env))
+        result = cpp(node)
+        for included, includer in cpp.missing:
+            fmt = "No dependency generated for file: %s (included from: %s) -- file not found"
+            SCons.Warnings.warn(SCons.Warnings.DependencyWarning,
+                                fmt % (included, includer))
+        return result
+
+    def recurse_nodes(self, nodes):
+        return nodes
+    def select(self, node):
+        return self
+
+def CScanner():
+    """Return a prototype Scanner instance for scanning source files
+    that use the C pre-processor"""
+
+    # Here's how we would (or might) use the CPP scanner code above that
+    # knows how to evaluate #if/#ifdef/#else/#elif lines when searching
+    # for #includes.  This is commented out for now until we add the
+    # right configurability to let users pick between the scanners.
+    #return SConsCPPScannerWrapper("CScanner", "CPPPATH")
+
+    cs = SCons.Scanner.ClassicCPP("CScanner",
+                                  "$CPPSUFFIXES",
+                                  "CPPPATH",
+                                  '^[ \t]*#[ \t]*(?:include|import)[ \t]*(<|")([^>"]+)(>|")')
+    return cs
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/D.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/D.py
new file mode 100644
index 0000000..1f13c94
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/D.py
@@ -0,0 +1,73 @@
+"""SCons.Scanner.D
+
+Scanner for the Digital Mars "D" programming language.
+
+Coded by Andy Friesen
+17 Nov 2003
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Scanner/D.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import re
+
+import SCons.Scanner
+
+def DScanner():
+    """Return a prototype Scanner instance for scanning D source files"""
+    ds = D()
+    return ds
+
+class D(SCons.Scanner.Classic):
+    def __init__ (self):
+        SCons.Scanner.Classic.__init__ (self,
+            name = "DScanner",
+            suffixes = '$DSUFFIXES',
+            path_variable = 'DPATH',
+            regex = 'import\s+(?:[a-zA-Z0-9_.]+)\s*(?:,\s*(?:[a-zA-Z0-9_.]+)\s*)*;')
+
+        self.cre2 = re.compile ('(?:import\s)?\s*([a-zA-Z0-9_.]+)\s*(?:,|;)', re.M)
+
+    def find_include(self, include, source_dir, path):
+        # translate dots (package separators) to slashes
+        inc = include.replace('.', '/')
+
+        i = SCons.Node.FS.find_file(inc + '.d', (source_dir,) + path)
+        if i is None:
+            i = SCons.Node.FS.find_file (inc + '.di', (source_dir,) + path)
+        return i, include
+
+    def find_include_names(self, node):
+        includes = []
+        for i in self.cre.findall(node.get_text_contents()):
+            includes = includes + self.cre2.findall(i)
+        return includes
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/Dir.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/Dir.py
new file mode 100644
index 0000000..b988c24
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/Dir.py
@@ -0,0 +1,109 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Scanner/Dir.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Node.FS
+import SCons.Scanner
+
+def only_dirs(nodes):
+    is_Dir = lambda n: isinstance(n.disambiguate(), SCons.Node.FS.Dir)
+    return list(filter(is_Dir, nodes))
+
+def DirScanner(**kw):
+    """Return a prototype Scanner instance for scanning
+    directories for on-disk files"""
+    kw['node_factory'] = SCons.Node.FS.Entry
+    kw['recursive'] = only_dirs
+    return SCons.Scanner.Base(scan_on_disk, "DirScanner", **kw)
+
+def DirEntryScanner(**kw):
+    """Return a prototype Scanner instance for "scanning"
+    directory Nodes for their in-memory entries"""
+    kw['node_factory'] = SCons.Node.FS.Entry
+    kw['recursive'] = None
+    return SCons.Scanner.Base(scan_in_memory, "DirEntryScanner", **kw)
+
+skip_entry = {}
+
+skip_entry_list = [
+   '.',
+   '..',
+   '.sconsign',
+   # Used by the native dblite.py module.
+   '.sconsign.dblite',
+   # Used by dbm and dumbdbm.
+   '.sconsign.dir',
+   # Used by dbm.
+   '.sconsign.pag',
+   # Used by dumbdbm.
+   '.sconsign.dat',
+   '.sconsign.bak',
+   # Used by some dbm emulations using Berkeley DB.
+   '.sconsign.db',
+]
+
+for skip in skip_entry_list:
+    skip_entry[skip] = 1
+    skip_entry[SCons.Node.FS._my_normcase(skip)] = 1
+
+do_not_scan = lambda k: k not in skip_entry
+
+def scan_on_disk(node, env, path=()):
+    """
+    Scans a directory for on-disk files and directories therein.
+
+    Looking up the entries will add these to the in-memory Node tree
+    representation of the file system, so all we have to do is just
+    that and then call the in-memory scanning function.
+    """
+    try:
+        flist = node.fs.listdir(node.abspath)
+    except (IOError, OSError):
+        return []
+    e = node.Entry
+    for f in  filter(do_not_scan, flist):
+        # Add ./ to the beginning of the file name so if it begins with a
+        # '#' we don't look it up relative to the top-level directory.
+        e('./' + f)
+    return scan_in_memory(node, env, path)
+
+def scan_in_memory(node, env, path=()):
+    """
+    "Scans" a Node.FS.Dir for its in-memory entries.
+    """
+    try:
+        entries = node.entries
+    except AttributeError:
+        # It's not a Node.FS.Dir (or doesn't look enough like one for
+        # our purposes), which can happen if a target list containing
+        # mixed Node types (Dirs and Files, for example) has a Dir as
+        # the first entry.
+        return []
+    entry_list = sorted(filter(do_not_scan, list(entries.keys())))
+    return [entries[n] for n in entry_list]
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/Fortran.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/Fortran.py
new file mode 100644
index 0000000..43f344c
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/Fortran.py
@@ -0,0 +1,316 @@
+"""SCons.Scanner.Fortran
+
+This module implements the dependency scanner for Fortran code.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Scanner/Fortran.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import re
+
+import SCons.Node
+import SCons.Node.FS
+import SCons.Scanner
+import SCons.Util
+import SCons.Warnings
+
+class F90Scanner(SCons.Scanner.Classic):
+    """
+    A Classic Scanner subclass for Fortran source files which takes
+    into account both USE and INCLUDE statements.  This scanner will
+    work for both F77 and F90 (and beyond) compilers.
+
+    Currently, this scanner assumes that the include files do not contain
+    USE statements.  To enable the ability to deal with USE statements
+    in include files, add logic right after the module names are found
+    to loop over each include file, search for and locate each USE
+    statement, and append each module name to the list of dependencies.
+    Caching the search results in a common dictionary somewhere so that
+    the same include file is not searched multiple times would be a
+    smart thing to do.
+    """
+
+    def __init__(self, name, suffixes, path_variable,
+                 use_regex, incl_regex, def_regex, *args, **kw):
+
+        self.cre_use = re.compile(use_regex, re.M)
+        self.cre_incl = re.compile(incl_regex, re.M)
+        self.cre_def = re.compile(def_regex, re.M)
+
+        def _scan(node, env, path, self=self):
+            node = node.rfile()
+
+            if not node.exists():
+                return []
+
+            return self.scan(node, env, path)
+
+        kw['function'] = _scan
+        kw['path_function'] = SCons.Scanner.FindPathDirs(path_variable)
+        kw['recursive'] = 1
+        kw['skeys'] = suffixes
+        kw['name'] = name
+
+        SCons.Scanner.Current.__init__(self, *args, **kw)
+
+    def scan(self, node, env, path=()):
+
+        # cache the includes list in node so we only scan it once:
+        if node.includes != None:
+            mods_and_includes = node.includes
+        else:
+            # retrieve all included filenames
+            includes = self.cre_incl.findall(node.get_text_contents())
+            # retrieve all USE'd module names
+            modules = self.cre_use.findall(node.get_text_contents())
+            # retrieve all defined module names
+            defmodules = self.cre_def.findall(node.get_text_contents())
+
+            # Remove all USE'd module names that are defined in the same file
+            # (case-insensitively)
+            d = {}
+            for m in defmodules:
+                d[m.lower()] = 1
+            modules = [m for m in modules if m.lower() not in d]
+
+            # Convert module name to a .mod filename
+            suffix = env.subst('$FORTRANMODSUFFIX')
+            modules = [x.lower() + suffix for x in modules]
+            # Remove unique items from the list
+            mods_and_includes = SCons.Util.unique(includes+modules)
+            node.includes = mods_and_includes
+
+        # This is a hand-coded DSU (decorate-sort-undecorate, or
+        # Schwartzian transform) pattern.  The sort key is the raw name
+        # of the file as specifed on the USE or INCLUDE line, which lets
+        # us keep the sort order constant regardless of whether the file
+        # is actually found in a Repository or locally.
+        nodes = []
+        source_dir = node.get_dir()
+        if callable(path):
+            path = path()
+        for dep in mods_and_includes:
+            n, i = self.find_include(dep, source_dir, path)
+
+            if n is None:
+                SCons.Warnings.warn(SCons.Warnings.DependencyWarning,
+                                    "No dependency generated for file: %s (referenced by: %s) -- file not found" % (i, node))
+            else:
+                sortkey = self.sort_key(dep)
+                nodes.append((sortkey, n))
+
+        return [pair[1] for pair in sorted(nodes)]
+
+def FortranScan(path_variable="FORTRANPATH"):
+    """Return a prototype Scanner instance for scanning source files
+    for Fortran USE & INCLUDE statements"""
+
+#   The USE statement regex matches the following:
+#
+#   USE module_name
+#   USE :: module_name
+#   USE, INTRINSIC :: module_name
+#   USE, NON_INTRINSIC :: module_name
+#
+#   Limitations
+#
+#   --  While the regex can handle multiple USE statements on one line,
+#       it cannot properly handle them if they are commented out.
+#       In either of the following cases:
+#
+#            !  USE mod_a ; USE mod_b         [entire line is commented out]
+#               USE mod_a ! ; USE mod_b       [in-line comment of second USE statement]
+#
+#       the second module name (mod_b) will be picked up as a dependency
+#       even though it should be ignored.  The only way I can see
+#       to rectify this would be to modify the scanner to eliminate
+#       the call to re.findall, read in the contents of the file,
+#       treating the comment character as an end-of-line character
+#       in addition to the normal linefeed, loop over each line,
+#       weeding out the comments, and looking for the USE statements.
+#       One advantage to this is that the regex passed to the scanner
+#       would no longer need to match a semicolon.
+#
+#   --  I question whether or not we need to detect dependencies to
+#       INTRINSIC modules because these are built-in to the compiler.
+#       If we consider them a dependency, will SCons look for them, not
+#       find them, and kill the build?  Or will we there be standard
+#       compiler-specific directories we will need to point to so the
+#       compiler and SCons can locate the proper object and mod files?
+
+#   Here is a breakdown of the regex:
+#
+#   (?i)               : regex is case insensitive
+#   ^                  : start of line
+#   (?:                : group a collection of regex symbols without saving the match as a "group"
+#      ^|;             : matches either the start of the line or a semicolon - semicolon
+#   )                  : end the unsaved grouping
+#   \s*                : any amount of white space
+#   USE                : match the string USE, case insensitive
+#   (?:                : group a collection of regex symbols without saving the match as a "group"
+#      \s+|            : match one or more whitespace OR ....  (the next entire grouped set of regex symbols)
+#      (?:             : group a collection of regex symbols without saving the match as a "group"
+#         (?:          : establish another unsaved grouping of regex symbols
+#            \s*          : any amount of white space
+#            ,         : match a comma
+#            \s*       : any amount of white space
+#            (?:NON_)? : optionally match the prefix NON_, case insensitive
+#            INTRINSIC : match the string INTRINSIC, case insensitive
+#         )?           : optionally match the ", INTRINSIC/NON_INTRINSIC" grouped expression
+#         \s*          : any amount of white space
+#         ::           : match a double colon that must appear after the INTRINSIC/NON_INTRINSIC attribute
+#      )               : end the unsaved grouping
+#   )                  : end the unsaved grouping
+#   \s*                : match any amount of white space
+#   (\w+)              : match the module name that is being USE'd
+#
+#
+    use_regex = "(?i)(?:^|;)\s*USE(?:\s+|(?:(?:\s*,\s*(?:NON_)?INTRINSIC)?\s*::))\s*(\w+)"
+
+
+#   The INCLUDE statement regex matches the following:
+#
+#   INCLUDE 'some_Text'
+#   INCLUDE "some_Text"
+#   INCLUDE "some_Text" ; INCLUDE "some_Text"
+#   INCLUDE kind_"some_Text"
+#   INCLUDE kind_'some_Text"
+#
+#   where some_Text can include any alphanumeric and/or special character
+#   as defined by the Fortran 2003 standard.
+#
+#   Limitations:
+#
+#   --  The Fortran standard dictates that a " or ' in the INCLUDE'd
+#       string must be represented as a "" or '', if the quotes that wrap
+#       the entire string are either a ' or ", respectively.   While the
+#       regular expression below can detect the ' or " characters just fine,
+#       the scanning logic, presently is unable to detect them and reduce
+#       them to a single instance.  This probably isn't an issue since,
+#       in practice, ' or " are not generally used in filenames.
+#
+#   --  This regex will not properly deal with multiple INCLUDE statements
+#       when the entire line has been commented out, ala
+#
+#           ! INCLUDE 'some_file' ; INCLUDE 'some_file'
+#
+#       In such cases, it will properly ignore the first INCLUDE file,
+#       but will actually still pick up the second.  Interestingly enough,
+#       the regex will properly deal with these cases:
+#
+#             INCLUDE 'some_file'
+#             INCLUDE 'some_file' !; INCLUDE 'some_file'
+#
+#       To get around the above limitation, the FORTRAN programmer could
+#       simply comment each INCLUDE statement separately, like this
+#
+#           ! INCLUDE 'some_file' !; INCLUDE 'some_file'
+#
+#       The way I see it, the only way to get around this limitation would
+#       be to modify the scanning logic to replace the calls to re.findall
+#       with a custom loop that processes each line separately, throwing
+#       away fully commented out lines before attempting to match against
+#       the INCLUDE syntax.
+#
+#   Here is a breakdown of the regex:
+#
+#   (?i)               : regex is case insensitive
+#   (?:                : begin a non-saving group that matches the following:
+#      ^               :    either the start of the line
+#      |               :                or
+#      ['">]\s*;       :    a semicolon that follows a single quote,
+#                           double quote or greater than symbol (with any
+#                           amount of whitespace in between).  This will
+#                           allow the regex to match multiple INCLUDE
+#                           statements per line (although it also requires
+#                           the positive lookahead assertion that is
+#                           used below).  It will even properly deal with
+#                           (i.e. ignore) cases in which the additional
+#                           INCLUDES are part of an in-line comment, ala
+#                                           "  INCLUDE 'someFile' ! ; INCLUDE 'someFile2' "
+#   )                  : end of non-saving group
+#   \s*                : any amount of white space
+#   INCLUDE            : match the string INCLUDE, case insensitive
+#   \s+                : match one or more white space characters
+#   (?\w+_)?           : match the optional "kind-param _" prefix allowed by the standard
+#   [<"']              : match the include delimiter - an apostrophe, double quote, or less than symbol
+#   (.+?)              : match one or more characters that make up
+#                        the included path and file name and save it
+#                        in a group.  The Fortran standard allows for
+#                        any non-control character to be used.  The dot
+#                        operator will pick up any character, including
+#                        control codes, but I can't conceive of anyone
+#                        putting control codes in their file names.
+#                        The question mark indicates it is non-greedy so
+#                        that regex will match only up to the next quote,
+#                        double quote, or greater than symbol
+#   (?=["'>])          : positive lookahead assertion to match the include
+#                        delimiter - an apostrophe, double quote, or
+#                        greater than symbol.  This level of complexity
+#                        is required so that the include delimiter is
+#                        not consumed by the match, thus allowing the
+#                        sub-regex discussed above to uniquely match a
+#                        set of semicolon-separated INCLUDE statements
+#                        (as allowed by the F2003 standard)
+
+    include_regex = """(?i)(?:^|['">]\s*;)\s*INCLUDE\s+(?:\w+_)?[<"'](.+?)(?=["'>])"""
+
+#   The MODULE statement regex finds module definitions by matching
+#   the following:
+#
+#   MODULE module_name
+#
+#   but *not* the following:
+#
+#   MODULE PROCEDURE procedure_name
+#
+#   Here is a breakdown of the regex:
+#
+#   (?i)               : regex is case insensitive
+#   ^\s*               : any amount of white space
+#   MODULE             : match the string MODULE, case insensitive
+#   \s+                : match one or more white space characters
+#   (?!PROCEDURE)      : but *don't* match if the next word matches
+#                        PROCEDURE (negative lookahead assertion),
+#                        case insensitive
+#   (\w+)              : match one or more alphanumeric characters
+#                        that make up the defined module name and
+#                        save it in a group
+
+    def_regex = """(?i)^\s*MODULE\s+(?!PROCEDURE)(\w+)"""
+
+    scanner = F90Scanner("FortranScan",
+                         "$FORTRANSUFFIXES",
+                         path_variable,
+                         use_regex,
+                         include_regex,
+                         def_regex)
+    return scanner
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/IDL.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/IDL.py
new file mode 100644
index 0000000..0b6c23f
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/IDL.py
@@ -0,0 +1,48 @@
+"""SCons.Scanner.IDL
+
+This module implements the depenency scanner for IDL (Interface
+Definition Language) files.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Scanner/IDL.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Node.FS
+import SCons.Scanner
+
+def IDLScan():
+    """Return a prototype Scanner instance for scanning IDL source files"""
+    cs = SCons.Scanner.ClassicCPP("IDLScan",
+                                  "$IDLSUFFIXES",
+                                  "CPPPATH",
+                                  '^[ \t]*(?:#[ \t]*include|[ \t]*import)[ \t]+(<|")([^>"]+)(>|")')
+    return cs
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/LaTeX.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/LaTeX.py
new file mode 100644
index 0000000..a66341d
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/LaTeX.py
@@ -0,0 +1,387 @@
+"""SCons.Scanner.LaTeX
+
+This module implements the dependency scanner for LaTeX code.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Scanner/LaTeX.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os.path
+import re
+
+import SCons.Scanner
+import SCons.Util
+
+# list of graphics file extensions for TeX and LaTeX
+TexGraphics   = ['.eps', '.ps']
+LatexGraphics = ['.pdf', '.png', '.jpg', '.gif', '.tif']
+
+# Used as a return value of modify_env_var if the variable is not set.
+class _Null(object):
+    pass
+_null = _Null
+
+# The user specifies the paths in env[variable], similar to other builders.
+# They may be relative and must be converted to absolute, as expected
+# by LaTeX and Co. The environment may already have some paths in
+# env['ENV'][var]. These paths are honored, but the env[var] paths have
+# higher precedence. All changes are un-done on exit.
+def modify_env_var(env, var, abspath):
+    try:
+        save = env['ENV'][var]
+    except KeyError:
+        save = _null
+    env.PrependENVPath(var, abspath)
+    try:
+        if SCons.Util.is_List(env[var]):
+            env.PrependENVPath(var, [os.path.abspath(str(p)) for p in env[var]])
+        else:
+            # Split at os.pathsep to convert into absolute path
+            env.PrependENVPath(var, [os.path.abspath(p) for p in str(env[var]).split(os.pathsep)])
+    except KeyError:
+        pass
+
+    # Convert into a string explicitly to append ":" (without which it won't search system
+    # paths as well). The problem is that env.AppendENVPath(var, ":")
+    # does not work, refuses to append ":" (os.pathsep).
+
+    if SCons.Util.is_List(env['ENV'][var]):
+        env['ENV'][var] = os.pathsep.join(env['ENV'][var])
+    # Append the trailing os.pathsep character here to catch the case with no env[var]
+    env['ENV'][var] = env['ENV'][var] + os.pathsep
+
+    return save
+
+class FindENVPathDirs(object):
+    """A class to bind a specific *PATH variable name to a function that
+    will return all of the *path directories."""
+    def __init__(self, variable):
+        self.variable = variable
+    def __call__(self, env, dir=None, target=None, source=None, argument=None):
+        import SCons.PathList
+        try:
+            path = env['ENV'][self.variable]
+        except KeyError:
+            return ()
+
+        dir = dir or env.fs._cwd
+        path = SCons.PathList.PathList(path).subst_path(env, target, source)
+        return tuple(dir.Rfindalldirs(path))
+
+
+
+def LaTeXScanner():
+    """Return a prototype Scanner instance for scanning LaTeX source files
+    when built with latex.
+    """
+    ds = LaTeX(name = "LaTeXScanner",
+               suffixes =  '$LATEXSUFFIXES',
+               # in the search order, see below in LaTeX class docstring
+               graphics_extensions = TexGraphics,
+               recursive = 0)
+    return ds
+
+def PDFLaTeXScanner():
+    """Return a prototype Scanner instance for scanning LaTeX source files
+    when built with pdflatex.
+    """
+    ds = LaTeX(name = "PDFLaTeXScanner",
+               suffixes =  '$LATEXSUFFIXES',
+               # in the search order, see below in LaTeX class docstring
+               graphics_extensions = LatexGraphics,
+               recursive = 0)
+    return ds
+
+class LaTeX(SCons.Scanner.Base):
+    """Class for scanning LaTeX files for included files.
+
+    Unlike most scanners, which use regular expressions that just
+    return the included file name, this returns a tuple consisting
+    of the keyword for the inclusion ("include", "includegraphics",
+    "input", or "bibliography"), and then the file name itself.  
+    Based on a quick look at LaTeX documentation, it seems that we 
+    should append .tex suffix for the "include" keywords, append .tex if
+    there is no extension for the "input" keyword, and need to add .bib
+    for the "bibliography" keyword that does not accept extensions by itself.
+
+    Finally, if there is no extension for an "includegraphics" keyword
+    latex will append .ps or .eps to find the file, while pdftex may use .pdf,
+    .jpg, .tif, .mps, or .png.
+    
+    The actual subset and search order may be altered by
+    DeclareGraphicsExtensions command. This complication is ignored.
+    The default order corresponds to experimentation with teTeX
+        $ latex --version
+        pdfeTeX 3.141592-1.21a-2.2 (Web2C 7.5.4)
+        kpathsea version 3.5.4
+    The order is:
+        ['.eps', '.ps'] for latex
+        ['.png', '.pdf', '.jpg', '.tif'].
+
+    Another difference is that the search path is determined by the type
+    of the file being searched:
+    env['TEXINPUTS'] for "input" and "include" keywords
+    env['TEXINPUTS'] for "includegraphics" keyword
+    env['TEXINPUTS'] for "lstinputlisting" keyword
+    env['BIBINPUTS'] for "bibliography" keyword
+    env['BSTINPUTS'] for "bibliographystyle" keyword
+    env['INDEXSTYLE'] for "makeindex" keyword, no scanning support needed
+                      just allows user to set it if needed.
+
+    FIXME: also look for the class or style in document[class|style]{}
+    FIXME: also look for the argument of bibliographystyle{}
+    """
+    keyword_paths = {'include': 'TEXINPUTS',
+                     'input': 'TEXINPUTS',
+                     'includegraphics': 'TEXINPUTS',
+                     'bibliography': 'BIBINPUTS',
+                     'bibliographystyle': 'BSTINPUTS',
+                     'makeindex': 'INDEXSTYLE',
+                     'usepackage': 'TEXINPUTS',
+                     'lstinputlisting': 'TEXINPUTS'}
+    env_variables = SCons.Util.unique(list(keyword_paths.values()))
+
+    def __init__(self, name, suffixes, graphics_extensions, *args, **kw):
+
+        # We have to include \n with the % we exclude from the first part
+        # part of the regex because the expression is compiled with re.M.
+        # Without the \n,  the ^ could match the beginning of a *previous*
+        # line followed by one or more newline characters (i.e. blank
+        # lines), interfering with a match on the next line.
+        # add option for whitespace before the '[options]' or the '{filename}'
+        regex = r'^[^%\n]*\\(include|includegraphics(?:\s*\[[^\]]+\])?|lstinputlisting(?:\[[^\]]+\])?|input|bibliography|usepackage)\s*{([^}]*)}'
+        self.cre = re.compile(regex, re.M)
+        self.comment_re = re.compile(r'^((?:(?:\\%)|[^%\n])*)(.*)$', re.M)
+
+        self.graphics_extensions = graphics_extensions
+
+        def _scan(node, env, path=(), self=self):
+            node = node.rfile()
+            if not node.exists():
+                return []
+            return self.scan_recurse(node, path)
+
+        class FindMultiPathDirs(object):
+            """The stock FindPathDirs function has the wrong granularity:
+            it is called once per target, while we need the path that depends
+            on what kind of included files is being searched. This wrapper
+            hides multiple instances of FindPathDirs, one per the LaTeX path
+            variable in the environment. When invoked, the function calculates
+            and returns all the required paths as a dictionary (converted into
+            a tuple to become hashable). Then the scan function converts it
+            back and uses a dictionary of tuples rather than a single tuple
+            of paths.
+            """
+            def __init__(self, dictionary):
+                self.dictionary = {}
+                for k,n in dictionary.items():
+                    self.dictionary[k] = ( SCons.Scanner.FindPathDirs(n),
+                                           FindENVPathDirs(n) )
+
+            def __call__(self, env, dir=None, target=None, source=None,
+                                    argument=None):
+                di = {}
+                for k,(c,cENV)  in self.dictionary.items():
+                    di[k] = ( c(env, dir=None, target=None, source=None,
+                                   argument=None) ,
+                              cENV(env, dir=None, target=None, source=None,
+                                   argument=None) )
+                # To prevent "dict is not hashable error"
+                return tuple(di.items())
+
+        class LaTeXScanCheck(object):
+            """Skip all but LaTeX source files, i.e., do not scan *.eps,
+            *.pdf, *.jpg, etc.
+            """
+            def __init__(self, suffixes):
+                self.suffixes = suffixes
+            def __call__(self, node, env):
+                current = not node.has_builder() or node.is_up_to_date()
+                scannable = node.get_suffix() in env.subst_list(self.suffixes)[0]
+                # Returning false means that the file is not scanned.
+                return scannable and current
+
+        kw['function'] = _scan
+        kw['path_function'] = FindMultiPathDirs(LaTeX.keyword_paths)
+        kw['recursive'] = 0
+        kw['skeys'] = suffixes
+        kw['scan_check'] = LaTeXScanCheck(suffixes)
+        kw['name'] = name
+
+        SCons.Scanner.Base.__init__(self, *args, **kw)
+
+    def _latex_names(self, include):
+        filename = include[1]
+        if include[0] == 'input':
+            base, ext = os.path.splitext( filename )
+            if ext == "":
+                return [filename + '.tex']
+        if (include[0] == 'include'):
+            return [filename + '.tex']
+        if include[0] == 'bibliography':
+            base, ext = os.path.splitext( filename )
+            if ext == "":
+                return [filename + '.bib']
+        if include[0] == 'usepackage':
+            base, ext = os.path.splitext( filename )
+            if ext == "":
+                return [filename + '.sty']
+        if include[0] == 'includegraphics':
+            base, ext = os.path.splitext( filename )
+            if ext == "":
+                #return [filename+e for e in self.graphics_extensions + TexGraphics]
+                # use the line above to find dependencies for the PDF builder
+                # when only an .eps figure is present.  Since it will be found
+                # if the user tells scons how to make the pdf figure, leave
+                # it out for now.
+                return [filename+e for e in self.graphics_extensions]
+        return [filename]
+
+    def sort_key(self, include):
+        return SCons.Node.FS._my_normcase(str(include))
+
+    def find_include(self, include, source_dir, path):
+        try:
+            sub_path = path[include[0]]
+        except (IndexError, KeyError):
+            sub_path = ()
+        try_names = self._latex_names(include)
+        for n in try_names:
+            # see if we find it using the path in env[var]
+            i = SCons.Node.FS.find_file(n, (source_dir,) + sub_path[0])
+            if i:
+                return i, include
+            # see if we find it using the path in env['ENV'][var]
+            i = SCons.Node.FS.find_file(n, (source_dir,) + sub_path[1])
+            if i:
+                return i, include
+        return i, include
+
+    def canonical_text(self, text):
+        """Standardize an input TeX-file contents.
+
+        Currently:
+          * removes comments, unwrapping comment-wrapped lines.
+        """
+        out = []
+        line_continues_a_comment = False
+        for line in text.splitlines():
+            line,comment = self.comment_re.findall(line)[0]
+            if line_continues_a_comment == True:
+                out[-1] = out[-1] + line.lstrip()
+            else:
+                out.append(line)
+            line_continues_a_comment = len(comment) > 0
+        return '\n'.join(out).rstrip()+'\n'
+
+    def scan(self, node):
+        # Modify the default scan function to allow for the regular
+        # expression to return a comma separated list of file names
+        # as can be the case with the bibliography keyword.
+
+        # Cache the includes list in node so we only scan it once:
+        # path_dict = dict(list(path))
+        # add option for whitespace (\s) before the '['
+        noopt_cre = re.compile('\s*\[.*$')
+        if node.includes != None:
+            includes = node.includes
+        else:
+            text = self.canonical_text(node.get_text_contents())
+            includes = self.cre.findall(text)
+            # 1. Split comma-separated lines, e.g.
+            #      ('bibliography', 'phys,comp')
+            #    should become two entries
+            #      ('bibliography', 'phys')
+            #      ('bibliography', 'comp')
+            # 2. Remove the options, e.g., such as
+            #      ('includegraphics[clip,width=0.7\\linewidth]', 'picture.eps')
+            #    should become
+            #      ('includegraphics', 'picture.eps')
+            split_includes = []
+            for include in includes:
+                inc_type = noopt_cre.sub('', include[0])
+                inc_list = include[1].split(',')
+                for j in range(len(inc_list)):
+                    split_includes.append( (inc_type, inc_list[j]) )
+            #
+            includes = split_includes
+            node.includes = includes
+
+        return includes
+
+    def scan_recurse(self, node, path=()):
+        """ do a recursive scan of the top level target file
+        This lets us search for included files based on the
+        directory of the main file just as latex does"""
+
+        path_dict = dict(list(path))
+        
+        queue = [] 
+        queue.extend( self.scan(node) )
+        seen = {}
+
+        # This is a hand-coded DSU (decorate-sort-undecorate, or
+        # Schwartzian transform) pattern.  The sort key is the raw name
+        # of the file as specifed on the \include, \input, etc. line.
+        # TODO: what about the comment in the original Classic scanner:
+        # """which lets
+        # us keep the sort order constant regardless of whether the file
+        # is actually found in a Repository or locally."""
+        nodes = []
+        source_dir = node.get_dir()
+        #for include in includes:
+        while queue:
+            
+            include = queue.pop()
+            try:
+                if seen[include[1]] == 1:
+                    continue
+            except KeyError:
+                seen[include[1]] = 1
+
+            #
+            # Handle multiple filenames in include[1]
+            #
+            n, i = self.find_include(include, source_dir, path_dict)
+            if n is None:
+                # Do not bother with 'usepackage' warnings, as they most
+                # likely refer to system-level files
+                if include[0] != 'usepackage':
+                    SCons.Warnings.warn(SCons.Warnings.DependencyWarning,
+                                        "No dependency generated for file: %s (included from: %s) -- file not found" % (i, node))
+            else:
+                sortkey = self.sort_key(n)
+                nodes.append((sortkey, n))
+                # recurse down 
+                queue.extend( self.scan(n) )
+
+        return [pair[1] for pair in sorted(nodes)]
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/Prog.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/Prog.py
new file mode 100644
index 0000000..af75e41
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/Prog.py
@@ -0,0 +1,101 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Scanner/Prog.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Node
+import SCons.Node.FS
+import SCons.Scanner
+import SCons.Util
+
+# global, set by --debug=findlibs
+print_find_libs = None
+
+def ProgramScanner(**kw):
+    """Return a prototype Scanner instance for scanning executable
+    files for static-lib dependencies"""
+    kw['path_function'] = SCons.Scanner.FindPathDirs('LIBPATH')
+    ps = SCons.Scanner.Base(scan, "ProgramScanner", **kw)
+    return ps
+
+def scan(node, env, libpath = ()):
+    """
+    This scanner scans program files for static-library
+    dependencies.  It will search the LIBPATH environment variable
+    for libraries specified in the LIBS variable, returning any
+    files it finds as dependencies.
+    """
+    try:
+        libs = env['LIBS']
+    except KeyError:
+        # There are no LIBS in this environment, so just return a null list:
+        return []
+    if SCons.Util.is_String(libs):
+        libs = libs.split()
+    else:
+        libs = SCons.Util.flatten(libs)
+
+    try:
+        prefix = env['LIBPREFIXES']
+        if not SCons.Util.is_List(prefix):
+            prefix = [ prefix ]
+    except KeyError:
+        prefix = [ '' ]
+
+    try:
+        suffix = env['LIBSUFFIXES']
+        if not SCons.Util.is_List(suffix):
+            suffix = [ suffix ]
+    except KeyError:
+        suffix = [ '' ]
+
+    pairs = []
+    for suf in map(env.subst, suffix):
+        for pref in map(env.subst, prefix):
+            pairs.append((pref, suf))
+
+    result = []
+
+    if callable(libpath):
+        libpath = libpath()
+
+    find_file = SCons.Node.FS.find_file
+    adjustixes = SCons.Util.adjustixes
+    for lib in libs:
+        if SCons.Util.is_String(lib):
+            lib = env.subst(lib)
+            for pref, suf in pairs:
+                l = adjustixes(lib, pref, suf)
+                l = find_file(l, libpath, verbose=print_find_libs)
+                if l:
+                    result.append(l)
+        else:
+            result.append(lib)
+
+    return result
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/RC.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/RC.py
new file mode 100644
index 0000000..04f5459
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/RC.py
@@ -0,0 +1,55 @@
+"""SCons.Scanner.RC
+
+This module implements the depenency scanner for RC (Interface
+Definition Language) files.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Scanner/RC.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Node.FS
+import SCons.Scanner
+import re
+
+def RCScan():
+    """Return a prototype Scanner instance for scanning RC source files"""
+ 
+    res_re= r'^(?:\s*#\s*(?:include)|' \
+            '.*?\s+(?:ICON|BITMAP|CURSOR|HTML|FONT|MESSAGETABLE|TYPELIB|REGISTRY|D3DFX)' \
+            '\s*.*?)' \
+            '\s*(<|"| )([^>"\s]+)(?:[>" ])*$'
+    resScanner = SCons.Scanner.ClassicCPP( "ResourceScanner",
+                                           "$RCSUFFIXES",
+                                           "CPPPATH",
+                                           res_re )
+    
+    return resScanner
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/__init__.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/__init__.py
new file mode 100644
index 0000000..27cea75
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Scanner/__init__.py
@@ -0,0 +1,413 @@
+"""SCons.Scanner
+
+The Scanner package for the SCons software construction utility.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Scanner/__init__.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import re
+
+import SCons.Node.FS
+import SCons.Util
+
+
+class _Null(object):
+    pass
+
+# This is used instead of None as a default argument value so None can be
+# used as an actual argument value.
+_null = _Null
+
+def Scanner(function, *args, **kw):
+    """
+    Public interface factory function for creating different types
+    of Scanners based on the different types of "functions" that may
+    be supplied.
+
+    TODO:  Deprecate this some day.  We've moved the functionality
+    inside the Base class and really don't need this factory function
+    any more.  It was, however, used by some of our Tool modules, so
+    the call probably ended up in various people's custom modules
+    patterned on SCons code.
+    """
+    if SCons.Util.is_Dict(function):
+        return Selector(function, *args, **kw)
+    else:
+        return Base(function, *args, **kw)
+
+
+
+class FindPathDirs(object):
+    """A class to bind a specific *PATH variable name to a function that
+    will return all of the *path directories."""
+    def __init__(self, variable):
+        self.variable = variable
+    def __call__(self, env, dir=None, target=None, source=None, argument=None):
+        import SCons.PathList
+        try:
+            path = env[self.variable]
+        except KeyError:
+            return ()
+
+        dir = dir or env.fs._cwd
+        path = SCons.PathList.PathList(path).subst_path(env, target, source)
+        return tuple(dir.Rfindalldirs(path))
+
+
+
+class Base(object):
+    """
+    The base class for dependency scanners.  This implements
+    straightforward, single-pass scanning of a single file.
+    """
+
+    def __init__(self,
+                 function,
+                 name = "NONE",
+                 argument = _null,
+                 skeys = _null,
+                 path_function = None,
+                 # Node.FS.Base so that, by default, it's okay for a
+                 # scanner to return a Dir, File or Entry.
+                 node_class = SCons.Node.FS.Base,
+                 node_factory = None,
+                 scan_check = None,
+                 recursive = None):
+        """
+        Construct a new scanner object given a scanner function.
+
+        'function' - a scanner function taking two or three
+        arguments and returning a list of strings.
+
+        'name' - a name for identifying this scanner object.
+
+        'argument' - an optional argument that, if specified, will be
+        passed to both the scanner function and the path_function.
+
+        'skeys' - an optional list argument that can be used to determine
+        which scanner should be used for a given Node. In the case of File
+        nodes, for example, the 'skeys' would be file suffixes.
+
+        'path_function' - a function that takes four or five arguments
+        (a construction environment, Node for the directory containing
+        the SConscript file that defined the primary target, list of
+        target nodes, list of source nodes, and optional argument for
+        this instance) and returns a tuple of the directories that can
+        be searched for implicit dependency files.  May also return a
+        callable() which is called with no args and returns the tuple
+        (supporting Bindable class).
+
+        'node_class' - the class of Nodes which this scan will return.
+        If node_class is None, then this scanner will not enforce any
+        Node conversion and will return the raw results from the
+        underlying scanner function.
+
+        'node_factory' - the factory function to be called to translate
+        the raw results returned by the scanner function into the
+        expected node_class objects.
+
+        'scan_check' - a function to be called to first check whether
+        this node really needs to be scanned.
+
+        'recursive' - specifies that this scanner should be invoked
+        recursively on all of the implicit dependencies it returns
+        (the canonical example being #include lines in C source files).
+        May be a callable, which will be called to filter the list
+        of nodes found to select a subset for recursive scanning
+        (the canonical example being only recursively scanning
+        subdirectories within a directory).
+
+        The scanner function's first argument will be a Node that should
+        be scanned for dependencies, the second argument will be an
+        Environment object, the third argument will be the tuple of paths
+        returned by the path_function, and the fourth argument will be
+        the value passed into 'argument', and the returned list should
+        contain the Nodes for all the direct dependencies of the file.
+
+        Examples:
+
+        s = Scanner(my_scanner_function)
+
+        s = Scanner(function = my_scanner_function)
+
+        s = Scanner(function = my_scanner_function, argument = 'foo')
+
+        """
+
+        # Note: this class could easily work with scanner functions that take
+        # something other than a filename as an argument (e.g. a database
+        # node) and a dependencies list that aren't file names. All that
+        # would need to be changed is the documentation.
+
+        self.function = function
+        self.path_function = path_function
+        self.name = name
+        self.argument = argument
+
+        if skeys is _null:
+            if SCons.Util.is_Dict(function):
+                skeys = list(function.keys())
+            else:
+                skeys = []
+        self.skeys = skeys
+
+        self.node_class = node_class
+        self.node_factory = node_factory
+        self.scan_check = scan_check
+        if callable(recursive):
+            self.recurse_nodes = recursive
+        elif recursive:
+            self.recurse_nodes = self._recurse_all_nodes
+        else:
+            self.recurse_nodes = self._recurse_no_nodes
+
+    def path(self, env, dir=None, target=None, source=None):
+        if not self.path_function:
+            return ()
+        if not self.argument is _null:
+            return self.path_function(env, dir, target, source, self.argument)
+        else:
+            return self.path_function(env, dir, target, source)
+
+    def __call__(self, node, env, path = ()):
+        """
+        This method scans a single object. 'node' is the node
+        that will be passed to the scanner function, and 'env' is the
+        environment that will be passed to the scanner function. A list of
+        direct dependency nodes for the specified node will be returned.
+        """
+        if self.scan_check and not self.scan_check(node, env):
+            return []
+
+        self = self.select(node)
+
+        if not self.argument is _null:
+            list = self.function(node, env, path, self.argument)
+        else:
+            list = self.function(node, env, path)
+
+        kw = {}
+        if hasattr(node, 'dir'):
+            kw['directory'] = node.dir
+        node_factory = env.get_factory(self.node_factory)
+        nodes = []
+        for l in list:
+            if self.node_class and not isinstance(l, self.node_class):
+                l = node_factory(l, **kw)
+            nodes.append(l)
+        return nodes
+
+    def __cmp__(self, other):
+        try:
+            return cmp(self.__dict__, other.__dict__)
+        except AttributeError:
+            # other probably doesn't have a __dict__
+            return cmp(self.__dict__, other)
+
+    def __hash__(self):
+        return id(self)
+
+    def __str__(self):
+        return self.name
+
+    def add_skey(self, skey):
+        """Add a skey to the list of skeys"""
+        self.skeys.append(skey)
+
+    def get_skeys(self, env=None):
+        if env and SCons.Util.is_String(self.skeys):
+            return env.subst_list(self.skeys)[0]
+        return self.skeys
+
+    def select(self, node):
+        if SCons.Util.is_Dict(self.function):
+            key = node.scanner_key()
+            try:
+                return self.function[key]
+            except KeyError:
+                return None
+        else:
+            return self
+
+    def _recurse_all_nodes(self, nodes):
+        return nodes
+
+    def _recurse_no_nodes(self, nodes):
+        return []
+
+    recurse_nodes = _recurse_no_nodes
+
+    def add_scanner(self, skey, scanner):
+        self.function[skey] = scanner
+        self.add_skey(skey)
+
+
+class Selector(Base):
+    """
+    A class for selecting a more specific scanner based on the
+    scanner_key() (suffix) for a specific Node.
+
+    TODO:  This functionality has been moved into the inner workings of
+    the Base class, and this class will be deprecated at some point.
+    (It was never exposed directly as part of the public interface,
+    although it is used by the Scanner() factory function that was
+    used by various Tool modules and therefore was likely a template
+    for custom modules that may be out there.)
+    """
+    def __init__(self, dict, *args, **kw):
+        Base.__init__(self, None, *args, **kw)
+        self.dict = dict
+        self.skeys = list(dict.keys())
+
+    def __call__(self, node, env, path = ()):
+        return self.select(node)(node, env, path)
+
+    def select(self, node):
+        try:
+            return self.dict[node.scanner_key()]
+        except KeyError:
+            return None
+
+    def add_scanner(self, skey, scanner):
+        self.dict[skey] = scanner
+        self.add_skey(skey)
+
+
+class Current(Base):
+    """
+    A class for scanning files that are source files (have no builder)
+    or are derived files and are current (which implies that they exist,
+    either locally or in a repository).
+    """
+
+    def __init__(self, *args, **kw):
+        def current_check(node, env):
+            return not node.has_builder() or node.is_up_to_date()
+        kw['scan_check'] = current_check
+        Base.__init__(self, *args, **kw)
+
+class Classic(Current):
+    """
+    A Scanner subclass to contain the common logic for classic CPP-style
+    include scanning, but which can be customized to use different
+    regular expressions to find the includes.
+
+    Note that in order for this to work "out of the box" (without
+    overriding the find_include() and sort_key() methods), the regular
+    expression passed to the constructor must return the name of the
+    include file in group 0.
+    """
+
+    def __init__(self, name, suffixes, path_variable, regex, *args, **kw):
+
+        self.cre = re.compile(regex, re.M)
+
+        def _scan(node, env, path=(), self=self):
+            node = node.rfile()
+            if not node.exists():
+                return []
+            return self.scan(node, path)
+
+        kw['function'] = _scan
+        kw['path_function'] = FindPathDirs(path_variable)
+        kw['recursive'] = 1
+        kw['skeys'] = suffixes
+        kw['name'] = name
+
+        Current.__init__(self, *args, **kw)
+
+    def find_include(self, include, source_dir, path):
+        n = SCons.Node.FS.find_file(include, (source_dir,) + tuple(path))
+        return n, include
+
+    def sort_key(self, include):
+        return SCons.Node.FS._my_normcase(include)
+
+    def find_include_names(self, node):
+        return self.cre.findall(node.get_text_contents())
+
+    def scan(self, node, path=()):
+
+        # cache the includes list in node so we only scan it once:
+        if node.includes is not None:
+            includes = node.includes
+        else:
+            includes = self.find_include_names (node)
+            # Intern the names of the include files. Saves some memory
+            # if the same header is included many times.
+            node.includes = list(map(SCons.Util.silent_intern, includes))
+
+        # This is a hand-coded DSU (decorate-sort-undecorate, or
+        # Schwartzian transform) pattern.  The sort key is the raw name
+        # of the file as specifed on the #include line (including the
+        # " or <, since that may affect what file is found), which lets
+        # us keep the sort order constant regardless of whether the file
+        # is actually found in a Repository or locally.
+        nodes = []
+        source_dir = node.get_dir()
+        if callable(path):
+            path = path()
+        for include in includes:
+            n, i = self.find_include(include, source_dir, path)
+
+            if n is None:
+                SCons.Warnings.warn(SCons.Warnings.DependencyWarning,
+                                    "No dependency generated for file: %s (included from: %s) -- file not found" % (i, node))
+            else:
+                nodes.append((self.sort_key(include), n))
+
+        return [pair[1] for pair in sorted(nodes)]
+
+class ClassicCPP(Classic):
+    """
+    A Classic Scanner subclass which takes into account the type of
+    bracketing used to include the file, and uses classic CPP rules
+    for searching for the files based on the bracketing.
+
+    Note that in order for this to work, the regular expression passed
+    to the constructor must return the leading bracket in group 0, and
+    the contained filename in group 1.
+    """
+    def find_include(self, include, source_dir, path):
+        if include[0] == '"':
+            paths = (source_dir,) + tuple(path)
+        else:
+            paths = tuple(path) + (source_dir,)
+
+        n = SCons.Node.FS.find_file(include[1], paths)
+
+        i = SCons.Util.silent_intern(include[1])
+        return n, i
+
+    def sort_key(self, include):
+        return SCons.Node.FS._my_normcase(' '.join(include))
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Script/Interactive.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Script/Interactive.py
new file mode 100644
index 0000000..006a9e4
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Script/Interactive.py
@@ -0,0 +1,384 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Script/Interactive.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__doc__ = """
+SCons interactive mode
+"""
+
+# TODO:
+#
+# This has the potential to grow into something with a really big life
+# of its own, which might or might not be a good thing.  Nevertheless,
+# here are some enhancements that will probably be requested some day
+# and are worth keeping in mind (assuming this takes off):
+# 
+# - A command to re-read / re-load the SConscript files.  This may
+#   involve allowing people to specify command-line options (e.g. -f,
+#   -I, --no-site-dir) that affect how the SConscript files are read.
+#
+# - Additional command-line options on the "build" command.
+#
+#   Of the supported options that seemed to make sense (after a quick
+#   pass through the list), the ones that seemed likely enough to be
+#   used are listed in the man page and have explicit test scripts.
+#
+#   These had code changed in Script/Main.py to support them, but didn't
+#   seem likely to be used regularly, so had no test scripts added:
+#
+#       build --diskcheck=*
+#       build --implicit-cache=*
+#       build --implicit-deps-changed=*
+#       build --implicit-deps-unchanged=*
+#
+#   These look like they should "just work" with no changes to the
+#   existing code, but like those above, look unlikely to be used and
+#   therefore had no test scripts added:
+#
+#       build --random
+#
+#   These I'm not sure about.  They might be useful for individual
+#   "build" commands, and may even work, but they seem unlikely enough
+#   that we'll wait until they're requested before spending any time on
+#   writing test scripts for them, or investigating whether they work.
+#
+#       build -q [???  is there a useful analog to the exit status?]
+#       build --duplicate=
+#       build --profile=
+#       build --max-drift=
+#       build --warn=*
+#       build --Y
+#
+# - Most of the SCons command-line options that the "build" command
+#   supports should be settable as default options that apply to all
+#   subsequent "build" commands.  Maybe a "set {option}" command that
+#   maps to "SetOption('{option}')".
+#
+# - Need something in the 'help' command that prints the -h output.
+#
+# - A command to run the configure subsystem separately (must see how
+#   this interacts with the new automake model).
+#
+# - Command-line completion of target names; maybe even of SCons options?
+#   Completion is something that's supported by the Python cmd module,
+#   so this should be doable without too much trouble.
+#
+
+import cmd
+import copy
+import os
+import re
+import shlex
+import sys
+
+try:
+    import readline
+except ImportError:
+    pass
+
+class SConsInteractiveCmd(cmd.Cmd):
+    """\
+    build [TARGETS]         Build the specified TARGETS and their dependencies.
+                            'b' is a synonym.
+    clean [TARGETS]         Clean (remove) the specified TARGETS and their
+                            dependencies.  'c' is a synonym.
+    exit                    Exit SCons interactive mode.
+    help [COMMAND]          Prints help for the specified COMMAND.  'h' and
+                            '?' are synonyms.
+    shell [COMMANDLINE]     Execute COMMANDLINE in a subshell.  'sh' and '!'
+                            are synonyms.
+    version                 Prints SCons version information.
+    """
+
+    synonyms = {
+        'b'     : 'build',
+        'c'     : 'clean',
+        'h'     : 'help',
+        'scons' : 'build',
+        'sh'    : 'shell',
+    }
+
+    def __init__(self, **kw):
+        cmd.Cmd.__init__(self)
+        for key, val in kw.items():
+            setattr(self, key, val)
+
+        if sys.platform == 'win32':
+            self.shell_variable = 'COMSPEC'
+        else:
+            self.shell_variable = 'SHELL'
+
+    def default(self, argv):
+        print "*** Unknown command: %s" % argv[0]
+
+    def onecmd(self, line):
+        line = line.strip()
+        if not line:
+            print self.lastcmd
+            return self.emptyline()
+        self.lastcmd = line
+        if line[0] == '!':
+            line = 'shell ' + line[1:]
+        elif line[0] == '?':
+            line = 'help ' + line[1:]
+        if os.sep == '\\':
+            line = line.replace('\\', '\\\\')
+        argv = shlex.split(line)
+        argv[0] = self.synonyms.get(argv[0], argv[0])
+        if not argv[0]:
+            return self.default(line)
+        else:
+            try:
+                func = getattr(self, 'do_' + argv[0])
+            except AttributeError:
+                return self.default(argv)
+            return func(argv)
+
+    def do_build(self, argv):
+        """\
+        build [TARGETS]         Build the specified TARGETS and their
+                                dependencies.  'b' is a synonym.
+        """
+        import SCons.Node
+        import SCons.SConsign
+        import SCons.Script.Main
+
+        options = copy.deepcopy(self.options)
+
+        options, targets = self.parser.parse_args(argv[1:], values=options)
+
+        SCons.Script.COMMAND_LINE_TARGETS = targets
+
+        if targets:
+            SCons.Script.BUILD_TARGETS = targets
+        else:
+            # If the user didn't specify any targets on the command line,
+            # use the list of default targets.
+            SCons.Script.BUILD_TARGETS = SCons.Script._build_plus_default
+
+        nodes = SCons.Script.Main._build_targets(self.fs,
+                                                 options,
+                                                 targets,
+                                                 self.target_top)
+
+        if not nodes:
+            return
+
+        # Call each of the Node's alter_targets() methods, which may
+        # provide additional targets that ended up as part of the build
+        # (the canonical example being a VariantDir() when we're building
+        # from a source directory) and which we therefore need their
+        # state cleared, too.
+        x = []
+        for n in nodes:
+            x.extend(n.alter_targets()[0])
+        nodes.extend(x)
+
+        # Clean up so that we can perform the next build correctly.
+        #
+        # We do this by walking over all the children of the targets,
+        # and clearing their state.
+        #
+        # We currently have to re-scan each node to find their
+        # children, because built nodes have already been partially
+        # cleared and don't remember their children.  (In scons
+        # 0.96.1 and earlier, this wasn't the case, and we didn't
+        # have to re-scan the nodes.)
+        #
+        # Because we have to re-scan each node, we can't clear the
+        # nodes as we walk over them, because we may end up rescanning
+        # a cleared node as we scan a later node.  Therefore, only
+        # store the list of nodes that need to be cleared as we walk
+        # the tree, and clear them in a separate pass.
+        #
+        # XXX: Someone more familiar with the inner workings of scons
+        # may be able to point out a more efficient way to do this.
+
+        SCons.Script.Main.progress_display("scons: Clearing cached node information ...")
+
+        seen_nodes = {}
+
+        def get_unseen_children(node, parent, seen_nodes=seen_nodes):
+            def is_unseen(node, seen_nodes=seen_nodes):
+                return node not in seen_nodes
+            return list(filter(is_unseen, node.children(scan=1)))
+
+        def add_to_seen_nodes(node, parent, seen_nodes=seen_nodes):
+            seen_nodes[node] = 1
+
+            # If this file is in a VariantDir and has a
+            # corresponding source file in the source tree, remember the
+            # node in the source tree, too.  This is needed in
+            # particular to clear cached implicit dependencies on the
+            # source file, since the scanner will scan it if the
+            # VariantDir was created with duplicate=0.
+            try:
+                rfile_method = node.rfile
+            except AttributeError:
+                return
+            else:
+                rfile = rfile_method()
+            if rfile != node:
+                seen_nodes[rfile] = 1
+
+        for node in nodes:
+            walker = SCons.Node.Walker(node,
+                                        kids_func=get_unseen_children,
+                                        eval_func=add_to_seen_nodes)
+            n = walker.get_next()
+            while n:
+                n = walker.get_next()
+
+        for node in seen_nodes.keys():
+            # Call node.clear() to clear most of the state
+            node.clear()
+            # node.clear() doesn't reset node.state, so call
+            # node.set_state() to reset it manually
+            node.set_state(SCons.Node.no_state)
+            node.implicit = None
+
+            # Debug:  Uncomment to verify that all Taskmaster reference
+            # counts have been reset to zero.
+            #if node.ref_count != 0:
+            #    from SCons.Debug import Trace
+            #    Trace('node %s, ref_count %s !!!\n' % (node, node.ref_count))
+
+        SCons.SConsign.Reset()
+        SCons.Script.Main.progress_display("scons: done clearing node information.")
+
+    def do_clean(self, argv):
+        """\
+        clean [TARGETS]         Clean (remove) the specified TARGETS
+                                and their dependencies.  'c' is a synonym.
+        """
+        return self.do_build(['build', '--clean'] + argv[1:])
+
+    def do_EOF(self, argv):
+        print
+        self.do_exit(argv)
+
+    def _do_one_help(self, arg):
+        try:
+            # If help_<arg>() exists, then call it.
+            func = getattr(self, 'help_' + arg)
+        except AttributeError:
+            try:
+                func = getattr(self, 'do_' + arg)
+            except AttributeError:
+                doc = None
+            else:
+                doc = self._doc_to_help(func)
+            if doc:
+                sys.stdout.write(doc + '\n')
+                sys.stdout.flush()
+        else:
+            doc = self.strip_initial_spaces(func())
+            if doc:
+                sys.stdout.write(doc + '\n')
+                sys.stdout.flush()
+
+    def _doc_to_help(self, obj):
+        doc = obj.__doc__
+        if doc is None:
+            return ''
+        return self._strip_initial_spaces(doc)
+
+    def _strip_initial_spaces(self, s):
+        #lines = s.split('\n')
+        lines = s.split('\n')
+        spaces = re.match(' *', lines[0]).group(0)
+        #def strip_spaces(l):
+        #    if l.startswith(spaces):
+        #        l = l[len(spaces):]
+        #    return l
+        #return '\n'.join([ strip_spaces(l) for l in lines ])
+        def strip_spaces(l, spaces=spaces):
+            if l[:len(spaces)] == spaces:
+                l = l[len(spaces):]
+            return l
+        lines = list(map(strip_spaces, lines))
+        return '\n'.join(lines)
+
+    def do_exit(self, argv):
+        """\
+        exit                    Exit SCons interactive mode.
+        """
+        sys.exit(0)
+
+    def do_help(self, argv):
+        """\
+        help [COMMAND]          Prints help for the specified COMMAND.  'h'
+                                and '?' are synonyms.
+        """
+        if argv[1:]:
+            for arg in argv[1:]:
+                if self._do_one_help(arg):
+                    break
+        else:
+            # If bare 'help' is called, print this class's doc
+            # string (if it has one).
+            doc = self._doc_to_help(self.__class__)
+            if doc:
+                sys.stdout.write(doc + '\n')
+                sys.stdout.flush()
+
+    def do_shell(self, argv):
+        """\
+        shell [COMMANDLINE]     Execute COMMANDLINE in a subshell.  'sh' and
+                                '!' are synonyms.
+        """
+        import subprocess
+        argv = argv[1:]
+        if not argv:
+            argv = os.environ[self.shell_variable]
+        try:
+            # Per "[Python-Dev] subprocess insufficiently platform-independent?"
+            # http://mail.python.org/pipermail/python-dev/2008-August/081979.html "+
+            # Doing the right thing with an argument list currently
+            # requires different shell= values on Windows and Linux.
+            p = subprocess.Popen(argv, shell=(sys.platform=='win32'))
+        except EnvironmentError, e:
+            sys.stderr.write('scons: %s: %s\n' % (argv[0], e.strerror))
+        else:
+            p.wait()
+
+    def do_version(self, argv):
+        """\
+        version                 Prints SCons version information.
+        """
+        sys.stdout.write(self.parser.version + '\n')
+
+def interact(fs, parser, options, targets, target_top):
+    c = SConsInteractiveCmd(prompt = 'scons>>> ',
+                            fs = fs,
+                            parser = parser,
+                            options = options,
+                            targets = targets,
+                            target_top = target_top)
+    c.cmdloop()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Script/Main.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Script/Main.py
new file mode 100644
index 0000000..b7db8ac
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Script/Main.py
@@ -0,0 +1,1401 @@
+"""SCons.Script
+
+This file implements the main() function used by the scons script.
+
+Architecturally, this *is* the scons script, and will likely only be
+called from the external "scons" wrapper.  Consequently, anything here
+should not be, or be considered, part of the build engine.  If it's
+something that we expect other software to want to use, it should go in
+some other module.  If it's specific to the "scons" script invocation,
+it goes here.
+"""
+
+unsupported_python_version = (2, 3, 0)
+deprecated_python_version = (2, 4, 0)
+
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Script/Main.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.compat
+
+import os
+import sys
+import time
+import traceback
+
+# Strip the script directory from sys.path() so on case-insensitive
+# (Windows) systems Python doesn't think that the "scons" script is the
+# "SCons" package.  Replace it with our own version directory so, if
+# if they're there, we pick up the right version of the build engine
+# modules.
+#sys.path = [os.path.join(sys.prefix,
+#                         'lib',
+#                         'scons-%d' % SCons.__version__)] + sys.path[1:]
+
+import SCons.CacheDir
+import SCons.Debug
+import SCons.Defaults
+import SCons.Environment
+import SCons.Errors
+import SCons.Job
+import SCons.Node
+import SCons.Node.FS
+import SCons.Platform
+import SCons.SConf
+import SCons.Script
+import SCons.Taskmaster
+import SCons.Util
+import SCons.Warnings
+
+import SCons.Script.Interactive
+
+def fetch_win32_parallel_msg():
+    # A subsidiary function that exists solely to isolate this import
+    # so we don't have to pull it in on all platforms, and so that an
+    # in-line "import" statement in the _main() function below doesn't
+    # cause warnings about local names shadowing use of the 'SCons'
+    # globl in nest scopes and UnboundLocalErrors and the like in some
+    # versions (2.1) of Python.
+    import SCons.Platform.win32
+    return SCons.Platform.win32.parallel_msg
+
+#
+
+class SConsPrintHelpException(Exception):
+    pass
+
+display = SCons.Util.display
+progress_display = SCons.Util.DisplayEngine()
+
+first_command_start = None
+last_command_end = None
+
+class Progressor(object):
+    prev = ''
+    count = 0
+    target_string = '$TARGET'
+
+    def __init__(self, obj, interval=1, file=None, overwrite=False):
+        if file is None:
+            file = sys.stdout
+
+        self.obj = obj
+        self.file = file
+        self.interval = interval
+        self.overwrite = overwrite
+
+        if callable(obj):
+            self.func = obj
+        elif SCons.Util.is_List(obj):
+            self.func = self.spinner
+        elif obj.find(self.target_string) != -1:
+            self.func = self.replace_string
+        else:
+            self.func = self.string
+
+    def write(self, s):
+        self.file.write(s)
+        self.file.flush()
+        self.prev = s
+
+    def erase_previous(self):
+        if self.prev:
+            length = len(self.prev)
+            if self.prev[-1] in ('\n', '\r'):
+                length = length - 1
+            self.write(' ' * length + '\r')
+            self.prev = ''
+
+    def spinner(self, node):
+        self.write(self.obj[self.count % len(self.obj)])
+
+    def string(self, node):
+        self.write(self.obj)
+
+    def replace_string(self, node):
+        self.write(self.obj.replace(self.target_string, str(node)))
+
+    def __call__(self, node):
+        self.count = self.count + 1
+        if (self.count % self.interval) == 0:
+            if self.overwrite:
+                self.erase_previous()
+            self.func(node)
+
+ProgressObject = SCons.Util.Null()
+
+def Progress(*args, **kw):
+    global ProgressObject
+    ProgressObject = Progressor(*args, **kw)
+
+# Task control.
+#
+
+_BuildFailures = []
+
+def GetBuildFailures():
+    return _BuildFailures
+
+class BuildTask(SCons.Taskmaster.OutOfDateTask):
+    """An SCons build task."""
+    progress = ProgressObject
+
+    def display(self, message):
+        display('scons: ' + message)
+
+    def prepare(self):
+        self.progress(self.targets[0])
+        return SCons.Taskmaster.OutOfDateTask.prepare(self)
+
+    def needs_execute(self):
+        if SCons.Taskmaster.OutOfDateTask.needs_execute(self):
+            return True
+        if self.top and self.targets[0].has_builder():
+            display("scons: `%s' is up to date." % str(self.node))
+        return False
+
+    def execute(self):
+        if print_time:
+            start_time = time.time()
+            global first_command_start
+            if first_command_start is None:
+                first_command_start = start_time
+        SCons.Taskmaster.OutOfDateTask.execute(self)
+        if print_time:
+            global cumulative_command_time
+            global last_command_end
+            finish_time = time.time()
+            last_command_end = finish_time
+            cumulative_command_time = cumulative_command_time+finish_time-start_time
+            sys.stdout.write("Command execution time: %f seconds\n"%(finish_time-start_time))
+
+    def do_failed(self, status=2):
+        _BuildFailures.append(self.exception[1])
+        global exit_status
+        global this_build_status
+        if self.options.ignore_errors:
+            SCons.Taskmaster.OutOfDateTask.executed(self)
+        elif self.options.keep_going:
+            SCons.Taskmaster.OutOfDateTask.fail_continue(self)
+            exit_status = status
+            this_build_status = status
+        else:
+            SCons.Taskmaster.OutOfDateTask.fail_stop(self)
+            exit_status = status
+            this_build_status = status
+            
+    def executed(self):
+        t = self.targets[0]
+        if self.top and not t.has_builder() and not t.side_effect:
+            if not t.exists():
+                if t.__class__.__name__ in ('File', 'Dir', 'Entry'):
+                    errstr="Do not know how to make %s target `%s' (%s)." % (t.__class__.__name__, t, t.abspath)
+                else: # Alias or Python or ...
+                    errstr="Do not know how to make %s target `%s'." % (t.__class__.__name__, t)
+                sys.stderr.write("scons: *** " + errstr)
+                if not self.options.keep_going:
+                    sys.stderr.write("  Stop.")
+                sys.stderr.write("\n")
+                try:
+                    raise SCons.Errors.BuildError(t, errstr)
+                except KeyboardInterrupt:
+                    raise
+                except:
+                    self.exception_set()
+                self.do_failed()
+            else:
+                print "scons: Nothing to be done for `%s'." % t
+                SCons.Taskmaster.OutOfDateTask.executed(self)
+        else:
+            SCons.Taskmaster.OutOfDateTask.executed(self)
+
+    def failed(self):
+        # Handle the failure of a build task.  The primary purpose here
+        # is to display the various types of Errors and Exceptions
+        # appropriately.
+        exc_info = self.exc_info()
+        try:
+            t, e, tb = exc_info
+        except ValueError:
+            t, e = exc_info
+            tb = None
+
+        if t is None:
+            # The Taskmaster didn't record an exception for this Task;
+            # see if the sys module has one.
+            try:
+                t, e, tb = sys.exc_info()[:]
+            except ValueError:
+                t, e = exc_info
+                tb = None
+                
+        # Deprecated string exceptions will have their string stored
+        # in the first entry of the tuple.
+        if e is None:
+            e = t
+
+        buildError = SCons.Errors.convert_to_BuildError(e)
+        if not buildError.node:
+            buildError.node = self.node
+
+        node = buildError.node
+        if not SCons.Util.is_List(node):
+                node = [ node ]
+        nodename = ', '.join(map(str, node))
+
+        errfmt = "scons: *** [%s] %s\n"
+        sys.stderr.write(errfmt % (nodename, buildError))
+
+        if (buildError.exc_info[2] and buildError.exc_info[1] and 
+           not isinstance(
+               buildError.exc_info[1], 
+               (EnvironmentError, SCons.Errors.StopError,
+                            SCons.Errors.UserError))):
+            type, value, trace = buildError.exc_info
+            traceback.print_exception(type, value, trace)
+        elif tb and print_stacktrace:
+            sys.stderr.write("scons: internal stack trace:\n")
+            traceback.print_tb(tb, file=sys.stderr)
+
+        self.exception = (e, buildError, tb) # type, value, traceback
+        self.do_failed(buildError.exitstatus)
+
+        self.exc_clear()
+
+    def postprocess(self):
+        if self.top:
+            t = self.targets[0]
+            for tp in self.options.tree_printers:
+                tp.display(t)
+            if self.options.debug_includes:
+                tree = t.render_include_tree()
+                if tree:
+                    print
+                    print tree
+        SCons.Taskmaster.OutOfDateTask.postprocess(self)
+
+    def make_ready(self):
+        """Make a task ready for execution"""
+        SCons.Taskmaster.OutOfDateTask.make_ready(self)
+        if self.out_of_date and self.options.debug_explain:
+            explanation = self.out_of_date[0].explain()
+            if explanation:
+                sys.stdout.write("scons: " + explanation)
+
+class CleanTask(SCons.Taskmaster.AlwaysTask):
+    """An SCons clean task."""
+    def fs_delete(self, path, pathstr, remove=1):
+        try:
+            if os.path.lexists(path):
+                if os.path.isfile(path) or os.path.islink(path):
+                    if remove: os.unlink(path)
+                    display("Removed " + pathstr)
+                elif os.path.isdir(path) and not os.path.islink(path):
+                    # delete everything in the dir
+                    for e in sorted(os.listdir(path)):
+                        p = os.path.join(path, e)
+                        s = os.path.join(pathstr, e)
+                        if os.path.isfile(p):
+                            if remove: os.unlink(p)
+                            display("Removed " + s)
+                        else:
+                            self.fs_delete(p, s, remove)
+                    # then delete dir itself
+                    if remove: os.rmdir(path)
+                    display("Removed directory " + pathstr)
+                else:
+                    errstr = "Path '%s' exists but isn't a file or directory."
+                    raise SCons.Errors.UserError(errstr % (pathstr))
+        except SCons.Errors.UserError, e:
+            print e
+        except (IOError, OSError), e:
+            print "scons: Could not remove '%s':" % pathstr, e.strerror
+
+    def show(self):
+        target = self.targets[0]
+        if (target.has_builder() or target.side_effect) and not target.noclean:
+            for t in self.targets:
+                if not t.isdir():
+                    display("Removed " + str(t))
+        if target in SCons.Environment.CleanTargets:
+            files = SCons.Environment.CleanTargets[target]
+            for f in files:
+                self.fs_delete(f.abspath, str(f), 0)
+
+    def remove(self):
+        target = self.targets[0]
+        if (target.has_builder() or target.side_effect) and not target.noclean:
+            for t in self.targets:
+                try:
+                    removed = t.remove()
+                except OSError, e:
+                    # An OSError may indicate something like a permissions
+                    # issue, an IOError would indicate something like
+                    # the file not existing.  In either case, print a
+                    # message and keep going to try to remove as many
+                    # targets aa possible.
+                    print "scons: Could not remove '%s':" % str(t), e.strerror
+                else:
+                    if removed:
+                        display("Removed " + str(t))
+        if target in SCons.Environment.CleanTargets:
+            files = SCons.Environment.CleanTargets[target]
+            for f in files:
+                self.fs_delete(f.abspath, str(f))
+
+    execute = remove
+
+    # We want the Taskmaster to update the Node states (and therefore
+    # handle reference counts, etc.), but we don't want to call
+    # back to the Node's post-build methods, which would do things
+    # we don't want, like store .sconsign information.
+    executed = SCons.Taskmaster.Task.executed_without_callbacks
+
+    # Have the taskmaster arrange to "execute" all of the targets, because
+    # we'll figure out ourselves (in remove() or show() above) whether
+    # anything really needs to be done.
+    make_ready = SCons.Taskmaster.Task.make_ready_all
+
+    def prepare(self):
+        pass
+
+class QuestionTask(SCons.Taskmaster.AlwaysTask):
+    """An SCons task for the -q (question) option."""
+    def prepare(self):
+        pass
+
+    def execute(self):
+        if self.targets[0].get_state() != SCons.Node.up_to_date or \
+           (self.top and not self.targets[0].exists()):
+            global exit_status
+            global this_build_status
+            exit_status = 1
+            this_build_status = 1
+            self.tm.stop()
+
+    def executed(self):
+        pass
+
+
+class TreePrinter(object):
+    def __init__(self, derived=False, prune=False, status=False):
+        self.derived = derived
+        self.prune = prune
+        self.status = status
+    def get_all_children(self, node):
+        return node.all_children()
+    def get_derived_children(self, node):
+        children = node.all_children(None)
+        return [x for x in children if x.has_builder()]
+    def display(self, t):
+        if self.derived:
+            func = self.get_derived_children
+        else:
+            func = self.get_all_children
+        s = self.status and 2 or 0
+        SCons.Util.print_tree(t, func, prune=self.prune, showtags=s)
+
+
+def python_version_string():
+    return sys.version.split()[0]
+
+def python_version_unsupported(version=sys.version_info):
+    return version < unsupported_python_version
+
+def python_version_deprecated(version=sys.version_info):
+    return version < deprecated_python_version
+
+
+# Global variables
+
+print_objects = 0
+print_memoizer = 0
+print_stacktrace = 0
+print_time = 0
+sconscript_time = 0
+cumulative_command_time = 0
+exit_status = 0 # final exit status, assume success by default
+this_build_status = 0 # "exit status" of an individual build
+num_jobs = None
+delayed_warnings = []
+
+class FakeOptionParser(object):
+    """
+    A do-nothing option parser, used for the initial OptionsParser variable.
+
+    During normal SCons operation, the OptionsParser is created right
+    away by the main() function.  Certain tests scripts however, can
+    introspect on different Tool modules, the initialization of which
+    can try to add a new, local option to an otherwise uninitialized
+    OptionsParser object.  This allows that introspection to happen
+    without blowing up.
+
+    """
+    class FakeOptionValues(object):
+        def __getattr__(self, attr):
+            return None
+    values = FakeOptionValues()
+    def add_local_option(self, *args, **kw):
+        pass
+
+OptionsParser = FakeOptionParser()
+
+def AddOption(*args, **kw):
+    if 'default' not in kw:
+        kw['default'] = None
+    result = OptionsParser.add_local_option(*args, **kw)
+    return result
+
+def GetOption(name):
+    return getattr(OptionsParser.values, name)
+
+def SetOption(name, value):
+    return OptionsParser.values.set_option(name, value)
+
+#
+class Stats(object):
+    def __init__(self):
+        self.stats = []
+        self.labels = []
+        self.append = self.do_nothing
+        self.print_stats = self.do_nothing
+    def enable(self, outfp):
+        self.outfp = outfp
+        self.append = self.do_append
+        self.print_stats = self.do_print
+    def do_nothing(self, *args, **kw):
+        pass
+
+class CountStats(Stats):
+    def do_append(self, label):
+        self.labels.append(label)
+        self.stats.append(SCons.Debug.fetchLoggedInstances())
+    def do_print(self):
+        stats_table = {}
+        for s in self.stats:
+            for n in [t[0] for t in s]:
+                stats_table[n] = [0, 0, 0, 0]
+        i = 0
+        for s in self.stats:
+            for n, c in s:
+                stats_table[n][i] = c
+            i = i + 1
+        self.outfp.write("Object counts:\n")
+        pre = ["   "]
+        post = ["   %s\n"]
+        l = len(self.stats)
+        fmt1 = ''.join(pre + [' %7s']*l + post)
+        fmt2 = ''.join(pre + [' %7d']*l + post)
+        labels = self.labels[:l]
+        labels.append(("", "Class"))
+        self.outfp.write(fmt1 % tuple([x[0] for x in labels]))
+        self.outfp.write(fmt1 % tuple([x[1] for x in labels]))
+        for k in sorted(stats_table.keys()):
+            r = stats_table[k][:l] + [k]
+            self.outfp.write(fmt2 % tuple(r))
+
+count_stats = CountStats()
+
+class MemStats(Stats):
+    def do_append(self, label):
+        self.labels.append(label)
+        self.stats.append(SCons.Debug.memory())
+    def do_print(self):
+        fmt = 'Memory %-32s %12d\n'
+        for label, stats in zip(self.labels, self.stats):
+            self.outfp.write(fmt % (label, stats))
+
+memory_stats = MemStats()
+
+# utility functions
+
+def _scons_syntax_error(e):
+    """Handle syntax errors. Print out a message and show where the error
+    occurred.
+    """
+    etype, value, tb = sys.exc_info()
+    lines = traceback.format_exception_only(etype, value)
+    for line in lines:
+        sys.stderr.write(line+'\n')
+    sys.exit(2)
+
+def find_deepest_user_frame(tb):
+    """
+    Find the deepest stack frame that is not part of SCons.
+
+    Input is a "pre-processed" stack trace in the form
+    returned by traceback.extract_tb() or traceback.extract_stack()
+    """
+    
+    tb.reverse()
+
+    # find the deepest traceback frame that is not part
+    # of SCons:
+    for frame in tb:
+        filename = frame[0]
+        if filename.find(os.sep+'SCons'+os.sep) == -1:
+            return frame
+    return tb[0]
+
+def _scons_user_error(e):
+    """Handle user errors. Print out a message and a description of the
+    error, along with the line number and routine where it occured. 
+    The file and line number will be the deepest stack frame that is
+    not part of SCons itself.
+    """
+    global print_stacktrace
+    etype, value, tb = sys.exc_info()
+    if print_stacktrace:
+        traceback.print_exception(etype, value, tb)
+    filename, lineno, routine, dummy = find_deepest_user_frame(traceback.extract_tb(tb))
+    sys.stderr.write("\nscons: *** %s\n" % value)
+    sys.stderr.write('File "%s", line %d, in %s\n' % (filename, lineno, routine))
+    sys.exit(2)
+
+def _scons_user_warning(e):
+    """Handle user warnings. Print out a message and a description of
+    the warning, along with the line number and routine where it occured.
+    The file and line number will be the deepest stack frame that is
+    not part of SCons itself.
+    """
+    etype, value, tb = sys.exc_info()
+    filename, lineno, routine, dummy = find_deepest_user_frame(traceback.extract_tb(tb))
+    sys.stderr.write("\nscons: warning: %s\n" % e)
+    sys.stderr.write('File "%s", line %d, in %s\n' % (filename, lineno, routine))
+
+def _scons_internal_warning(e):
+    """Slightly different from _scons_user_warning in that we use the
+    *current call stack* rather than sys.exc_info() to get our stack trace.
+    This is used by the warnings framework to print warnings."""
+    filename, lineno, routine, dummy = find_deepest_user_frame(traceback.extract_stack())
+    sys.stderr.write("\nscons: warning: %s\n" % e.args[0])
+    sys.stderr.write('File "%s", line %d, in %s\n' % (filename, lineno, routine))
+
+def _scons_internal_error():
+    """Handle all errors but user errors. Print out a message telling
+    the user what to do in this case and print a normal trace.
+    """
+    print 'internal error'
+    traceback.print_exc()
+    sys.exit(2)
+
+def _SConstruct_exists(dirname='', repositories=[], filelist=None):
+    """This function checks that an SConstruct file exists in a directory.
+    If so, it returns the path of the file. By default, it checks the
+    current directory.
+    """
+    if not filelist:
+        filelist = ['SConstruct', 'Sconstruct', 'sconstruct']
+    for file in filelist:
+        sfile = os.path.join(dirname, file)
+        if os.path.isfile(sfile):
+            return sfile
+        if not os.path.isabs(sfile):
+            for rep in repositories:
+                if os.path.isfile(os.path.join(rep, sfile)):
+                    return sfile
+    return None
+
+def _set_debug_values(options):
+    global print_memoizer, print_objects, print_stacktrace, print_time
+
+    debug_values = options.debug
+
+    if "count" in debug_values:
+        # All of the object counts are within "if __debug__:" blocks,
+        # which get stripped when running optimized (with python -O or
+        # from compiled *.pyo files).  Provide a warning if __debug__ is
+        # stripped, so it doesn't just look like --debug=count is broken.
+        enable_count = False
+        if __debug__: enable_count = True
+        if enable_count:
+            count_stats.enable(sys.stdout)
+        else:
+            msg = "--debug=count is not supported when running SCons\n" + \
+                  "\twith the python -O option or optimized (.pyo) modules."
+            SCons.Warnings.warn(SCons.Warnings.NoObjectCountWarning, msg)
+    if "dtree" in debug_values:
+        options.tree_printers.append(TreePrinter(derived=True))
+    options.debug_explain = ("explain" in debug_values)
+    if "findlibs" in debug_values:
+        SCons.Scanner.Prog.print_find_libs = "findlibs"
+    options.debug_includes = ("includes" in debug_values)
+    print_memoizer = ("memoizer" in debug_values)
+    if "memory" in debug_values:
+        memory_stats.enable(sys.stdout)
+    print_objects = ("objects" in debug_values)
+    if "presub" in debug_values:
+        SCons.Action.print_actions_presub = 1
+    if "stacktrace" in debug_values:
+        print_stacktrace = 1
+    if "stree" in debug_values:
+        options.tree_printers.append(TreePrinter(status=True))
+    if "time" in debug_values:
+        print_time = 1
+    if "tree" in debug_values:
+        options.tree_printers.append(TreePrinter())
+
+def _create_path(plist):
+    path = '.'
+    for d in plist:
+        if os.path.isabs(d):
+            path = d
+        else:
+            path = path + '/' + d
+    return path
+
+def _load_site_scons_dir(topdir, site_dir_name=None):
+    """Load the site_scons dir under topdir.
+    Prepends site_scons to sys.path, imports site_scons/site_init.py,
+    and prepends site_scons/site_tools to default toolpath."""
+    if site_dir_name:
+        err_if_not_found = True       # user specified: err if missing
+    else:
+        site_dir_name = "site_scons"
+        err_if_not_found = False
+        
+    site_dir = os.path.join(topdir, site_dir_name)
+    if not os.path.exists(site_dir):
+        if err_if_not_found:
+            raise SCons.Errors.UserError("site dir %s not found."%site_dir)
+        return
+
+    site_init_filename = "site_init.py"
+    site_init_modname = "site_init"
+    site_tools_dirname = "site_tools"
+    # prepend to sys.path
+    sys.path = [os.path.abspath(site_dir)] + sys.path
+    site_init_file = os.path.join(site_dir, site_init_filename)
+    site_tools_dir = os.path.join(site_dir, site_tools_dirname)
+    if os.path.exists(site_init_file):
+        import imp, re
+        # TODO(2.4): turn this into try:-except:-finally:
+        try:
+            try:
+                fp, pathname, description = imp.find_module(site_init_modname,
+                                                            [site_dir])
+                # Load the file into SCons.Script namespace.  This is
+                # opaque and clever; m is the module object for the
+                # SCons.Script module, and the exec ... in call executes a
+                # file (or string containing code) in the context of the
+                # module's dictionary, so anything that code defines ends
+                # up adding to that module.  This is really short, but all
+                # the error checking makes it longer.
+                try:
+                    m = sys.modules['SCons.Script']
+                except Exception, e:
+                    fmt = 'cannot import site_init.py: missing SCons.Script module %s'
+                    raise SCons.Errors.InternalError(fmt % repr(e))
+                try:
+                    sfx = description[0]
+                    modname = os.path.basename(pathname)[:-len(sfx)]
+                    site_m = {"__file__": pathname, "__name__": modname, "__doc__": None}
+                    re_special = re.compile("__[^_]+__")
+                    for k in m.__dict__.keys():
+                        if not re_special.match(k):
+                            site_m[k] = m.__dict__[k]
+
+                    # This is the magic.
+                    exec fp in site_m
+                except KeyboardInterrupt:
+                    raise
+                except Exception, e:
+                    fmt = '*** Error loading site_init file %s:\n'
+                    sys.stderr.write(fmt % repr(site_init_file))
+                    raise
+                else:
+                    for k in site_m:
+                        if not re_special.match(k):
+                            m.__dict__[k] = site_m[k]
+            except KeyboardInterrupt:
+                raise
+            except ImportError, e:
+                fmt = '*** cannot import site init file %s:\n'
+                sys.stderr.write(fmt % repr(site_init_file))
+                raise
+        finally:
+            if fp:
+                fp.close()
+    if os.path.exists(site_tools_dir):
+        # prepend to DefaultToolpath
+        SCons.Tool.DefaultToolpath.insert(0, os.path.abspath(site_tools_dir))
+
+def _load_all_site_scons_dirs(topdir, verbose=None):
+    """Load all of the predefined site_scons dir.
+    Order is significant; we load them in order from most generic
+    (machine-wide) to most specific (topdir).
+    The verbose argument is only for testing.
+    """
+    platform = SCons.Platform.platform_default()
+
+    def homedir(d):
+        return os.path.expanduser('~/'+d)
+
+    if platform == 'win32' or platform == 'cygwin':
+        # Note we use $ here instead of %...% because older
+        # pythons (prior to 2.6?) didn't expand %...% on Windows.
+        # This set of dirs should work on XP, Vista, 7 and later.
+        sysdirs=[
+            os.path.expandvars('$ALLUSERSPROFILE\\Application Data\\scons'),
+            os.path.expandvars('$USERPROFILE\\Local Settings\\Application Data\\scons')]
+        appdatadir = os.path.expandvars('$APPDATA\\scons')
+        if appdatadir not in sysdirs:
+            sysdirs.append(appdatadir)
+        sysdirs.append(homedir('.scons'))
+
+    elif platform == 'darwin':  # MacOS X
+        sysdirs=['/Library/Application Support/SCons',
+                 '/opt/local/share/scons', # (for MacPorts)
+                 '/sw/share/scons', # (for Fink)
+                  homedir('Library/Application Support/SCons'),
+                  homedir('.scons')]
+    elif platform == 'sunos':   # Solaris
+        sysdirs=['/opt/sfw/scons',
+                 '/usr/share/scons',
+                 homedir('.scons')]
+    else:                       # Linux, HPUX, etc.
+        # assume posix-like, i.e. platform == 'posix'
+        sysdirs=['/usr/share/scons',
+                 homedir('.scons')]
+
+    dirs=sysdirs + [topdir]
+    for d in dirs:
+        if verbose:    # this is used by unit tests.
+            print "Loading site dir ", d
+        _load_site_scons_dir(d)
+
+def test_load_all_site_scons_dirs(d):
+    _load_all_site_scons_dirs(d, True)
+
+def version_string(label, module):
+    version = module.__version__
+    build = module.__build__
+    if build:
+        if build[0] != '.':
+            build = '.' + build
+        version = version + build
+    fmt = "\t%s: v%s, %s, by %s on %s\n"
+    return fmt % (label,
+                  version,
+                  module.__date__,
+                  module.__developer__,
+                  module.__buildsys__)
+
+def path_string(label, module):
+    path = module.__path__
+    return "\t%s path: %s\n"%(label,path)
+
+def _main(parser):
+    global exit_status
+    global this_build_status
+
+    options = parser.values
+
+    # Here's where everything really happens.
+
+    # First order of business:  set up default warnings and then
+    # handle the user's warning options, so that we can issue (or
+    # suppress) appropriate warnings about anything that might happen,
+    # as configured by the user.
+
+    default_warnings = [ SCons.Warnings.WarningOnByDefault,
+                         SCons.Warnings.DeprecatedWarning,
+                       ]
+
+    for warning in default_warnings:
+        SCons.Warnings.enableWarningClass(warning)
+    SCons.Warnings._warningOut = _scons_internal_warning
+    SCons.Warnings.process_warn_strings(options.warn)
+
+    # Now that we have the warnings configuration set up, we can actually
+    # issue (or suppress) any warnings about warning-worthy things that
+    # occurred while the command-line options were getting parsed.
+    try:
+        dw = options.delayed_warnings
+    except AttributeError:
+        pass
+    else:
+        delayed_warnings.extend(dw)
+    for warning_type, message in delayed_warnings:
+        SCons.Warnings.warn(warning_type, message)
+
+    if options.diskcheck:
+        SCons.Node.FS.set_diskcheck(options.diskcheck)
+
+    # Next, we want to create the FS object that represents the outside
+    # world's file system, as that's central to a lot of initialization.
+    # To do this, however, we need to be in the directory from which we
+    # want to start everything, which means first handling any relevant
+    # options that might cause us to chdir somewhere (-C, -D, -U, -u).
+    if options.directory:
+        script_dir = os.path.abspath(_create_path(options.directory))
+    else:
+        script_dir = os.getcwd()
+
+    target_top = None
+    if options.climb_up:
+        target_top = '.'  # directory to prepend to targets
+        while script_dir and not _SConstruct_exists(script_dir,
+                                                    options.repository,
+                                                    options.file):
+            script_dir, last_part = os.path.split(script_dir)
+            if last_part:
+                target_top = os.path.join(last_part, target_top)
+            else:
+                script_dir = ''
+
+    if script_dir and script_dir != os.getcwd():
+        display("scons: Entering directory `%s'" % script_dir)
+        try:
+            os.chdir(script_dir)
+        except OSError:
+            sys.stderr.write("Could not change directory to %s\n" % script_dir)
+
+    # Now that we're in the top-level SConstruct directory, go ahead
+    # and initialize the FS object that represents the file system,
+    # and make it the build engine default.
+    fs = SCons.Node.FS.get_default_fs()
+
+    for rep in options.repository:
+        fs.Repository(rep)
+
+    # Now that we have the FS object, the next order of business is to
+    # check for an SConstruct file (or other specified config file).
+    # If there isn't one, we can bail before doing any more work.
+    scripts = []
+    if options.file:
+        scripts.extend(options.file)
+    if not scripts:
+        sfile = _SConstruct_exists(repositories=options.repository,
+                                   filelist=options.file)
+        if sfile:
+            scripts.append(sfile)
+
+    if not scripts:
+        if options.help:
+            # There's no SConstruct, but they specified -h.
+            # Give them the options usage now, before we fail
+            # trying to read a non-existent SConstruct file.
+            raise SConsPrintHelpException
+        raise SCons.Errors.UserError("No SConstruct file found.")
+
+    if scripts[0] == "-":
+        d = fs.getcwd()
+    else:
+        d = fs.File(scripts[0]).dir
+    fs.set_SConstruct_dir(d)
+
+    _set_debug_values(options)
+    SCons.Node.implicit_cache = options.implicit_cache
+    SCons.Node.implicit_deps_changed = options.implicit_deps_changed
+    SCons.Node.implicit_deps_unchanged = options.implicit_deps_unchanged
+
+    if options.no_exec:
+        SCons.SConf.dryrun = 1
+        SCons.Action.execute_actions = None
+    if options.question:
+        SCons.SConf.dryrun = 1
+    if options.clean:
+        SCons.SConf.SetBuildType('clean')
+    if options.help:
+        SCons.SConf.SetBuildType('help')
+    SCons.SConf.SetCacheMode(options.config)
+    SCons.SConf.SetProgressDisplay(progress_display)
+
+    if options.no_progress or options.silent:
+        progress_display.set_mode(0)
+
+    if options.site_dir:
+        _load_site_scons_dir(d.path, options.site_dir)
+    elif not options.no_site_dir:
+        _load_all_site_scons_dirs(d.path)
+        
+    if options.include_dir:
+        sys.path = options.include_dir + sys.path
+
+    # That should cover (most of) the options.  Next, set up the variables
+    # that hold command-line arguments, so the SConscript files that we
+    # read and execute have access to them.
+    targets = []
+    xmit_args = []
+    for a in parser.largs:
+        if a[:1] == '-':
+            continue
+        if '=' in a:
+            xmit_args.append(a)
+        else:
+            targets.append(a)
+    SCons.Script._Add_Targets(targets + parser.rargs)
+    SCons.Script._Add_Arguments(xmit_args)
+
+    # If stdout is not a tty, replace it with a wrapper object to call flush
+    # after every write.
+    #
+    # Tty devices automatically flush after every newline, so the replacement
+    # isn't necessary.  Furthermore, if we replace sys.stdout, the readline
+    # module will no longer work.  This affects the behavior during
+    # --interactive mode.  --interactive should only be used when stdin and
+    # stdout refer to a tty.
+    if not hasattr(sys.stdout, 'isatty') or not sys.stdout.isatty():
+        sys.stdout = SCons.Util.Unbuffered(sys.stdout)
+    if not hasattr(sys.stderr, 'isatty') or not sys.stderr.isatty():
+        sys.stderr = SCons.Util.Unbuffered(sys.stderr)
+
+    memory_stats.append('before reading SConscript files:')
+    count_stats.append(('pre-', 'read'))
+
+    # And here's where we (finally) read the SConscript files.
+
+    progress_display("scons: Reading SConscript files ...")
+
+    start_time = time.time()
+    try:
+        for script in scripts:
+            SCons.Script._SConscript._SConscript(fs, script)
+    except SCons.Errors.StopError, e:
+        # We had problems reading an SConscript file, such as it
+        # couldn't be copied in to the VariantDir.  Since we're just
+        # reading SConscript files and haven't started building
+        # things yet, stop regardless of whether they used -i or -k
+        # or anything else.
+        sys.stderr.write("scons: *** %s  Stop.\n" % e)
+        exit_status = 2
+        sys.exit(exit_status)
+    global sconscript_time
+    sconscript_time = time.time() - start_time
+
+    progress_display("scons: done reading SConscript files.")
+
+    memory_stats.append('after reading SConscript files:')
+    count_stats.append(('post-', 'read'))
+
+    # Re-{enable,disable} warnings in case they disabled some in
+    # the SConscript file.
+    #
+    # We delay enabling the PythonVersionWarning class until here so that,
+    # if they explicity disabled it in either in the command line or in
+    # $SCONSFLAGS, or in the SConscript file, then the search through
+    # the list of deprecated warning classes will find that disabling
+    # first and not issue the warning.
+    #SCons.Warnings.enableWarningClass(SCons.Warnings.PythonVersionWarning)
+    SCons.Warnings.process_warn_strings(options.warn)
+
+    # Now that we've read the SConscript files, we can check for the
+    # warning about deprecated Python versions--delayed until here
+    # in case they disabled the warning in the SConscript files.
+    if python_version_deprecated():
+        msg = "Support for pre-2.4 Python (%s) is deprecated.\n" + \
+              "    If this will cause hardship, contact dev at scons.tigris.org."
+        SCons.Warnings.warn(SCons.Warnings.PythonVersionWarning,
+                            msg % python_version_string())
+
+    if not options.help:
+        SCons.SConf.CreateConfigHBuilder(SCons.Defaults.DefaultEnvironment())
+
+    # Now re-parse the command-line options (any to the left of a '--'
+    # argument, that is) with any user-defined command-line options that
+    # the SConscript files may have added to the parser object.  This will
+    # emit the appropriate error message and exit if any unknown option
+    # was specified on the command line.
+
+    parser.preserve_unknown_options = False
+    parser.parse_args(parser.largs, options)
+
+    if options.help:
+        help_text = SCons.Script.help_text
+        if help_text is None:
+            # They specified -h, but there was no Help() inside the
+            # SConscript files.  Give them the options usage.
+            raise SConsPrintHelpException
+        else:
+            print help_text
+            print "Use scons -H for help about command-line options."
+        exit_status = 0
+        return
+
+    # Change directory to the top-level SConstruct directory, then tell
+    # the Node.FS subsystem that we're all done reading the SConscript
+    # files and calling Repository() and VariantDir() and changing
+    # directories and the like, so it can go ahead and start memoizing
+    # the string values of file system nodes.
+
+    fs.chdir(fs.Top)
+
+    SCons.Node.FS.save_strings(1)
+
+    # Now that we've read the SConscripts we can set the options
+    # that are SConscript settable:
+    SCons.Node.implicit_cache = options.implicit_cache
+    SCons.Node.FS.set_duplicate(options.duplicate)
+    fs.set_max_drift(options.max_drift)
+
+    SCons.Job.explicit_stack_size = options.stack_size
+
+    if options.md5_chunksize:
+        SCons.Node.FS.File.md5_chunksize = options.md5_chunksize
+
+    platform = SCons.Platform.platform_module()
+
+    if options.interactive:
+        SCons.Script.Interactive.interact(fs, OptionsParser, options,
+                                          targets, target_top)
+
+    else:
+
+        # Build the targets
+        nodes = _build_targets(fs, options, targets, target_top)
+        if not nodes:
+            exit_status = 2
+
+def _build_targets(fs, options, targets, target_top):
+
+    global this_build_status
+    this_build_status = 0
+
+    progress_display.set_mode(not (options.no_progress or options.silent))
+    display.set_mode(not options.silent)
+    SCons.Action.print_actions          = not options.silent
+    SCons.Action.execute_actions        = not options.no_exec
+    SCons.Node.FS.do_store_info         = not options.no_exec
+    SCons.SConf.dryrun                  = options.no_exec
+
+    if options.diskcheck:
+        SCons.Node.FS.set_diskcheck(options.diskcheck)
+
+    SCons.CacheDir.cache_enabled = not options.cache_disable
+    SCons.CacheDir.cache_debug = options.cache_debug
+    SCons.CacheDir.cache_force = options.cache_force
+    SCons.CacheDir.cache_show = options.cache_show
+
+    if options.no_exec:
+        CleanTask.execute = CleanTask.show
+    else:
+        CleanTask.execute = CleanTask.remove
+
+    lookup_top = None
+    if targets or SCons.Script.BUILD_TARGETS != SCons.Script._build_plus_default:
+        # They specified targets on the command line or modified
+        # BUILD_TARGETS in the SConscript file(s), so if they used -u,
+        # -U or -D, we have to look up targets relative to the top,
+        # but we build whatever they specified.
+        if target_top:
+            lookup_top = fs.Dir(target_top)
+            target_top = None
+
+        targets = SCons.Script.BUILD_TARGETS
+    else:
+        # There are no targets specified on the command line,
+        # so if they used -u, -U or -D, we may have to restrict
+        # what actually gets built.
+        d = None
+        if target_top:
+            if options.climb_up == 1:
+                # -u, local directory and below
+                target_top = fs.Dir(target_top)
+                lookup_top = target_top
+            elif options.climb_up == 2:
+                # -D, all Default() targets
+                target_top = None
+                lookup_top = None
+            elif options.climb_up == 3:
+                # -U, local SConscript Default() targets
+                target_top = fs.Dir(target_top)
+                def check_dir(x, target_top=target_top):
+                    if hasattr(x, 'cwd') and not x.cwd is None:
+                        cwd = x.cwd.srcnode()
+                        return cwd == target_top
+                    else:
+                        # x doesn't have a cwd, so it's either not a target,
+                        # or not a file, so go ahead and keep it as a default
+                        # target and let the engine sort it out:
+                        return 1                
+                d = list(filter(check_dir, SCons.Script.DEFAULT_TARGETS))
+                SCons.Script.DEFAULT_TARGETS[:] = d
+                target_top = None
+                lookup_top = None
+
+        targets = SCons.Script._Get_Default_Targets(d, fs)
+
+    if not targets:
+        sys.stderr.write("scons: *** No targets specified and no Default() targets found.  Stop.\n")
+        return None
+
+    def Entry(x, ltop=lookup_top, ttop=target_top, fs=fs):
+        if isinstance(x, SCons.Node.Node):
+            node = x
+        else:
+            node = None
+            # Why would ltop be None? Unfortunately this happens.
+            if ltop is None: ltop = ''
+            # Curdir becomes important when SCons is called with -u, -C,
+            # or similar option that changes directory, and so the paths
+            # of targets given on the command line need to be adjusted.
+            curdir = os.path.join(os.getcwd(), str(ltop))
+            for lookup in SCons.Node.arg2nodes_lookups:
+                node = lookup(x, curdir=curdir)
+                if node is not None:
+                    break
+            if node is None:
+                node = fs.Entry(x, directory=ltop, create=1)
+        if ttop and not node.is_under(ttop):
+            if isinstance(node, SCons.Node.FS.Dir) and ttop.is_under(node):
+                node = ttop
+            else:
+                node = None
+        return node
+
+    nodes = [_f for _f in map(Entry, targets) if _f]
+
+    task_class = BuildTask      # default action is to build targets
+    opening_message = "Building targets ..."
+    closing_message = "done building targets."
+    if options.keep_going:
+        failure_message = "done building targets (errors occurred during build)."
+    else:
+        failure_message = "building terminated because of errors."
+    if options.question:
+        task_class = QuestionTask
+    try:
+        if options.clean:
+            task_class = CleanTask
+            opening_message = "Cleaning targets ..."
+            closing_message = "done cleaning targets."
+            if options.keep_going:
+                failure_message = "done cleaning targets (errors occurred during clean)."
+            else:
+                failure_message = "cleaning terminated because of errors."
+    except AttributeError:
+        pass
+
+    task_class.progress = ProgressObject
+
+    if options.random:
+        def order(dependencies):
+            """Randomize the dependencies."""
+            import random
+            # This is cribbed from the implementation of
+            # random.shuffle() in Python 2.X.
+            d = dependencies
+            for i in range(len(d)-1, 0, -1):
+                j = int(random.random() * (i+1))
+                d[i], d[j] = d[j], d[i]
+            return d
+    else:
+        def order(dependencies):
+            """Leave the order of dependencies alone."""
+            return dependencies
+
+    if options.taskmastertrace_file == '-':
+        tmtrace = sys.stdout
+    elif options.taskmastertrace_file:
+        tmtrace = open(options.taskmastertrace_file, 'wb')
+    else:
+        tmtrace = None
+    taskmaster = SCons.Taskmaster.Taskmaster(nodes, task_class, order, tmtrace)
+
+    # Let the BuildTask objects get at the options to respond to the
+    # various print_* settings, tree_printer list, etc.
+    BuildTask.options = options
+
+    global num_jobs
+    num_jobs = options.num_jobs
+    jobs = SCons.Job.Jobs(num_jobs, taskmaster)
+    if num_jobs > 1:
+        msg = None
+        if jobs.num_jobs == 1:
+            msg = "parallel builds are unsupported by this version of Python;\n" + \
+                  "\tignoring -j or num_jobs option.\n"
+        elif sys.platform == 'win32':
+            msg = fetch_win32_parallel_msg()
+        if msg:
+            SCons.Warnings.warn(SCons.Warnings.NoParallelSupportWarning, msg)
+
+    memory_stats.append('before building targets:')
+    count_stats.append(('pre-', 'build'))
+
+    def jobs_postfunc(
+        jobs=jobs,
+        options=options,
+        closing_message=closing_message,
+        failure_message=failure_message
+        ):
+        if jobs.were_interrupted():
+            if not options.no_progress and not options.silent:
+                sys.stderr.write("scons: Build interrupted.\n")
+            global exit_status
+            global this_build_status
+            exit_status = 2
+            this_build_status = 2
+
+        if this_build_status:
+            progress_display("scons: " + failure_message)
+        else:
+            progress_display("scons: " + closing_message)
+        if not options.no_exec:
+            if jobs.were_interrupted():
+                progress_display("scons: writing .sconsign file.")
+            SCons.SConsign.write()
+
+    progress_display("scons: " + opening_message)
+    jobs.run(postfunc = jobs_postfunc)
+
+    memory_stats.append('after building targets:')
+    count_stats.append(('post-', 'build'))
+
+    return nodes
+
+def _exec_main(parser, values):
+    sconsflags = os.environ.get('SCONSFLAGS', '')
+    all_args = sconsflags.split() + sys.argv[1:]
+
+    options, args = parser.parse_args(all_args, values)
+
+    if isinstance(options.debug, list) and "pdb" in options.debug:
+        import pdb
+        pdb.Pdb().runcall(_main, parser)
+    elif options.profile_file:
+        # compat layer imports "cProfile" for us if it's available.
+        from profile import Profile
+
+        # Some versions of Python 2.4 shipped a profiler that had the
+        # wrong 'c_exception' entry in its dispatch table.  Make sure
+        # we have the right one.  (This may put an unnecessary entry
+        # in the table in earlier versions of Python, but its presence
+        # shouldn't hurt anything).
+        try:
+            dispatch = Profile.dispatch
+        except AttributeError:
+            pass
+        else:
+            dispatch['c_exception'] = Profile.trace_dispatch_return
+
+        prof = Profile()
+        try:
+            prof.runcall(_main, parser)
+        except SConsPrintHelpException, e:
+            prof.dump_stats(options.profile_file)
+            raise e
+        except SystemExit:
+            pass
+        prof.dump_stats(options.profile_file)
+    else:
+        _main(parser)
+
+def main():
+    global OptionsParser
+    global exit_status
+    global first_command_start
+
+    # Check up front for a Python version we do not support.  We
+    # delay the check for deprecated Python versions until later,
+    # after the SConscript files have been read, in case they
+    # disable that warning.
+    if python_version_unsupported():
+        msg = "scons: *** SCons version %s does not run under Python version %s.\n"
+        sys.stderr.write(msg % (SCons.__version__, python_version_string()))
+        sys.exit(1)
+
+    parts = ["SCons by Steven Knight et al.:\n"]
+    try:
+        import __main__
+        parts.append(version_string("script", __main__))
+    except (ImportError, AttributeError):
+        # On Windows there is no scons.py, so there is no
+        # __main__.__version__, hence there is no script version.
+        pass 
+    parts.append(version_string("engine", SCons))
+    parts.append(path_string("engine", SCons))
+    parts.append("Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation")
+    version = ''.join(parts)
+
+    import SConsOptions
+    parser = SConsOptions.Parser(version)
+    values = SConsOptions.SConsValues(parser.get_default_values())
+
+    OptionsParser = parser
+    
+    try:
+        _exec_main(parser, values)
+    except SystemExit, s:
+        if s:
+            exit_status = s
+    except KeyboardInterrupt:
+        print("scons: Build interrupted.")
+        sys.exit(2)
+    except SyntaxError, e:
+        _scons_syntax_error(e)
+    except SCons.Errors.InternalError:
+        _scons_internal_error()
+    except SCons.Errors.UserError, e:
+        _scons_user_error(e)
+    except SConsPrintHelpException:
+        parser.print_help()
+        exit_status = 0
+    except SCons.Errors.BuildError, e:
+        exit_status = e.exitstatus
+    except:
+        # An exception here is likely a builtin Python exception Python
+        # code in an SConscript file.  Show them precisely what the
+        # problem was and where it happened.
+        SCons.Script._SConscript.SConscript_exception()
+        sys.exit(2)
+
+    memory_stats.print_stats()
+    count_stats.print_stats()
+
+    if print_objects:
+        SCons.Debug.listLoggedInstances('*')
+        #SCons.Debug.dumpLoggedInstances('*')
+
+    if print_memoizer:
+        SCons.Memoize.Dump("Memoizer (memory cache) hits and misses:")
+
+    # Dump any development debug info that may have been enabled.
+    # These are purely for internal debugging during development, so
+    # there's no need to control them with --debug= options; they're
+    # controlled by changing the source code.
+    SCons.Debug.dump_caller_counts()
+    SCons.Taskmaster.dump_stats()
+
+    if print_time:
+        total_time = time.time() - SCons.Script.start_time
+        if num_jobs == 1:
+            ct = cumulative_command_time
+        else:
+            if last_command_end is None or first_command_start is None:
+                ct = 0.0
+            else:
+                ct = last_command_end - first_command_start
+        scons_time = total_time - sconscript_time - ct
+        print "Total build time: %f seconds"%total_time
+        print "Total SConscript file execution time: %f seconds"%sconscript_time
+        print "Total SCons execution time: %f seconds"%scons_time
+        print "Total command execution time: %f seconds"%ct
+
+    sys.exit(exit_status)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Script/SConsOptions.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Script/SConsOptions.py
new file mode 100644
index 0000000..82290e0
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Script/SConsOptions.py
@@ -0,0 +1,939 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Script/SConsOptions.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import optparse
+import re
+import sys
+import textwrap
+
+no_hyphen_re = re.compile(r'(\s+|(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))')
+
+try:
+    from gettext import gettext
+except ImportError:
+    def gettext(message):
+        return message
+_ = gettext
+
+import SCons.Node.FS
+import SCons.Warnings
+
+OptionValueError        = optparse.OptionValueError
+SUPPRESS_HELP           = optparse.SUPPRESS_HELP
+
+diskcheck_all = SCons.Node.FS.diskcheck_types()
+
+def diskcheck_convert(value):
+    if value is None:
+        return []
+    if not SCons.Util.is_List(value):
+        value = value.split(',')
+    result = []
+    for v in value:
+        v = v.lower()
+        if v == 'all':
+            result = diskcheck_all
+        elif v == 'none':
+            result = []
+        elif v in diskcheck_all:
+            result.append(v)
+        else:
+            raise ValueError(v)
+    return result
+
+class SConsValues(optparse.Values):
+    """
+    Holder class for uniform access to SCons options, regardless
+    of whether or not they can be set on the command line or in the
+    SConscript files (using the SetOption() function).
+
+    A SCons option value can originate three different ways:
+
+        1)  set on the command line;
+        2)  set in an SConscript file;
+        3)  the default setting (from the the op.add_option()
+            calls in the Parser() function, below).
+
+    The command line always overrides a value set in a SConscript file,
+    which in turn always overrides default settings.  Because we want
+    to support user-specified options in the SConscript file itself,
+    though, we may not know about all of the options when the command
+    line is first parsed, so we can't make all the necessary precedence
+    decisions at the time the option is configured.
+
+    The solution implemented in this class is to keep these different sets
+    of settings separate (command line, SConscript file, and default)
+    and to override the __getattr__() method to check them in turn.
+    This should allow the rest of the code to just fetch values as
+    attributes of an instance of this class, without having to worry
+    about where they came from.
+
+    Note that not all command line options are settable from SConscript
+    files, and the ones that are must be explicitly added to the
+    "settable" list in this class, and optionally validated and coerced
+    in the set_option() method.
+    """
+
+    def __init__(self, defaults):
+        self.__dict__['__defaults__'] = defaults
+        self.__dict__['__SConscript_settings__'] = {}
+
+    def __getattr__(self, attr):
+        """
+        Fetches an options value, checking first for explicit settings
+        from the command line (which are direct attributes), then the
+        SConscript file settings, then the default values.
+        """
+        try:
+            return self.__dict__[attr]
+        except KeyError:
+            try:
+                return self.__dict__['__SConscript_settings__'][attr]
+            except KeyError:
+                return getattr(self.__dict__['__defaults__'], attr)
+
+    settable = [
+        'clean',
+        'diskcheck',
+        'duplicate',
+        'help',
+        'implicit_cache',
+        'max_drift',
+        'md5_chunksize',
+        'no_exec',
+        'num_jobs',
+        'random',
+        'stack_size',
+        'warn',
+    ]
+
+    def set_option(self, name, value):
+        """
+        Sets an option from an SConscript file.
+        """
+        if not name in self.settable:
+            raise SCons.Errors.UserError("This option is not settable from a SConscript file: %s"%name)
+
+        if name == 'num_jobs':
+            try:
+                value = int(value)
+                if value < 1:
+                    raise ValueError
+            except ValueError:
+                raise SCons.Errors.UserError("A positive integer is required: %s"%repr(value))
+        elif name == 'max_drift':
+            try:
+                value = int(value)
+            except ValueError:
+                raise SCons.Errors.UserError("An integer is required: %s"%repr(value))
+        elif name == 'duplicate':
+            try:
+                value = str(value)
+            except ValueError:
+                raise SCons.Errors.UserError("A string is required: %s"%repr(value))
+            if not value in SCons.Node.FS.Valid_Duplicates:
+                raise SCons.Errors.UserError("Not a valid duplication style: %s" % value)
+            # Set the duplicate style right away so it can affect linking
+            # of SConscript files.
+            SCons.Node.FS.set_duplicate(value)
+        elif name == 'diskcheck':
+            try:
+                value = diskcheck_convert(value)
+            except ValueError, v:
+                raise SCons.Errors.UserError("Not a valid diskcheck value: %s"%v)
+            if 'diskcheck' not in self.__dict__:
+                # No --diskcheck= option was specified on the command line.
+                # Set this right away so it can affect the rest of the
+                # file/Node lookups while processing the SConscript files.
+                SCons.Node.FS.set_diskcheck(value)
+        elif name == 'stack_size':
+            try:
+                value = int(value)
+            except ValueError:
+                raise SCons.Errors.UserError("An integer is required: %s"%repr(value))
+        elif name == 'md5_chunksize':
+            try:
+                value = int(value)
+            except ValueError:
+                raise SCons.Errors.UserError("An integer is required: %s"%repr(value))
+        elif name == 'warn':
+            if SCons.Util.is_String(value):
+                value = [value]
+            value = self.__SConscript_settings__.get(name, []) + value
+            SCons.Warnings.process_warn_strings(value)
+
+        self.__SConscript_settings__[name] = value
+
+class SConsOption(optparse.Option):
+    def convert_value(self, opt, value):
+        if value is not None:
+            if self.nargs in (1, '?'):
+                return self.check_value(opt, value)
+            else:
+                return tuple([self.check_value(opt, v) for v in value])
+
+    def process(self, opt, value, values, parser):
+
+        # First, convert the value(s) to the right type.  Howl if any
+        # value(s) are bogus.
+        value = self.convert_value(opt, value)
+
+        # And then take whatever action is expected of us.
+        # This is a separate method to make life easier for
+        # subclasses to add new actions.
+        return self.take_action(
+            self.action, self.dest, opt, value, values, parser)
+
+    def _check_nargs_optional(self):
+        if self.nargs == '?' and self._short_opts:
+            fmt = "option %s: nargs='?' is incompatible with short options"
+            raise SCons.Errors.UserError(fmt % self._short_opts[0])
+
+    try:
+        _orig_CONST_ACTIONS = optparse.Option.CONST_ACTIONS
+
+        _orig_CHECK_METHODS = optparse.Option.CHECK_METHODS
+
+    except AttributeError:
+        # optparse.Option had no CONST_ACTIONS before Python 2.5.
+
+        _orig_CONST_ACTIONS = ("store_const",)
+
+        def _check_const(self):
+            if self.action not in self.CONST_ACTIONS and self.const is not None:
+                raise OptionError(
+                    "'const' must not be supplied for action %r" % self.action,
+                    self)
+
+        # optparse.Option collects its list of unbound check functions
+        # up front.  This sucks because it means we can't just override
+        # the _check_const() function like a normal method, we have to
+        # actually replace it in the list.  This seems to be the most
+        # straightforward way to do that.
+
+        _orig_CHECK_METHODS = [optparse.Option._check_action,
+                     optparse.Option._check_type,
+                     optparse.Option._check_choice,
+                     optparse.Option._check_dest,
+                     _check_const,
+                     optparse.Option._check_nargs,
+                     optparse.Option._check_callback]
+
+    CHECK_METHODS = _orig_CHECK_METHODS + [_check_nargs_optional]
+
+    CONST_ACTIONS = _orig_CONST_ACTIONS + optparse.Option.TYPED_ACTIONS
+
+class SConsOptionGroup(optparse.OptionGroup):
+    """
+    A subclass for SCons-specific option groups.
+    
+    The only difference between this and the base class is that we print
+    the group's help text flush left, underneath their own title but
+    lined up with the normal "SCons Options".
+    """
+    def format_help(self, formatter):
+        """
+        Format an option group's help text, outdenting the title so it's
+        flush with the "SCons Options" title we print at the top.
+        """
+        formatter.dedent()
+        result = formatter.format_heading(self.title)
+        formatter.indent()
+        result = result + optparse.OptionContainer.format_help(self, formatter)
+        return result
+
+class SConsOptionParser(optparse.OptionParser):
+    preserve_unknown_options = False
+
+    def error(self, msg):
+        self.print_usage(sys.stderr)
+        sys.stderr.write("SCons error: %s\n" % msg)
+        sys.exit(2)
+
+    def _process_long_opt(self, rargs, values):
+        """
+        SCons-specific processing of long options.
+
+        This is copied directly from the normal
+        optparse._process_long_opt() method, except that, if configured
+        to do so, we catch the exception thrown when an unknown option
+        is encountered and just stick it back on the "leftover" arguments
+        for later (re-)processing.
+        """
+        arg = rargs.pop(0)
+
+        # Value explicitly attached to arg?  Pretend it's the next
+        # argument.
+        if "=" in arg:
+            (opt, next_arg) = arg.split("=", 1)
+            rargs.insert(0, next_arg)
+            had_explicit_value = True
+        else:
+            opt = arg
+            had_explicit_value = False
+
+        try:
+            opt = self._match_long_opt(opt)
+        except optparse.BadOptionError:
+            if self.preserve_unknown_options:
+                # SCons-specific:  if requested, add unknown options to
+                # the "leftover arguments" list for later processing.
+                self.largs.append(arg)
+                if had_explicit_value:
+                    # The unknown option will be re-processed later,
+                    # so undo the insertion of the explicit value.
+                    rargs.pop(0)
+                return
+            raise
+
+        option = self._long_opt[opt]
+        if option.takes_value():
+            nargs = option.nargs
+            if nargs == '?':
+                if had_explicit_value:
+                    value = rargs.pop(0)
+                else:
+                    value = option.const
+            elif len(rargs) < nargs:
+                if nargs == 1:
+                    self.error(_("%s option requires an argument") % opt)
+                else:
+                    self.error(_("%s option requires %d arguments")
+                               % (opt, nargs))
+            elif nargs == 1:
+                value = rargs.pop(0)
+            else:
+                value = tuple(rargs[0:nargs])
+                del rargs[0:nargs]
+
+        elif had_explicit_value:
+            self.error(_("%s option does not take a value") % opt)
+
+        else:
+            value = None
+
+        option.process(opt, value, values, self)
+
+    def add_local_option(self, *args, **kw):
+        """
+        Adds a local option to the parser.
+        
+        This is initiated by a SetOption() call to add a user-defined
+        command-line option.  We add the option to a separate option
+        group for the local options, creating the group if necessary.
+        """
+        try:
+            group = self.local_option_group
+        except AttributeError:
+            group = SConsOptionGroup(self, 'Local Options')
+            group = self.add_option_group(group)
+            self.local_option_group = group
+
+        result = group.add_option(*args, **kw)
+
+        if result:
+            # The option was added succesfully.  We now have to add the
+            # default value to our object that holds the default values
+            # (so that an attempt to fetch the option's attribute will
+            # yield the default value when not overridden) and then
+            # we re-parse the leftover command-line options, so that
+            # any value overridden on the command line is immediately
+            # available if the user turns around and does a GetOption()
+            # right away.
+            setattr(self.values.__defaults__, result.dest, result.default)
+            self.parse_args(self.largs, self.values)
+
+        return result
+
+class SConsIndentedHelpFormatter(optparse.IndentedHelpFormatter):
+    def format_usage(self, usage):
+        return "usage: %s\n" % usage
+
+    def format_heading(self, heading):
+        """
+        This translates any heading of "options" or "Options" into
+        "SCons Options."  Unfortunately, we have to do this here,
+        because those titles are hard-coded in the optparse calls.
+        """
+        if heading == 'options':
+            # The versions of optparse.py shipped with Pythons 2.3 and
+            # 2.4 pass this in uncapitalized; override that so we get
+            # consistent output on all versions.
+            heading = "Options"
+        if heading == 'Options':
+            heading = "SCons Options"
+        return optparse.IndentedHelpFormatter.format_heading(self, heading)
+
+    def format_option(self, option):
+        """
+        A copy of the normal optparse.IndentedHelpFormatter.format_option()
+        method.  This has been snarfed so we can modify text wrapping to
+        out liking:
+
+        --  add our own regular expression that doesn't break on hyphens
+            (so things like --no-print-directory don't get broken); 
+
+        --  wrap the list of options themselves when it's too long
+            (the wrapper.fill(opts) call below);
+ 
+        --  set the subsequent_indent when wrapping the help_text.
+        """
+        # The help for each option consists of two parts:
+        #   * the opt strings and metavars
+        #     eg. ("-x", or "-fFILENAME, --file=FILENAME")
+        #   * the user-supplied help string
+        #     eg. ("turn on expert mode", "read data from FILENAME")
+        #
+        # If possible, we write both of these on the same line:
+        #   -x      turn on expert mode
+        #
+        # But if the opt string list is too long, we put the help
+        # string on a second line, indented to the same column it would
+        # start in if it fit on the first line.
+        #   -fFILENAME, --file=FILENAME
+        #           read data from FILENAME
+        result = []
+
+        try:
+            opts = self.option_strings[option]
+        except AttributeError:
+            # The Python 2.3 version of optparse attaches this to
+            # to the option argument, not to this object.
+            opts = option.option_strings
+
+        opt_width = self.help_position - self.current_indent - 2
+        if len(opts) > opt_width:
+            wrapper = textwrap.TextWrapper(width=self.width,
+                                           initial_indent = '  ',
+                                           subsequent_indent = '  ')
+            wrapper.wordsep_re = no_hyphen_re
+            opts = wrapper.fill(opts) + '\n'
+            indent_first = self.help_position
+        else:                       # start help on same line as opts
+            opts = "%*s%-*s  " % (self.current_indent, "", opt_width, opts)
+            indent_first = 0
+        result.append(opts)
+        if option.help:
+
+            try:
+                expand_default = self.expand_default
+            except AttributeError:
+                # The HelpFormatter base class in the Python 2.3 version
+                # of optparse has no expand_default() method.
+                help_text = option.help
+            else:
+                help_text = expand_default(option)
+
+            # SCons:  indent every line of the help text but the first.
+            wrapper = textwrap.TextWrapper(width=self.help_width,
+                                           subsequent_indent = '  ')
+            wrapper.wordsep_re = no_hyphen_re
+            help_lines = wrapper.wrap(help_text)
+            result.append("%*s%s\n" % (indent_first, "", help_lines[0]))
+            for line in help_lines[1:]:
+                result.append("%*s%s\n" % (self.help_position, "", line))
+        elif opts[-1] != "\n":
+            result.append("\n")
+        return "".join(result)
+
+    # For consistent help output across Python versions, we provide a
+    # subclass copy of format_option_strings() and these two variables.
+    # This is necessary (?) for Python2.3, which otherwise concatenates
+    # a short option with its metavar.
+    _short_opt_fmt = "%s %s"
+    _long_opt_fmt = "%s=%s"
+
+    def format_option_strings(self, option):
+        """Return a comma-separated list of option strings & metavariables."""
+        if option.takes_value():
+            metavar = option.metavar or option.dest.upper()
+            short_opts = []
+            for sopt in option._short_opts:
+                short_opts.append(self._short_opt_fmt % (sopt, metavar))
+            long_opts = []
+            for lopt in option._long_opts:
+                long_opts.append(self._long_opt_fmt % (lopt, metavar))
+        else:
+            short_opts = option._short_opts
+            long_opts = option._long_opts
+
+        if self.short_first:
+            opts = short_opts + long_opts
+        else:
+            opts = long_opts + short_opts
+
+        return ", ".join(opts)
+
+def Parser(version):
+    """
+    Returns an options parser object initialized with the standard
+    SCons options.
+    """
+
+    formatter = SConsIndentedHelpFormatter(max_help_position=30)
+
+    op = SConsOptionParser(option_class=SConsOption,
+                           add_help_option=False,
+                           formatter=formatter,
+                           usage="usage: scons [OPTION] [TARGET] ...",)
+
+    op.preserve_unknown_options = True
+    op.version = version
+
+    # Add the options to the parser we just created.
+    #
+    # These are in the order we want them to show up in the -H help
+    # text, basically alphabetical.  Each op.add_option() call below
+    # should have a consistent format:
+    #
+    #   op.add_option("-L", "--long-option-name",
+    #                 nargs=1, type="string",
+    #                 dest="long_option_name", default='foo',
+    #                 action="callback", callback=opt_long_option,
+    #                 help="help text goes here",
+    #                 metavar="VAR")
+    #
+    # Even though the optparse module constructs reasonable default
+    # destination names from the long option names, we're going to be
+    # explicit about each one for easier readability and so this code
+    # will at least show up when grepping the source for option attribute
+    # names, or otherwise browsing the source code.
+
+    # options ignored for compatibility
+    def opt_ignore(option, opt, value, parser):
+        sys.stderr.write("Warning:  ignoring %s option\n" % opt)
+    op.add_option("-b", "-d", "-e", "-m", "-S", "-t", "-w",
+                  "--environment-overrides",
+                  "--no-keep-going",
+                  "--no-print-directory",
+                  "--print-directory",
+                  "--stop",
+                  "--touch",
+                  action="callback", callback=opt_ignore,
+                  help="Ignored for compatibility.")
+
+    op.add_option('-c', '--clean', '--remove',
+                  dest="clean", default=False,
+                  action="store_true",
+                  help="Remove specified targets and dependencies.")
+
+    op.add_option('-C', '--directory',
+                  nargs=1, type="string",
+                  dest="directory", default=[],
+                  action="append",
+                  help="Change to DIR before doing anything.",
+                  metavar="DIR")
+
+    op.add_option('--cache-debug',
+                  nargs=1,
+                  dest="cache_debug", default=None,
+                  action="store",
+                  help="Print CacheDir debug info to FILE.",
+                  metavar="FILE")
+
+    op.add_option('--cache-disable', '--no-cache',
+                  dest='cache_disable', default=False,
+                  action="store_true",
+                  help="Do not retrieve built targets from CacheDir.")
+
+    op.add_option('--cache-force', '--cache-populate',
+                  dest='cache_force', default=False,
+                  action="store_true",
+                  help="Copy already-built targets into the CacheDir.")
+
+    op.add_option('--cache-show',
+                  dest='cache_show', default=False,
+                  action="store_true",
+                  help="Print build actions for files from CacheDir.")
+
+    config_options = ["auto", "force" ,"cache"]
+
+    def opt_config(option, opt, value, parser, c_options=config_options):
+        if not value in c_options:
+            raise OptionValueError("Warning:  %s is not a valid config type" % value)
+        setattr(parser.values, option.dest, value)
+    opt_config_help = "Controls Configure subsystem: %s." \
+                      % ", ".join(config_options)
+    op.add_option('--config',
+                  nargs=1, type="string",
+                  dest="config", default="auto",
+                  action="callback", callback=opt_config,
+                  help = opt_config_help,
+                  metavar="MODE")
+
+    op.add_option('-D',
+                  dest="climb_up", default=None,
+                  action="store_const", const=2,
+                  help="Search up directory tree for SConstruct,       "
+                       "build all Default() targets.")
+
+    deprecated_debug_options = {
+        "dtree"         : '; please use --tree=derived instead',
+        "nomemoizer"    : ' and has no effect',
+        "stree"         : '; please use --tree=all,status instead',
+        "tree"          : '; please use --tree=all instead',
+    }
+
+    debug_options = ["count", "explain", "findlibs",
+                     "includes", "memoizer", "memory", "objects",
+                     "pdb", "presub", "stacktrace",
+                     "time"] + list(deprecated_debug_options.keys())
+
+    def opt_debug(option, opt, value, parser,
+                  debug_options=debug_options,
+                  deprecated_debug_options=deprecated_debug_options):
+        if value in debug_options:
+            parser.values.debug.append(value)
+            if value in deprecated_debug_options.keys():
+                try:
+                    parser.values.delayed_warnings
+                except AttributeError:
+                    parser.values.delayed_warnings = []
+                msg = deprecated_debug_options[value]
+                w = "The --debug=%s option is deprecated%s." % (value, msg)
+                t = (SCons.Warnings.DeprecatedDebugOptionsWarning, w)
+                parser.values.delayed_warnings.append(t)
+        else:
+            raise OptionValueError("Warning:  %s is not a valid debug type" % value)
+    opt_debug_help = "Print various types of debugging information: %s." \
+                     % ", ".join(debug_options)
+    op.add_option('--debug',
+                  nargs=1, type="string",
+                  dest="debug", default=[],
+                  action="callback", callback=opt_debug,
+                  help=opt_debug_help,
+                  metavar="TYPE")
+
+    def opt_diskcheck(option, opt, value, parser):
+        try:
+            diskcheck_value = diskcheck_convert(value)
+        except ValueError, e:
+            raise OptionValueError("Warning: `%s' is not a valid diskcheck type" % e)
+        setattr(parser.values, option.dest, diskcheck_value)
+
+    op.add_option('--diskcheck',
+                  nargs=1, type="string",
+                  dest='diskcheck', default=None,
+                  action="callback", callback=opt_diskcheck,
+                  help="Enable specific on-disk checks.",
+                  metavar="TYPE")
+
+    def opt_duplicate(option, opt, value, parser):
+        if not value in SCons.Node.FS.Valid_Duplicates:
+            raise OptionValueError("`%s' is not a valid duplication style." % value)
+        setattr(parser.values, option.dest, value)
+        # Set the duplicate style right away so it can affect linking
+        # of SConscript files.
+        SCons.Node.FS.set_duplicate(value)
+
+    opt_duplicate_help = "Set the preferred duplication methods. Must be one of " \
+                         + ", ".join(SCons.Node.FS.Valid_Duplicates)
+
+    op.add_option('--duplicate',
+                  nargs=1, type="string",
+                  dest="duplicate", default='hard-soft-copy',
+                  action="callback", callback=opt_duplicate,
+                  help=opt_duplicate_help)
+
+    op.add_option('-f', '--file', '--makefile', '--sconstruct',
+                  nargs=1, type="string",
+                  dest="file", default=[],
+                  action="append",
+                  help="Read FILE as the top-level SConstruct file.")
+
+    op.add_option('-h', '--help',
+                  dest="help", default=False,
+                  action="store_true",
+                  help="Print defined help message, or this one.")
+
+    op.add_option("-H", "--help-options",
+                  action="help",
+                  help="Print this message and exit.")
+
+    op.add_option('-i', '--ignore-errors',
+                  dest='ignore_errors', default=False,
+                  action="store_true",
+                  help="Ignore errors from build actions.")
+
+    op.add_option('-I', '--include-dir',
+                  nargs=1,
+                  dest='include_dir', default=[],
+                  action="append",
+                  help="Search DIR for imported Python modules.",
+                  metavar="DIR")
+
+    op.add_option('--implicit-cache',
+                  dest='implicit_cache', default=False,
+                  action="store_true",
+                  help="Cache implicit dependencies")
+
+    def opt_implicit_deps(option, opt, value, parser):
+        setattr(parser.values, 'implicit_cache', True)
+        setattr(parser.values, option.dest, True)
+
+    op.add_option('--implicit-deps-changed',
+                  dest="implicit_deps_changed", default=False,
+                  action="callback", callback=opt_implicit_deps,
+                  help="Ignore cached implicit dependencies.")
+
+    op.add_option('--implicit-deps-unchanged',
+                  dest="implicit_deps_unchanged", default=False,
+                  action="callback", callback=opt_implicit_deps,
+                  help="Ignore changes in implicit dependencies.")
+
+    op.add_option('--interact', '--interactive',
+                  dest='interactive', default=False,
+                  action="store_true",
+                  help="Run in interactive mode.")
+
+    op.add_option('-j', '--jobs',
+                  nargs=1, type="int",
+                  dest="num_jobs", default=1,
+                  action="store",
+                  help="Allow N jobs at once.",
+                  metavar="N")
+
+    op.add_option('-k', '--keep-going',
+                  dest='keep_going', default=False,
+                  action="store_true",
+                  help="Keep going when a target can't be made.")
+
+    op.add_option('--max-drift',
+                  nargs=1, type="int",
+                  dest='max_drift', default=SCons.Node.FS.default_max_drift,
+                  action="store",
+                  help="Set maximum system clock drift to N seconds.",
+                  metavar="N")
+
+    op.add_option('--md5-chunksize',
+                  nargs=1, type="int",
+                  dest='md5_chunksize', default=SCons.Node.FS.File.md5_chunksize,
+                  action="store",
+                  help="Set chunk-size for MD5 signature computation to N kilobytes.",
+                  metavar="N")
+
+    op.add_option('-n', '--no-exec', '--just-print', '--dry-run', '--recon',
+                  dest='no_exec', default=False,
+                  action="store_true",
+                  help="Don't build; just print commands.")
+
+    op.add_option('--no-site-dir',
+                  dest='no_site_dir', default=False,
+                  action="store_true",
+                  help="Don't search or use the usual site_scons dir.")
+
+    op.add_option('--profile',
+                  nargs=1,
+                  dest="profile_file", default=None,
+                  action="store",
+                  help="Profile SCons and put results in FILE.",
+                  metavar="FILE")
+
+    op.add_option('-q', '--question',
+                  dest="question", default=False,
+                  action="store_true",
+                  help="Don't build; exit status says if up to date.")
+
+    op.add_option('-Q',
+                  dest='no_progress', default=False,
+                  action="store_true",
+                  help="Suppress \"Reading/Building\" progress messages.")
+
+    op.add_option('--random',
+                  dest="random", default=False,
+                  action="store_true",
+                  help="Build dependencies in random order.")
+
+    op.add_option('-s', '--silent', '--quiet',
+                  dest="silent", default=False,
+                  action="store_true",
+                  help="Don't print commands.")
+
+    op.add_option('--site-dir',
+                  nargs=1,
+                  dest='site_dir', default=None,
+                  action="store",
+                  help="Use DIR instead of the usual site_scons dir.",
+                  metavar="DIR")
+
+    op.add_option('--stack-size',
+                  nargs=1, type="int",
+                  dest='stack_size',
+                  action="store",
+                  help="Set the stack size of the threads used to run jobs to N kilobytes.",
+                  metavar="N")
+
+    op.add_option('--taskmastertrace',
+                  nargs=1,
+                  dest="taskmastertrace_file", default=None,
+                  action="store",
+                  help="Trace Node evaluation to FILE.",
+                  metavar="FILE")
+
+    tree_options = ["all", "derived", "prune", "status"]
+
+    def opt_tree(option, opt, value, parser, tree_options=tree_options):
+        import Main
+        tp = Main.TreePrinter()
+        for o in value.split(','):
+            if o == 'all':
+                tp.derived = False
+            elif o == 'derived':
+                tp.derived = True
+            elif o == 'prune':
+                tp.prune = True
+            elif o == 'status':
+                tp.status = True
+            else:
+                raise OptionValueError("Warning:  %s is not a valid --tree option" % o)
+        parser.values.tree_printers.append(tp)
+
+    opt_tree_help = "Print a dependency tree in various formats: %s." \
+                    % ", ".join(tree_options)
+
+    op.add_option('--tree',
+                  nargs=1, type="string",
+                  dest="tree_printers", default=[],
+                  action="callback", callback=opt_tree,
+                  help=opt_tree_help,
+                  metavar="OPTIONS")
+
+    op.add_option('-u', '--up', '--search-up',
+                  dest="climb_up", default=0,
+                  action="store_const", const=1,
+                  help="Search up directory tree for SConstruct,       "
+                       "build targets at or below current directory.")
+
+    op.add_option('-U',
+                  dest="climb_up", default=0,
+                  action="store_const", const=3,
+                  help="Search up directory tree for SConstruct,       "
+                       "build Default() targets from local SConscript.")
+
+    def opt_version(option, opt, value, parser):
+        sys.stdout.write(parser.version + '\n')
+        sys.exit(0)
+    op.add_option("-v", "--version",
+                  action="callback", callback=opt_version,
+                  help="Print the SCons version number and exit.")
+
+    def opt_warn(option, opt, value, parser, tree_options=tree_options):
+        if SCons.Util.is_String(value):
+            value = value.split(',')
+        parser.values.warn.extend(value)
+
+    op.add_option('--warn', '--warning',
+                  nargs=1, type="string",
+                  dest="warn", default=[],
+                  action="callback", callback=opt_warn,
+                  help="Enable or disable warnings.",
+                  metavar="WARNING-SPEC")
+
+    op.add_option('-Y', '--repository', '--srcdir',
+                  nargs=1,
+                  dest="repository", default=[],
+                  action="append",
+                  help="Search REPOSITORY for source and target files.")
+
+    # Options from Make and Cons classic that we do not yet support,
+    # but which we may support someday and whose (potential) meanings
+    # we don't want to change.  These all get a "the -X option is not
+    # yet implemented" message and don't show up in the help output.
+
+    def opt_not_yet(option, opt, value, parser):
+        msg = "Warning:  the %s option is not yet implemented\n" % opt
+        sys.stderr.write(msg)
+
+    op.add_option('-l', '--load-average', '--max-load',
+                  nargs=1, type="float",
+                  dest="load_average", default=0,
+                  action="callback", callback=opt_not_yet,
+                  # action="store",
+                  # help="Don't start multiple jobs unless load is below "
+                  #      "LOAD-AVERAGE."
+                  help=SUPPRESS_HELP)
+    op.add_option('--list-actions',
+                  dest="list_actions",
+                  action="callback", callback=opt_not_yet,
+                  # help="Don't build; list files and build actions."
+                  help=SUPPRESS_HELP)
+    op.add_option('--list-derived',
+                  dest="list_derived",
+                  action="callback", callback=opt_not_yet,
+                  # help="Don't build; list files that would be built."
+                  help=SUPPRESS_HELP)
+    op.add_option('--list-where',
+                  dest="list_where",
+                  action="callback", callback=opt_not_yet,
+                  # help="Don't build; list files and where defined."
+                  help=SUPPRESS_HELP)
+    op.add_option('-o', '--old-file', '--assume-old',
+                  nargs=1, type="string",
+                  dest="old_file", default=[],
+                  action="callback", callback=opt_not_yet,
+                  # action="append",
+                  # help = "Consider FILE to be old; don't rebuild it."
+                  help=SUPPRESS_HELP)
+    op.add_option('--override',
+                  nargs=1, type="string",
+                  action="callback", callback=opt_not_yet,
+                  dest="override",
+                  # help="Override variables as specified in FILE."
+                  help=SUPPRESS_HELP)
+    op.add_option('-p',
+                  action="callback", callback=opt_not_yet,
+                  dest="p",
+                  # help="Print internal environments/objects."
+                  help=SUPPRESS_HELP)
+    op.add_option('-r', '-R', '--no-builtin-rules', '--no-builtin-variables',
+                  action="callback", callback=opt_not_yet,
+                  dest="no_builtin_rules",
+                  # help="Clear default environments and variables."
+                  help=SUPPRESS_HELP)
+    op.add_option('--write-filenames',
+                  nargs=1, type="string",
+                  dest="write_filenames",
+                  action="callback", callback=opt_not_yet,
+                  # help="Write all filenames examined into FILE."
+                  help=SUPPRESS_HELP)
+    op.add_option('-W', '--new-file', '--assume-new', '--what-if',
+                  nargs=1, type="string",
+                  dest="new_file",
+                  action="callback", callback=opt_not_yet,
+                  # help="Consider FILE to be changed."
+                  help=SUPPRESS_HELP)
+    op.add_option('--warn-undefined-variables',
+                  dest="warn_undefined_variables",
+                  action="callback", callback=opt_not_yet,
+                  # help="Warn when an undefined variable is referenced."
+                  help=SUPPRESS_HELP)
+
+    return op
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Script/SConscript.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Script/SConscript.py
new file mode 100644
index 0000000..f823ee9
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Script/SConscript.py
@@ -0,0 +1,640 @@
+"""SCons.Script.SConscript
+
+This module defines the Python API provided to SConscript and SConstruct
+files.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+from __future__ import division
+
+__revision__ = "src/engine/SCons/Script/SConscript.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons
+import SCons.Action
+import SCons.Builder
+import SCons.Defaults
+import SCons.Environment
+import SCons.Errors
+import SCons.Node
+import SCons.Node.Alias
+import SCons.Node.FS
+import SCons.Platform
+import SCons.SConf
+import SCons.Script.Main
+import SCons.Tool
+import SCons.Util
+
+import collections
+import os
+import os.path
+import re
+import sys
+import traceback
+
+# The following variables used to live in this module.  Some
+# SConscript files out there may have referred to them directly as
+# SCons.Script.SConscript.*.  This is now supported by some special
+# handling towards the bottom of the SConscript.__init__.py module.
+#Arguments = {}
+#ArgList = []
+#BuildTargets = TargetList()
+#CommandLineTargets = []
+#DefaultTargets = []
+
+class SConscriptReturn(Exception):
+    pass
+
+launch_dir = os.path.abspath(os.curdir)
+
+GlobalDict = None
+
+# global exports set by Export():
+global_exports = {}
+
+# chdir flag
+sconscript_chdir = 1
+
+def get_calling_namespaces():
+    """Return the locals and globals for the function that called
+    into this module in the current call stack."""
+    try: 1//0
+    except ZeroDivisionError: 
+        # Don't start iterating with the current stack-frame to
+        # prevent creating reference cycles (f_back is safe).
+        frame = sys.exc_info()[2].tb_frame.f_back
+
+    # Find the first frame that *isn't* from this file.  This means
+    # that we expect all of the SCons frames that implement an Export()
+    # or SConscript() call to be in this file, so that we can identify
+    # the first non-Script.SConscript frame as the user's local calling
+    # environment, and the locals and globals dictionaries from that
+    # frame as the calling namespaces.  See the comment below preceding
+    # the DefaultEnvironmentCall block for even more explanation.
+    while frame.f_globals.get("__name__") == __name__:
+        frame = frame.f_back
+
+    return frame.f_locals, frame.f_globals
+
+
+def compute_exports(exports):
+    """Compute a dictionary of exports given one of the parameters
+    to the Export() function or the exports argument to SConscript()."""
+
+    loc, glob = get_calling_namespaces()
+
+    retval = {}
+    try:
+        for export in exports:
+            if SCons.Util.is_Dict(export):
+                retval.update(export)
+            else:
+                try:
+                    retval[export] = loc[export]
+                except KeyError:
+                    retval[export] = glob[export]
+    except KeyError, x:
+        raise SCons.Errors.UserError("Export of non-existent variable '%s'"%x)
+
+    return retval
+
+class Frame(object):
+    """A frame on the SConstruct/SConscript call stack"""
+    def __init__(self, fs, exports, sconscript):
+        self.globals = BuildDefaultGlobals()
+        self.retval = None
+        self.prev_dir = fs.getcwd()
+        self.exports = compute_exports(exports)  # exports from the calling SConscript
+        # make sure the sconscript attr is a Node.
+        if isinstance(sconscript, SCons.Node.Node):
+            self.sconscript = sconscript
+        elif sconscript == '-':
+            self.sconscript = None
+        else:
+            self.sconscript = fs.File(str(sconscript))
+
+# the SConstruct/SConscript call stack:
+call_stack = []
+
+# For documentation on the methods in this file, see the scons man-page
+
+def Return(*vars, **kw):
+    retval = []
+    try:
+        fvars = SCons.Util.flatten(vars)
+        for var in fvars:
+            for v in var.split():
+                retval.append(call_stack[-1].globals[v])
+    except KeyError, x:
+        raise SCons.Errors.UserError("Return of non-existent variable '%s'"%x)
+
+    if len(retval) == 1:
+        call_stack[-1].retval = retval[0]
+    else:
+        call_stack[-1].retval = tuple(retval)
+
+    stop = kw.get('stop', True)
+
+    if stop:
+        raise SConscriptReturn
+
+
+stack_bottom = '% Stack boTTom %' # hard to define a variable w/this name :)
+
+def _SConscript(fs, *files, **kw):
+    top = fs.Top
+    sd = fs.SConstruct_dir.rdir()
+    exports = kw.get('exports', [])
+
+    # evaluate each SConscript file
+    results = []
+    for fn in files:
+        call_stack.append(Frame(fs, exports, fn))
+        old_sys_path = sys.path
+        try:
+            SCons.Script.sconscript_reading = SCons.Script.sconscript_reading + 1
+            if fn == "-":
+                exec sys.stdin in call_stack[-1].globals
+            else:
+                if isinstance(fn, SCons.Node.Node):
+                    f = fn
+                else:
+                    f = fs.File(str(fn))
+                _file_ = None
+
+                # Change directory to the top of the source
+                # tree to make sure the os's cwd and the cwd of
+                # fs match so we can open the SConscript.
+                fs.chdir(top, change_os_dir=1)
+                if f.rexists():
+                    actual = f.rfile()
+                    _file_ = open(actual.get_abspath(), "r")
+                elif f.srcnode().rexists():
+                    actual = f.srcnode().rfile()
+                    _file_ = open(actual.get_abspath(), "r")
+                elif f.has_src_builder():
+                    # The SConscript file apparently exists in a source
+                    # code management system.  Build it, but then clear
+                    # the builder so that it doesn't get built *again*
+                    # during the actual build phase.
+                    f.build()
+                    f.built()
+                    f.builder_set(None)
+                    if f.exists():
+                        _file_ = open(f.get_abspath(), "r")
+                if _file_:
+                    # Chdir to the SConscript directory.  Use a path
+                    # name relative to the SConstruct file so that if
+                    # we're using the -f option, we're essentially
+                    # creating a parallel SConscript directory structure
+                    # in our local directory tree.
+                    #
+                    # XXX This is broken for multiple-repository cases
+                    # where the SConstruct and SConscript files might be
+                    # in different Repositories.  For now, cross that
+                    # bridge when someone comes to it.
+                    try:
+                        src_dir = kw['src_dir']
+                    except KeyError:
+                        ldir = fs.Dir(f.dir.get_path(sd))
+                    else:
+                        ldir = fs.Dir(src_dir)
+                        if not ldir.is_under(f.dir):
+                            # They specified a source directory, but
+                            # it's above the SConscript directory.
+                            # Do the sensible thing and just use the
+                            # SConcript directory.
+                            ldir = fs.Dir(f.dir.get_path(sd))
+                    try:
+                        fs.chdir(ldir, change_os_dir=sconscript_chdir)
+                    except OSError:
+                        # There was no local directory, so we should be
+                        # able to chdir to the Repository directory.
+                        # Note that we do this directly, not through
+                        # fs.chdir(), because we still need to
+                        # interpret the stuff within the SConscript file
+                        # relative to where we are logically.
+                        fs.chdir(ldir, change_os_dir=0)
+                        os.chdir(actual.dir.get_abspath())
+
+                    # Append the SConscript directory to the beginning
+                    # of sys.path so Python modules in the SConscript
+                    # directory can be easily imported.
+                    sys.path = [ f.dir.get_abspath() ] + sys.path
+
+                    # This is the magic line that actually reads up
+                    # and executes the stuff in the SConscript file.
+                    # The locals for this frame contain the special
+                    # bottom-of-the-stack marker so that any
+                    # exceptions that occur when processing this
+                    # SConscript can base the printed frames at this
+                    # level and not show SCons internals as well.
+                    call_stack[-1].globals.update({stack_bottom:1})
+                    old_file = call_stack[-1].globals.get('__file__')
+                    try:
+                        del call_stack[-1].globals['__file__']
+                    except KeyError:
+                        pass
+                    try:
+                        try:
+                            exec _file_ in call_stack[-1].globals
+                        except SConscriptReturn:
+                            pass
+                    finally:
+                        if old_file is not None:
+                            call_stack[-1].globals.update({__file__:old_file})
+                else:
+                    SCons.Warnings.warn(SCons.Warnings.MissingSConscriptWarning,
+                             "Ignoring missing SConscript '%s'" % f.path)
+
+        finally:
+            SCons.Script.sconscript_reading = SCons.Script.sconscript_reading - 1
+            sys.path = old_sys_path
+            frame = call_stack.pop()
+            try:
+                fs.chdir(frame.prev_dir, change_os_dir=sconscript_chdir)
+            except OSError:
+                # There was no local directory, so chdir to the
+                # Repository directory.  Like above, we do this
+                # directly.
+                fs.chdir(frame.prev_dir, change_os_dir=0)
+                rdir = frame.prev_dir.rdir()
+                rdir._create()  # Make sure there's a directory there.
+                try:
+                    os.chdir(rdir.get_abspath())
+                except OSError, e:
+                    # We still couldn't chdir there, so raise the error,
+                    # but only if actions are being executed.
+                    #
+                    # If the -n option was used, the directory would *not*
+                    # have been created and we should just carry on and
+                    # let things muddle through.  This isn't guaranteed
+                    # to work if the SConscript files are reading things
+                    # from disk (for example), but it should work well
+                    # enough for most configurations.
+                    if SCons.Action.execute_actions:
+                        raise e
+
+            results.append(frame.retval)
+
+    # if we only have one script, don't return a tuple
+    if len(results) == 1:
+        return results[0]
+    else:
+        return tuple(results)
+
+def SConscript_exception(file=sys.stderr):
+    """Print an exception stack trace just for the SConscript file(s).
+    This will show users who have Python errors where the problem is,
+    without cluttering the output with all of the internal calls leading
+    up to where we exec the SConscript."""
+    exc_type, exc_value, exc_tb = sys.exc_info()
+    tb = exc_tb
+    while tb and stack_bottom not in tb.tb_frame.f_locals:
+        tb = tb.tb_next
+    if not tb:
+        # We did not find our exec statement, so this was actually a bug
+        # in SCons itself.  Show the whole stack.
+        tb = exc_tb
+    stack = traceback.extract_tb(tb)
+    try:
+        type = exc_type.__name__
+    except AttributeError:
+        type = str(exc_type)
+        if type[:11] == "exceptions.":
+            type = type[11:]
+    file.write('%s: %s:\n' % (type, exc_value))
+    for fname, line, func, text in stack:
+        file.write('  File "%s", line %d:\n' % (fname, line))
+        file.write('    %s\n' % text)
+
+def annotate(node):
+    """Annotate a node with the stack frame describing the
+    SConscript file and line number that created it."""
+    tb = sys.exc_info()[2]
+    while tb and stack_bottom not in tb.tb_frame.f_locals:
+        tb = tb.tb_next
+    if not tb:
+        # We did not find any exec of an SConscript file: what?!
+        raise SCons.Errors.InternalError("could not find SConscript stack frame")
+    node.creator = traceback.extract_stack(tb)[0]
+
+# The following line would cause each Node to be annotated using the
+# above function.  Unfortunately, this is a *huge* performance hit, so
+# leave this disabled until we find a more efficient mechanism.
+#SCons.Node.Annotate = annotate
+
+class SConsEnvironment(SCons.Environment.Base):
+    """An Environment subclass that contains all of the methods that
+    are particular to the wrapper SCons interface and which aren't
+    (or shouldn't be) part of the build engine itself.
+
+    Note that not all of the methods of this class have corresponding
+    global functions, there are some private methods.
+    """
+
+    #
+    # Private methods of an SConsEnvironment.
+    #
+    def _exceeds_version(self, major, minor, v_major, v_minor):
+        """Return 1 if 'major' and 'minor' are greater than the version
+        in 'v_major' and 'v_minor', and 0 otherwise."""
+        return (major > v_major or (major == v_major and minor > v_minor))
+
+    def _get_major_minor_revision(self, version_string):
+        """Split a version string into major, minor and (optionally)
+        revision parts.
+
+        This is complicated by the fact that a version string can be
+        something like 3.2b1."""
+        version = version_string.split(' ')[0].split('.')
+        v_major = int(version[0])
+        v_minor = int(re.match('\d+', version[1]).group())
+        if len(version) >= 3:
+            v_revision = int(re.match('\d+', version[2]).group())
+        else:
+            v_revision = 0
+        return v_major, v_minor, v_revision
+
+    def _get_SConscript_filenames(self, ls, kw):
+        """
+        Convert the parameters passed to SConscript() calls into a list
+        of files and export variables.  If the parameters are invalid,
+        throws SCons.Errors.UserError. Returns a tuple (l, e) where l
+        is a list of SConscript filenames and e is a list of exports.
+        """
+        exports = []
+
+        if len(ls) == 0:
+            try:
+                dirs = kw["dirs"]
+            except KeyError:
+                raise SCons.Errors.UserError("Invalid SConscript usage - no parameters")
+
+            if not SCons.Util.is_List(dirs):
+                dirs = [ dirs ]
+            dirs = list(map(str, dirs))
+
+            name = kw.get('name', 'SConscript')
+
+            files = [os.path.join(n, name) for n in dirs]
+
+        elif len(ls) == 1:
+
+            files = ls[0]
+
+        elif len(ls) == 2:
+
+            files   = ls[0]
+            exports = self.Split(ls[1])
+
+        else:
+
+            raise SCons.Errors.UserError("Invalid SConscript() usage - too many arguments")
+
+        if not SCons.Util.is_List(files):
+            files = [ files ]
+
+        if kw.get('exports'):
+            exports.extend(self.Split(kw['exports']))
+
+        variant_dir = kw.get('variant_dir') or kw.get('build_dir')
+        if variant_dir:
+            if len(files) != 1:
+                raise SCons.Errors.UserError("Invalid SConscript() usage - can only specify one SConscript with a variant_dir")
+            duplicate = kw.get('duplicate', 1)
+            src_dir = kw.get('src_dir')
+            if not src_dir:
+                src_dir, fname = os.path.split(str(files[0]))
+                files = [os.path.join(str(variant_dir), fname)]
+            else:
+                if not isinstance(src_dir, SCons.Node.Node):
+                    src_dir = self.fs.Dir(src_dir)
+                fn = files[0]
+                if not isinstance(fn, SCons.Node.Node):
+                    fn = self.fs.File(fn)
+                if fn.is_under(src_dir):
+                    # Get path relative to the source directory.
+                    fname = fn.get_path(src_dir)
+                    files = [os.path.join(str(variant_dir), fname)]
+                else:
+                    files = [fn.abspath]
+                kw['src_dir'] = variant_dir
+            self.fs.VariantDir(variant_dir, src_dir, duplicate)
+
+        return (files, exports)
+
+    #
+    # Public methods of an SConsEnvironment.  These get
+    # entry points in the global name space so they can be called
+    # as global functions.
+    #
+
+    def Configure(self, *args, **kw):
+        if not SCons.Script.sconscript_reading:
+            raise SCons.Errors.UserError("Calling Configure from Builders is not supported.")
+        kw['_depth'] = kw.get('_depth', 0) + 1
+        return SCons.Environment.Base.Configure(self, *args, **kw)
+
+    def Default(self, *targets):
+        SCons.Script._Set_Default_Targets(self, targets)
+
+    def EnsureSConsVersion(self, major, minor, revision=0):
+        """Exit abnormally if the SCons version is not late enough."""
+        scons_ver = self._get_major_minor_revision(SCons.__version__)
+        if scons_ver < (major, minor, revision):
+            if revision:
+                scons_ver_string = '%d.%d.%d' % (major, minor, revision)
+            else:
+                scons_ver_string = '%d.%d' % (major, minor)
+            print "SCons %s or greater required, but you have SCons %s" % \
+                  (scons_ver_string, SCons.__version__)
+            sys.exit(2)
+
+    def EnsurePythonVersion(self, major, minor):
+        """Exit abnormally if the Python version is not late enough."""
+        try:
+            v_major, v_minor, v_micro, release, serial = sys.version_info
+            python_ver = (v_major, v_minor)
+        except AttributeError:
+            python_ver = self._get_major_minor_revision(sys.version)[:2]
+        if python_ver < (major, minor):
+            v = sys.version.split(" ", 1)[0]
+            print "Python %d.%d or greater required, but you have Python %s" %(major,minor,v)
+            sys.exit(2)
+
+    def Exit(self, value=0):
+        sys.exit(value)
+
+    def Export(self, *vars, **kw):
+        for var in vars:
+            global_exports.update(compute_exports(self.Split(var)))
+        global_exports.update(kw)
+
+    def GetLaunchDir(self):
+        global launch_dir
+        return launch_dir
+
+    def GetOption(self, name):
+        name = self.subst(name)
+        return SCons.Script.Main.GetOption(name)
+
+    def Help(self, text):
+        text = self.subst(text, raw=1)
+        SCons.Script.HelpFunction(text)
+
+    def Import(self, *vars):
+        try:
+            frame = call_stack[-1]
+            globals = frame.globals
+            exports = frame.exports
+            for var in vars:
+                var = self.Split(var)
+                for v in var:
+                    if v == '*':
+                        globals.update(global_exports)
+                        globals.update(exports)
+                    else:
+                        if v in exports:
+                            globals[v] = exports[v]
+                        else:
+                            globals[v] = global_exports[v]
+        except KeyError,x:
+            raise SCons.Errors.UserError("Import of non-existent variable '%s'"%x)
+
+    def SConscript(self, *ls, **kw):
+        if 'build_dir' in kw:
+            msg = """The build_dir keyword has been deprecated; use the variant_dir keyword instead."""
+            SCons.Warnings.warn(SCons.Warnings.DeprecatedBuildDirWarning, msg)
+        def subst_element(x, subst=self.subst):
+            if SCons.Util.is_List(x):
+                x = list(map(subst, x))
+            else:
+                x = subst(x)
+            return x
+        ls = list(map(subst_element, ls))
+        subst_kw = {}
+        for key, val in kw.items():
+            if SCons.Util.is_String(val):
+                val = self.subst(val)
+            elif SCons.Util.is_List(val):
+                result = []
+                for v in val:
+                    if SCons.Util.is_String(v):
+                        v = self.subst(v)
+                    result.append(v)
+                val = result
+            subst_kw[key] = val
+
+        files, exports = self._get_SConscript_filenames(ls, subst_kw)
+        subst_kw['exports'] = exports
+        return _SConscript(self.fs, *files, **subst_kw)
+
+    def SConscriptChdir(self, flag):
+        global sconscript_chdir
+        sconscript_chdir = flag
+
+    def SetOption(self, name, value):
+        name = self.subst(name)
+        SCons.Script.Main.SetOption(name, value)
+
+#
+#
+#
+SCons.Environment.Environment = SConsEnvironment
+
+def Configure(*args, **kw):
+    if not SCons.Script.sconscript_reading:
+        raise SCons.Errors.UserError("Calling Configure from Builders is not supported.")
+    kw['_depth'] = 1
+    return SCons.SConf.SConf(*args, **kw)
+
+# It's very important that the DefaultEnvironmentCall() class stay in this
+# file, with the get_calling_namespaces() function, the compute_exports()
+# function, the Frame class and the SConsEnvironment.Export() method.
+# These things make up the calling stack leading up to the actual global
+# Export() or SConscript() call that the user issued.  We want to allow
+# users to export local variables that they define, like so:
+#
+#       def func():
+#           x = 1
+#           Export('x')
+#
+# To support this, the get_calling_namespaces() function assumes that
+# the *first* stack frame that's not from this file is the local frame
+# for the Export() or SConscript() call.
+
+_DefaultEnvironmentProxy = None
+
+def get_DefaultEnvironmentProxy():
+    global _DefaultEnvironmentProxy
+    if not _DefaultEnvironmentProxy:
+        default_env = SCons.Defaults.DefaultEnvironment()
+        _DefaultEnvironmentProxy = SCons.Environment.NoSubstitutionProxy(default_env)
+    return _DefaultEnvironmentProxy
+
+class DefaultEnvironmentCall(object):
+    """A class that implements "global function" calls of
+    Environment methods by fetching the specified method from the
+    DefaultEnvironment's class.  Note that this uses an intermediate
+    proxy class instead of calling the DefaultEnvironment method
+    directly so that the proxy can override the subst() method and
+    thereby prevent expansion of construction variables (since from
+    the user's point of view this was called as a global function,
+    with no associated construction environment)."""
+    def __init__(self, method_name, subst=0):
+        self.method_name = method_name
+        if subst:
+            self.factory = SCons.Defaults.DefaultEnvironment
+        else:
+            self.factory = get_DefaultEnvironmentProxy
+    def __call__(self, *args, **kw):
+        env = self.factory()
+        method = getattr(env, self.method_name)
+        return method(*args, **kw)
+
+
+def BuildDefaultGlobals():
+    """
+    Create a dictionary containing all the default globals for
+    SConstruct and SConscript files.
+    """
+
+    global GlobalDict
+    if GlobalDict is None:
+        GlobalDict = {}
+
+        import SCons.Script
+        d = SCons.Script.__dict__
+        def not_a_module(m, d=d, mtype=type(SCons.Script)):
+             return not isinstance(d[m], mtype)
+        for m in filter(not_a_module, dir(SCons.Script)):
+             GlobalDict[m] = d[m]
+
+    return GlobalDict.copy()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Script/__init__.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Script/__init__.py
new file mode 100644
index 0000000..b874a15
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Script/__init__.py
@@ -0,0 +1,412 @@
+"""SCons.Script
+
+This file implements the main() function used by the scons script.
+
+Architecturally, this *is* the scons script, and will likely only be
+called from the external "scons" wrapper.  Consequently, anything here
+should not be, or be considered, part of the build engine.  If it's
+something that we expect other software to want to use, it should go in
+some other module.  If it's specific to the "scons" script invocation,
+it goes here.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Script/__init__.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import time
+start_time = time.time()
+
+import collections
+import os
+import sys
+
+# Special chicken-and-egg handling of the "--debug=memoizer" flag:
+#
+# SCons.Memoize contains a metaclass implementation that affects how
+# the other classes are instantiated.  The Memoizer may add shim methods
+# to classes that have methods that cache computed values in order to
+# count and report the hits and misses.
+#
+# If we wait to enable the Memoization until after we've parsed the
+# command line options normally, it will be too late, because the Memoizer
+# will have already analyzed the classes that it's Memoizing and decided
+# to not add the shims.  So we use a special-case, up-front check for
+# the "--debug=memoizer" flag and enable Memoizer before we import any
+# of the other modules that use it.
+
+_args = sys.argv + os.environ.get('SCONSFLAGS', '').split()
+if "--debug=memoizer" in _args:
+    import SCons.Memoize
+    import SCons.Warnings
+    try:
+        SCons.Memoize.EnableMemoization()
+    except SCons.Warnings.Warning:
+        # Some warning was thrown.  Arrange for it to be displayed
+        # or not after warnings are configured.
+        import Main
+        exc_type, exc_value, tb = sys.exc_info()
+        Main.delayed_warnings.append((exc_type, exc_value))
+del _args
+
+import SCons.Action
+import SCons.Builder
+import SCons.Environment
+import SCons.Node.FS
+import SCons.Options
+import SCons.Platform
+import SCons.Scanner
+import SCons.SConf
+import SCons.Subst
+import SCons.Tool
+import SCons.Util
+import SCons.Variables
+import SCons.Defaults
+
+import Main
+
+main                    = Main.main
+
+# The following are global class definitions and variables that used to
+# live directly in this module back before 0.96.90, when it contained
+# a lot of code.  Some SConscript files in widely-distributed packages
+# (Blender is the specific example) actually reached into SCons.Script
+# directly to use some of these.  Rather than break those SConscript
+# files, we're going to propagate these names into the SCons.Script
+# namespace here.
+#
+# Some of these are commented out because it's *really* unlikely anyone
+# used them, but we're going to leave the comment here to try to make
+# it obvious what to do if the situation arises.
+BuildTask               = Main.BuildTask
+CleanTask               = Main.CleanTask
+QuestionTask            = Main.QuestionTask
+#PrintHelp               = Main.PrintHelp
+#SConscriptSettableOptions = Main.SConscriptSettableOptions
+
+AddOption               = Main.AddOption
+GetOption               = Main.GetOption
+SetOption               = Main.SetOption
+Progress                = Main.Progress
+GetBuildFailures        = Main.GetBuildFailures
+
+#keep_going_on_error     = Main.keep_going_on_error
+#print_dtree             = Main.print_dtree
+#print_explanations      = Main.print_explanations
+#print_includes          = Main.print_includes
+#print_objects           = Main.print_objects
+#print_time              = Main.print_time
+#print_tree              = Main.print_tree
+#memory_stats            = Main.memory_stats
+#ignore_errors           = Main.ignore_errors
+#sconscript_time         = Main.sconscript_time
+#command_time            = Main.command_time
+#exit_status             = Main.exit_status
+#profiling               = Main.profiling
+#repositories            = Main.repositories
+
+#
+import SConscript
+_SConscript = SConscript
+
+call_stack              = _SConscript.call_stack
+
+#
+Action                  = SCons.Action.Action
+AddMethod               = SCons.Util.AddMethod
+AllowSubstExceptions    = SCons.Subst.SetAllowableExceptions
+Builder                 = SCons.Builder.Builder
+Configure               = _SConscript.Configure
+Environment             = SCons.Environment.Environment
+#OptParser               = SCons.SConsOptions.OptParser
+FindPathDirs            = SCons.Scanner.FindPathDirs
+Platform                = SCons.Platform.Platform
+Return                  = _SConscript.Return
+Scanner                 = SCons.Scanner.Base
+Tool                    = SCons.Tool.Tool
+WhereIs                 = SCons.Util.WhereIs
+
+#
+BoolVariable            = SCons.Variables.BoolVariable
+EnumVariable            = SCons.Variables.EnumVariable
+ListVariable            = SCons.Variables.ListVariable
+PackageVariable         = SCons.Variables.PackageVariable
+PathVariable            = SCons.Variables.PathVariable
+
+# Deprecated names that will go away some day.
+BoolOption              = SCons.Options.BoolOption
+EnumOption              = SCons.Options.EnumOption
+ListOption              = SCons.Options.ListOption
+PackageOption           = SCons.Options.PackageOption
+PathOption              = SCons.Options.PathOption
+
+# Action factories.
+Chmod                   = SCons.Defaults.Chmod
+Copy                    = SCons.Defaults.Copy
+Delete                  = SCons.Defaults.Delete
+Mkdir                   = SCons.Defaults.Mkdir
+Move                    = SCons.Defaults.Move
+Touch                   = SCons.Defaults.Touch
+
+# Pre-made, public scanners.
+CScanner                = SCons.Tool.CScanner
+DScanner                = SCons.Tool.DScanner
+DirScanner              = SCons.Defaults.DirScanner
+ProgramScanner          = SCons.Tool.ProgramScanner
+SourceFileScanner       = SCons.Tool.SourceFileScanner
+
+# Functions we might still convert to Environment methods.
+CScan                   = SCons.Defaults.CScan
+DefaultEnvironment      = SCons.Defaults.DefaultEnvironment
+
+# Other variables we provide.
+class TargetList(collections.UserList):
+    def _do_nothing(self, *args, **kw):
+        pass
+    def _add_Default(self, list):
+        self.extend(list)
+    def _clear(self):
+        del self[:]
+
+ARGUMENTS               = {}
+ARGLIST                 = []
+BUILD_TARGETS           = TargetList()
+COMMAND_LINE_TARGETS    = []
+DEFAULT_TARGETS         = []
+
+# BUILD_TARGETS can be modified in the SConscript files.  If so, we
+# want to treat the modified BUILD_TARGETS list as if they specified
+# targets on the command line.  To do that, though, we need to know if
+# BUILD_TARGETS was modified through "official" APIs or by hand.  We do
+# this by updating two lists in parallel, the documented BUILD_TARGETS
+# list, above, and this internal _build_plus_default targets list which
+# should only have "official" API changes.  Then Script/Main.py can
+# compare these two afterwards to figure out if the user added their
+# own targets to BUILD_TARGETS.
+_build_plus_default = TargetList()
+
+def _Add_Arguments(alist):
+    for arg in alist:
+        a, b = arg.split('=', 1)
+        ARGUMENTS[a] = b
+        ARGLIST.append((a, b))
+
+def _Add_Targets(tlist):
+    if tlist:
+        COMMAND_LINE_TARGETS.extend(tlist)
+        BUILD_TARGETS.extend(tlist)
+        BUILD_TARGETS._add_Default = BUILD_TARGETS._do_nothing
+        BUILD_TARGETS._clear = BUILD_TARGETS._do_nothing
+        _build_plus_default.extend(tlist)
+        _build_plus_default._add_Default = _build_plus_default._do_nothing
+        _build_plus_default._clear = _build_plus_default._do_nothing
+
+def _Set_Default_Targets_Has_Been_Called(d, fs):
+    return DEFAULT_TARGETS
+
+def _Set_Default_Targets_Has_Not_Been_Called(d, fs):
+    if d is None:
+        d = [fs.Dir('.')]
+    return d
+
+_Get_Default_Targets = _Set_Default_Targets_Has_Not_Been_Called
+
+def _Set_Default_Targets(env, tlist):
+    global DEFAULT_TARGETS
+    global _Get_Default_Targets
+    _Get_Default_Targets = _Set_Default_Targets_Has_Been_Called
+    for t in tlist:
+        if t is None:
+            # Delete the elements from the list in-place, don't
+            # reassign an empty list to DEFAULT_TARGETS, so that the
+            # variables will still point to the same object we point to.
+            del DEFAULT_TARGETS[:]
+            BUILD_TARGETS._clear()
+            _build_plus_default._clear()
+        elif isinstance(t, SCons.Node.Node):
+            DEFAULT_TARGETS.append(t)
+            BUILD_TARGETS._add_Default([t])
+            _build_plus_default._add_Default([t])
+        else:
+            nodes = env.arg2nodes(t, env.fs.Entry)
+            DEFAULT_TARGETS.extend(nodes)
+            BUILD_TARGETS._add_Default(nodes)
+            _build_plus_default._add_Default(nodes)
+
+#
+help_text = None
+
+def HelpFunction(text):
+    global help_text
+    if SCons.Script.help_text is None:
+        SCons.Script.help_text = text
+    else:
+        help_text = help_text + text
+
+#
+# Will be non-zero if we are reading an SConscript file.
+sconscript_reading = 0
+
+#
+def Variables(files=[], args=ARGUMENTS):
+    return SCons.Variables.Variables(files, args)
+
+def Options(files=[], args=ARGUMENTS):
+    return SCons.Options.Options(files, args)
+
+# The list of global functions to add to the SConscript name space
+# that end up calling corresponding methods or Builders in the
+# DefaultEnvironment().
+GlobalDefaultEnvironmentFunctions = [
+    # Methods from the SConsEnvironment class, above.
+    'Default',
+    'EnsurePythonVersion',
+    'EnsureSConsVersion',
+    'Exit',
+    'Export',
+    'GetLaunchDir',
+    'Help',
+    'Import',
+    #'SConscript', is handled separately, below.
+    'SConscriptChdir',
+
+    # Methods from the Environment.Base class.
+    'AddPostAction',
+    'AddPreAction',
+    'Alias',
+    'AlwaysBuild',
+    'BuildDir',
+    'CacheDir',
+    'Clean',
+    #The Command() method is handled separately, below.
+    'Decider',
+    'Depends',
+    'Dir',
+    'NoClean',
+    'NoCache',
+    'Entry',
+    'Execute',
+    'File',
+    'FindFile',
+    'FindInstalledFiles',
+    'FindSourceFiles',
+    'Flatten',
+    'GetBuildPath',
+    'Glob',
+    'Ignore',
+    'Install',
+    'InstallAs',
+    'Literal',
+    'Local',
+    'ParseDepends',
+    'Precious',
+    'Repository',
+    'Requires',
+    'SConsignFile',
+    'SideEffect',
+    'SourceCode',
+    'SourceSignatures',
+    'Split',
+    'Tag',
+    'TargetSignatures',
+    'Value',
+    'VariantDir',
+]
+
+GlobalDefaultBuilders = [
+    # Supported builders.
+    'CFile',
+    'CXXFile',
+    'DVI',
+    'Jar',
+    'Java',
+    'JavaH',
+    'Library',
+    'M4',
+    'MSVSProject',
+    'Object',
+    'PCH',
+    'PDF',
+    'PostScript',
+    'Program',
+    'RES',
+    'RMIC',
+    'SharedLibrary',
+    'SharedObject',
+    'StaticLibrary',
+    'StaticObject',
+    'Tar',
+    'TypeLibrary',
+    'Zip',
+    'Package',
+]
+
+for name in GlobalDefaultEnvironmentFunctions + GlobalDefaultBuilders:
+    exec "%s = _SConscript.DefaultEnvironmentCall(%s)" % (name, repr(name))
+del name
+
+# There are a handful of variables that used to live in the
+# Script/SConscript.py module that some SConscript files out there were
+# accessing directly as SCons.Script.SConscript.*.  The problem is that
+# "SConscript" in this namespace is no longer a module, it's a global
+# function call--or more precisely, an object that implements a global
+# function call through the default Environment.  Nevertheless, we can
+# maintain backwards compatibility for SConscripts that were reaching in
+# this way by hanging some attributes off the "SConscript" object here.
+SConscript = _SConscript.DefaultEnvironmentCall('SConscript')
+
+# Make SConscript look enough like the module it used to be so
+# that pychecker doesn't barf.
+SConscript.__name__ = 'SConscript'
+
+SConscript.Arguments = ARGUMENTS
+SConscript.ArgList = ARGLIST
+SConscript.BuildTargets = BUILD_TARGETS
+SConscript.CommandLineTargets = COMMAND_LINE_TARGETS
+SConscript.DefaultTargets = DEFAULT_TARGETS
+
+# The global Command() function must be handled differently than the
+# global functions for other construction environment methods because
+# we want people to be able to use Actions that must expand $TARGET
+# and $SOURCE later, when (and if) the Action is invoked to build
+# the target(s).  We do this with the subst=1 argument, which creates
+# a DefaultEnvironmentCall instance that wraps up a normal default
+# construction environment that performs variable substitution, not a
+# proxy that doesn't.
+#
+# There's a flaw here, though, because any other $-variables on a command
+# line will *also* be expanded, each to a null string, but that should
+# only be a problem in the unusual case where someone was passing a '$'
+# on a command line and *expected* the $ to get through to the shell
+# because they were calling Command() and not env.Command()...  This is
+# unlikely enough that we're going to leave this as is and cross that
+# bridge if someone actually comes to it.
+Command = _SConscript.DefaultEnvironmentCall('Command', subst=1)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Sig.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Sig.py
new file mode 100644
index 0000000..623e1fe
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Sig.py
@@ -0,0 +1,63 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Sig.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__doc__ = """Place-holder for the old SCons.Sig module hierarchy
+
+This is no longer used, but code out there (such as the NSIS module on
+the SCons wiki) may try to import SCons.Sig.  If so, we generate a warning
+that points them to the line that caused the import, and don't die.
+
+If someone actually tried to use the sub-modules or functions within
+the package (for example, SCons.Sig.MD5.signature()), then they'll still
+get an AttributeError, but at least they'll know where to start looking.
+"""
+
+import SCons.Util
+import SCons.Warnings
+
+msg = 'The SCons.Sig module no longer exists.\n' \
+      '    Remove the following "import SCons.Sig" line to eliminate this warning:'
+
+SCons.Warnings.warn(SCons.Warnings.DeprecatedSigModuleWarning, msg)
+
+default_calc = None
+default_module = None
+
+class MD5Null(SCons.Util.Null):
+    def __repr__(self):
+        return "MD5Null()"
+
+class TimeStampNull(SCons.Util.Null):
+    def __repr__(self):
+        return "TimeStampNull()"
+
+MD5 = MD5Null()
+TimeStamp = TimeStampNull()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Subst.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Subst.py
new file mode 100644
index 0000000..6750815
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Subst.py
@@ -0,0 +1,904 @@
+"""SCons.Subst
+
+SCons string substitution.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Subst.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import collections
+import re
+
+import SCons.Errors
+
+from SCons.Util import is_String, is_Sequence
+
+# Indexed by the SUBST_* constants below.
+_strconv = [SCons.Util.to_String_for_subst,
+            SCons.Util.to_String_for_subst,
+            SCons.Util.to_String_for_signature]
+
+
+
+AllowableExceptions = (IndexError, NameError)
+
+def SetAllowableExceptions(*excepts):
+    global AllowableExceptions
+    AllowableExceptions = [_f for _f in excepts if _f]
+
+def raise_exception(exception, target, s):
+    name = exception.__class__.__name__
+    msg = "%s `%s' trying to evaluate `%s'" % (name, exception, s)
+    if target:
+        raise SCons.Errors.BuildError(target[0], msg)
+    else:
+        raise SCons.Errors.UserError(msg)
+
+
+
+class Literal(object):
+    """A wrapper for a string.  If you use this object wrapped
+    around a string, then it will be interpreted as literal.
+    When passed to the command interpreter, all special
+    characters will be escaped."""
+    def __init__(self, lstr):
+        self.lstr = lstr
+
+    def __str__(self):
+        return self.lstr
+
+    def escape(self, escape_func):
+        return escape_func(self.lstr)
+
+    def for_signature(self):
+        return self.lstr
+
+    def is_literal(self):
+        return 1
+
+class SpecialAttrWrapper(object):
+    """This is a wrapper for what we call a 'Node special attribute.'
+    This is any of the attributes of a Node that we can reference from
+    Environment variable substitution, such as $TARGET.abspath or
+    $SOURCES[1].filebase.  We implement the same methods as Literal
+    so we can handle special characters, plus a for_signature method,
+    such that we can return some canonical string during signature
+    calculation to avoid unnecessary rebuilds."""
+
+    def __init__(self, lstr, for_signature=None):
+        """The for_signature parameter, if supplied, will be the
+        canonical string we return from for_signature().  Else
+        we will simply return lstr."""
+        self.lstr = lstr
+        if for_signature:
+            self.forsig = for_signature
+        else:
+            self.forsig = lstr
+
+    def __str__(self):
+        return self.lstr
+
+    def escape(self, escape_func):
+        return escape_func(self.lstr)
+
+    def for_signature(self):
+        return self.forsig
+
+    def is_literal(self):
+        return 1
+
+def quote_spaces(arg):
+    """Generic function for putting double quotes around any string that
+    has white space in it."""
+    if ' ' in arg or '\t' in arg:
+        return '"%s"' % arg
+    else:
+        return str(arg)
+
+class CmdStringHolder(collections.UserString):
+    """This is a special class used to hold strings generated by
+    scons_subst() and scons_subst_list().  It defines a special method
+    escape().  When passed a function with an escape algorithm for a
+    particular platform, it will return the contained string with the
+    proper escape sequences inserted.
+    """
+    def __init__(self, cmd, literal=None):
+        collections.UserString.__init__(self, cmd)
+        self.literal = literal
+
+    def is_literal(self):
+        return self.literal
+
+    def escape(self, escape_func, quote_func=quote_spaces):
+        """Escape the string with the supplied function.  The
+        function is expected to take an arbitrary string, then
+        return it with all special characters escaped and ready
+        for passing to the command interpreter.
+
+        After calling this function, the next call to str() will
+        return the escaped string.
+        """
+
+        if self.is_literal():
+            return escape_func(self.data)
+        elif ' ' in self.data or '\t' in self.data:
+            return quote_func(self.data)
+        else:
+            return self.data
+
+def escape_list(mylist, escape_func):
+    """Escape a list of arguments by running the specified escape_func
+    on every object in the list that has an escape() method."""
+    def escape(obj, escape_func=escape_func):
+        try:
+            e = obj.escape
+        except AttributeError:
+            return obj
+        else:
+            return e(escape_func)
+    return list(map(escape, mylist))
+
+class NLWrapper(object):
+    """A wrapper class that delays turning a list of sources or targets
+    into a NodeList until it's needed.  The specified function supplied
+    when the object is initialized is responsible for turning raw nodes
+    into proxies that implement the special attributes like .abspath,
+    .source, etc.  This way, we avoid creating those proxies just
+    "in case" someone is going to use $TARGET or the like, and only
+    go through the trouble if we really have to.
+
+    In practice, this might be a wash performance-wise, but it's a little
+    cleaner conceptually...
+    """
+    
+    def __init__(self, list, func):
+        self.list = list
+        self.func = func
+    def _return_nodelist(self):
+        return self.nodelist
+    def _gen_nodelist(self):
+        mylist = self.list
+        if mylist is None:
+            mylist = []
+        elif not is_Sequence(mylist):
+            mylist = [mylist]
+        # The map(self.func) call is what actually turns
+        # a list into appropriate proxies.
+        self.nodelist = SCons.Util.NodeList(list(map(self.func, mylist)))
+        self._create_nodelist = self._return_nodelist
+        return self.nodelist
+    _create_nodelist = _gen_nodelist
+    
+
+class Targets_or_Sources(collections.UserList):
+    """A class that implements $TARGETS or $SOURCES expansions by in turn
+    wrapping a NLWrapper.  This class handles the different methods used
+    to access the list, calling the NLWrapper to create proxies on demand.
+
+    Note that we subclass collections.UserList purely so that the
+    is_Sequence() function will identify an object of this class as
+    a list during variable expansion.  We're not really using any
+    collections.UserList methods in practice.
+    """
+    def __init__(self, nl):
+        self.nl = nl
+    def __getattr__(self, attr):
+        nl = self.nl._create_nodelist()
+        return getattr(nl, attr)
+    def __getitem__(self, i):
+        nl = self.nl._create_nodelist()
+        return nl[i]
+    def __getslice__(self, i, j):
+        nl = self.nl._create_nodelist()
+        i = max(i, 0); j = max(j, 0)
+        return nl[i:j]
+    def __str__(self):
+        nl = self.nl._create_nodelist()
+        return str(nl)
+    def __repr__(self):
+        nl = self.nl._create_nodelist()
+        return repr(nl)
+
+class Target_or_Source(object):
+    """A class that implements $TARGET or $SOURCE expansions by in turn
+    wrapping a NLWrapper.  This class handles the different methods used
+    to access an individual proxy Node, calling the NLWrapper to create
+    a proxy on demand.
+    """
+    def __init__(self, nl):
+        self.nl = nl
+    def __getattr__(self, attr):
+        nl = self.nl._create_nodelist()
+        try:
+            nl0 = nl[0]
+        except IndexError:
+            # If there is nothing in the list, then we have no attributes to
+            # pass through, so raise AttributeError for everything.
+            raise AttributeError("NodeList has no attribute: %s" % attr)
+        return getattr(nl0, attr)
+    def __str__(self):
+        nl = self.nl._create_nodelist()
+        if nl:
+            return str(nl[0])
+        return ''
+    def __repr__(self):
+        nl = self.nl._create_nodelist()
+        if nl:
+            return repr(nl[0])
+        return ''
+
+class NullNodeList(SCons.Util.NullSeq):
+  def __call__(self, *args, **kwargs): return ''
+  def __str__(self): return ''
+
+NullNodesList = NullNodeList()
+
+def subst_dict(target, source):
+    """Create a dictionary for substitution of special
+    construction variables.
+
+    This translates the following special arguments:
+
+    target - the target (object or array of objects),
+             used to generate the TARGET and TARGETS
+             construction variables
+
+    source - the source (object or array of objects),
+             used to generate the SOURCES and SOURCE
+             construction variables
+    """
+    dict = {}
+
+    if target:
+        def get_tgt_subst_proxy(thing):
+            try:
+                subst_proxy = thing.get_subst_proxy()
+            except AttributeError:
+                subst_proxy = thing # probably a string, just return it
+            return subst_proxy
+        tnl = NLWrapper(target, get_tgt_subst_proxy)
+        dict['TARGETS'] = Targets_or_Sources(tnl)
+        dict['TARGET'] = Target_or_Source(tnl)
+
+        # This is a total cheat, but hopefully this dictionary goes
+        # away soon anyway.  We just let these expand to $TARGETS
+        # because that's "good enough" for the use of ToolSurrogates
+        # (see test/ToolSurrogate.py) to generate documentation.
+        dict['CHANGED_TARGETS'] = '$TARGETS'
+        dict['UNCHANGED_TARGETS'] = '$TARGETS'
+    else:
+        dict['TARGETS'] = NullNodesList
+        dict['TARGET'] = NullNodesList
+
+    if source:
+        def get_src_subst_proxy(node):
+            try:
+                rfile = node.rfile
+            except AttributeError:
+                pass
+            else:
+                node = rfile()
+            try:
+                return node.get_subst_proxy()
+            except AttributeError:
+                return node     # probably a String, just return it
+        snl = NLWrapper(source, get_src_subst_proxy)
+        dict['SOURCES'] = Targets_or_Sources(snl)
+        dict['SOURCE'] = Target_or_Source(snl)
+
+        # This is a total cheat, but hopefully this dictionary goes
+        # away soon anyway.  We just let these expand to $TARGETS
+        # because that's "good enough" for the use of ToolSurrogates
+        # (see test/ToolSurrogate.py) to generate documentation.
+        dict['CHANGED_SOURCES'] = '$SOURCES'
+        dict['UNCHANGED_SOURCES'] = '$SOURCES'
+    else:
+        dict['SOURCES'] = NullNodesList
+        dict['SOURCE'] = NullNodesList
+
+    return dict
+
+# Constants for the "mode" parameter to scons_subst_list() and
+# scons_subst().  SUBST_RAW gives the raw command line.  SUBST_CMD
+# gives a command line suitable for passing to a shell.  SUBST_SIG
+# gives a command line appropriate for calculating the signature
+# of a command line...if this changes, we should rebuild.
+SUBST_CMD = 0
+SUBST_RAW = 1
+SUBST_SIG = 2
+
+_rm = re.compile(r'\$[()]')
+_remove = re.compile(r'\$\([^\$]*(\$[^\)][^\$]*)*\$\)')
+
+# Indexed by the SUBST_* constants above.
+_regex_remove = [ _rm, None, _remove ]
+
+def _rm_list(list):
+    #return [ l for l in list if not l in ('$(', '$)') ]
+    return [l for l in list if not l in ('$(', '$)')]
+
+def _remove_list(list):
+    result = []
+    do_append = result.append
+    for l in list:
+        if l == '$(':
+            do_append = lambda x: None
+        elif l == '$)':
+            do_append = result.append
+        else:
+            do_append(l)
+    return result
+
+# Indexed by the SUBST_* constants above.
+_list_remove = [ _rm_list, None, _remove_list ]
+
+# Regular expressions for splitting strings and handling substitutions,
+# for use by the scons_subst() and scons_subst_list() functions:
+#
+# The first expression compiled matches all of the $-introduced tokens
+# that we need to process in some way, and is used for substitutions.
+# The expressions it matches are:
+#
+#       "$$"
+#       "$("
+#       "$)"
+#       "$variable"             [must begin with alphabetic or underscore]
+#       "${any stuff}"
+#
+# The second expression compiled is used for splitting strings into tokens
+# to be processed, and it matches all of the tokens listed above, plus
+# the following that affect how arguments do or don't get joined together:
+#
+#       "   "                   [white space]
+#       "non-white-space"       [without any dollar signs]
+#       "$"                     [single dollar sign]
+#
+_dollar_exps_str = r'\$[\$\(\)]|\$[_a-zA-Z][\.\w]*|\${[^}]*}'
+_dollar_exps = re.compile(r'(%s)' % _dollar_exps_str)
+_separate_args = re.compile(r'(%s|\s+|[^\s\$]+|\$)' % _dollar_exps_str)
+
+# This regular expression is used to replace strings of multiple white
+# space characters in the string result from the scons_subst() function.
+_space_sep = re.compile(r'[\t ]+(?![^{]*})')
+
+def scons_subst(strSubst, env, mode=SUBST_RAW, target=None, source=None, gvars={}, lvars={}, conv=None):
+    """Expand a string or list containing construction variable
+    substitutions.
+
+    This is the work-horse function for substitutions in file names
+    and the like.  The companion scons_subst_list() function (below)
+    handles separating command lines into lists of arguments, so see
+    that function if that's what you're looking for.
+    """
+    if isinstance(strSubst, str) and strSubst.find('$') < 0:
+        return strSubst
+
+    class StringSubber(object):
+        """A class to construct the results of a scons_subst() call.
+
+        This binds a specific construction environment, mode, target and
+        source with two methods (substitute() and expand()) that handle
+        the expansion.
+        """
+        def __init__(self, env, mode, conv, gvars):
+            self.env = env
+            self.mode = mode
+            self.conv = conv
+            self.gvars = gvars
+
+        def expand(self, s, lvars):
+            """Expand a single "token" as necessary, returning an
+            appropriate string containing the expansion.
+
+            This handles expanding different types of things (strings,
+            lists, callables) appropriately.  It calls the wrapper
+            substitute() method to re-expand things as necessary, so that
+            the results of expansions of side-by-side strings still get
+            re-evaluated separately, not smushed together.
+            """
+            if is_String(s):
+                try:
+                    s0, s1 = s[:2]
+                except (IndexError, ValueError):
+                    return s
+                if s0 != '$':
+                    return s
+                if s1 == '$':
+                    return '$'
+                elif s1 in '()':
+                    return s
+                else:
+                    key = s[1:]
+                    if key[0] == '{' or key.find('.') >= 0:
+                        if key[0] == '{':
+                            key = key[1:-1]
+                        try:
+                            s = eval(key, self.gvars, lvars)
+                        except KeyboardInterrupt:
+                            raise
+                        except Exception, e:
+                            if e.__class__ in AllowableExceptions:
+                                return ''
+                            raise_exception(e, lvars['TARGETS'], s)
+                    else:
+                        if key in lvars:
+                            s = lvars[key]
+                        elif key in self.gvars:
+                            s = self.gvars[key]
+                        elif not NameError in AllowableExceptions:
+                            raise_exception(NameError(key), lvars['TARGETS'], s)
+                        else:
+                            return ''
+    
+                    # Before re-expanding the result, handle
+                    # recursive expansion by copying the local
+                    # variable dictionary and overwriting a null
+                    # string for the value of the variable name
+                    # we just expanded.
+                    #
+                    # This could potentially be optimized by only
+                    # copying lvars when s contains more expansions,
+                    # but lvars is usually supposed to be pretty
+                    # small, and deeply nested variable expansions
+                    # are probably more the exception than the norm,
+                    # so it should be tolerable for now.
+                    lv = lvars.copy()
+                    var = key.split('.')[0]
+                    lv[var] = ''
+                    return self.substitute(s, lv)
+            elif is_Sequence(s):
+                def func(l, conv=self.conv, substitute=self.substitute, lvars=lvars):
+                    return conv(substitute(l, lvars))
+                return list(map(func, s))
+            elif callable(s):
+                try:
+                    s = s(target=lvars['TARGETS'],
+                         source=lvars['SOURCES'],
+                         env=self.env,
+                         for_signature=(self.mode != SUBST_CMD))
+                except TypeError:
+                    # This probably indicates that it's a callable
+                    # object that doesn't match our calling arguments
+                    # (like an Action).
+                    if self.mode == SUBST_RAW:
+                        return s
+                    s = self.conv(s)
+                return self.substitute(s, lvars)
+            elif s is None:
+                return ''
+            else:
+                return s
+
+        def substitute(self, args, lvars):
+            """Substitute expansions in an argument or list of arguments.
+
+            This serves as a wrapper for splitting up a string into
+            separate tokens.
+            """
+            if is_String(args) and not isinstance(args, CmdStringHolder):
+                args = str(args)        # In case it's a UserString.
+                try:
+                    def sub_match(match):
+                        return self.conv(self.expand(match.group(1), lvars))
+                    result = _dollar_exps.sub(sub_match, args)
+                except TypeError:
+                    # If the internal conversion routine doesn't return
+                    # strings (it could be overridden to return Nodes, for
+                    # example), then the 1.5.2 re module will throw this
+                    # exception.  Back off to a slower, general-purpose
+                    # algorithm that works for all data types.
+                    args = _separate_args.findall(args)
+                    result = []
+                    for a in args:
+                        result.append(self.conv(self.expand(a, lvars)))
+                    if len(result) == 1:
+                        result = result[0]
+                    else:
+                        result = ''.join(map(str, result))
+                return result
+            else:
+                return self.expand(args, lvars)
+
+    if conv is None:
+        conv = _strconv[mode]
+
+    # Doing this every time is a bit of a waste, since the Executor
+    # has typically already populated the OverrideEnvironment with
+    # $TARGET/$SOURCE variables.  We're keeping this (for now), though,
+    # because it supports existing behavior that allows us to call
+    # an Action directly with an arbitrary target+source pair, which
+    # we use in Tool/tex.py to handle calling $BIBTEX when necessary.
+    # If we dropped that behavior (or found another way to cover it),
+    # we could get rid of this call completely and just rely on the
+    # Executor setting the variables.
+    if 'TARGET' not in lvars:
+        d = subst_dict(target, source)
+        if d:
+            lvars = lvars.copy()
+            lvars.update(d)
+
+    # We're (most likely) going to eval() things.  If Python doesn't
+    # find a __builtins__ value in the global dictionary used for eval(),
+    # it copies the current global values for you.  Avoid this by
+    # setting it explicitly and then deleting, so we don't pollute the
+    # construction environment Dictionary(ies) that are typically used
+    # for expansion.
+    gvars['__builtins__'] = __builtins__
+
+    ss = StringSubber(env, mode, conv, gvars)
+    result = ss.substitute(strSubst, lvars)
+
+    try:
+        del gvars['__builtins__']
+    except KeyError:
+        pass
+
+    if is_String(result):
+        # Remove $(-$) pairs and any stuff in between,
+        # if that's appropriate.
+        remove = _regex_remove[mode]
+        if remove:
+            result = remove.sub('', result)
+        if mode != SUBST_RAW:
+            # Compress strings of white space characters into
+            # a single space.
+            result = _space_sep.sub(' ', result).strip()
+    elif is_Sequence(result):
+        remove = _list_remove[mode]
+        if remove:
+            result = remove(result)
+
+    return result
+
+#Subst_List_Strings = {}
+
+def scons_subst_list(strSubst, env, mode=SUBST_RAW, target=None, source=None, gvars={}, lvars={}, conv=None):
+    """Substitute construction variables in a string (or list or other
+    object) and separate the arguments into a command list.
+
+    The companion scons_subst() function (above) handles basic
+    substitutions within strings, so see that function instead
+    if that's what you're looking for.
+    """
+#    try:
+#        Subst_List_Strings[strSubst] = Subst_List_Strings[strSubst] + 1
+#    except KeyError:
+#        Subst_List_Strings[strSubst] = 1
+#    import SCons.Debug
+#    SCons.Debug.caller_trace(1)
+    class ListSubber(collections.UserList):
+        """A class to construct the results of a scons_subst_list() call.
+
+        Like StringSubber, this class binds a specific construction
+        environment, mode, target and source with two methods
+        (substitute() and expand()) that handle the expansion.
+
+        In addition, however, this class is used to track the state of
+        the result(s) we're gathering so we can do the appropriate thing
+        whenever we have to append another word to the result--start a new
+        line, start a new word, append to the current word, etc.  We do
+        this by setting the "append" attribute to the right method so
+        that our wrapper methods only need ever call ListSubber.append(),
+        and the rest of the object takes care of doing the right thing
+        internally.
+        """
+        def __init__(self, env, mode, conv, gvars):
+            collections.UserList.__init__(self, [])
+            self.env = env
+            self.mode = mode
+            self.conv = conv
+            self.gvars = gvars
+
+            if self.mode == SUBST_RAW:
+                self.add_strip = lambda x: self.append(x)
+            else:
+                self.add_strip = lambda x: None
+            self.in_strip = None
+            self.next_line()
+
+        def expand(self, s, lvars, within_list):
+            """Expand a single "token" as necessary, appending the
+            expansion to the current result.
+
+            This handles expanding different types of things (strings,
+            lists, callables) appropriately.  It calls the wrapper
+            substitute() method to re-expand things as necessary, so that
+            the results of expansions of side-by-side strings still get
+            re-evaluated separately, not smushed together.
+            """
+
+            if is_String(s):
+                try:
+                    s0, s1 = s[:2]
+                except (IndexError, ValueError):
+                    self.append(s)
+                    return
+                if s0 != '$':
+                    self.append(s)
+                    return
+                if s1 == '$':
+                    self.append('$')
+                elif s1 == '(':
+                    self.open_strip('$(')
+                elif s1 == ')':
+                    self.close_strip('$)')
+                else:
+                    key = s[1:]
+                    if key[0] == '{' or key.find('.') >= 0:
+                        if key[0] == '{':
+                            key = key[1:-1]
+                        try:
+                            s = eval(key, self.gvars, lvars)
+                        except KeyboardInterrupt:
+                            raise
+                        except Exception, e:
+                            if e.__class__ in AllowableExceptions:
+                                return
+                            raise_exception(e, lvars['TARGETS'], s)
+                    else:
+                        if key in lvars:
+                            s = lvars[key]
+                        elif key in self.gvars:
+                            s = self.gvars[key]
+                        elif not NameError in AllowableExceptions:
+                            raise_exception(NameError(), lvars['TARGETS'], s)
+                        else:
+                            return
+
+                    # Before re-expanding the result, handle
+                    # recursive expansion by copying the local
+                    # variable dictionary and overwriting a null
+                    # string for the value of the variable name
+                    # we just expanded.
+                    lv = lvars.copy()
+                    var = key.split('.')[0]
+                    lv[var] = ''
+                    self.substitute(s, lv, 0)
+                    self.this_word()
+            elif is_Sequence(s):
+                for a in s:
+                    self.substitute(a, lvars, 1)
+                    self.next_word()
+            elif callable(s):
+                try:
+                    s = s(target=lvars['TARGETS'],
+                         source=lvars['SOURCES'],
+                         env=self.env,
+                         for_signature=(self.mode != SUBST_CMD))
+                except TypeError:
+                    # This probably indicates that it's a callable
+                    # object that doesn't match our calling arguments
+                    # (like an Action).
+                    if self.mode == SUBST_RAW:
+                        self.append(s)
+                        return
+                    s = self.conv(s)
+                self.substitute(s, lvars, within_list)
+            elif s is None:
+                self.this_word()
+            else:
+                self.append(s)
+
+        def substitute(self, args, lvars, within_list):
+            """Substitute expansions in an argument or list of arguments.
+
+            This serves as a wrapper for splitting up a string into
+            separate tokens.
+            """
+
+            if is_String(args) and not isinstance(args, CmdStringHolder):
+                args = str(args)        # In case it's a UserString.
+                args = _separate_args.findall(args)
+                for a in args:
+                    if a[0] in ' \t\n\r\f\v':
+                        if '\n' in a:
+                            self.next_line()
+                        elif within_list:
+                            self.append(a)
+                        else:
+                            self.next_word()
+                    else:
+                        self.expand(a, lvars, within_list)
+            else:
+                self.expand(args, lvars, within_list)
+
+        def next_line(self):
+            """Arrange for the next word to start a new line.  This
+            is like starting a new word, except that we have to append
+            another line to the result."""
+            collections.UserList.append(self, [])
+            self.next_word()
+
+        def this_word(self):
+            """Arrange for the next word to append to the end of the
+            current last word in the result."""
+            self.append = self.add_to_current_word
+
+        def next_word(self):
+            """Arrange for the next word to start a new word."""
+            self.append = self.add_new_word
+
+        def add_to_current_word(self, x):
+            """Append the string x to the end of the current last word
+            in the result.  If that is not possible, then just add
+            it as a new word.  Make sure the entire concatenated string
+            inherits the object attributes of x (in particular, the
+            escape function) by wrapping it as CmdStringHolder."""
+
+            if not self.in_strip or self.mode != SUBST_SIG:
+                try:
+                    current_word = self[-1][-1]
+                except IndexError:
+                    self.add_new_word(x)
+                else:
+                    # All right, this is a hack and it should probably
+                    # be refactored out of existence in the future.
+                    # The issue is that we want to smoosh words together
+                    # and make one file name that gets escaped if
+                    # we're expanding something like foo$EXTENSION,
+                    # but we don't want to smoosh them together if
+                    # it's something like >$TARGET, because then we'll
+                    # treat the '>' like it's part of the file name.
+                    # So for now, just hard-code looking for the special
+                    # command-line redirection characters...
+                    try:
+                        last_char = str(current_word)[-1]
+                    except IndexError:
+                        last_char = '\0'
+                    if last_char in '<>|':
+                        self.add_new_word(x)
+                    else:
+                        y = current_word + x
+
+                        # We used to treat a word appended to a literal
+                        # as a literal itself, but this caused problems
+                        # with interpreting quotes around space-separated
+                        # targets on command lines.  Removing this makes
+                        # none of the "substantive" end-to-end tests fail,
+                        # so we'll take this out but leave it commented
+                        # for now in case there's a problem not covered
+                        # by the test cases and we need to resurrect this.
+                        #literal1 = self.literal(self[-1][-1])
+                        #literal2 = self.literal(x)
+                        y = self.conv(y)
+                        if is_String(y):
+                            #y = CmdStringHolder(y, literal1 or literal2)
+                            y = CmdStringHolder(y, None)
+                        self[-1][-1] = y
+
+        def add_new_word(self, x):
+            if not self.in_strip or self.mode != SUBST_SIG:
+                literal = self.literal(x)
+                x = self.conv(x)
+                if is_String(x):
+                    x = CmdStringHolder(x, literal)
+                self[-1].append(x)
+            self.append = self.add_to_current_word
+
+        def literal(self, x):
+            try:
+                l = x.is_literal
+            except AttributeError:
+                return None
+            else:
+                return l()
+
+        def open_strip(self, x):
+            """Handle the "open strip" $( token."""
+            self.add_strip(x)
+            self.in_strip = 1
+
+        def close_strip(self, x):
+            """Handle the "close strip" $) token."""
+            self.add_strip(x)
+            self.in_strip = None
+
+    if conv is None:
+        conv = _strconv[mode]
+
+    # Doing this every time is a bit of a waste, since the Executor
+    # has typically already populated the OverrideEnvironment with
+    # $TARGET/$SOURCE variables.  We're keeping this (for now), though,
+    # because it supports existing behavior that allows us to call
+    # an Action directly with an arbitrary target+source pair, which
+    # we use in Tool/tex.py to handle calling $BIBTEX when necessary.
+    # If we dropped that behavior (or found another way to cover it),
+    # we could get rid of this call completely and just rely on the
+    # Executor setting the variables.
+    if 'TARGET' not in lvars:
+        d = subst_dict(target, source)
+        if d:
+            lvars = lvars.copy()
+            lvars.update(d)
+
+    # We're (most likely) going to eval() things.  If Python doesn't
+    # find a __builtins__ value in the global dictionary used for eval(),
+    # it copies the current global values for you.  Avoid this by
+    # setting it explicitly and then deleting, so we don't pollute the
+    # construction environment Dictionary(ies) that are typically used
+    # for expansion.
+    gvars['__builtins__'] = __builtins__
+
+    ls = ListSubber(env, mode, conv, gvars)
+    ls.substitute(strSubst, lvars, 0)
+
+    try:
+        del gvars['__builtins__']
+    except KeyError:
+        pass
+
+    return ls.data
+
+def scons_subst_once(strSubst, env, key):
+    """Perform single (non-recursive) substitution of a single
+    construction variable keyword.
+
+    This is used when setting a variable when copying or overriding values
+    in an Environment.  We want to capture (expand) the old value before
+    we override it, so people can do things like:
+
+        env2 = env.Clone(CCFLAGS = '$CCFLAGS -g')
+
+    We do this with some straightforward, brute-force code here...
+    """
+    if isinstance(strSubst, str) and strSubst.find('$') < 0:
+        return strSubst
+
+    matchlist = ['$' + key, '${' + key + '}']
+    val = env.get(key, '')
+    def sub_match(match, val=val, matchlist=matchlist):
+        a = match.group(1)
+        if a in matchlist:
+            a = val
+        if is_Sequence(a):
+            return ' '.join(map(str, a))
+        else:
+            return str(a)
+
+    if is_Sequence(strSubst):
+        result = []
+        for arg in strSubst:
+            if is_String(arg):
+                if arg in matchlist:
+                    arg = val
+                    if is_Sequence(arg):
+                        result.extend(arg)
+                    else:
+                        result.append(arg)
+                else:
+                    result.append(_dollar_exps.sub(sub_match, arg))
+            else:
+                result.append(arg)
+        return result
+    elif is_String(strSubst):
+        return _dollar_exps.sub(sub_match, strSubst)
+    else:
+        return strSubst
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Taskmaster.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Taskmaster.py
new file mode 100644
index 0000000..9e9a683
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Taskmaster.py
@@ -0,0 +1,1017 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__doc__ = """
+Generic Taskmaster module for the SCons build engine.
+
+This module contains the primary interface(s) between a wrapping user
+interface and the SCons build engine.  There are two key classes here:
+
+    Taskmaster
+        This is the main engine for walking the dependency graph and
+        calling things to decide what does or doesn't need to be built.
+
+    Task
+        This is the base class for allowing a wrapping interface to
+        decide what does or doesn't actually need to be done.  The
+        intention is for a wrapping interface to subclass this as
+        appropriate for different types of behavior it may need.
+
+        The canonical example is the SCons native Python interface,
+        which has Task subclasses that handle its specific behavior,
+        like printing "`foo' is up to date" when a top-level target
+        doesn't need to be built, and handling the -c option by removing
+        targets as its "build" action.  There is also a separate subclass
+        for suppressing this output when the -q option is used.
+
+        The Taskmaster instantiates a Task object for each (set of)
+        target(s) that it decides need to be evaluated and/or built.
+"""
+
+__revision__ = "src/engine/SCons/Taskmaster.py 5183 2010/11/25 14:46:21 bdeegan"
+
+from itertools import chain
+import operator
+import sys
+import traceback
+
+import SCons.Errors
+import SCons.Node
+import SCons.Warnings
+
+StateString = SCons.Node.StateString
+NODE_NO_STATE = SCons.Node.no_state
+NODE_PENDING = SCons.Node.pending
+NODE_EXECUTING = SCons.Node.executing
+NODE_UP_TO_DATE = SCons.Node.up_to_date
+NODE_EXECUTED = SCons.Node.executed
+NODE_FAILED = SCons.Node.failed
+
+
+# A subsystem for recording stats about how different Nodes are handled by
+# the main Taskmaster loop.  There's no external control here (no need for
+# a --debug= option); enable it by changing the value of CollectStats.
+
+CollectStats = None
+
+class Stats(object):
+    """
+    A simple class for holding statistics about the disposition of a
+    Node by the Taskmaster.  If we're collecting statistics, each Node
+    processed by the Taskmaster gets one of these attached, in which case
+    the Taskmaster records its decision each time it processes the Node.
+    (Ideally, that's just once per Node.)
+    """
+    def __init__(self):
+        """
+        Instantiates a Taskmaster.Stats object, initializing all
+        appropriate counters to zero.
+        """
+        self.considered  = 0
+        self.already_handled  = 0
+        self.problem  = 0
+        self.child_failed  = 0
+        self.not_built  = 0
+        self.side_effects  = 0
+        self.build  = 0
+
+StatsNodes = []
+
+fmt = "%(considered)3d "\
+      "%(already_handled)3d " \
+      "%(problem)3d " \
+      "%(child_failed)3d " \
+      "%(not_built)3d " \
+      "%(side_effects)3d " \
+      "%(build)3d "
+
+def dump_stats():
+    for n in sorted(StatsNodes, key=lambda a: str(a)):
+        print (fmt % n.stats.__dict__) + str(n)
+
+
+
+class Task(object):
+    """
+    Default SCons build engine task.
+
+    This controls the interaction of the actual building of node
+    and the rest of the engine.
+
+    This is expected to handle all of the normally-customizable
+    aspects of controlling a build, so any given application
+    *should* be able to do what it wants by sub-classing this
+    class and overriding methods as appropriate.  If an application
+    needs to customze something by sub-classing Taskmaster (or
+    some other build engine class), we should first try to migrate
+    that functionality into this class.
+
+    Note that it's generally a good idea for sub-classes to call
+    these methods explicitly to update state, etc., rather than
+    roll their own interaction with Taskmaster from scratch.
+    """
+    def __init__(self, tm, targets, top, node):
+        self.tm = tm
+        self.targets = targets
+        self.top = top
+        self.node = node
+        self.exc_clear()
+
+    def trace_message(self, method, node, description='node'):
+        fmt = '%-20s %s %s\n'
+        return fmt % (method + ':', description, self.tm.trace_node(node))
+
+    def display(self, message):
+        """
+        Hook to allow the calling interface to display a message.
+
+        This hook gets called as part of preparing a task for execution
+        (that is, a Node to be built).  As part of figuring out what Node
+        should be built next, the actually target list may be altered,
+        along with a message describing the alteration.  The calling
+        interface can subclass Task and provide a concrete implementation
+        of this method to see those messages.
+        """
+        pass
+
+    def prepare(self):
+        """
+        Called just before the task is executed.
+
+        This is mainly intended to give the target Nodes a chance to
+        unlink underlying files and make all necessary directories before
+        the Action is actually called to build the targets.
+        """
+        T = self.tm.trace
+        if T: T.write(self.trace_message(u'Task.prepare()', self.node))
+
+        # Now that it's the appropriate time, give the TaskMaster a
+        # chance to raise any exceptions it encountered while preparing
+        # this task.
+        self.exception_raise()
+
+        if self.tm.message:
+            self.display(self.tm.message)
+            self.tm.message = None
+
+        # Let the targets take care of any necessary preparations.
+        # This includes verifying that all of the necessary sources
+        # and dependencies exist, removing the target file(s), etc.
+        #
+        # As of April 2008, the get_executor().prepare() method makes
+        # sure that all of the aggregate sources necessary to build this
+        # Task's target(s) exist in one up-front check.  The individual
+        # target t.prepare() methods check that each target's explicit
+        # or implicit dependencies exists, and also initialize the
+        # .sconsign info.
+        executor = self.targets[0].get_executor()
+        executor.prepare()
+        for t in executor.get_action_targets():
+            t.prepare()
+            for s in t.side_effects:
+                s.prepare()
+
+    def get_target(self):
+        """Fetch the target being built or updated by this task.
+        """
+        return self.node
+
+    def needs_execute(self):
+        # TODO(deprecate):  "return True" is the old default behavior;
+        # change it to NotImplementedError (after running through the
+        # Deprecation Cycle) so the desired behavior is explicitly
+        # determined by which concrete subclass is used.
+        #raise NotImplementedError
+        msg = ('Taskmaster.Task is an abstract base class; instead of\n'
+              '\tusing it directly, '
+              'derive from it and override the abstract methods.')
+        SCons.Warnings.warn(SCons.Warnings.TaskmasterNeedsExecuteWarning, msg)
+        return True
+
+    def execute(self):
+        """
+        Called to execute the task.
+
+        This method is called from multiple threads in a parallel build,
+        so only do thread safe stuff here.  Do thread unsafe stuff in
+        prepare(), executed() or failed().
+        """
+        T = self.tm.trace
+        if T: T.write(self.trace_message(u'Task.execute()', self.node))
+
+        try:
+            everything_was_cached = 1
+            for t in self.targets:
+                if t.retrieve_from_cache():
+                    # Call the .built() method without calling the
+                    # .push_to_cache() method, since we just got the
+                    # target from the cache and don't need to push
+                    # it back there.
+                    t.set_state(NODE_EXECUTED)
+                    t.built()
+                else:
+                    everything_was_cached = 0
+                    break
+            if not everything_was_cached:
+                self.targets[0].build()
+        except SystemExit:
+            exc_value = sys.exc_info()[1]
+            raise SCons.Errors.ExplicitExit(self.targets[0], exc_value.code)
+        except SCons.Errors.UserError:
+            raise
+        except SCons.Errors.BuildError:
+            raise
+        except Exception, e:
+            buildError = SCons.Errors.convert_to_BuildError(e)
+            buildError.node = self.targets[0]
+            buildError.exc_info = sys.exc_info()
+            raise buildError
+
+    def executed_without_callbacks(self):
+        """
+        Called when the task has been successfully executed
+        and the Taskmaster instance doesn't want to call
+        the Node's callback methods.
+        """
+        T = self.tm.trace
+        if T: T.write(self.trace_message('Task.executed_without_callbacks()',
+                                         self.node))
+
+        for t in self.targets:
+            if t.get_state() == NODE_EXECUTING:
+                for side_effect in t.side_effects:
+                    side_effect.set_state(NODE_NO_STATE)
+                t.set_state(NODE_EXECUTED)
+
+    def executed_with_callbacks(self):
+        """
+        Called when the task has been successfully executed and
+        the Taskmaster instance wants to call the Node's callback
+        methods.
+
+        This may have been a do-nothing operation (to preserve build
+        order), so we must check the node's state before deciding whether
+        it was "built", in which case we call the appropriate Node method.
+        In any event, we always call "visited()", which will handle any
+        post-visit actions that must take place regardless of whether
+        or not the target was an actual built target or a source Node.
+        """
+        T = self.tm.trace
+        if T: T.write(self.trace_message('Task.executed_with_callbacks()',
+                                         self.node))
+
+        for t in self.targets:
+            if t.get_state() == NODE_EXECUTING:
+                for side_effect in t.side_effects:
+                    side_effect.set_state(NODE_NO_STATE)
+                t.set_state(NODE_EXECUTED)
+                t.push_to_cache()
+                t.built()
+            t.visited()
+
+    executed = executed_with_callbacks
+
+    def failed(self):
+        """
+        Default action when a task fails:  stop the build.
+
+        Note: Although this function is normally invoked on nodes in
+        the executing state, it might also be invoked on up-to-date
+        nodes when using Configure().
+        """
+        self.fail_stop()
+
+    def fail_stop(self):
+        """
+        Explicit stop-the-build failure.
+
+        This sets failure status on the target nodes and all of
+        their dependent parent nodes.
+
+        Note: Although this function is normally invoked on nodes in
+        the executing state, it might also be invoked on up-to-date
+        nodes when using Configure().
+        """
+        T = self.tm.trace
+        if T: T.write(self.trace_message('Task.failed_stop()', self.node))
+
+        # Invoke will_not_build() to clean-up the pending children
+        # list.
+        self.tm.will_not_build(self.targets, lambda n: n.set_state(NODE_FAILED))
+
+        # Tell the taskmaster to not start any new tasks
+        self.tm.stop()
+
+        # We're stopping because of a build failure, but give the
+        # calling Task class a chance to postprocess() the top-level
+        # target under which the build failure occurred.
+        self.targets = [self.tm.current_top]
+        self.top = 1
+
+    def fail_continue(self):
+        """
+        Explicit continue-the-build failure.
+
+        This sets failure status on the target nodes and all of
+        their dependent parent nodes.
+
+        Note: Although this function is normally invoked on nodes in
+        the executing state, it might also be invoked on up-to-date
+        nodes when using Configure().
+        """
+        T = self.tm.trace
+        if T: T.write(self.trace_message('Task.failed_continue()', self.node))
+
+        self.tm.will_not_build(self.targets, lambda n: n.set_state(NODE_FAILED))
+
+    def make_ready_all(self):
+        """
+        Marks all targets in a task ready for execution.
+
+        This is used when the interface needs every target Node to be
+        visited--the canonical example being the "scons -c" option.
+        """
+        T = self.tm.trace
+        if T: T.write(self.trace_message('Task.make_ready_all()', self.node))
+
+        self.out_of_date = self.targets[:]
+        for t in self.targets:
+            t.disambiguate().set_state(NODE_EXECUTING)
+            for s in t.side_effects:
+                # add disambiguate here to mirror the call on targets above
+                s.disambiguate().set_state(NODE_EXECUTING)
+
+    def make_ready_current(self):
+        """
+        Marks all targets in a task ready for execution if any target
+        is not current.
+
+        This is the default behavior for building only what's necessary.
+        """
+        T = self.tm.trace
+        if T: T.write(self.trace_message(u'Task.make_ready_current()',
+                                         self.node))
+
+        self.out_of_date = []
+        needs_executing = False
+        for t in self.targets:
+            try:
+                t.disambiguate().make_ready()
+                is_up_to_date = not t.has_builder() or \
+                                (not t.always_build and t.is_up_to_date())
+            except EnvironmentError, e:
+                raise SCons.Errors.BuildError(node=t, errstr=e.strerror, filename=e.filename)
+
+            if not is_up_to_date:
+                self.out_of_date.append(t)
+                needs_executing = True
+
+        if needs_executing:
+            for t in self.targets:
+                t.set_state(NODE_EXECUTING)
+                for s in t.side_effects:
+                    # add disambiguate here to mirror the call on targets in first loop above
+                    s.disambiguate().set_state(NODE_EXECUTING)
+        else:
+            for t in self.targets:
+                # We must invoke visited() to ensure that the node
+                # information has been computed before allowing the
+                # parent nodes to execute. (That could occur in a
+                # parallel build...)
+                t.visited()
+                t.set_state(NODE_UP_TO_DATE)
+
+    make_ready = make_ready_current
+
+    def postprocess(self):
+        """
+        Post-processes a task after it's been executed.
+
+        This examines all the targets just built (or not, we don't care
+        if the build was successful, or even if there was no build
+        because everything was up-to-date) to see if they have any
+        waiting parent Nodes, or Nodes waiting on a common side effect,
+        that can be put back on the candidates list.
+        """
+        T = self.tm.trace
+        if T: T.write(self.trace_message(u'Task.postprocess()', self.node))
+
+        # We may have built multiple targets, some of which may have
+        # common parents waiting for this build.  Count up how many
+        # targets each parent was waiting for so we can subtract the
+        # values later, and so we *don't* put waiting side-effect Nodes
+        # back on the candidates list if the Node is also a waiting
+        # parent.
+
+        targets = set(self.targets)
+
+        pending_children = self.tm.pending_children
+        parents = {}
+        for t in targets:
+            # A node can only be in the pending_children set if it has
+            # some waiting_parents.
+            if t.waiting_parents:
+                if T: T.write(self.trace_message(u'Task.postprocess()',
+                                                 t,
+                                                 'removing'))
+                pending_children.discard(t)
+            for p in t.waiting_parents:
+                parents[p] = parents.get(p, 0) + 1
+
+        for t in targets:
+            for s in t.side_effects:
+                if s.get_state() == NODE_EXECUTING:
+                    s.set_state(NODE_NO_STATE)
+                    for p in s.waiting_parents:
+                        parents[p] = parents.get(p, 0) + 1
+                for p in s.waiting_s_e:
+                    if p.ref_count == 0:
+                        self.tm.candidates.append(p)
+
+        for p, subtract in parents.items():
+            p.ref_count = p.ref_count - subtract
+            if T: T.write(self.trace_message(u'Task.postprocess()',
+                                             p,
+                                             'adjusted parent ref count'))
+            if p.ref_count == 0:
+                self.tm.candidates.append(p)
+
+        for t in targets:
+            t.postprocess()
+
+    # Exception handling subsystem.
+    #
+    # Exceptions that occur while walking the DAG or examining Nodes
+    # must be raised, but must be raised at an appropriate time and in
+    # a controlled manner so we can, if necessary, recover gracefully,
+    # possibly write out signature information for Nodes we've updated,
+    # etc.  This is done by having the Taskmaster tell us about the
+    # exception, and letting
+
+    def exc_info(self):
+        """
+        Returns info about a recorded exception.
+        """
+        return self.exception
+
+    def exc_clear(self):
+        """
+        Clears any recorded exception.
+
+        This also changes the "exception_raise" attribute to point
+        to the appropriate do-nothing method.
+        """
+        self.exception = (None, None, None)
+        self.exception_raise = self._no_exception_to_raise
+
+    def exception_set(self, exception=None):
+        """
+        Records an exception to be raised at the appropriate time.
+
+        This also changes the "exception_raise" attribute to point
+        to the method that will, in fact
+        """
+        if not exception:
+            exception = sys.exc_info()
+        self.exception = exception
+        self.exception_raise = self._exception_raise
+
+    def _no_exception_to_raise(self):
+        pass
+
+    def _exception_raise(self):
+        """
+        Raises a pending exception that was recorded while getting a
+        Task ready for execution.
+        """
+        exc = self.exc_info()[:]
+        try:
+            exc_type, exc_value, exc_traceback = exc
+        except ValueError:
+            exc_type, exc_value = exc
+            exc_traceback = None
+        raise exc_type, exc_value, exc_traceback
+
+class AlwaysTask(Task):
+    def needs_execute(self):
+        """
+        Always returns True (indicating this Task should always
+        be executed).
+
+        Subclasses that need this behavior (as opposed to the default
+        of only executing Nodes that are out of date w.r.t. their
+        dependencies) can use this as follows:
+
+            class MyTaskSubclass(SCons.Taskmaster.Task):
+                needs_execute = SCons.Taskmaster.Task.execute_always
+        """
+        return True
+
+class OutOfDateTask(Task):
+    def needs_execute(self):
+        """
+        Returns True (indicating this Task should be executed) if this
+        Task's target state indicates it needs executing, which has
+        already been determined by an earlier up-to-date check.
+        """
+        return self.targets[0].get_state() == SCons.Node.executing
+
+
+def find_cycle(stack, visited):
+    if stack[-1] in visited:
+        return None
+    visited.add(stack[-1])
+    for n in stack[-1].waiting_parents:
+        stack.append(n)
+        if stack[0] == stack[-1]:
+            return stack
+        if find_cycle(stack, visited):
+            return stack
+        stack.pop()
+    return None
+
+
+class Taskmaster(object):
+    """
+    The Taskmaster for walking the dependency DAG.
+    """
+
+    def __init__(self, targets=[], tasker=None, order=None, trace=None):
+        self.original_top = targets
+        self.top_targets_left = targets[:]
+        self.top_targets_left.reverse()
+        self.candidates = []
+        if tasker is None:
+            tasker = OutOfDateTask
+        self.tasker = tasker
+        if not order:
+            order = lambda l: l
+        self.order = order
+        self.message = None
+        self.trace = trace
+        self.next_candidate = self.find_next_candidate
+        self.pending_children = set()
+
+    def find_next_candidate(self):
+        """
+        Returns the next candidate Node for (potential) evaluation.
+
+        The candidate list (really a stack) initially consists of all of
+        the top-level (command line) targets provided when the Taskmaster
+        was initialized.  While we walk the DAG, visiting Nodes, all the
+        children that haven't finished processing get pushed on to the
+        candidate list.  Each child can then be popped and examined in
+        turn for whether *their* children are all up-to-date, in which
+        case a Task will be created for their actual evaluation and
+        potential building.
+
+        Here is where we also allow candidate Nodes to alter the list of
+        Nodes that should be examined.  This is used, for example, when
+        invoking SCons in a source directory.  A source directory Node can
+        return its corresponding build directory Node, essentially saying,
+        "Hey, you really need to build this thing over here instead."
+        """
+        try:
+            return self.candidates.pop()
+        except IndexError:
+            pass
+        try:
+            node = self.top_targets_left.pop()
+        except IndexError:
+            return None
+        self.current_top = node
+        alt, message = node.alter_targets()
+        if alt:
+            self.message = message
+            self.candidates.append(node)
+            self.candidates.extend(self.order(alt))
+            node = self.candidates.pop()
+        return node
+
+    def no_next_candidate(self):
+        """
+        Stops Taskmaster processing by not returning a next candidate.
+
+        Note that we have to clean-up the Taskmaster candidate list
+        because the cycle detection depends on the fact all nodes have
+        been processed somehow.
+        """
+        while self.candidates:
+            candidates = self.candidates
+            self.candidates = []
+            self.will_not_build(candidates)
+        return None
+
+    def _validate_pending_children(self):
+        """
+        Validate the content of the pending_children set. Assert if an
+        internal error is found.
+
+        This function is used strictly for debugging the taskmaster by
+        checking that no invariants are violated. It is not used in
+        normal operation.
+
+        The pending_children set is used to detect cycles in the
+        dependency graph. We call a "pending child" a child that is
+        found in the "pending" state when checking the dependencies of
+        its parent node.
+
+        A pending child can occur when the Taskmaster completes a loop
+        through a cycle. For example, lets imagine a graph made of
+        three node (A, B and C) making a cycle. The evaluation starts
+        at node A. The taskmaster first consider whether node A's
+        child B is up-to-date. Then, recursively, node B needs to
+        check whether node C is up-to-date. This leaves us with a
+        dependency graph looking like:
+
+                                      Next candidate \
+                                                      \
+        Node A (Pending) --> Node B(Pending) --> Node C (NoState)
+                ^                                     |
+                |                                     |
+                +-------------------------------------+
+
+        Now, when the Taskmaster examines the Node C's child Node A,
+        it finds that Node A is in the "pending" state. Therefore,
+        Node A is a pending child of node C.
+
+        Pending children indicate that the Taskmaster has potentially
+        loop back through a cycle. We say potentially because it could
+        also occur when a DAG is evaluated in parallel. For example,
+        consider the following graph:
+
+
+        Node A (Pending) --> Node B(Pending) --> Node C (Pending) --> ...
+                |                                     ^
+                |                                     |
+                +----------> Node D (NoState) --------+
+                                  /
+                  Next candidate /
+
+        The Taskmaster first evaluates the nodes A, B, and C and
+        starts building some children of node C. Assuming, that the
+        maximum parallel level has not been reached, the Taskmaster
+        will examine Node D. It will find that Node C is a pending
+        child of Node D.
+
+        In summary, evaluating a graph with a cycle will always
+        involve a pending child at one point. A pending child might
+        indicate either a cycle or a diamond-shaped DAG. Only a
+        fraction of the nodes ends-up being a "pending child" of
+        another node. This keeps the pending_children set small in
+        practice.
+
+        We can differentiate between the two cases if we wait until
+        the end of the build. At this point, all the pending children
+        nodes due to a diamond-shaped DAG will have been properly
+        built (or will have failed to build). But, the pending
+        children involved in a cycle will still be in the pending
+        state.
+
+        The taskmaster removes nodes from the pending_children set as
+        soon as a pending_children node moves out of the pending
+        state. This also helps to keep the pending_children set small.
+        """
+
+        for n in self.pending_children:
+            assert n.state in (NODE_PENDING, NODE_EXECUTING), \
+                (str(n), StateString[n.state])
+            assert len(n.waiting_parents) != 0, (str(n), len(n.waiting_parents))
+            for p in n.waiting_parents:
+                assert p.ref_count > 0, (str(n), str(p), p.ref_count)
+
+
+    def trace_message(self, message):
+        return 'Taskmaster: %s\n' % message
+
+    def trace_node(self, node):
+        return '<%-10s %-3s %s>' % (StateString[node.get_state()],
+                                    node.ref_count,
+                                    repr(str(node)))
+
+    def _find_next_ready_node(self):
+        """
+        Finds the next node that is ready to be built.
+
+        This is *the* main guts of the DAG walk.  We loop through the
+        list of candidates, looking for something that has no un-built
+        children (i.e., that is a leaf Node or has dependencies that are
+        all leaf Nodes or up-to-date).  Candidate Nodes are re-scanned
+        (both the target Node itself and its sources, which are always
+        scanned in the context of a given target) to discover implicit
+        dependencies.  A Node that must wait for some children to be
+        built will be put back on the candidates list after the children
+        have finished building.  A Node that has been put back on the
+        candidates list in this way may have itself (or its sources)
+        re-scanned, in order to handle generated header files (e.g.) and
+        the implicit dependencies therein.
+
+        Note that this method does not do any signature calculation or
+        up-to-date check itself.  All of that is handled by the Task
+        class.  This is purely concerned with the dependency graph walk.
+        """
+
+        self.ready_exc = None
+
+        T = self.trace
+        if T: T.write(u'\n' + self.trace_message('Looking for a node to evaluate'))
+
+        while True:
+            node = self.next_candidate()
+            if node is None:
+                if T: T.write(self.trace_message('No candidate anymore.') + u'\n')
+                return None
+
+            node = node.disambiguate()
+            state = node.get_state()
+
+            # For debugging only:
+            #
+            # try:
+            #     self._validate_pending_children()
+            # except:
+            #     self.ready_exc = sys.exc_info()
+            #     return node
+
+            if CollectStats:
+                if not hasattr(node, 'stats'):
+                    node.stats = Stats()
+                    StatsNodes.append(node)
+                S = node.stats
+                S.considered = S.considered + 1
+            else:
+                S = None
+
+            if T: T.write(self.trace_message(u'    Considering node %s and its children:' % self.trace_node(node)))
+
+            if state == NODE_NO_STATE:
+                # Mark this node as being on the execution stack:
+                node.set_state(NODE_PENDING)
+            elif state > NODE_PENDING:
+                # Skip this node if it has already been evaluated:
+                if S: S.already_handled = S.already_handled + 1
+                if T: T.write(self.trace_message(u'       already handled (executed)'))
+                continue
+
+            executor = node.get_executor()
+
+            try:
+                children = executor.get_all_children()
+            except SystemExit:
+                exc_value = sys.exc_info()[1]
+                e = SCons.Errors.ExplicitExit(node, exc_value.code)
+                self.ready_exc = (SCons.Errors.ExplicitExit, e)
+                if T: T.write(self.trace_message('       SystemExit'))
+                return node
+            except Exception, e:
+                # We had a problem just trying to figure out the
+                # children (like a child couldn't be linked in to a
+                # VariantDir, or a Scanner threw something).  Arrange to
+                # raise the exception when the Task is "executed."
+                self.ready_exc = sys.exc_info()
+                if S: S.problem = S.problem + 1
+                if T: T.write(self.trace_message('       exception %s while scanning children.\n' % e))
+                return node
+
+            children_not_visited = []
+            children_pending = set()
+            children_not_ready = []
+            children_failed = False
+
+            for child in chain(executor.get_all_prerequisites(), children):
+                childstate = child.get_state()
+
+                if T: T.write(self.trace_message(u'       ' + self.trace_node(child)))
+
+                if childstate == NODE_NO_STATE:
+                    children_not_visited.append(child)
+                elif childstate == NODE_PENDING:
+                    children_pending.add(child)
+                elif childstate == NODE_FAILED:
+                    children_failed = True
+
+                if childstate <= NODE_EXECUTING:
+                    children_not_ready.append(child)
+
+
+            # These nodes have not even been visited yet.  Add
+            # them to the list so that on some next pass we can
+            # take a stab at evaluating them (or their children).
+            children_not_visited.reverse()
+            self.candidates.extend(self.order(children_not_visited))
+            #if T and children_not_visited:
+            #    T.write(self.trace_message('     adding to candidates: %s' % map(str, children_not_visited)))
+            #    T.write(self.trace_message('     candidates now: %s\n' % map(str, self.candidates)))
+
+            # Skip this node if any of its children have failed.
+            #
+            # This catches the case where we're descending a top-level
+            # target and one of our children failed while trying to be
+            # built by a *previous* descent of an earlier top-level
+            # target.
+            #
+            # It can also occur if a node is reused in multiple
+            # targets. One first descends though the one of the
+            # target, the next time occurs through the other target.
+            #
+            # Note that we can only have failed_children if the
+            # --keep-going flag was used, because without it the build
+            # will stop before diving in the other branch.
+            #
+            # Note that even if one of the children fails, we still
+            # added the other children to the list of candidate nodes
+            # to keep on building (--keep-going).
+            if children_failed:
+                for n in executor.get_action_targets():
+                    n.set_state(NODE_FAILED)
+
+                if S: S.child_failed = S.child_failed + 1
+                if T: T.write(self.trace_message('****** %s\n' % self.trace_node(node)))
+                continue
+
+            if children_not_ready:
+                for child in children_not_ready:
+                    # We're waiting on one or more derived targets
+                    # that have not yet finished building.
+                    if S: S.not_built = S.not_built + 1
+
+                    # Add this node to the waiting parents lists of
+                    # anything we're waiting on, with a reference
+                    # count so we can be put back on the list for
+                    # re-evaluation when they've all finished.
+                    node.ref_count =  node.ref_count + child.add_to_waiting_parents(node)
+                    if T: T.write(self.trace_message(u'     adjusted ref count: %s, child %s' %
+                                  (self.trace_node(node), repr(str(child)))))
+
+                if T:
+                    for pc in children_pending:
+                        T.write(self.trace_message('       adding %s to the pending children set\n' %
+                                self.trace_node(pc)))
+                self.pending_children = self.pending_children | children_pending
+
+                continue
+
+            # Skip this node if it has side-effects that are
+            # currently being built:
+            wait_side_effects = False
+            for se in executor.get_action_side_effects():
+                if se.get_state() == NODE_EXECUTING:
+                    se.add_to_waiting_s_e(node)
+                    wait_side_effects = True
+
+            if wait_side_effects:
+                if S: S.side_effects = S.side_effects + 1
+                continue
+
+            # The default when we've gotten through all of the checks above:
+            # this node is ready to be built.
+            if S: S.build = S.build + 1
+            if T: T.write(self.trace_message(u'Evaluating %s\n' %
+                                             self.trace_node(node)))
+
+            # For debugging only:
+            #
+            # try:
+            #     self._validate_pending_children()
+            # except:
+            #     self.ready_exc = sys.exc_info()
+            #     return node
+
+            return node
+
+        return None
+
+    def next_task(self):
+        """
+        Returns the next task to be executed.
+
+        This simply asks for the next Node to be evaluated, and then wraps
+        it in the specific Task subclass with which we were initialized.
+        """
+        node = self._find_next_ready_node()
+
+        if node is None:
+            return None
+
+        tlist = node.get_executor().get_all_targets()
+
+        task = self.tasker(self, tlist, node in self.original_top, node)
+        try:
+            task.make_ready()
+        except:
+            # We had a problem just trying to get this task ready (like
+            # a child couldn't be linked in to a VariantDir when deciding
+            # whether this node is current).  Arrange to raise the
+            # exception when the Task is "executed."
+            self.ready_exc = sys.exc_info()
+
+        if self.ready_exc:
+            task.exception_set(self.ready_exc)
+
+        self.ready_exc = None
+
+        return task
+
+    def will_not_build(self, nodes, node_func=lambda n: None):
+        """
+        Perform clean-up about nodes that will never be built. Invokes
+        a user defined function on all of these nodes (including all
+        of their parents).
+        """
+
+        T = self.trace
+
+        pending_children = self.pending_children
+
+        to_visit = set(nodes)
+        pending_children = pending_children - to_visit
+
+        if T:
+            for n in nodes:
+                T.write(self.trace_message('       removing node %s from the pending children set\n' %
+                        self.trace_node(n)))
+        try:
+            while len(to_visit):
+                node = to_visit.pop()
+                node_func(node)
+
+                # Prune recursion by flushing the waiting children
+                # list immediately.
+                parents = node.waiting_parents
+                node.waiting_parents = set()
+
+                to_visit = to_visit | parents
+                pending_children = pending_children - parents
+
+                for p in parents:
+                    p.ref_count = p.ref_count - 1
+                    if T: T.write(self.trace_message('       removing parent %s from the pending children set\n' %
+                                  self.trace_node(p)))
+        except KeyError:
+            # The container to_visit has been emptied.
+            pass
+
+        # We have the stick back the pending_children list into the
+        # taskmaster because the python 1.5.2 compatibility does not
+        # allow us to use in-place updates
+        self.pending_children = pending_children
+
+    def stop(self):
+        """
+        Stops the current build completely.
+        """
+        self.next_candidate = self.no_next_candidate
+
+    def cleanup(self):
+        """
+        Check for dependency cycles.
+        """
+        if not self.pending_children:
+            return
+
+        nclist = [(n, find_cycle([n], set())) for n in self.pending_children]
+
+        genuine_cycles = [
+            node for node,cycle in nclist
+                     if cycle or node.get_state() != NODE_EXECUTED
+        ]
+        if not genuine_cycles:
+            # All of the "cycles" found were single nodes in EXECUTED state,
+            # which is to say, they really weren't cycles.  Just return.
+            return
+
+        desc = 'Found dependency cycle(s):\n'
+        for node, cycle in nclist:
+            if cycle:
+                desc = desc + "  " + " -> ".join(map(str, cycle)) + "\n"
+            else:
+                desc = desc + \
+                    "  Internal Error: no cycle found for node %s (%s) in state %s\n" %  \
+                    (node, repr(node), StateString[node.get_state()])
+
+        raise SCons.Errors.UserError(desc)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/386asm.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/386asm.py
new file mode 100644
index 0000000..8be2e66
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/386asm.py
@@ -0,0 +1,61 @@
+"""SCons.Tool.386asm
+
+Tool specification for the 386ASM assembler for the Phar Lap ETS embedded
+operating system.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/386asm.py 5183 2010/11/25 14:46:21 bdeegan"
+
+from SCons.Tool.PharLapCommon import addPharLapPaths
+import SCons.Util
+
+as_module = __import__('as', globals(), locals(), [])
+
+def generate(env):
+    """Add Builders and construction variables for ar to an Environment."""
+    as_module.generate(env)
+
+    env['AS']        = '386asm'
+    env['ASFLAGS']   = SCons.Util.CLVar('')
+    env['ASPPFLAGS'] = '$ASFLAGS'
+    env['ASCOM']     = '$AS $ASFLAGS $SOURCES -o $TARGET'
+    env['ASPPCOM']   = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $SOURCES -o $TARGET'
+
+    addPharLapPaths(env)
+
+def exists(env):
+    return env.Detect('386asm')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/BitKeeper.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/BitKeeper.py
new file mode 100644
index 0000000..312bd47
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/BitKeeper.py
@@ -0,0 +1,67 @@
+"""SCons.Tool.BitKeeper.py
+
+Tool-specific initialization for the BitKeeper source code control
+system.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/BitKeeper.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Action
+import SCons.Builder
+import SCons.Util
+
+def generate(env):
+    """Add a Builder factory function and construction variables for
+    BitKeeper to an Environment."""
+
+    def BitKeeperFactory(env=env):
+        """ """
+        import SCons.Warnings as W
+        W.warn(W.DeprecatedSourceCodeWarning, """The BitKeeper() factory is deprecated and there is no replacement.""")
+        act = SCons.Action.Action("$BITKEEPERCOM", "$BITKEEPERCOMSTR")
+        return SCons.Builder.Builder(action = act, env = env)
+
+    #setattr(env, 'BitKeeper', BitKeeperFactory)
+    env.BitKeeper = BitKeeperFactory
+
+    env['BITKEEPER']         = 'bk'
+    env['BITKEEPERGET']      = '$BITKEEPER get'
+    env['BITKEEPERGETFLAGS'] = SCons.Util.CLVar('')
+    env['BITKEEPERCOM']      = '$BITKEEPERGET $BITKEEPERGETFLAGS $TARGET'
+
+def exists(env):
+    return env.Detect('bk')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/CVS.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/CVS.py
new file mode 100644
index 0000000..7730f1c
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/CVS.py
@@ -0,0 +1,73 @@
+"""SCons.Tool.CVS.py
+
+Tool-specific initialization for CVS.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Tool/CVS.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Action
+import SCons.Builder
+import SCons.Util
+
+def generate(env):
+    """Add a Builder factory function and construction variables for
+    CVS to an Environment."""
+
+    def CVSFactory(repos, module='', env=env):
+        """ """
+        import SCons.Warnings as W
+        W.warn(W.DeprecatedSourceCodeWarning, """The CVS() factory is deprecated and there is no replacement.""")
+        # fail if repos is not an absolute path name?
+        if module != '':
+           # Don't use os.path.join() because the name we fetch might
+           # be across a network and must use POSIX slashes as separators.
+           module = module + '/'
+           env['CVSCOM']   = '$CVS $CVSFLAGS co $CVSCOFLAGS -d ${TARGET.dir} $CVSMODULE${TARGET.posix}'
+        act = SCons.Action.Action('$CVSCOM', '$CVSCOMSTR')
+        return SCons.Builder.Builder(action = act,
+                                     env = env,
+                                     CVSREPOSITORY = repos,
+                                     CVSMODULE = module)
+
+    #setattr(env, 'CVS', CVSFactory)
+    env.CVS = CVSFactory
+
+    env['CVS']        = 'cvs'
+    env['CVSFLAGS']   = SCons.Util.CLVar('-d $CVSREPOSITORY')
+    env['CVSCOFLAGS'] = SCons.Util.CLVar('')
+    env['CVSCOM']     = '$CVS $CVSFLAGS co $CVSCOFLAGS ${TARGET.posix}'
+
+def exists(env):
+    return env.Detect('cvs')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/FortranCommon.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/FortranCommon.py
new file mode 100644
index 0000000..3d1f6e3
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/FortranCommon.py
@@ -0,0 +1,263 @@
+"""SCons.Tool.FortranCommon
+
+Stuff for processing Fortran, common to all fortran dialects.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/FortranCommon.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import re
+import os.path
+
+import SCons.Action
+import SCons.Defaults
+import SCons.Scanner.Fortran
+import SCons.Tool
+import SCons.Util
+
+def isfortran(env, source):
+    """Return 1 if any of code in source has fortran files in it, 0
+    otherwise."""
+    try:
+        fsuffixes = env['FORTRANSUFFIXES']
+    except KeyError:
+        # If no FORTRANSUFFIXES, no fortran tool, so there is no need to look
+        # for fortran sources.
+        return 0
+
+    if not source:
+        # Source might be None for unusual cases like SConf.
+        return 0
+    for s in source:
+        if s.sources:
+            ext = os.path.splitext(str(s.sources[0]))[1]
+            if ext in fsuffixes:
+                return 1
+    return 0
+
+def _fortranEmitter(target, source, env):
+    node = source[0].rfile()
+    if not node.exists() and not node.is_derived():
+       print "Could not locate " + str(node.name)
+       return ([], [])
+    mod_regex = """(?i)^\s*MODULE\s+(?!PROCEDURE)(\w+)"""
+    cre = re.compile(mod_regex,re.M)
+    # Retrieve all USE'd module names
+    modules = cre.findall(node.get_text_contents())
+    # Remove unique items from the list
+    modules = SCons.Util.unique(modules)
+    # Convert module name to a .mod filename
+    suffix = env.subst('$FORTRANMODSUFFIX', target=target, source=source)
+    moddir = env.subst('$FORTRANMODDIR', target=target, source=source)
+    modules = [x.lower() + suffix for x in modules]
+    for m in modules:
+       target.append(env.fs.File(m, moddir))
+    return (target, source)
+
+def FortranEmitter(target, source, env):
+    target, source = _fortranEmitter(target, source, env)
+    return SCons.Defaults.StaticObjectEmitter(target, source, env)
+
+def ShFortranEmitter(target, source, env):
+    target, source = _fortranEmitter(target, source, env)
+    return SCons.Defaults.SharedObjectEmitter(target, source, env)
+
+def ComputeFortranSuffixes(suffixes, ppsuffixes):
+    """suffixes are fortran source files, and ppsuffixes the ones to be
+    pre-processed. Both should be sequences, not strings."""
+    assert len(suffixes) > 0
+    s = suffixes[0]
+    sup = s.upper()
+    upper_suffixes = [_.upper() for _ in suffixes]
+    if SCons.Util.case_sensitive_suffixes(s, sup):
+        ppsuffixes.extend(upper_suffixes)
+    else:
+        suffixes.extend(upper_suffixes)
+
+def CreateDialectActions(dialect):
+    """Create dialect specific actions."""
+    CompAction = SCons.Action.Action('$%sCOM ' % dialect, '$%sCOMSTR' % dialect)
+    CompPPAction = SCons.Action.Action('$%sPPCOM ' % dialect, '$%sPPCOMSTR' % dialect)
+    ShCompAction = SCons.Action.Action('$SH%sCOM ' % dialect, '$SH%sCOMSTR' % dialect)
+    ShCompPPAction = SCons.Action.Action('$SH%sPPCOM ' % dialect, '$SH%sPPCOMSTR' % dialect)
+
+    return CompAction, CompPPAction, ShCompAction, ShCompPPAction
+
+def DialectAddToEnv(env, dialect, suffixes, ppsuffixes, support_module = 0):
+    """Add dialect specific construction variables."""
+    ComputeFortranSuffixes(suffixes, ppsuffixes)
+
+    fscan = SCons.Scanner.Fortran.FortranScan("%sPATH" % dialect)
+
+    for suffix in suffixes + ppsuffixes:
+        SCons.Tool.SourceFileScanner.add_scanner(suffix, fscan)
+
+    env.AppendUnique(FORTRANSUFFIXES = suffixes + ppsuffixes)
+
+    compaction, compppaction, shcompaction, shcompppaction = \
+            CreateDialectActions(dialect)
+
+    static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+    for suffix in suffixes:
+        static_obj.add_action(suffix, compaction)
+        shared_obj.add_action(suffix, shcompaction)
+        static_obj.add_emitter(suffix, FortranEmitter)
+        shared_obj.add_emitter(suffix, ShFortranEmitter)
+
+    for suffix in ppsuffixes:
+        static_obj.add_action(suffix, compppaction)
+        shared_obj.add_action(suffix, shcompppaction)
+        static_obj.add_emitter(suffix, FortranEmitter)
+        shared_obj.add_emitter(suffix, ShFortranEmitter)
+
+    if '%sFLAGS' % dialect not in env:
+        env['%sFLAGS' % dialect] = SCons.Util.CLVar('')
+
+    if 'SH%sFLAGS' % dialect not in env:
+        env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS' % dialect)
+
+    # If a tool does not define fortran prefix/suffix for include path, use C ones
+    if 'INC%sPREFIX' % dialect not in env:
+        env['INC%sPREFIX' % dialect] = '$INCPREFIX'
+
+    if 'INC%sSUFFIX' % dialect not in env:
+        env['INC%sSUFFIX' % dialect] = '$INCSUFFIX'
+
+    env['_%sINCFLAGS' % dialect] = '$( ${_concat(INC%sPREFIX, %sPATH, INC%sSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' % (dialect, dialect, dialect)
+
+    if support_module == 1:
+        env['%sCOM' % dialect]     = '$%s -o $TARGET -c $%sFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect)
+        env['%sPPCOM' % dialect]   = '$%s -o $TARGET -c $%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect)
+        env['SH%sCOM' % dialect]    = '$SH%s -o $TARGET -c $SH%sFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect)
+        env['SH%sPPCOM' % dialect]  = '$SH%s -o $TARGET -c $SH%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect)
+    else:
+        env['%sCOM' % dialect]     = '$%s -o $TARGET -c $%sFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect)
+        env['%sPPCOM' % dialect]   = '$%s -o $TARGET -c $%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect)
+        env['SH%sCOM' % dialect]    = '$SH%s -o $TARGET -c $SH%sFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect)
+        env['SH%sPPCOM' % dialect]  = '$SH%s -o $TARGET -c $SH%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect)
+
+def add_fortran_to_env(env):
+    """Add Builders and construction variables for Fortran to an Environment."""
+    try:
+        FortranSuffixes = env['FORTRANFILESUFFIXES']
+    except KeyError:
+        FortranSuffixes = ['.f', '.for', '.ftn']
+
+    #print "Adding %s to fortran suffixes" % FortranSuffixes
+    try:
+        FortranPPSuffixes = env['FORTRANPPFILESUFFIXES']
+    except KeyError:
+        FortranPPSuffixes = ['.fpp', '.FPP']
+
+    DialectAddToEnv(env, "FORTRAN", FortranSuffixes,
+                    FortranPPSuffixes, support_module = 1)
+
+    env['FORTRANMODPREFIX'] = ''     # like $LIBPREFIX
+    env['FORTRANMODSUFFIX'] = '.mod' # like $LIBSUFFIX
+
+    env['FORTRANMODDIR'] = ''          # where the compiler should place .mod files
+    env['FORTRANMODDIRPREFIX'] = ''    # some prefix to $FORTRANMODDIR - similar to $INCPREFIX
+    env['FORTRANMODDIRSUFFIX'] = ''    # some suffix to $FORTRANMODDIR - similar to $INCSUFFIX
+    env['_FORTRANMODFLAG'] = '$( ${_concat(FORTRANMODDIRPREFIX, FORTRANMODDIR, FORTRANMODDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'
+
+def add_f77_to_env(env):
+    """Add Builders and construction variables for f77 to an Environment."""
+    try:
+        F77Suffixes = env['F77FILESUFFIXES']
+    except KeyError:
+        F77Suffixes = ['.f77']
+
+    #print "Adding %s to f77 suffixes" % F77Suffixes
+    try:
+        F77PPSuffixes = env['F77PPFILESUFFIXES']
+    except KeyError:
+        F77PPSuffixes = []
+
+    DialectAddToEnv(env, "F77", F77Suffixes, F77PPSuffixes)
+
+def add_f90_to_env(env):
+    """Add Builders and construction variables for f90 to an Environment."""
+    try:
+        F90Suffixes = env['F90FILESUFFIXES']
+    except KeyError:
+        F90Suffixes = ['.f90']
+
+    #print "Adding %s to f90 suffixes" % F90Suffixes
+    try:
+        F90PPSuffixes = env['F90PPFILESUFFIXES']
+    except KeyError:
+        F90PPSuffixes = []
+
+    DialectAddToEnv(env, "F90", F90Suffixes, F90PPSuffixes,
+                    support_module = 1)
+
+def add_f95_to_env(env):
+    """Add Builders and construction variables for f95 to an Environment."""
+    try:
+        F95Suffixes = env['F95FILESUFFIXES']
+    except KeyError:
+        F95Suffixes = ['.f95']
+
+    #print "Adding %s to f95 suffixes" % F95Suffixes
+    try:
+        F95PPSuffixes = env['F95PPFILESUFFIXES']
+    except KeyError:
+        F95PPSuffixes = []
+
+    DialectAddToEnv(env, "F95", F95Suffixes, F95PPSuffixes,
+                    support_module = 1)
+
+def add_f03_to_env(env):
+    """Add Builders and construction variables for f03 to an Environment."""
+    try:
+        F03Suffixes = env['F03FILESUFFIXES']
+    except KeyError:
+        F03Suffixes = ['.f03']
+
+    #print "Adding %s to f95 suffixes" % F95Suffixes
+    try:
+        F03PPSuffixes = env['F03PPFILESUFFIXES']
+    except KeyError:
+        F03PPSuffixes = []
+
+    DialectAddToEnv(env, "F03", F03Suffixes, F03PPSuffixes,
+                    support_module = 1)
+
+def add_all_to_env(env):
+    """Add builders and construction variables for all supported fortran
+    dialects."""
+    add_fortran_to_env(env)
+    add_f77_to_env(env)
+    add_f90_to_env(env)
+    add_f95_to_env(env)
+    add_f03_to_env(env)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/JavaCommon.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/JavaCommon.py
new file mode 100644
index 0000000..f3096ea
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/JavaCommon.py
@@ -0,0 +1,323 @@
+"""SCons.Tool.JavaCommon
+
+Stuff for processing Java.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/JavaCommon.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+import os.path
+import re
+
+java_parsing = 1
+
+default_java_version = '1.4'
+
+if java_parsing:
+    # Parse Java files for class names.
+    #
+    # This is a really cool parser from Charles Crain
+    # that finds appropriate class names in Java source.
+
+    # A regular expression that will find, in a java file:
+    #     newlines;
+    #     double-backslashes;
+    #     a single-line comment "//";
+    #     single or double quotes preceeded by a backslash;
+    #     single quotes, double quotes, open or close braces, semi-colons,
+    #         periods, open or close parentheses;
+    #     floating-point numbers;
+    #     any alphanumeric token (keyword, class name, specifier);
+    #     any alphanumeric token surrounded by angle brackets (generics);
+    #     the multi-line comment begin and end tokens /* and */;
+    #     array declarations "[]".
+    _reToken = re.compile(r'(\n|\\\\|//|\\[\'"]|[\'"\{\}\;\.\(\)]|' +
+                          r'\d*\.\d*|[A-Za-z_][\w\$\.]*|<[A-Za-z_]\w+>|' +
+                          r'/\*|\*/|\[\])')
+
+    class OuterState(object):
+        """The initial state for parsing a Java file for classes,
+        interfaces, and anonymous inner classes."""
+        def __init__(self, version=default_java_version):
+
+            if not version in ('1.1', '1.2', '1.3','1.4', '1.5', '1.6',
+                               '5', '6'):
+                msg = "Java version %s not supported" % version
+                raise NotImplementedError(msg)
+
+            self.version = version
+            self.listClasses = []
+            self.listOutputs = []
+            self.stackBrackets = []
+            self.brackets = 0
+            self.nextAnon = 1
+            self.localClasses = []
+            self.stackAnonClassBrackets = []
+            self.anonStacksStack = [[0]]
+            self.package = None
+
+        def trace(self):
+            pass
+
+        def __getClassState(self):
+            try:
+                return self.classState
+            except AttributeError:
+                ret = ClassState(self)
+                self.classState = ret
+                return ret
+
+        def __getPackageState(self):
+            try:
+                return self.packageState
+            except AttributeError:
+                ret = PackageState(self)
+                self.packageState = ret
+                return ret
+
+        def __getAnonClassState(self):
+            try:
+                return self.anonState
+            except AttributeError:
+                self.outer_state = self
+                ret = SkipState(1, AnonClassState(self))
+                self.anonState = ret
+                return ret
+
+        def __getSkipState(self):
+            try:
+                return self.skipState
+            except AttributeError:
+                ret = SkipState(1, self)
+                self.skipState = ret
+                return ret
+        
+        def __getAnonStack(self):
+            return self.anonStacksStack[-1]
+
+        def openBracket(self):
+            self.brackets = self.brackets + 1
+
+        def closeBracket(self):
+            self.brackets = self.brackets - 1
+            if len(self.stackBrackets) and \
+               self.brackets == self.stackBrackets[-1]:
+                self.listOutputs.append('$'.join(self.listClasses))
+                self.localClasses.pop()
+                self.listClasses.pop()
+                self.anonStacksStack.pop()
+                self.stackBrackets.pop()
+            if len(self.stackAnonClassBrackets) and \
+               self.brackets == self.stackAnonClassBrackets[-1]:
+                self.__getAnonStack().pop()
+                self.stackAnonClassBrackets.pop()
+
+        def parseToken(self, token):
+            if token[:2] == '//':
+                return IgnoreState('\n', self)
+            elif token == '/*':
+                return IgnoreState('*/', self)
+            elif token == '{':
+                self.openBracket()
+            elif token == '}':
+                self.closeBracket()
+            elif token in [ '"', "'" ]:
+                return IgnoreState(token, self)
+            elif token == "new":
+                # anonymous inner class
+                if len(self.listClasses) > 0:
+                    return self.__getAnonClassState()
+                return self.__getSkipState() # Skip the class name
+            elif token in ['class', 'interface', 'enum']:
+                if len(self.listClasses) == 0:
+                    self.nextAnon = 1
+                self.stackBrackets.append(self.brackets)
+                return self.__getClassState()
+            elif token == 'package':
+                return self.__getPackageState()
+            elif token == '.':
+                # Skip the attribute, it might be named "class", in which
+                # case we don't want to treat the following token as
+                # an inner class name...
+                return self.__getSkipState()
+            return self
+
+        def addAnonClass(self):
+            """Add an anonymous inner class"""
+            if self.version in ('1.1', '1.2', '1.3', '1.4'):
+                clazz = self.listClasses[0]
+                self.listOutputs.append('%s$%d' % (clazz, self.nextAnon))
+            elif self.version in ('1.5', '1.6', '5', '6'):
+                self.stackAnonClassBrackets.append(self.brackets)
+                className = []
+                className.extend(self.listClasses)
+                self.__getAnonStack()[-1] = self.__getAnonStack()[-1] + 1
+                for anon in self.__getAnonStack():
+                    className.append(str(anon))
+                self.listOutputs.append('$'.join(className))
+
+            self.nextAnon = self.nextAnon + 1
+            self.__getAnonStack().append(0)
+
+        def setPackage(self, package):
+            self.package = package
+
+    class AnonClassState(object):
+        """A state that looks for anonymous inner classes."""
+        def __init__(self, old_state):
+            # outer_state is always an instance of OuterState
+            self.outer_state = old_state.outer_state
+            self.old_state = old_state
+            self.brace_level = 0
+        def parseToken(self, token):
+            # This is an anonymous class if and only if the next
+            # non-whitespace token is a bracket. Everything between
+            # braces should be parsed as normal java code.
+            if token[:2] == '//':
+                return IgnoreState('\n', self)
+            elif token == '/*':
+                return IgnoreState('*/', self)
+            elif token == '\n':
+                return self
+            elif token[0] == '<' and token[-1] == '>':
+                return self
+            elif token == '(':
+                self.brace_level = self.brace_level + 1
+                return self
+            if self.brace_level > 0:
+                if token == 'new':
+                    # look further for anonymous inner class
+                    return SkipState(1, AnonClassState(self))
+                elif token in [ '"', "'" ]:
+                    return IgnoreState(token, self)
+                elif token == ')':
+                    self.brace_level = self.brace_level - 1
+                return self
+            if token == '{':
+                self.outer_state.addAnonClass()
+            return self.old_state.parseToken(token)
+
+    class SkipState(object):
+        """A state that will skip a specified number of tokens before
+        reverting to the previous state."""
+        def __init__(self, tokens_to_skip, old_state):
+            self.tokens_to_skip = tokens_to_skip
+            self.old_state = old_state
+        def parseToken(self, token):
+            self.tokens_to_skip = self.tokens_to_skip - 1
+            if self.tokens_to_skip < 1:
+                return self.old_state
+            return self
+
+    class ClassState(object):
+        """A state we go into when we hit a class or interface keyword."""
+        def __init__(self, outer_state):
+            # outer_state is always an instance of OuterState
+            self.outer_state = outer_state
+        def parseToken(self, token):
+            # the next non-whitespace token should be the name of the class
+            if token == '\n':
+                return self
+            # If that's an inner class which is declared in a method, it
+            # requires an index prepended to the class-name, e.g.
+            # 'Foo$1Inner' (Tigris Issue 2087)
+            if self.outer_state.localClasses and \
+                self.outer_state.stackBrackets[-1] > \
+                self.outer_state.stackBrackets[-2]+1:
+                locals = self.outer_state.localClasses[-1]
+                try:
+                    idx = locals[token]
+                    locals[token] = locals[token]+1
+                except KeyError:
+                    locals[token] = 1
+                token = str(locals[token]) + token
+            self.outer_state.localClasses.append({})
+            self.outer_state.listClasses.append(token)
+            self.outer_state.anonStacksStack.append([0])
+            return self.outer_state
+
+    class IgnoreState(object):
+        """A state that will ignore all tokens until it gets to a
+        specified token."""
+        def __init__(self, ignore_until, old_state):
+            self.ignore_until = ignore_until
+            self.old_state = old_state
+        def parseToken(self, token):
+            if self.ignore_until == token:
+                return self.old_state
+            return self
+
+    class PackageState(object):
+        """The state we enter when we encounter the package keyword.
+        We assume the next token will be the package name."""
+        def __init__(self, outer_state):
+            # outer_state is always an instance of OuterState
+            self.outer_state = outer_state
+        def parseToken(self, token):
+            self.outer_state.setPackage(token)
+            return self.outer_state
+
+    def parse_java_file(fn, version=default_java_version):
+        return parse_java(open(fn, 'r').read(), version)
+
+    def parse_java(contents, version=default_java_version, trace=None):
+        """Parse a .java file and return a double of package directory,
+        plus a list of .class files that compiling that .java file will
+        produce"""
+        package = None
+        initial = OuterState(version)
+        currstate = initial
+        for token in _reToken.findall(contents):
+            # The regex produces a bunch of groups, but only one will
+            # have anything in it.
+            currstate = currstate.parseToken(token)
+            if trace: trace(token, currstate)
+        if initial.package:
+            package = initial.package.replace('.', os.sep)
+        return (package, initial.listOutputs)
+
+else:
+    # Don't actually parse Java files for class names.
+    #
+    # We might make this a configurable option in the future if
+    # Java-file parsing takes too long (although it shouldn't relative
+    # to how long the Java compiler itself seems to take...).
+
+    def parse_java_file(fn):
+        """ "Parse" a .java file.
+
+        This actually just splits the file name, so the assumption here
+        is that the file name matches the public class name, and that
+        the path to the file is the same as the package name.
+        """
+        return os.path.split(file)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/__init__.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/__init__.py
new file mode 100644
index 0000000..acaef22
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/__init__.py
@@ -0,0 +1,56 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/MSCommon/__init__.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__doc__ = """
+Common functions for Microsoft Visual Studio and Visual C/C++.
+"""
+
+import copy
+import os
+import re
+import subprocess
+
+import SCons.Errors
+import SCons.Platform.win32
+import SCons.Util
+
+from SCons.Tool.MSCommon.sdk import mssdk_exists, \
+                                    mssdk_setup_env
+
+from SCons.Tool.MSCommon.vc import msvc_exists, \
+                                   msvc_setup_env, \
+                                   msvc_setup_env_once
+
+from SCons.Tool.MSCommon.vs import get_default_version, \
+                                   get_vs_by_version, \
+                                   merge_default_version, \
+                                   msvs_exists, \
+                                   query_versions
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/arch.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/arch.py
new file mode 100644
index 0000000..ef039af
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/arch.py
@@ -0,0 +1,61 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/MSCommon/arch.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__doc__ = """Module to define supported Windows chip architectures.
+"""
+
+import os
+
+class ArchDefinition(object):
+    """
+    A class for defining architecture-specific settings and logic.
+    """
+    def __init__(self, arch, synonyms=[]):
+        self.arch = arch
+        self.synonyms = synonyms
+
+SupportedArchitectureList = [
+    ArchitectureDefinition(
+        'x86',
+        ['i386', 'i486', 'i586', 'i686'],
+    ),
+
+    ArchitectureDefinition(
+        'x86_64',
+        ['AMD64', 'amd64', 'em64t', 'EM64T', 'x86_64'],
+    ),
+
+    ArchitectureDefinition(
+        'ia64',
+        ['IA64'],
+    ),
+]
+
+SupportedArchitectureMap = {}
+for a in SupportedArchitectureList:
+    SupportedArchitectureMap[a.arch] = a
+    for s in a.synonyms:
+        SupportedArchitectureMap[s] = a
+
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/common.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/common.py
new file mode 100644
index 0000000..43e6e74
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/common.py
@@ -0,0 +1,240 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/MSCommon/common.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__doc__ = """
+Common helper functions for working with the Microsoft tool chain.
+"""
+
+import copy
+import os
+import subprocess
+import re
+
+import SCons.Util
+
+
+logfile = os.environ.get('SCONS_MSCOMMON_DEBUG')
+if logfile == '-':
+    def debug(x):
+        print x
+elif logfile:
+    try:
+        import logging
+    except ImportError:
+        debug = lambda x: open(logfile, 'a').write(x + '\n')
+    else:
+        logging.basicConfig(filename=logfile, level=logging.DEBUG)
+        debug = logging.debug
+else:
+    debug = lambda x: None
+
+
+_is_win64 = None
+
+def is_win64():
+    """Return true if running on windows 64 bits.
+    
+    Works whether python itself runs in 64 bits or 32 bits."""
+    # Unfortunately, python does not provide a useful way to determine
+    # if the underlying Windows OS is 32-bit or 64-bit.  Worse, whether
+    # the Python itself is 32-bit or 64-bit affects what it returns,
+    # so nothing in sys.* or os.* help.  
+
+    # Apparently the best solution is to use env vars that Windows
+    # sets.  If PROCESSOR_ARCHITECTURE is not x86, then the python
+    # process is running in 64 bit mode (on a 64-bit OS, 64-bit
+    # hardware, obviously).
+    # If this python is 32-bit but the OS is 64, Windows will set
+    # ProgramW6432 and PROCESSOR_ARCHITEW6432 to non-null.
+    # (Checking for HKLM\Software\Wow6432Node in the registry doesn't
+    # work, because some 32-bit installers create it.)
+    global _is_win64
+    if _is_win64 is None:
+        # I structured these tests to make it easy to add new ones or
+        # add exceptions in the future, because this is a bit fragile.
+        _is_win64 = False
+        if os.environ.get('PROCESSOR_ARCHITECTURE','x86') != 'x86':
+            _is_win64 = True
+        if os.environ.get('PROCESSOR_ARCHITEW6432'):
+            _is_win64 = True
+        if os.environ.get('ProgramW6432'):
+            _is_win64 = True
+    return _is_win64
+
+
+def read_reg(value):
+    return SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE, value)[0]
+
+def has_reg(value):
+    """Return True if the given key exists in HKEY_LOCAL_MACHINE, False
+    otherwise."""
+    try:
+        SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, value)
+        ret = True
+    except WindowsError:
+        ret = False
+    return ret
+
+# Functions for fetching environment variable settings from batch files.
+
+def normalize_env(env, keys, force=False):
+    """Given a dictionary representing a shell environment, add the variables
+    from os.environ needed for the processing of .bat files; the keys are
+    controlled by the keys argument.
+
+    It also makes sure the environment values are correctly encoded.
+
+    If force=True, then all of the key values that exist are copied
+    into the returned dictionary.  If force=false, values are only
+    copied if the key does not already exist in the copied dictionary.
+
+    Note: the environment is copied."""
+    normenv = {}
+    if env:
+        for k in env.keys():
+            normenv[k] = copy.deepcopy(env[k]).encode('mbcs')
+
+        for k in keys:
+            if k in os.environ and (force or not k in normenv):
+                normenv[k] = os.environ[k].encode('mbcs')
+
+    return normenv
+
+def get_output(vcbat, args = None, env = None):
+    """Parse the output of given bat file, with given args."""
+    
+    if env is None:
+        # Create a blank environment, for use in launching the tools
+        env = SCons.Environment.Environment(tools=[])
+
+    # TODO:  This is a hard-coded list of the variables that (may) need
+    # to be imported from os.environ[] for v[sc]*vars*.bat file
+    # execution to work.  This list should really be either directly
+    # controlled by vc.py, or else derived from the common_tools_var
+    # settings in vs.py.
+    vars = [
+        'COMSPEC',
+        'VS90COMNTOOLS',
+        'VS80COMNTOOLS',
+        'VS71COMNTOOLS',
+        'VS70COMNTOOLS',
+        'VS60COMNTOOLS',
+    ]
+    env['ENV'] = normalize_env(env['ENV'], vars, force=False)
+
+    if args:
+        debug("Calling '%s %s'" % (vcbat, args))
+        popen = SCons.Action._subproc(env,
+                                     '"%s" %s & set' % (vcbat, args),
+                                     stdin = 'devnull',
+                                     stdout=subprocess.PIPE,
+                                     stderr=subprocess.PIPE)
+    else:
+        debug("Calling '%s'" % vcbat)
+        popen = SCons.Action._subproc(env,
+                                     '"%s" & set' % vcbat,
+                                     stdin = 'devnull',
+                                     stdout=subprocess.PIPE,
+                                     stderr=subprocess.PIPE)
+
+    # Use the .stdout and .stderr attributes directly because the
+    # .communicate() method uses the threading module on Windows
+    # and won't work under Pythons not built with threading.
+    stdout = popen.stdout.read()
+    stderr = popen.stderr.read()
+    if stderr:
+        # TODO: find something better to do with stderr;
+        # this at least prevents errors from getting swallowed.
+        import sys
+        sys.stderr.write(stderr)
+    if popen.wait() != 0:
+        raise IOError(stderr.decode("mbcs"))
+
+    output = stdout.decode("mbcs")
+    return output
+
+def parse_output(output, keep = ("INCLUDE", "LIB", "LIBPATH", "PATH")):
+    # dkeep is a dict associating key: path_list, where key is one item from
+    # keep, and pat_list the associated list of paths
+
+    dkeep = dict([(i, []) for i in keep])
+
+    # rdk will  keep the regex to match the .bat file output line starts
+    rdk = {}
+    for i in keep:
+        rdk[i] = re.compile('%s=(.*)' % i, re.I)
+
+    def add_env(rmatch, key, dkeep=dkeep):
+        plist = rmatch.group(1).split(os.pathsep)
+        for p in plist:
+            # Do not add empty paths (when a var ends with ;)
+            if p:
+                p = p.encode('mbcs')
+                # XXX: For some reason, VC98 .bat file adds "" around the PATH
+                # values, and it screws up the environment later, so we strip
+                # it. 
+                p = p.strip('"')
+                dkeep[key].append(p)
+
+    for line in output.splitlines():
+        for k,v in rdk.items():
+            m = v.match(line)
+            if m:
+                add_env(m, k)
+
+    return dkeep
+
+# TODO(sgk): unused
+def output_to_dict(output):
+    """Given an output string, parse it to find env variables.
+
+    Return a dict where keys are variables names, and values their content"""
+    envlinem = re.compile(r'^([a-zA-z0-9]+)=([\S\s]*)$')
+    parsedenv = {}
+    for line in output.splitlines():
+        m = envlinem.match(line)
+        if m:
+            parsedenv[m.group(1)] = m.group(2)
+    return parsedenv
+
+# TODO(sgk): unused
+def get_new(l1, l2):
+    """Given two list l1 and l2, return the items in l2 which are not in l1.
+    Order is maintained."""
+
+    # We don't try to be smart: lists are small, and this is not the bottleneck
+    # is any case
+    new = []
+    for i in l2:
+        if i not in l1:
+            new.append(i)
+
+    return new
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/netframework.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/netframework.py
new file mode 100644
index 0000000..6a9f210
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/netframework.py
@@ -0,0 +1,82 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Tool/MSCommon/netframework.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__doc__ = """
+"""
+
+import os
+import re
+
+from common import read_reg, debug
+
+# Original value recorded by dcournapeau
+_FRAMEWORKDIR_HKEY_ROOT = r'Software\Microsoft\.NETFramework\InstallRoot'
+# On SGK's system
+_FRAMEWORKDIR_HKEY_ROOT = r'Software\Microsoft\Microsoft SDKs\.NETFramework\v2.0\InstallationFolder'
+
+def find_framework_root():
+    # XXX: find it from environment (FrameworkDir)
+    try:
+        froot = read_reg(_FRAMEWORKDIR_HKEY_ROOT)
+        debug("Found framework install root in registry: %s" % froot)
+    except WindowsError, e:
+        debug("Could not read reg key %s" % _FRAMEWORKDIR_HKEY_ROOT)
+        return None
+
+    if not os.path.exists(froot):
+        debug("%s not found on fs" % froot)
+        return None
+
+    return froot
+
+def query_versions():
+    froot = find_framework_root()
+    if froot:
+        contents = os.listdir(froot)
+
+        l = re.compile('v[0-9]+.*')
+        versions = [e for e in contents if l.match(e)]
+
+        def versrt(a,b):
+            # since version numbers aren't really floats...
+            aa = a[1:]
+            bb = b[1:]
+            aal = aa.split('.')
+            bbl = bb.split('.')
+            # sequence comparison in python is lexicographical
+            # which is exactly what we want.
+            # Note we sort backwards so the highest version is first.
+            return cmp(bbl,aal)
+
+        versions.sort(versrt)
+    else:
+        versions = []
+
+    return versions
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/sdk.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/sdk.py
new file mode 100644
index 0000000..4076cee
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/sdk.py
@@ -0,0 +1,391 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/MSCommon/sdk.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__doc__ = """Module to detect the Platform/Windows SDK
+
+PSDK 2003 R1 is the earliest version detected.
+"""
+
+import os
+
+import SCons.Errors
+import SCons.Util
+
+import common
+
+debug = common.debug
+
+# SDK Checks. This is of course a mess as everything else on MS platforms. Here
+# is what we do to detect the SDK:
+#
+# For Windows SDK >= 6.0: just look into the registry entries:
+#   HKLM\Software\Microsoft\Microsoft SDKs\Windows
+# All the keys in there are the available versions.
+#
+# For Platform SDK before 6.0 (2003 server R1 and R2, etc...), there does not
+# seem to be any sane registry key, so the precise location is hardcoded.
+#
+# For versions below 2003R1, it seems the PSDK is included with Visual Studio?
+#
+# Also, per the following:
+#     http://benjamin.smedbergs.us/blog/tag/atl/
+# VC++ Professional comes with the SDK, VC++ Express does not.
+
+# Location of the SDK (checked for 6.1 only)
+_CURINSTALLED_SDK_HKEY_ROOT = \
+        r"Software\Microsoft\Microsoft SDKs\Windows\CurrentInstallFolder"
+
+
+class SDKDefinition(object):
+    """
+    An abstract base class for trying to find installed SDK directories.
+    """
+    def __init__(self, version, **kw):
+        self.version = version
+        self.__dict__.update(kw)
+
+    def find_sdk_dir(self):
+        """Try to find the MS SDK from the registry.
+
+        Return None if failed or the directory does not exist.
+        """
+        if not SCons.Util.can_read_reg:
+            debug('find_sdk_dir(): can not read registry')
+            return None
+
+        hkey = self.HKEY_FMT % self.hkey_data
+        debug('find_sdk_dir(): checking registry:%s'%hkey)
+
+        try:
+            sdk_dir = common.read_reg(hkey)
+        except WindowsError, e:
+            debug('find_sdk_dir(): no SDK registry key %s' % repr(hkey))
+            return None
+
+        debug('find_sdk_dir(): Trying SDK Dir: %s'%sdk_dir)
+
+        if not os.path.exists(sdk_dir):
+            debug('find_sdk_dir():  %s not on file system' % sdk_dir)
+            return None
+
+        ftc = os.path.join(sdk_dir, self.sanity_check_file)
+        if not os.path.exists(ftc):
+            debug("find_sdk_dir(): sanity check %s not found" % ftc)
+            return None
+
+        return sdk_dir
+
+    def get_sdk_dir(self):
+        """Return the MSSSDK given the version string."""
+        try:
+            return self._sdk_dir
+        except AttributeError:
+            sdk_dir = self.find_sdk_dir()
+            self._sdk_dir = sdk_dir
+            return sdk_dir
+        
+    def get_sdk_vc_script(self,host_arch, target_arch):
+        """ Return the script to initialize the VC compiler installed by SDK
+        """
+
+        if (host_arch == 'amd64' and target_arch == 'x86'):
+            # No cross tools needed compiling 32 bits on 64 bit machine
+            host_arch=target_arch
+        
+        arch_string=target_arch
+        if (host_arch != target_arch):
+            arch_string='%s_%s'%(host_arch,target_arch)
+            
+        debug("sdk.py: get_sdk_vc_script():arch_string:%s host_arch:%s target_arch:%s"%(arch_string,
+                                                           host_arch,
+                                                           target_arch))
+        file=self.vc_setup_scripts.get(arch_string,None)
+        debug("sdk.py: get_sdk_vc_script():file:%s"%file)
+        return file
+
+class WindowsSDK(SDKDefinition):
+    """
+    A subclass for trying to find installed Windows SDK directories.
+    """
+    HKEY_FMT = r'Software\Microsoft\Microsoft SDKs\Windows\v%s\InstallationFolder'
+    def __init__(self, *args, **kw):
+        SDKDefinition.__init__(self, *args, **kw)
+        self.hkey_data = self.version
+
+class PlatformSDK(SDKDefinition):
+    """
+    A subclass for trying to find installed Platform SDK directories.
+    """
+    HKEY_FMT = r'Software\Microsoft\MicrosoftSDK\InstalledSDKS\%s\Install Dir'
+    def __init__(self, *args, **kw):
+        SDKDefinition.__init__(self, *args, **kw)
+        self.hkey_data = self.uuid
+
+#
+# The list of VC initialization scripts installed by the SDK
+# These should be tried if the vcvarsall.bat TARGET_ARCH fails
+preSDK61VCSetupScripts = { 'x86'      : r'bin\vcvars32.bat',
+                           'amd64'    : r'bin\vcvarsamd64.bat',
+                           'x86_amd64': r'bin\vcvarsx86_amd64.bat',
+                           'x86_ia64' : r'bin\vcvarsx86_ia64.bat',
+                           'ia64'     : r'bin\vcvarsia64.bat'}
+
+SDK61VCSetupScripts = {'x86'      : r'bin\vcvars32.bat',
+                       'amd64'    : r'bin\amd64\vcvarsamd64.bat',
+                       'x86_amd64': r'bin\x86_amd64\vcvarsx86_amd64.bat',
+                       'x86_ia64' : r'bin\x86_ia64\vcvarsx86_ia64.bat',
+                       'ia64'     : r'bin\ia64\vcvarsia64.bat'}
+
+SDK70VCSetupScripts =    { 'x86'      : r'bin\vcvars32.bat',
+                           'amd64'    : r'bin\vcvars64.bat',
+                           'x86_amd64': r'bin\vcvarsx86_amd64.bat',
+                           'x86_ia64' : r'bin\vcvarsx86_ia64.bat',
+                           'ia64'     : r'bin\vcvarsia64.bat'}
+
+# The list of support SDKs which we know how to detect.
+#
+# The first SDK found in the list is the one used by default if there
+# are multiple SDKs installed.  Barring good reasons to the contrary,
+# this means we should list SDKs with from most recent to oldest.
+#
+# If you update this list, update the documentation in Tool/mssdk.xml.
+SupportedSDKList = [
+    WindowsSDK('7.0',
+               sanity_check_file=r'bin\SetEnv.Cmd',
+               include_subdir='include',
+               lib_subdir={
+                   'x86'       : ['lib'],
+                   'x86_64'    : [r'lib\x64'],
+                   'ia64'      : [r'lib\ia64'],
+               },
+               vc_setup_scripts = SDK70VCSetupScripts,
+              ),
+    WindowsSDK('6.1',
+               sanity_check_file=r'bin\SetEnv.Cmd',
+               include_subdir='include',
+               lib_subdir={
+                   'x86'       : ['lib'],
+                   'x86_64'    : [r'lib\x64'],
+                   'ia64'      : [r'lib\ia64'],
+               },
+               vc_setup_scripts = SDK61VCSetupScripts,
+              ),
+
+    WindowsSDK('6.0A',
+               sanity_check_file=r'include\windows.h',
+               include_subdir='include',
+               lib_subdir={
+                   'x86'       : ['lib'],
+                   'x86_64'    : [r'lib\x64'],
+                   'ia64'      : [r'lib\ia64'],
+               },
+               vc_setup_scripts = preSDK61VCSetupScripts,
+              ),
+
+    WindowsSDK('6.0',
+               sanity_check_file=r'bin\gacutil.exe',
+               include_subdir='include',
+               lib_subdir='lib',
+               vc_setup_scripts = preSDK61VCSetupScripts,
+              ),
+
+    PlatformSDK('2003R2',
+                sanity_check_file=r'SetEnv.Cmd',
+                uuid="D2FF9F89-8AA2-4373-8A31-C838BF4DBBE1",
+                vc_setup_scripts = preSDK61VCSetupScripts,
+               ),
+
+    PlatformSDK('2003R1',
+                sanity_check_file=r'SetEnv.Cmd',
+                uuid="8F9E5EF3-A9A5-491B-A889-C58EFFECE8B3",
+                vc_setup_scripts = preSDK61VCSetupScripts,
+               ),
+]
+
+SupportedSDKMap = {}
+for sdk in SupportedSDKList:
+    SupportedSDKMap[sdk.version] = sdk
+
+
+# Finding installed SDKs isn't cheap, because it goes not only to the
+# registry but also to the disk to sanity-check that there is, in fact,
+# an SDK installed there and that the registry entry isn't just stale.
+# Find this information once, when requested, and cache it.
+
+InstalledSDKList = None
+InstalledSDKMap = None
+
+def get_installed_sdks():
+    global InstalledSDKList
+    global InstalledSDKMap
+    debug('sdk.py:get_installed_sdks()')
+    if InstalledSDKList is None:
+        InstalledSDKList = []
+        InstalledSDKMap = {}
+        for sdk in SupportedSDKList:
+            debug('MSCommon/sdk.py: trying to find SDK %s' % sdk.version)
+            if sdk.get_sdk_dir():
+                debug('MSCommon/sdk.py:found SDK %s' % sdk.version)
+                InstalledSDKList.append(sdk)
+                InstalledSDKMap[sdk.version] = sdk
+    return InstalledSDKList
+
+
+# We may be asked to update multiple construction environments with
+# SDK information.  When doing this, we check on-disk for whether
+# the SDK has 'mfc' and 'atl' subdirectories.  Since going to disk
+# is expensive, cache results by directory.
+
+SDKEnvironmentUpdates = {}
+
+def set_sdk_by_directory(env, sdk_dir):
+    global SDKEnvironmentUpdates
+    debug('set_sdk_by_directory: Using dir:%s'%sdk_dir)
+    try:
+        env_tuple_list = SDKEnvironmentUpdates[sdk_dir]
+    except KeyError:
+        env_tuple_list = []
+        SDKEnvironmentUpdates[sdk_dir] = env_tuple_list
+
+        include_path = os.path.join(sdk_dir, 'include')
+        mfc_path = os.path.join(include_path, 'mfc')
+        atl_path = os.path.join(include_path, 'atl')
+
+        if os.path.exists(mfc_path):
+            env_tuple_list.append(('INCLUDE', mfc_path))
+        if os.path.exists(atl_path):
+            env_tuple_list.append(('INCLUDE', atl_path))
+        env_tuple_list.append(('INCLUDE', include_path))
+
+        env_tuple_list.append(('LIB', os.path.join(sdk_dir, 'lib')))
+        env_tuple_list.append(('LIBPATH', os.path.join(sdk_dir, 'lib')))
+        env_tuple_list.append(('PATH', os.path.join(sdk_dir, 'bin')))
+
+    for variable, directory in env_tuple_list:
+        env.PrependENVPath(variable, directory)
+
+
+# TODO(sgk):  currently unused; remove?
+def get_cur_sdk_dir_from_reg():
+    """Try to find the platform sdk directory from the registry.
+
+    Return None if failed or the directory does not exist"""
+    if not SCons.Util.can_read_reg:
+        debug('SCons cannot read registry')
+        return None
+
+    try:
+        val = common.read_reg(_CURINSTALLED_SDK_HKEY_ROOT)
+        debug("Found current sdk dir in registry: %s" % val)
+    except WindowsError, e:
+        debug("Did not find current sdk in registry")
+        return None
+
+    if not os.path.exists(val):
+        debug("Current sdk dir %s not on fs" % val)
+        return None
+
+    return val
+
+def get_sdk_by_version(mssdk):
+    if mssdk not in SupportedSDKMap:
+        msg = "SDK version %s is not supported" % repr(mssdk)
+        raise SCons.Errors.UserError(msg)
+    get_installed_sdks()
+    return InstalledSDKMap.get(mssdk)
+
+def get_default_sdk():
+    """Set up the default Platform/Windows SDK."""
+    get_installed_sdks()
+    if not InstalledSDKList:
+        return None
+    return InstalledSDKList[0]
+
+
+
+
+def mssdk_setup_env(env):
+    debug('sdk.py:mssdk_setup_env()')
+    if 'MSSDK_DIR' in env:
+        sdk_dir = env['MSSDK_DIR']
+        if sdk_dir is None:
+            return
+        sdk_dir = env.subst(sdk_dir)
+        debug('sdk.py:mssdk_setup_env: Using MSSDK_DIR:%s'%sdk_dir)
+    elif 'MSSDK_VERSION' in env:
+        sdk_version = env['MSSDK_VERSION']
+        if sdk_version is None:
+            msg = "SDK version %s is not installed" % repr(mssdk)
+            raise SCons.Errors.UserError(msg)
+        sdk_version = env.subst(sdk_version)
+        mssdk = get_sdk_by_version(sdk_version)
+        sdk_dir = mssdk.get_sdk_dir()
+        debug('sdk.py:mssdk_setup_env: Using MSSDK_VERSION:%s'%sdk_dir)
+    elif 'MSVS_VERSION' in env:
+        msvs_version = env['MSVS_VERSION']
+        debug('sdk.py:mssdk_setup_env:Getting MSVS_VERSION from env:%s'%msvs_version)
+        if msvs_version is None:
+            debug('sdk.py:mssdk_setup_env thinks msvs_version is None')
+            return
+        msvs_version = env.subst(msvs_version)
+        import vs
+        msvs = vs.get_vs_by_version(msvs_version)
+        debug('sdk.py:mssdk_setup_env:msvs is :%s'%msvs)
+        if not msvs:
+            debug('sdk.py:mssdk_setup_env: no VS version detected, bailingout:%s'%msvs)
+            return
+        sdk_version = msvs.sdk_version
+        debug('sdk.py:msvs.sdk_version is %s'%sdk_version)
+        if not sdk_version:
+            return
+        mssdk = get_sdk_by_version(sdk_version)
+        if not mssdk:
+            mssdk = get_default_sdk()
+            if not mssdk:
+                return
+        sdk_dir = mssdk.get_sdk_dir()
+        debug('sdk.py:mssdk_setup_env: Using MSVS_VERSION:%s'%sdk_dir)
+    else:
+        mssdk = get_default_sdk()
+        if not mssdk:
+            return
+        sdk_dir = mssdk.get_sdk_dir()
+        debug('sdk.py:mssdk_setup_env: not using any env values. sdk_dir:%s'%sdk_dir)
+
+    set_sdk_by_directory(env, sdk_dir)
+
+    #print "No MSVS_VERSION: this is likely to be a bug"
+
+def mssdk_exists(version=None):
+    sdks = get_installed_sdks()
+    if version is None:
+        return len(sdks) > 0
+    return version in sdks
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/vc.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/vc.py
new file mode 100644
index 0000000..2c52c6e
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/vc.py
@@ -0,0 +1,456 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+# TODO:
+#   * supported arch for versions: for old versions of batch file without
+#     argument, giving bogus argument cannot be detected, so we have to hardcode
+#     this here
+#   * print warning when msvc version specified but not found
+#   * find out why warning do not print
+#   * test on 64 bits XP +  VS 2005 (and VS 6 if possible)
+#   * SDK
+#   * Assembly
+__revision__ = "src/engine/SCons/Tool/MSCommon/vc.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__doc__ = """Module for Visual C/C++ detection and configuration.
+"""
+import SCons.compat
+
+import os
+import platform
+from string import digits as string_digits
+
+import SCons.Warnings
+
+import common
+
+debug = common.debug
+
+import sdk
+
+get_installed_sdks = sdk.get_installed_sdks
+
+
+class VisualCException(Exception):
+    pass
+
+class UnsupportedVersion(VisualCException):
+    pass
+
+class UnsupportedArch(VisualCException):
+    pass
+
+class MissingConfiguration(VisualCException):
+    pass
+
+class NoVersionFound(VisualCException):
+    pass
+
+class BatchFileExecutionError(VisualCException):
+    pass
+
+# Dict to 'canonalize' the arch
+_ARCH_TO_CANONICAL = {
+    "amd64"     : "amd64",
+    "emt64"     : "amd64",
+    "i386"      : "x86",
+    "i486"      : "x86",
+    "i586"      : "x86",
+    "i686"      : "x86",
+    "ia64"      : "ia64",
+    "itanium"   : "ia64",
+    "x86"       : "x86",
+    "x86_64"    : "amd64",
+}
+
+# Given a (host, target) tuple, return the argument for the bat file. Both host
+# and targets should be canonalized.
+_HOST_TARGET_ARCH_TO_BAT_ARCH = {
+    ("x86", "x86"): "x86",
+    ("x86", "amd64"): "x86_amd64",
+    ("amd64", "amd64"): "amd64",
+    ("amd64", "x86"): "x86",
+    ("x86", "ia64"): "x86_ia64"
+}
+
+def get_host_target(env):
+    debug('vc.py:get_host_target()')
+
+    host_platform = env.get('HOST_ARCH')
+    if not host_platform:
+        host_platform = platform.machine()
+        # TODO(2.5):  the native Python platform.machine() function returns
+        # '' on all Python versions before 2.6, after which it also uses
+        # PROCESSOR_ARCHITECTURE.
+        if not host_platform:
+            host_platform = os.environ.get('PROCESSOR_ARCHITECTURE', '')
+            
+    # Retain user requested TARGET_ARCH
+    req_target_platform = env.get('TARGET_ARCH')
+    debug('vc.py:get_host_target() req_target_platform:%s'%req_target_platform)
+
+    if  req_target_platform:
+        # If user requested a specific platform then only try that one.
+        target_platform = req_target_platform
+    else:
+        target_platform = host_platform
+        
+    try:
+        host = _ARCH_TO_CANONICAL[host_platform.lower()]
+    except KeyError, e:
+        msg = "Unrecognized host architecture %s"
+        raise ValueError(msg % repr(host_platform))
+
+    try:
+        target = _ARCH_TO_CANONICAL[target_platform.lower()]
+    except KeyError, e:
+        raise ValueError("Unrecognized target architecture %s" % target_platform)
+
+    return (host, target,req_target_platform)
+
+_VCVER = ["10.0", "9.0", "9.0Exp","8.0", "8.0Exp","7.1", "7.0", "6.0"]
+
+_VCVER_TO_PRODUCT_DIR = {
+        '10.0': [
+            r'Microsoft\VisualStudio\10.0\Setup\VC\ProductDir'],
+        '9.0': [
+            r'Microsoft\VisualStudio\9.0\Setup\VC\ProductDir'],
+        '9.0Exp' : [
+            r'Microsoft\VCExpress\9.0\Setup\VC\ProductDir'],
+        '8.0': [
+            r'Microsoft\VisualStudio\8.0\Setup\VC\ProductDir'],
+        '8.0Exp': [
+            r'Microsoft\VCExpress\8.0\Setup\VC\ProductDir'],
+        '7.1': [
+            r'Microsoft\VisualStudio\7.1\Setup\VC\ProductDir'],
+        '7.0': [
+            r'Microsoft\VisualStudio\7.0\Setup\VC\ProductDir'],
+        '6.0': [
+            r'Microsoft\VisualStudio\6.0\Setup\Microsoft Visual C++\ProductDir']
+}
+        
+def msvc_version_to_maj_min(msvc_version):
+   msvc_version_numeric = ''.join([x for  x in msvc_version if x in string_digits + '.'])
+
+   t = msvc_version_numeric.split(".")
+   if not len(t) == 2:
+       raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric))
+   try:
+       maj = int(t[0])
+       min = int(t[1])
+       return maj, min
+   except ValueError, e:
+       raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric))
+
+def is_host_target_supported(host_target, msvc_version):
+    """Return True if the given (host, target) tuple is supported given the
+    msvc version.
+
+    Parameters
+    ----------
+    host_target: tuple
+        tuple of (canonalized) host-target, e.g. ("x86", "amd64") for cross
+        compilation from 32 bits windows to 64 bits.
+    msvc_version: str
+        msvc version (major.minor, e.g. 10.0)
+
+    Note
+    ----
+    This only check whether a given version *may* support the given (host,
+    target), not that the toolchain is actually present on the machine.
+    """
+    # We assume that any Visual Studio version supports x86 as a target
+    if host_target[1] != "x86":
+        maj, min = msvc_version_to_maj_min(msvc_version)
+        if maj < 8:
+            return False
+
+    return True
+
+def find_vc_pdir(msvc_version):
+    """Try to find the product directory for the given
+    version.
+
+    Note
+    ----
+    If for some reason the requested version could not be found, an
+    exception which inherits from VisualCException will be raised."""
+    root = 'Software\\'
+    if common.is_win64():
+        root = root + 'Wow6432Node\\'
+    try:
+        hkeys = _VCVER_TO_PRODUCT_DIR[msvc_version]
+    except KeyError:
+        debug("Unknown version of MSVC: %s" % msvc_version)
+        raise UnsupportedVersion("Unknown version %s" % msvc_version)
+
+    for key in hkeys:
+        key = root + key
+        try:
+            comps = common.read_reg(key)
+        except WindowsError, e:
+            debug('find_vc_dir(): no VC registry key %s' % repr(key))
+        else:
+            debug('find_vc_dir(): found VC in registry: %s' % comps)
+            if os.path.exists(comps):
+                return comps
+            else:
+                debug('find_vc_dir(): reg says dir is %s, but it does not exist. (ignoring)'\
+                          % comps)
+                raise MissingConfiguration("registry dir %s not found on the filesystem" % comps)
+    return None
+
+def find_batch_file(env,msvc_version,host_arch,target_arch):
+    """
+    Find the location of the batch script which should set up the compiler
+    for any TARGET_ARCH whose compilers were installed by Visual Studio/VCExpress
+    """
+    pdir = find_vc_pdir(msvc_version)
+    if pdir is None:
+        raise NoVersionFound("No version of Visual Studio found")
+        
+    debug('vc.py: find_batch_file() pdir:%s'%pdir)
+
+    # filter out e.g. "Exp" from the version name
+    msvc_ver_numeric = ''.join([x for x in msvc_version if x in string_digits + "."])
+    vernum = float(msvc_ver_numeric)
+    if 7 <= vernum < 8:
+        pdir = os.path.join(pdir, os.pardir, "Common7", "Tools")
+        batfilename = os.path.join(pdir, "vsvars32.bat")
+    elif vernum < 7:
+        pdir = os.path.join(pdir, "Bin")
+        batfilename = os.path.join(pdir, "vcvars32.bat")
+    else: # >= 8
+        batfilename = os.path.join(pdir, "vcvarsall.bat")
+
+    if not os.path.exists(batfilename):
+        debug("Not found: %s" % batfilename)
+        batfilename = None
+    
+    installed_sdks=get_installed_sdks()
+    for _sdk in installed_sdks:
+        sdk_bat_file=_sdk.get_sdk_vc_script(host_arch,target_arch)
+        sdk_bat_file_path=os.path.join(pdir,sdk_bat_file)
+        debug('vc.py:find_batch_file() sdk_bat_file_path:%s'%sdk_bat_file_path)
+        if os.path.exists(sdk_bat_file_path):
+            return (batfilename,sdk_bat_file_path)
+        else:
+            debug("vc.py:find_batch_file() not found:%s"%sdk_bat_file_path)
+    else:
+        return (batfilename,None)
+
+__INSTALLED_VCS_RUN = None
+
+def cached_get_installed_vcs():
+    global __INSTALLED_VCS_RUN
+
+    if __INSTALLED_VCS_RUN is None:
+        ret = get_installed_vcs()
+        __INSTALLED_VCS_RUN = ret
+
+    return __INSTALLED_VCS_RUN
+
+def get_installed_vcs():
+    installed_versions = []
+    for ver in _VCVER:
+        debug('trying to find VC %s' % ver)
+        try:
+            if find_vc_pdir(ver):
+                debug('found VC %s' % ver)
+                installed_versions.append(ver)
+            else:
+                debug('find_vc_pdir return None for ver %s' % ver)
+        except VisualCException, e:
+            debug('did not find VC %s: caught exception %s' % (ver, str(e)))
+    return installed_versions
+
+def reset_installed_vcs():
+    """Make it try again to find VC.  This is just for the tests."""
+    __INSTALLED_VCS_RUN = None
+
+def script_env(script, args=None):
+    stdout = common.get_output(script, args)
+    # Stupid batch files do not set return code: we take a look at the
+    # beginning of the output for an error message instead
+    olines = stdout.splitlines()
+    if olines[0].startswith("The specified configuration type is missing"):
+        raise BatchFileExecutionError("\n".join(olines[:2]))
+
+    return common.parse_output(stdout)
+
+def get_default_version(env):
+    debug('get_default_version()')
+
+    msvc_version = env.get('MSVC_VERSION')
+    msvs_version = env.get('MSVS_VERSION')
+    
+    debug('get_default_version(): msvc_version:%s msvs_version:%s'%(msvc_version,msvs_version))
+
+    if msvs_version and not msvc_version:
+        SCons.Warnings.warn(
+                SCons.Warnings.DeprecatedWarning,
+                "MSVS_VERSION is deprecated: please use MSVC_VERSION instead ")
+        return msvs_version
+    elif msvc_version and msvs_version:
+        if not msvc_version == msvs_version:
+            SCons.Warnings.warn(
+                    SCons.Warnings.VisualVersionMismatch,
+                    "Requested msvc version (%s) and msvs version (%s) do " \
+                    "not match: please use MSVC_VERSION only to request a " \
+                    "visual studio version, MSVS_VERSION is deprecated" \
+                    % (msvc_version, msvs_version))
+        return msvs_version
+    if not msvc_version:
+        installed_vcs = cached_get_installed_vcs()
+        debug('installed_vcs:%s' % installed_vcs)
+        if not installed_vcs:
+            msg = 'No installed VCs'
+            debug('msv %s\n' % repr(msg))
+            SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, msg)
+            return None
+        msvc_version = installed_vcs[0]
+        debug('msvc_setup_env: using default installed MSVC version %s\n' % repr(msvc_version))
+
+    return msvc_version
+
+def msvc_setup_env_once(env):
+    try:
+        has_run  = env["MSVC_SETUP_RUN"]
+    except KeyError:
+        has_run = False
+
+    if not has_run:
+        msvc_setup_env(env)
+        env["MSVC_SETUP_RUN"] = True
+
+def msvc_find_valid_batch_script(env,version):
+    debug('vc.py:msvc_find_valid_batch_script()')
+    # Find the host platform, target platform, and if present the requested
+    # target platform
+    (host_platform, target_platform,req_target_platform) = get_host_target(env)
+
+    # If the user hasn't specifically requested a TARGET_ARCH, and
+    # The TARGET_ARCH is amd64 then also try 32 bits if there are no viable
+    # 64 bit tools installed
+    try_target_archs = [target_platform]
+    if not req_target_platform and target_platform=='amd64':
+        try_target_archs.append('x86')
+
+    d = None
+    for tp in try_target_archs:
+        # Set to current arch.
+        env['TARGET_ARCH']=tp
+        
+        debug("vc.py:msvc_find_valid_batch_script() trying target_platform:%s"%tp)
+        host_target = (host_platform, tp)
+        if not is_host_target_supported(host_target, version):
+            warn_msg = "host, target = %s not supported for MSVC version %s" % \
+                (host_target, version)
+            SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)
+        arg = _HOST_TARGET_ARCH_TO_BAT_ARCH[host_target]
+        
+        # Try to locate a batch file for this host/target platform combo
+        try:
+            (vc_script,sdk_script) = find_batch_file(env,version,host_platform,tp)
+            debug('vc.py:msvc_find_valid_batch_script() vc_script:%s sdk_script:%s'%(vc_script,sdk_script))
+        except VisualCException, e:
+            msg = str(e)
+            debug('Caught exception while looking for batch file (%s)' % msg)
+            warn_msg = "VC version %s not installed.  " + \
+                       "C/C++ compilers are most likely not set correctly.\n" + \
+                       " Installed versions are: %s"
+            warn_msg = warn_msg % (version, cached_get_installed_vcs())
+            SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)
+            continue
+        
+        # Try to use the located batch file for this host/target platform combo
+        debug('vc.py:msvc_find_valid_batch_script() use_script 2 %s, args:%s\n' % (repr(vc_script), arg))
+        if vc_script:
+            try:
+                d = script_env(vc_script, args=arg)
+            except BatchFileExecutionError, e:
+                debug('vc.py:msvc_find_valid_batch_script() use_script 3: failed running VC script %s: %s: Error:%s'%(repr(vc_script),arg,e))
+                vc_script=None
+        if not vc_script and sdk_script:
+            debug('vc.py:msvc_find_valid_batch_script() use_script 4: trying sdk script: %s'%(sdk_script))
+            try:
+                d = script_env(sdk_script,args=[])
+            except BatchFileExecutionError,e:
+                debug('vc.py:msvc_find_valid_batch_script() use_script 5: failed running SDK script %s: Error:%s'%(repr(sdk_script),e))
+                continue
+        elif not vc_script and not sdk_script:
+            debug('vc.py:msvc_find_valid_batch_script() use_script 6: Neither VC script nor SDK script found')
+            continue
+    
+    # If we cannot find a viable installed compiler, reset the TARGET_ARCH
+    # To it's initial value
+    if not d:
+        env['TARGET_ARCH']=req_target_platform
+    
+    return d
+    
+
+def msvc_setup_env(env):
+    debug('msvc_setup_env()')
+
+    version = get_default_version(env)
+    if version is None:
+        warn_msg = "No version of Visual Studio compiler found - C/C++ " \
+                   "compilers most likely not set correctly"
+        SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)
+        return None
+    debug('msvc_setup_env: using specified MSVC version %s\n' % repr(version))
+
+    # XXX: we set-up both MSVS version for backward
+    # compatibility with the msvs tool
+    env['MSVC_VERSION'] = version
+    env['MSVS_VERSION'] = version
+    env['MSVS'] = {}
+
+    
+    use_script = env.get('MSVC_USE_SCRIPT', True)
+    if SCons.Util.is_String(use_script):
+        debug('vc.py:msvc_setup_env() use_script 1 %s\n' % repr(use_script))
+        d = script_env(use_script)
+    elif use_script:      
+        d = msvc_find_valid_batch_script(env,version)
+        debug('vc.py:msvc_setup_env() use_script 2 %s\n' % d)
+        if not d:
+            return d
+    else:
+        debug('MSVC_USE_SCRIPT set to False')
+        warn_msg = "MSVC_USE_SCRIPT set to False, assuming environment " \
+                   "set correctly."
+        SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)
+        return None
+
+    for k, v in d.items():
+        debug('vc.py:msvc_setup_env() env:%s -> %s'%(k,v))
+        env.PrependENVPath(k, v, delete_existing=True)
+
+def msvc_exists(version=None):
+    vcs = cached_get_installed_vcs()
+    if version is None:
+        return len(vcs) > 0
+    return version in vcs
+    
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/vs.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/vs.py
new file mode 100644
index 0000000..ebcf825
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/MSCommon/vs.py
@@ -0,0 +1,526 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/MSCommon/vs.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__doc__ = """Module to detect Visual Studio and/or Visual C/C++
+"""
+
+import os
+
+import SCons.Errors
+import SCons.Util
+
+from common import debug, \
+                   get_output, \
+                   is_win64, \
+                   normalize_env, \
+                   parse_output, \
+                   read_reg
+
+import SCons.Tool.MSCommon.vc
+
+class VisualStudio(object):
+    """
+    An abstract base class for trying to find installed versions of
+    Visual Studio.
+    """
+    def __init__(self, version, **kw):
+        self.version = version
+        kw['vc_version']  = kw.get('vc_version', version)
+        kw['sdk_version'] = kw.get('sdk_version', version)
+        self.__dict__.update(kw)
+        self._cache = {}
+
+    #
+
+    def find_batch_file(self):
+        vs_dir = self.get_vs_dir()
+        if not vs_dir:
+            debug('find_executable():  no vs_dir')
+            return None
+        batch_file = os.path.join(vs_dir, self.batch_file_path)
+        batch_file = os.path.normpath(batch_file)
+        if not os.path.isfile(batch_file):
+            debug('find_batch_file():  %s not on file system' % batch_file)
+            return None
+        return batch_file
+
+    def find_vs_dir_by_vc(self):
+        SCons.Tool.MSCommon.vc.get_installed_vcs()
+        dir = SCons.Tool.MSCommon.vc.find_vc_pdir(self.vc_version)
+        if not dir:
+            debug('find_vs_dir():  no installed VC %s' % self.vc_version)
+            return None
+        return dir
+        
+    def find_vs_dir_by_reg(self):
+        root = 'Software\\'
+
+        if is_win64():
+            root = root + 'Wow6432Node\\'
+        for key in self.hkeys:
+            if key=='use_dir':
+                return self.find_vs_dir_by_vc()
+            key = root + key
+            try:
+                comps = read_reg(key)
+            except WindowsError, e:
+                debug('find_vs_dir_by_reg(): no VS registry key %s' % repr(key))
+            else:
+                debug('find_vs_dir_by_reg(): found VS in registry: %s' % comps)
+                return comps
+        return None
+    
+    def find_vs_dir(self):
+        """ Can use registry or location of VC to find vs dir
+        First try to find by registry, and if that fails find via VC dir
+        """
+        
+        
+        if True:
+            vs_dir=self.find_vs_dir_by_reg()
+            return vs_dir
+        else:
+            return self.find_vs_dir_by_vc()
+
+    def find_executable(self):
+        vs_dir = self.get_vs_dir()
+        if not vs_dir:
+            debug('find_executable():  no vs_dir (%s)'%vs_dir)
+            return None
+        executable = os.path.join(vs_dir, self.executable_path)
+        executable = os.path.normpath(executable)
+        if not os.path.isfile(executable):
+            debug('find_executable():  %s not on file system' % executable)
+            return None
+        return executable
+    
+    #
+
+    def get_batch_file(self):
+        try:
+            return self._cache['batch_file']
+        except KeyError:
+            batch_file = self.find_batch_file()
+            self._cache['batch_file'] = batch_file
+            return batch_file
+
+    def get_executable(self):
+        try:
+            debug('get_executable using cache:%s'%self._cache['executable'])
+            return self._cache['executable']
+        except KeyError:
+            executable = self.find_executable()
+            self._cache['executable'] = executable
+            debug('get_executable not in cache:%s'%executable)
+            return executable
+
+    def get_vs_dir(self):
+        try:
+            return self._cache['vs_dir']
+        except KeyError:
+            vs_dir = self.find_vs_dir()
+            self._cache['vs_dir'] = vs_dir
+            return vs_dir
+
+    def get_supported_arch(self):
+        try:
+            return self._cache['supported_arch']
+        except KeyError:
+            # RDEVE: for the time being use hardcoded lists
+            # supported_arch = self.find_supported_arch()
+            self._cache['supported_arch'] = self.supported_arch
+            return self.supported_arch
+
+    def reset(self):
+        self._cache = {}
+
+# The list of supported Visual Studio versions we know how to detect.
+#
+# How to look for .bat file ?
+#  - VS 2008 Express (x86):
+#     * from registry key productdir, gives the full path to vsvarsall.bat. In
+#     HKEY_LOCAL_MACHINE):
+#         Software\Microsoft\VCEpress\9.0\Setup\VC\productdir
+#     * from environmnent variable VS90COMNTOOLS: the path is then ..\..\VC
+#     relatively to the path given by the variable.
+#
+#  - VS 2008 Express (WoW6432: 32 bits on windows x64):
+#         Software\Wow6432Node\Microsoft\VCEpress\9.0\Setup\VC\productdir
+#
+#  - VS 2005 Express (x86):
+#     * from registry key productdir, gives the full path to vsvarsall.bat. In
+#     HKEY_LOCAL_MACHINE):
+#         Software\Microsoft\VCEpress\8.0\Setup\VC\productdir
+#     * from environmnent variable VS80COMNTOOLS: the path is then ..\..\VC
+#     relatively to the path given by the variable.
+#
+#  - VS 2005 Express (WoW6432: 32 bits on windows x64): does not seem to have a
+#  productdir ?
+#
+#  - VS 2003 .Net (pro edition ? x86):
+#     * from registry key productdir. The path is then ..\Common7\Tools\
+#     relatively to the key. The key is in HKEY_LOCAL_MACHINE):
+#         Software\Microsoft\VisualStudio\7.1\Setup\VC\productdir
+#     * from environmnent variable VS71COMNTOOLS: the path is the full path to
+#     vsvars32.bat
+#
+#  - VS 98 (VS 6):
+#     * from registry key productdir. The path is then Bin
+#     relatively to the key. The key is in HKEY_LOCAL_MACHINE):
+#         Software\Microsoft\VisualStudio\6.0\Setup\VC98\productdir
+#
+# The first version found in the list is the one used by default if
+# there are multiple versions installed.  Barring good reasons to
+# the contrary, this means we should list versions from most recent
+# to oldest.  Pro versions get listed before Express versions on the
+# assumption that, by default, you'd rather use the version you paid
+# good money for in preference to whatever Microsoft makes available
+# for free.
+#
+# If you update this list, update the documentation in Tool/msvs.xml.
+
+SupportedVSList = [
+    # Visual Studio 2010
+    # TODO: find the settings, perhaps from someone with a CTP copy?
+    #VisualStudio('TBD',
+    #             hkey_root=r'TBD',
+    #             common_tools_var='TBD',
+    #             executable_path=r'TBD',
+    #             default_dirname='TBD',
+    #),
+
+    # Visual Studio 2010
+    # The batch file we look for is in the VC directory,
+    # so the devenv.com executable is up in ..\..\Common7\IDE.
+    VisualStudio('10.0',
+                 sdk_version='6.1',
+                 hkeys=[r'Microsoft\VisualStudio\10.0\Setup\VS\ProductDir'],
+                 common_tools_var='VS100COMNTOOLS',
+                 executable_path=r'Common7\IDE\devenv.com',
+                 batch_file_path=r'Common7\Tools\vsvars32.bat',
+                 default_dirname='Microsoft Visual Studio 10',
+                 supported_arch=['x86', 'amd64'],
+    ),
+
+    # Visual C++ 2010 Express Edition
+    # The batch file we look for is in the VC directory,
+    # so the VCExpress.exe executable is up in ..\..\Common7\IDE.
+    VisualStudio('10.0Exp',
+                 vc_version='10.0',
+                 sdk_version='6.1',
+                 hkeys=[r'Microsoft\VCExpress\10.0\Setup\VS\ProductDir'],
+                 common_tools_var='VS100COMNTOOLS',
+                 executable_path=r'Common7\IDE\VCExpress.exe',
+                 batch_file_path=r'Common7\Tools\vsvars32.bat',
+                 default_dirname='Microsoft Visual Studio 10',
+                 supported_arch=['x86'],
+    ),
+
+    # Visual Studio 2008
+    # The batch file we look for is in the VC directory,
+    # so the devenv.com executable is up in ..\..\Common7\IDE.
+    VisualStudio('9.0',
+                 sdk_version='6.1',
+                 hkeys=[r'Microsoft\VisualStudio\9.0\Setup\VS\ProductDir'],
+                 common_tools_var='VS90COMNTOOLS',
+                 executable_path=r'Common7\IDE\devenv.com',
+                 batch_file_path=r'Common7\Tools\vsvars32.bat',
+                 default_dirname='Microsoft Visual Studio 9',
+                 supported_arch=['x86', 'amd64'],
+    ),
+
+    # Visual C++ 2008 Express Edition
+    # The batch file we look for is in the VC directory,
+    # so the VCExpress.exe executable is up in ..\..\Common7\IDE.
+    VisualStudio('9.0Exp',
+                 vc_version='9.0',
+                 sdk_version='6.1',
+                 hkeys=[r'Microsoft\VCExpress\9.0\Setup\VS\ProductDir'],
+                 common_tools_var='VS90COMNTOOLS',
+                 executable_path=r'Common7\IDE\VCExpress.exe',
+                 batch_file_path=r'Common7\Tools\vsvars32.bat',
+                 default_dirname='Microsoft Visual Studio 9',
+                 supported_arch=['x86'],
+    ),
+
+    # Visual Studio 2005
+    # The batch file we look for is in the VC directory,
+    # so the devenv.com executable is up in ..\..\Common7\IDE.
+    VisualStudio('8.0',
+                 sdk_version='6.0A',
+                 hkeys=[r'Microsoft\VisualStudio\8.0\Setup\VS\ProductDir'],
+                 common_tools_var='VS80COMNTOOLS',
+                 executable_path=r'Common7\IDE\devenv.com',
+                 batch_file_path=r'Common7\Tools\vsvars32.bat',
+                 default_dirname='Microsoft Visual Studio 8',
+                 supported_arch=['x86', 'amd64'],
+    ),
+
+    # Visual C++ 2005 Express Edition
+    # The batch file we look for is in the VC directory,
+    # so the VCExpress.exe executable is up in ..\..\Common7\IDE.
+    VisualStudio('8.0Exp',
+                 vc_version='8.0Exp',
+                 sdk_version='6.0A',
+                 hkeys=[r'Microsoft\VCExpress\8.0\Setup\VS\ProductDir'],
+                 common_tools_var='VS80COMNTOOLS',
+                 executable_path=r'Common7\IDE\VCExpress.exe',
+                 batch_file_path=r'Common7\Tools\vsvars32.bat',
+                 default_dirname='Microsoft Visual Studio 8',
+                 supported_arch=['x86'],
+    ),
+
+    # Visual Studio .NET 2003
+    # The batch file we look for is in the Common7\Tools directory,
+    # so the devenv.com executable is next door in ..\IDE.
+    VisualStudio('7.1',
+                 sdk_version='6.0',
+                 hkeys=[r'Microsoft\VisualStudio\7.1\Setup\VS\ProductDir'],
+                 common_tools_var='VS71COMNTOOLS',
+                 executable_path=r'Common7\IDE\devenv.com',
+                 batch_file_path=r'Common7\Tools\vsvars32.bat',
+                 default_dirname='Microsoft Visual Studio .NET 2003',
+                 supported_arch=['x86'],
+    ),
+
+    # Visual Studio .NET
+    # The batch file we look for is in the Common7\Tools directory,
+    # so the devenv.com executable is next door in ..\IDE.
+    VisualStudio('7.0',
+                 sdk_version='2003R2',
+                 hkeys=[r'Microsoft\VisualStudio\7.0\Setup\VS\ProductDir'],
+                 common_tools_var='VS70COMNTOOLS',
+                 executable_path=r'IDE\devenv.com',
+                 batch_file_path=r'Common7\Tools\vsvars32.bat',
+                 default_dirname='Microsoft Visual Studio .NET',
+                 supported_arch=['x86'],
+    ),
+
+    # Visual Studio 6.0
+    VisualStudio('6.0',
+                 sdk_version='2003R1',
+                 hkeys=[r'Microsoft\VisualStudio\6.0\Setup\Microsoft Visual Studio\ProductDir',
+                        'use_dir'],
+                 common_tools_var='VS60COMNTOOLS',
+                 executable_path=r'Common\MSDev98\Bin\MSDEV.COM',
+                 batch_file_path=r'Common7\Tools\vsvars32.bat',
+                 default_dirname='Microsoft Visual Studio',
+                 supported_arch=['x86'],
+    ),
+]
+
+SupportedVSMap = {}
+for vs in SupportedVSList:
+    SupportedVSMap[vs.version] = vs
+
+
+# Finding installed versions of Visual Studio isn't cheap, because it
+# goes not only to the registry but also to the disk to sanity-check
+# that there is, in fact, a Visual Studio directory there and that the
+# registry entry isn't just stale.  Find this information once, when
+# requested, and cache it.
+
+InstalledVSList = None
+InstalledVSMap  = None
+
+def get_installed_visual_studios():
+    global InstalledVSList
+    global InstalledVSMap
+    if InstalledVSList is None:
+        InstalledVSList = []
+        InstalledVSMap = {}
+        for vs in SupportedVSList:
+            debug('trying to find VS %s' % vs.version)
+            if vs.get_executable():
+                debug('found VS %s' % vs.version)
+                InstalledVSList.append(vs)
+                InstalledVSMap[vs.version] = vs
+    return InstalledVSList
+
+def reset_installed_visual_studios():
+    global InstalledVSList
+    global InstalledVSMap
+    InstalledVSList = None
+    InstalledVSMap  = None
+    for vs in SupportedVSList:
+        vs.reset()
+        
+    # Need to clear installed VC's as well as they are used in finding
+    # installed VS's
+    SCons.Tool.MSCommon.vc.reset_installed_vcs()
+        
+
+# We may be asked to update multiple construction environments with
+# SDK information.  When doing this, we check on-disk for whether
+# the SDK has 'mfc' and 'atl' subdirectories.  Since going to disk
+# is expensive, cache results by directory.
+
+#SDKEnvironmentUpdates = {}
+#
+#def set_sdk_by_directory(env, sdk_dir):
+#    global SDKEnvironmentUpdates
+#    try:
+#        env_tuple_list = SDKEnvironmentUpdates[sdk_dir]
+#    except KeyError:
+#        env_tuple_list = []
+#        SDKEnvironmentUpdates[sdk_dir] = env_tuple_list
+#
+#        include_path = os.path.join(sdk_dir, 'include')
+#        mfc_path = os.path.join(include_path, 'mfc')
+#        atl_path = os.path.join(include_path, 'atl')
+#
+#        if os.path.exists(mfc_path):
+#            env_tuple_list.append(('INCLUDE', mfc_path))
+#        if os.path.exists(atl_path):
+#            env_tuple_list.append(('INCLUDE', atl_path))
+#        env_tuple_list.append(('INCLUDE', include_path))
+#
+#        env_tuple_list.append(('LIB', os.path.join(sdk_dir, 'lib')))
+#        env_tuple_list.append(('LIBPATH', os.path.join(sdk_dir, 'lib')))
+#        env_tuple_list.append(('PATH', os.path.join(sdk_dir, 'bin')))
+#
+#    for variable, directory in env_tuple_list:
+#        env.PrependENVPath(variable, directory)
+
+def msvs_exists():
+    return (len(get_installed_visual_studios()) > 0)
+
+def get_vs_by_version(msvs):
+    global InstalledVSMap
+    global SupportedVSMap
+
+    debug('vs.py:get_vs_by_version()')
+    if msvs not in SupportedVSMap:
+        msg = "Visual Studio version %s is not supported" % repr(msvs)
+        raise SCons.Errors.UserError(msg)
+    get_installed_visual_studios()
+    vs = InstalledVSMap.get(msvs)
+    debug('InstalledVSMap:%s'%InstalledVSMap)
+    debug('vs.py:get_vs_by_version: found vs:%s'%vs)
+    # Some check like this would let us provide a useful error message
+    # if they try to set a Visual Studio version that's not installed.
+    # However, we also want to be able to run tests (like the unit
+    # tests) on systems that don't, or won't ever, have it installed.
+    # It might be worth resurrecting this, with some configurable
+    # setting that the tests can use to bypass the check.
+    #if not vs:
+    #    msg = "Visual Studio version %s is not installed" % repr(msvs)
+    #    raise SCons.Errors.UserError, msg
+    return vs
+
+def get_default_version(env):
+    """Returns the default version string to use for MSVS.
+
+    If no version was requested by the user through the MSVS environment
+    variable, query all the available the visual studios through
+    query_versions, and take the highest one.
+
+    Return
+    ------
+    version: str
+        the default version.
+    """
+    if 'MSVS' not in env or not SCons.Util.is_Dict(env['MSVS']):
+        versions = [vs.version for vs in get_installed_visual_studios()]
+        env['MSVS'] = {'VERSIONS' : versions}
+    else:
+        versions = env['MSVS'].get('VERSIONS', [])
+
+    if 'MSVS_VERSION' not in env:
+        if versions:
+            env['MSVS_VERSION'] = versions[0] #use highest version by default
+        else:
+            env['MSVS_VERSION'] = SupportedVSList[0].version
+
+    env['MSVS']['VERSION'] = env['MSVS_VERSION']
+
+    return env['MSVS_VERSION']
+
+def get_default_arch(env):
+    """Return the default arch to use for MSVS
+
+    if no version was requested by the user through the MSVS_ARCH environment
+    variable, select x86
+
+    Return
+    ------
+    arch: str
+    """
+    arch = env.get('MSVS_ARCH', 'x86')
+
+    msvs = InstalledVSMap.get(env['MSVS_VERSION'])
+
+    if not msvs:
+        arch = 'x86'
+    elif not arch in msvs.get_supported_arch():
+        fmt = "Visual Studio version %s does not support architecture %s"
+        raise SCons.Errors.UserError(fmt % (env['MSVS_VERSION'], arch))
+
+    return arch
+
+def merge_default_version(env):
+    version = get_default_version(env)
+    arch = get_default_arch(env)
+
+def msvs_setup_env(env):
+    batfilename = msvs.get_batch_file()
+    msvs = get_vs_by_version(version)
+    if msvs is None:
+        return
+
+    # XXX: I think this is broken. This will silently set a bogus tool instead
+    # of failing, but there is no other way with the current scons tool
+    # framework
+    if batfilename is not None:
+
+        vars = ('LIB', 'LIBPATH', 'PATH', 'INCLUDE')
+
+        msvs_list = get_installed_visual_studios()
+        vscommonvarnames = [vs.common_tools_var for vs in msvs_list]
+        save_ENV = env['ENV']
+        nenv = normalize_env(env['ENV'],
+                             ['COMSPEC'] + vscommonvarnames,
+                             force=True)
+        try:
+            output = get_output(batfilename, arch, env=nenv)
+        finally:
+            env['ENV'] = save_ENV
+        vars = parse_output(output, vars)
+
+        for k, v in vars.items():
+            env.PrependENVPath(k, v, delete_existing=1)
+
+def query_versions():
+    """Query the system to get available versions of VS. A version is
+    considered when a batfile is found."""
+    msvs_list = get_installed_visual_studios()
+    versions = [msvs.version for msvs in msvs_list]
+    return versions
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/Perforce.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/Perforce.py
new file mode 100644
index 0000000..bd16382
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/Perforce.py
@@ -0,0 +1,103 @@
+"""SCons.Tool.Perforce.py
+
+Tool-specific initialization for Perforce Source Code Management system.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Tool/Perforce.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+
+import SCons.Action
+import SCons.Builder
+import SCons.Node.FS
+import SCons.Util
+
+# This function should maybe be moved to SCons.Util?
+from SCons.Tool.PharLapCommon import addPathIfNotExists
+
+
+# Variables that we want to import from the base OS environment.
+_import_env = [ 'P4PORT', 'P4CLIENT', 'P4USER', 'USER', 'USERNAME', 'P4PASSWD',
+                'P4CHARSET', 'P4LANGUAGE', 'SystemRoot' ]
+
+PerforceAction = SCons.Action.Action('$P4COM', '$P4COMSTR')
+
+def generate(env):
+    """Add a Builder factory function and construction variables for
+    Perforce to an Environment."""
+
+    def PerforceFactory(env=env):
+        """ """
+        import SCons.Warnings as W
+        W.warn(W.DeprecatedSourceCodeWarning, """The Perforce() factory is deprecated and there is no replacement.""")
+        return SCons.Builder.Builder(action = PerforceAction, env = env)
+
+    #setattr(env, 'Perforce', PerforceFactory)
+    env.Perforce = PerforceFactory
+
+    env['P4']      = 'p4'
+    env['P4FLAGS'] = SCons.Util.CLVar('')
+    env['P4COM']   = '$P4 $P4FLAGS sync $TARGET'
+    try:
+        environ = env['ENV']
+    except KeyError:
+        environ = {}
+        env['ENV'] = environ
+
+    # Perforce seems to use the PWD environment variable rather than
+    # calling getcwd() for itself, which is odd.  If no PWD variable
+    # is present, p4 WILL call getcwd, but this seems to cause problems
+    # with good ol' Windows's tilde-mangling for long file names.
+    environ['PWD'] = env.Dir('#').get_abspath()
+
+    for var in _import_env:
+        v = os.environ.get(var)
+        if v:
+            environ[var] = v
+
+    if SCons.Util.can_read_reg:
+        # If we can read the registry, add the path to Perforce to our environment.
+        try:
+            k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE,
+                                      'Software\\Perforce\\environment')
+            val, tok = SCons.Util.RegQueryValueEx(k, 'P4INSTROOT')
+            addPathIfNotExists(environ, 'PATH', val)
+        except SCons.Util.RegError:
+            # Can't detect where Perforce is, hope the user has it set in the
+            # PATH.
+            pass
+
+def exists(env):
+    return env.Detect('p4')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/PharLapCommon.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/PharLapCommon.py
new file mode 100644
index 0000000..4fd8fdd
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/PharLapCommon.py
@@ -0,0 +1,137 @@
+"""SCons.Tool.PharLapCommon
+
+This module contains common code used by all Tools for the
+Phar Lap ETS tool chain.  Right now, this is linkloc and
+386asm.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/PharLapCommon.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+import os.path
+import SCons.Errors
+import SCons.Util
+import re
+
+def getPharLapPath():
+    """Reads the registry to find the installed path of the Phar Lap ETS
+    development kit.
+
+    Raises UserError if no installed version of Phar Lap can
+    be found."""
+
+    if not SCons.Util.can_read_reg:
+        raise SCons.Errors.InternalError("No Windows registry module was found")
+    try:
+        k=SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE,
+                                  'SOFTWARE\\Pharlap\\ETS')
+        val, type = SCons.Util.RegQueryValueEx(k, 'BaseDir')
+
+        # The following is a hack...there is (not surprisingly)
+        # an odd issue in the Phar Lap plug in that inserts
+        # a bunch of junk data after the phar lap path in the
+        # registry.  We must trim it.
+        idx=val.find('\0')
+        if idx >= 0:
+            val = val[:idx]
+                    
+        return os.path.normpath(val)
+    except SCons.Util.RegError:
+        raise SCons.Errors.UserError("Cannot find Phar Lap ETS path in the registry.  Is it installed properly?")
+
+REGEX_ETS_VER = re.compile(r'#define\s+ETS_VER\s+([0-9]+)')
+
+def getPharLapVersion():
+    """Returns the version of the installed ETS Tool Suite as a
+    decimal number.  This version comes from the ETS_VER #define in
+    the embkern.h header.  For example, '#define ETS_VER 1010' (which
+    is what Phar Lap 10.1 defines) would cause this method to return
+    1010. Phar Lap 9.1 does not have such a #define, but this method
+    will return 910 as a default.
+
+    Raises UserError if no installed version of Phar Lap can
+    be found."""
+
+    include_path = os.path.join(getPharLapPath(), os.path.normpath("include/embkern.h"))
+    if not os.path.exists(include_path):
+        raise SCons.Errors.UserError("Cannot find embkern.h in ETS include directory.\nIs Phar Lap ETS installed properly?")
+    mo = REGEX_ETS_VER.search(open(include_path, 'r').read())
+    if mo:
+        return int(mo.group(1))
+    # Default return for Phar Lap 9.1
+    return 910
+
+def addPathIfNotExists(env_dict, key, path, sep=os.pathsep):
+    """This function will take 'key' out of the dictionary
+    'env_dict', then add the path 'path' to that key if it is not
+    already there.  This treats the value of env_dict[key] as if it
+    has a similar format to the PATH variable...a list of paths
+    separated by tokens.  The 'path' will get added to the list if it
+    is not already there."""
+    try:
+        is_list = 1
+        paths = env_dict[key]
+        if not SCons.Util.is_List(env_dict[key]):
+            paths = paths.split(sep)
+            is_list = 0
+        if os.path.normcase(path) not in list(map(os.path.normcase, paths)):
+            paths = [ path ] + paths
+        if is_list:
+            env_dict[key] = paths
+        else:
+            env_dict[key] = sep.join(paths)
+    except KeyError:
+        env_dict[key] = path
+
+def addPharLapPaths(env):
+    """This function adds the path to the Phar Lap binaries, includes,
+    and libraries, if they are not already there."""
+    ph_path = getPharLapPath()
+
+    try:
+        env_dict = env['ENV']
+    except KeyError:
+        env_dict = {}
+        env['ENV'] = env_dict
+    addPathIfNotExists(env_dict, 'PATH',
+                       os.path.join(ph_path, 'bin'))
+    addPathIfNotExists(env_dict, 'INCLUDE',
+                       os.path.join(ph_path, 'include'))
+    addPathIfNotExists(env_dict, 'LIB',
+                       os.path.join(ph_path, 'lib'))
+    addPathIfNotExists(env_dict, 'LIB',
+                       os.path.join(ph_path, os.path.normpath('lib/vclib')))
+    
+    env['PHARLAP_PATH'] = getPharLapPath()
+    env['PHARLAP_VERSION'] = str(getPharLapVersion())
+    
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/RCS.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/RCS.py
new file mode 100644
index 0000000..5c3588a
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/RCS.py
@@ -0,0 +1,64 @@
+"""SCons.Tool.RCS.py
+
+Tool-specific initialization for RCS.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Tool/RCS.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Action
+import SCons.Builder
+import SCons.Util
+
+def generate(env):
+    """Add a Builder factory function and construction variables for
+    RCS to an Environment."""
+
+    def RCSFactory(env=env):
+        """ """
+        import SCons.Warnings as W
+        W.warn(W.DeprecatedSourceCodeWarning, """The RCS() factory is deprecated and there is no replacement.""")
+        act = SCons.Action.Action('$RCS_COCOM', '$RCS_COCOMSTR')
+        return SCons.Builder.Builder(action = act, env = env)
+
+    #setattr(env, 'RCS', RCSFactory)
+    env.RCS = RCSFactory
+
+    env['RCS']          = 'rcs'
+    env['RCS_CO']       = 'co'
+    env['RCS_COFLAGS']  = SCons.Util.CLVar('')
+    env['RCS_COCOM']    = '$RCS_CO $RCS_COFLAGS $TARGET'
+
+def exists(env):
+    return env.Detect('rcs')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/SCCS.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/SCCS.py
new file mode 100644
index 0000000..50c22d3
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/SCCS.py
@@ -0,0 +1,64 @@
+"""SCons.Tool.SCCS.py
+
+Tool-specific initialization for SCCS.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Tool/SCCS.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Action
+import SCons.Builder
+import SCons.Util
+
+def generate(env):
+    """Add a Builder factory function and construction variables for
+    SCCS to an Environment."""
+
+    def SCCSFactory(env=env):
+        """ """
+        import SCons.Warnings as W
+        W.warn(W.DeprecatedSourceCodeWarning, """The SCCS() factory is deprecated and there is no replacement.""")
+        act = SCons.Action.Action('$SCCSCOM', '$SCCSCOMSTR')
+        return SCons.Builder.Builder(action = act, env = env)
+
+    #setattr(env, 'SCCS', SCCSFactory)
+    env.SCCS = SCCSFactory
+
+    env['SCCS']         = 'sccs'
+    env['SCCSFLAGS']    = SCons.Util.CLVar('')
+    env['SCCSGETFLAGS'] = SCons.Util.CLVar('')
+    env['SCCSCOM']      = '$SCCS $SCCSFLAGS get $SCCSGETFLAGS $TARGET'
+
+def exists(env):
+    return env.Detect('sccs')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/Subversion.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/Subversion.py
new file mode 100644
index 0000000..30c1c78
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/Subversion.py
@@ -0,0 +1,71 @@
+"""SCons.Tool.Subversion.py
+
+Tool-specific initialization for Subversion.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Tool/Subversion.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os.path
+
+import SCons.Action
+import SCons.Builder
+import SCons.Util
+
+def generate(env):
+    """Add a Builder factory function and construction variables for
+    Subversion to an Environment."""
+
+    def SubversionFactory(repos, module='', env=env):
+        """ """
+        # fail if repos is not an absolute path name?
+        import SCons.Warnings as W
+        W.warn(W.DeprecatedSourceCodeWarning, """The Subversion() factory is deprecated and there is no replacement.""")
+        if module != '':
+            module = os.path.join(module, '')
+        act = SCons.Action.Action('$SVNCOM', '$SVNCOMSTR')
+        return SCons.Builder.Builder(action = act,
+                                     env = env,
+                                     SVNREPOSITORY = repos,
+                                     SVNMODULE = module)
+
+    #setattr(env, 'Subversion', SubversionFactory)
+    env.Subversion = SubversionFactory
+
+    env['SVN']      = 'svn'
+    env['SVNFLAGS'] = SCons.Util.CLVar('')
+    env['SVNCOM']   = '$SVN $SVNFLAGS cat $SVNREPOSITORY/$SVNMODULE$TARGET > $TARGET'
+
+def exists(env):
+    return env.Detect('svn')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/__init__.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/__init__.py
new file mode 100644
index 0000000..2b8a06c
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/__init__.py
@@ -0,0 +1,681 @@
+"""SCons.Tool
+
+SCons tool selection.
+
+This looks for modules that define a callable object that can modify
+a construction environment as appropriate for a given tool (or tool
+chain).
+
+Note that because this subsystem just *selects* a callable that can
+modify a construction environment, it's possible for people to define
+their own "tool specification" in an arbitrary callable function.  No
+one needs to use or tie in to this subsystem in order to roll their own
+tool definition.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Tool/__init__.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import imp
+import sys
+
+import SCons.Builder
+import SCons.Errors
+import SCons.Node.FS
+import SCons.Scanner
+import SCons.Scanner.C
+import SCons.Scanner.D
+import SCons.Scanner.LaTeX
+import SCons.Scanner.Prog
+
+DefaultToolpath=[]
+
+CScanner = SCons.Scanner.C.CScanner()
+DScanner = SCons.Scanner.D.DScanner()
+LaTeXScanner = SCons.Scanner.LaTeX.LaTeXScanner()
+PDFLaTeXScanner = SCons.Scanner.LaTeX.PDFLaTeXScanner()
+ProgramScanner = SCons.Scanner.Prog.ProgramScanner()
+SourceFileScanner = SCons.Scanner.Base({}, name='SourceFileScanner')
+
+CSuffixes = [".c", ".C", ".cxx", ".cpp", ".c++", ".cc",
+             ".h", ".H", ".hxx", ".hpp", ".hh",
+             ".F", ".fpp", ".FPP",
+             ".m", ".mm",
+             ".S", ".spp", ".SPP", ".sx"]
+
+DSuffixes = ['.d']
+
+IDLSuffixes = [".idl", ".IDL"]
+
+LaTeXSuffixes = [".tex", ".ltx", ".latex"]
+
+for suffix in CSuffixes:
+    SourceFileScanner.add_scanner(suffix, CScanner)
+
+for suffix in DSuffixes:
+    SourceFileScanner.add_scanner(suffix, DScanner)
+
+# FIXME: what should be done here? Two scanners scan the same extensions,
+# but look for different files, e.g., "picture.eps" vs. "picture.pdf".
+# The builders for DVI and PDF explicitly reference their scanners
+# I think that means this is not needed???
+for suffix in LaTeXSuffixes:
+    SourceFileScanner.add_scanner(suffix, LaTeXScanner)
+    SourceFileScanner.add_scanner(suffix, PDFLaTeXScanner)
+
+class Tool(object):
+    def __init__(self, name, toolpath=[], **kw):
+        self.name = name
+        self.toolpath = toolpath + DefaultToolpath
+        # remember these so we can merge them into the call
+        self.init_kw = kw
+
+        module = self._tool_module()
+        self.generate = module.generate
+        self.exists = module.exists
+        if hasattr(module, 'options'):
+            self.options = module.options
+
+    def _tool_module(self):
+        # TODO: Interchange zipimport with normal initilization for better error reporting
+        oldpythonpath = sys.path
+        sys.path = self.toolpath + sys.path
+
+        try:
+            try:
+                file, path, desc = imp.find_module(self.name, self.toolpath)
+                try:
+                    return imp.load_module(self.name, file, path, desc)
+                finally:
+                    if file:
+                        file.close()
+            except ImportError, e:
+                if str(e)!="No module named %s"%self.name:
+                    raise SCons.Errors.EnvironmentError(e)
+                try:
+                    import zipimport
+                except ImportError:
+                    pass
+                else:
+                    for aPath in self.toolpath:
+                        try:
+                            importer = zipimport.zipimporter(aPath)
+                            return importer.load_module(self.name)
+                        except ImportError, e:
+                            pass
+        finally:
+            sys.path = oldpythonpath
+
+        full_name = 'SCons.Tool.' + self.name
+        try:
+            return sys.modules[full_name]
+        except KeyError:
+            try:
+                smpath = sys.modules['SCons.Tool'].__path__
+                try:
+                    file, path, desc = imp.find_module(self.name, smpath)
+                    module = imp.load_module(full_name, file, path, desc)
+                    setattr(SCons.Tool, self.name, module)
+                    if file:
+                        file.close()
+                    return module
+                except ImportError, e:
+                    if str(e)!="No module named %s"%self.name:
+                        raise SCons.Errors.EnvironmentError(e)
+                    try:
+                        import zipimport
+                        importer = zipimport.zipimporter( sys.modules['SCons.Tool'].__path__[0] )
+                        module = importer.load_module(full_name)
+                        setattr(SCons.Tool, self.name, module)
+                        return module
+                    except ImportError, e:
+                        m = "No tool named '%s': %s" % (self.name, e)
+                        raise SCons.Errors.EnvironmentError(m)
+            except ImportError, e:
+                m = "No tool named '%s': %s" % (self.name, e)
+                raise SCons.Errors.EnvironmentError(m)
+
+    def __call__(self, env, *args, **kw):
+        if self.init_kw is not None:
+            # Merge call kws into init kws;
+            # but don't bash self.init_kw.
+            if kw is not None:
+                call_kw = kw
+                kw = self.init_kw.copy()
+                kw.update(call_kw)
+            else:
+                kw = self.init_kw
+        env.Append(TOOLS = [ self.name ])
+        if hasattr(self, 'options'):
+            import SCons.Variables
+            if 'options' not in env:
+                from SCons.Script import ARGUMENTS
+                env['options']=SCons.Variables.Variables(args=ARGUMENTS)
+            opts=env['options']
+
+            self.options(opts)
+            opts.Update(env)
+
+        self.generate(env, *args, **kw)
+
+    def __str__(self):
+        return self.name
+
+##########################################################################
+#  Create common executable program / library / object builders
+
+def createProgBuilder(env):
+    """This is a utility function that creates the Program
+    Builder in an Environment if it is not there already.
+
+    If it is already there, we return the existing one.
+    """
+
+    try:
+        program = env['BUILDERS']['Program']
+    except KeyError:
+        import SCons.Defaults
+        program = SCons.Builder.Builder(action = SCons.Defaults.LinkAction,
+                                        emitter = '$PROGEMITTER',
+                                        prefix = '$PROGPREFIX',
+                                        suffix = '$PROGSUFFIX',
+                                        src_suffix = '$OBJSUFFIX',
+                                        src_builder = 'Object',
+                                        target_scanner = ProgramScanner)
+        env['BUILDERS']['Program'] = program
+
+    return program
+
+def createStaticLibBuilder(env):
+    """This is a utility function that creates the StaticLibrary
+    Builder in an Environment if it is not there already.
+
+    If it is already there, we return the existing one.
+    """
+
+    try:
+        static_lib = env['BUILDERS']['StaticLibrary']
+    except KeyError:
+        action_list = [ SCons.Action.Action("$ARCOM", "$ARCOMSTR") ]
+        if env.Detect('ranlib'):
+            ranlib_action = SCons.Action.Action("$RANLIBCOM", "$RANLIBCOMSTR")
+            action_list.append(ranlib_action)
+
+        static_lib = SCons.Builder.Builder(action = action_list,
+                                           emitter = '$LIBEMITTER',
+                                           prefix = '$LIBPREFIX',
+                                           suffix = '$LIBSUFFIX',
+                                           src_suffix = '$OBJSUFFIX',
+                                           src_builder = 'StaticObject')
+        env['BUILDERS']['StaticLibrary'] = static_lib
+        env['BUILDERS']['Library'] = static_lib
+
+    return static_lib
+
+def createSharedLibBuilder(env):
+    """This is a utility function that creates the SharedLibrary
+    Builder in an Environment if it is not there already.
+
+    If it is already there, we return the existing one.
+    """
+
+    try:
+        shared_lib = env['BUILDERS']['SharedLibrary']
+    except KeyError:
+        import SCons.Defaults
+        action_list = [ SCons.Defaults.SharedCheck,
+                        SCons.Defaults.ShLinkAction ]
+        shared_lib = SCons.Builder.Builder(action = action_list,
+                                           emitter = "$SHLIBEMITTER",
+                                           prefix = '$SHLIBPREFIX',
+                                           suffix = '$SHLIBSUFFIX',
+                                           target_scanner = ProgramScanner,
+                                           src_suffix = '$SHOBJSUFFIX',
+                                           src_builder = 'SharedObject')
+        env['BUILDERS']['SharedLibrary'] = shared_lib
+
+    return shared_lib
+
+def createLoadableModuleBuilder(env):
+    """This is a utility function that creates the LoadableModule
+    Builder in an Environment if it is not there already.
+
+    If it is already there, we return the existing one.
+    """
+
+    try:
+        ld_module = env['BUILDERS']['LoadableModule']
+    except KeyError:
+        import SCons.Defaults
+        action_list = [ SCons.Defaults.SharedCheck,
+                        SCons.Defaults.LdModuleLinkAction ]
+        ld_module = SCons.Builder.Builder(action = action_list,
+                                          emitter = "$LDMODULEEMITTER",
+                                          prefix = '$LDMODULEPREFIX',
+                                          suffix = '$LDMODULESUFFIX',
+                                          target_scanner = ProgramScanner,
+                                          src_suffix = '$SHOBJSUFFIX',
+                                          src_builder = 'SharedObject')
+        env['BUILDERS']['LoadableModule'] = ld_module
+
+    return ld_module
+
+def createObjBuilders(env):
+    """This is a utility function that creates the StaticObject
+    and SharedObject Builders in an Environment if they
+    are not there already.
+
+    If they are there already, we return the existing ones.
+
+    This is a separate function because soooo many Tools
+    use this functionality.
+
+    The return is a 2-tuple of (StaticObject, SharedObject)
+    """
+
+
+    try:
+        static_obj = env['BUILDERS']['StaticObject']
+    except KeyError:
+        static_obj = SCons.Builder.Builder(action = {},
+                                           emitter = {},
+                                           prefix = '$OBJPREFIX',
+                                           suffix = '$OBJSUFFIX',
+                                           src_builder = ['CFile', 'CXXFile'],
+                                           source_scanner = SourceFileScanner,
+                                           single_source = 1)
+        env['BUILDERS']['StaticObject'] = static_obj
+        env['BUILDERS']['Object'] = static_obj
+
+    try:
+        shared_obj = env['BUILDERS']['SharedObject']
+    except KeyError:
+        shared_obj = SCons.Builder.Builder(action = {},
+                                           emitter = {},
+                                           prefix = '$SHOBJPREFIX',
+                                           suffix = '$SHOBJSUFFIX',
+                                           src_builder = ['CFile', 'CXXFile'],
+                                           source_scanner = SourceFileScanner,
+                                           single_source = 1)
+        env['BUILDERS']['SharedObject'] = shared_obj
+
+    return (static_obj, shared_obj)
+
+def createCFileBuilders(env):
+    """This is a utility function that creates the CFile/CXXFile
+    Builders in an Environment if they
+    are not there already.
+
+    If they are there already, we return the existing ones.
+
+    This is a separate function because soooo many Tools
+    use this functionality.
+
+    The return is a 2-tuple of (CFile, CXXFile)
+    """
+
+    try:
+        c_file = env['BUILDERS']['CFile']
+    except KeyError:
+        c_file = SCons.Builder.Builder(action = {},
+                                       emitter = {},
+                                       suffix = {None:'$CFILESUFFIX'})
+        env['BUILDERS']['CFile'] = c_file
+
+        env.SetDefault(CFILESUFFIX = '.c')
+
+    try:
+        cxx_file = env['BUILDERS']['CXXFile']
+    except KeyError:
+        cxx_file = SCons.Builder.Builder(action = {},
+                                         emitter = {},
+                                         suffix = {None:'$CXXFILESUFFIX'})
+        env['BUILDERS']['CXXFile'] = cxx_file
+        env.SetDefault(CXXFILESUFFIX = '.cc')
+
+    return (c_file, cxx_file)
+
+##########################################################################
+#  Create common Java builders
+
+def CreateJarBuilder(env):
+    try:
+        java_jar = env['BUILDERS']['Jar']
+    except KeyError:
+        fs = SCons.Node.FS.get_default_fs()
+        jar_com = SCons.Action.Action('$JARCOM', '$JARCOMSTR')
+        java_jar = SCons.Builder.Builder(action = jar_com,
+                                         suffix = '$JARSUFFIX',
+                                         src_suffix = '$JAVACLASSSUFIX',
+                                         src_builder = 'JavaClassFile',
+                                         source_factory = fs.Entry)
+        env['BUILDERS']['Jar'] = java_jar
+    return java_jar
+
+def CreateJavaHBuilder(env):
+    try:
+        java_javah = env['BUILDERS']['JavaH']
+    except KeyError:
+        fs = SCons.Node.FS.get_default_fs()
+        java_javah_com = SCons.Action.Action('$JAVAHCOM', '$JAVAHCOMSTR')
+        java_javah = SCons.Builder.Builder(action = java_javah_com,
+                                           src_suffix = '$JAVACLASSSUFFIX',
+                                           target_factory = fs.Entry,
+                                           source_factory = fs.File,
+                                           src_builder = 'JavaClassFile')
+        env['BUILDERS']['JavaH'] = java_javah
+    return java_javah
+
+def CreateJavaClassFileBuilder(env):
+    try:
+        java_class_file = env['BUILDERS']['JavaClassFile']
+    except KeyError:
+        fs = SCons.Node.FS.get_default_fs()
+        javac_com = SCons.Action.Action('$JAVACCOM', '$JAVACCOMSTR')
+        java_class_file = SCons.Builder.Builder(action = javac_com,
+                                                emitter = {},
+                                                #suffix = '$JAVACLASSSUFFIX',
+                                                src_suffix = '$JAVASUFFIX',
+                                                src_builder = ['JavaFile'],
+                                                target_factory = fs.Entry,
+                                                source_factory = fs.File)
+        env['BUILDERS']['JavaClassFile'] = java_class_file
+    return java_class_file
+
+def CreateJavaClassDirBuilder(env):
+    try:
+        java_class_dir = env['BUILDERS']['JavaClassDir']
+    except KeyError:
+        fs = SCons.Node.FS.get_default_fs()
+        javac_com = SCons.Action.Action('$JAVACCOM', '$JAVACCOMSTR')
+        java_class_dir = SCons.Builder.Builder(action = javac_com,
+                                               emitter = {},
+                                               target_factory = fs.Dir,
+                                               source_factory = fs.Dir)
+        env['BUILDERS']['JavaClassDir'] = java_class_dir
+    return java_class_dir
+
+def CreateJavaFileBuilder(env):
+    try:
+        java_file = env['BUILDERS']['JavaFile']
+    except KeyError:
+        java_file = SCons.Builder.Builder(action = {},
+                                          emitter = {},
+                                          suffix = {None:'$JAVASUFFIX'})
+        env['BUILDERS']['JavaFile'] = java_file
+        env['JAVASUFFIX'] = '.java'
+    return java_file
+
+class ToolInitializerMethod(object):
+    """
+    This is added to a construction environment in place of a
+    method(s) normally called for a Builder (env.Object, env.StaticObject,
+    etc.).  When called, it has its associated ToolInitializer
+    object search the specified list of tools and apply the first
+    one that exists to the construction environment.  It then calls
+    whatever builder was (presumably) added to the construction
+    environment in place of this particular instance.
+    """
+    def __init__(self, name, initializer):
+        """
+        Note:  we store the tool name as __name__ so it can be used by
+        the class that attaches this to a construction environment.
+        """
+        self.__name__ = name
+        self.initializer = initializer
+
+    def get_builder(self, env):
+        """
+	Returns the appropriate real Builder for this method name
+	after having the associated ToolInitializer object apply
+	the appropriate Tool module.
+        """
+        builder = getattr(env, self.__name__)
+
+        self.initializer.apply_tools(env)
+
+        builder = getattr(env, self.__name__)
+        if builder is self:
+            # There was no Builder added, which means no valid Tool
+            # for this name was found (or possibly there's a mismatch
+            # between the name we were called by and the Builder name
+            # added by the Tool module).
+            return None
+
+        self.initializer.remove_methods(env)
+
+        return builder
+
+    def __call__(self, env, *args, **kw):
+        """
+        """
+        builder = self.get_builder(env)
+        if builder is None:
+            return [], []
+        return builder(*args, **kw)
+
+class ToolInitializer(object):
+    """
+    A class for delayed initialization of Tools modules.
+
+    Instances of this class associate a list of Tool modules with
+    a list of Builder method names that will be added by those Tool
+    modules.  As part of instantiating this object for a particular
+    construction environment, we also add the appropriate
+    ToolInitializerMethod objects for the various Builder methods
+    that we want to use to delay Tool searches until necessary.
+    """
+    def __init__(self, env, tools, names):
+        if not SCons.Util.is_List(tools):
+            tools = [tools]
+        if not SCons.Util.is_List(names):
+            names = [names]
+        self.env = env
+        self.tools = tools
+        self.names = names
+        self.methods = {}
+        for name in names:
+            method = ToolInitializerMethod(name, self)
+            self.methods[name] = method
+            env.AddMethod(method)
+
+    def remove_methods(self, env):
+        """
+        Removes the methods that were added by the tool initialization
+        so we no longer copy and re-bind them when the construction
+        environment gets cloned.
+        """
+        for method in self.methods.values():
+            env.RemoveMethod(method)
+
+    def apply_tools(self, env):
+        """
+	Searches the list of associated Tool modules for one that
+	exists, and applies that to the construction environment.
+        """
+        for t in self.tools:
+            tool = SCons.Tool.Tool(t)
+            if tool.exists(env):
+                env.Tool(tool)
+                return
+
+	# If we fall through here, there was no tool module found.
+	# This is where we can put an informative error message
+	# about the inability to find the tool.   We'll start doing
+	# this as we cut over more pre-defined Builder+Tools to use
+	# the ToolInitializer class.
+
+def Initializers(env):
+    ToolInitializer(env, ['install'], ['_InternalInstall', '_InternalInstallAs'])
+    def Install(self, *args, **kw):
+        return self._InternalInstall(*args, **kw)
+    def InstallAs(self, *args, **kw):
+        return self._InternalInstallAs(*args, **kw)
+    env.AddMethod(Install)
+    env.AddMethod(InstallAs)
+
+def FindTool(tools, env):
+    for tool in tools:
+        t = Tool(tool)
+        if t.exists(env):
+            return tool
+    return None
+
+def FindAllTools(tools, env):
+    def ToolExists(tool, env=env):
+        return Tool(tool).exists(env)
+    return list(filter (ToolExists, tools))
+
+def tool_list(platform, env):
+
+    other_plat_tools=[]
+    # XXX this logic about what tool to prefer on which platform
+    #     should be moved into either the platform files or
+    #     the tool files themselves.
+    # The search orders here are described in the man page.  If you
+    # change these search orders, update the man page as well.
+    if str(platform) == 'win32':
+        "prefer Microsoft tools on Windows"
+        linkers = ['mslink', 'gnulink', 'ilink', 'linkloc', 'ilink32' ]
+        c_compilers = ['msvc', 'mingw', 'gcc', 'intelc', 'icl', 'icc', 'cc', 'bcc32' ]
+        cxx_compilers = ['msvc', 'intelc', 'icc', 'g++', 'c++', 'bcc32' ]
+        assemblers = ['masm', 'nasm', 'gas', '386asm' ]
+        fortran_compilers = ['gfortran', 'g77', 'ifl', 'cvf', 'f95', 'f90', 'fortran']
+        ars = ['mslib', 'ar', 'tlib']
+        other_plat_tools=['msvs','midl']
+    elif str(platform) == 'os2':
+        "prefer IBM tools on OS/2"
+        linkers = ['ilink', 'gnulink', ]#'mslink']
+        c_compilers = ['icc', 'gcc',]# 'msvc', 'cc']
+        cxx_compilers = ['icc', 'g++',]# 'msvc', 'c++']
+        assemblers = ['nasm',]# 'masm', 'gas']
+        fortran_compilers = ['ifl', 'g77']
+        ars = ['ar',]# 'mslib']
+    elif str(platform) == 'irix':
+        "prefer MIPSPro on IRIX"
+        linkers = ['sgilink', 'gnulink']
+        c_compilers = ['sgicc', 'gcc', 'cc']
+        cxx_compilers = ['sgic++', 'g++', 'c++']
+        assemblers = ['as', 'gas']
+        fortran_compilers = ['f95', 'f90', 'f77', 'g77', 'fortran']
+        ars = ['sgiar']
+    elif str(platform) == 'sunos':
+        "prefer Forte tools on SunOS"
+        linkers = ['sunlink', 'gnulink']
+        c_compilers = ['suncc', 'gcc', 'cc']
+        cxx_compilers = ['sunc++', 'g++', 'c++']
+        assemblers = ['as', 'gas']
+        fortran_compilers = ['sunf95', 'sunf90', 'sunf77', 'f95', 'f90', 'f77',
+                             'gfortran', 'g77', 'fortran']
+        ars = ['sunar']
+    elif str(platform) == 'hpux':
+        "prefer aCC tools on HP-UX"
+        linkers = ['hplink', 'gnulink']
+        c_compilers = ['hpcc', 'gcc', 'cc']
+        cxx_compilers = ['hpc++', 'g++', 'c++']
+        assemblers = ['as', 'gas']
+        fortran_compilers = ['f95', 'f90', 'f77', 'g77', 'fortran']
+        ars = ['ar']
+    elif str(platform) == 'aix':
+        "prefer AIX Visual Age tools on AIX"
+        linkers = ['aixlink', 'gnulink']
+        c_compilers = ['aixcc', 'gcc', 'cc']
+        cxx_compilers = ['aixc++', 'g++', 'c++']
+        assemblers = ['as', 'gas']
+        fortran_compilers = ['f95', 'f90', 'aixf77', 'g77', 'fortran']
+        ars = ['ar']
+    elif str(platform) == 'darwin':
+        "prefer GNU tools on Mac OS X, except for some linkers and IBM tools"
+        linkers = ['applelink', 'gnulink']
+        c_compilers = ['gcc', 'cc']
+        cxx_compilers = ['g++', 'c++']
+        assemblers = ['as']
+        fortran_compilers = ['gfortran', 'f95', 'f90', 'g77']
+        ars = ['ar']
+    else:
+        "prefer GNU tools on all other platforms"
+        linkers = ['gnulink', 'mslink', 'ilink']
+        c_compilers = ['gcc', 'msvc', 'intelc', 'icc', 'cc']
+        cxx_compilers = ['g++', 'msvc', 'intelc', 'icc', 'c++']
+        assemblers = ['gas', 'nasm', 'masm']
+        fortran_compilers = ['gfortran', 'g77', 'ifort', 'ifl', 'f95', 'f90', 'f77']
+        ars = ['ar', 'mslib']
+
+    c_compiler = FindTool(c_compilers, env) or c_compilers[0]
+
+    # XXX this logic about what tool provides what should somehow be
+    #     moved into the tool files themselves.
+    if c_compiler and c_compiler == 'mingw':
+        # MinGW contains a linker, C compiler, C++ compiler,
+        # Fortran compiler, archiver and assembler:
+        cxx_compiler = None
+        linker = None
+        assembler = None
+        fortran_compiler = None
+        ar = None
+    else:
+        # Don't use g++ if the C compiler has built-in C++ support:
+        if c_compiler in ('msvc', 'intelc', 'icc'):
+            cxx_compiler = None
+        else:
+            cxx_compiler = FindTool(cxx_compilers, env) or cxx_compilers[0]
+        linker = FindTool(linkers, env) or linkers[0]
+        assembler = FindTool(assemblers, env) or assemblers[0]
+        fortran_compiler = FindTool(fortran_compilers, env) or fortran_compilers[0]
+        ar = FindTool(ars, env) or ars[0]
+
+    other_tools = FindAllTools(other_plat_tools + [
+                               'dmd',
+                               #TODO: merge 'install' into 'filesystem' and
+                               # make 'filesystem' the default
+                               'filesystem',
+                               'm4',
+                               'wix', #'midl', 'msvs',
+                               # Parser generators
+                               'lex', 'yacc',
+                               # Foreign function interface
+                               'rpcgen', 'swig',
+                               # Java
+                               'jar', 'javac', 'javah', 'rmic',
+                               # TeX
+                               'dvipdf', 'dvips', 'gs',
+                               'tex', 'latex', 'pdflatex', 'pdftex',
+                               # Archivers
+                               'tar', 'zip', 'rpm',
+                               # SourceCode factories
+                               'BitKeeper', 'CVS', 'Perforce',
+                               'RCS', 'SCCS', # 'Subversion',
+                               ], env)
+
+    tools = ([linker, c_compiler, cxx_compiler,
+              fortran_compiler, assembler, ar]
+             + other_tools)
+
+    return [x for x in tools if x]
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/aixc++.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/aixc++.py
new file mode 100644
index 0000000..0d0bc8a
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/aixc++.py
@@ -0,0 +1,82 @@
+"""SCons.Tool.aixc++
+
+Tool-specific initialization for IBM xlC / Visual Age C++ compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/aixc++.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os.path
+
+import SCons.Platform.aix
+
+cplusplus = __import__('c++', globals(), locals(), [])
+
+packages = ['vacpp.cmp.core', 'vacpp.cmp.batch', 'vacpp.cmp.C', 'ibmcxx.cmp']
+
+def get_xlc(env):
+    xlc = env.get('CXX', 'xlC')
+    xlc_r = env.get('SHCXX', 'xlC_r')
+    return SCons.Platform.aix.get_xlc(env, xlc, xlc_r, packages)
+
+def smart_cxxflags(source, target, env, for_signature):
+    build_dir = env.GetBuildPath()
+    if build_dir:
+        return '-qtempinc=' + os.path.join(build_dir, 'tempinc')
+    return ''
+
+def generate(env):
+    """Add Builders and construction variables for xlC / Visual Age
+    suite to an Environment."""
+    path, _cxx, _shcxx, version = get_xlc(env)
+    if path:
+        _cxx = os.path.join(path, _cxx)
+        _shcxx = os.path.join(path, _shcxx)
+
+    cplusplus.generate(env)
+
+    env['CXX'] = _cxx
+    env['SHCXX'] = _shcxx
+    env['CXXVERSION'] = version
+    env['SHOBJSUFFIX'] = '.pic.o'
+    
+def exists(env):
+    path, _cxx, _shcxx, version = get_xlc(env)
+    if path and _cxx:
+        xlc = os.path.join(path, _cxx)
+        if os.path.exists(xlc):
+            return xlc
+    return None
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/aixcc.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/aixcc.py
new file mode 100644
index 0000000..bf866ab
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/aixcc.py
@@ -0,0 +1,74 @@
+"""SCons.Tool.aixcc
+
+Tool-specific initialization for IBM xlc / Visual Age C compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/aixcc.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os.path
+
+import SCons.Platform.aix
+
+import cc
+
+packages = ['vac.C', 'ibmcxx.cmp']
+
+def get_xlc(env):
+    xlc = env.get('CC', 'xlc')
+    xlc_r = env.get('SHCC', 'xlc_r')
+    return SCons.Platform.aix.get_xlc(env, xlc, xlc_r, packages)
+
+def generate(env):
+    """Add Builders and construction variables for xlc / Visual Age
+    suite to an Environment."""
+    path, _cc, _shcc, version = get_xlc(env)
+    if path:
+        _cc = os.path.join(path, _cc)
+        _shcc = os.path.join(path, _shcc)
+
+    cc.generate(env)
+
+    env['CC'] = _cc
+    env['SHCC'] = _shcc
+    env['CCVERSION'] = version
+
+def exists(env):
+    path, _cc, _shcc, version = get_xlc(env)
+    if path and _cc:
+        xlc = os.path.join(path, _cc)
+        if os.path.exists(xlc):
+            return xlc
+    return None
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/aixf77.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/aixf77.py
new file mode 100644
index 0000000..de2a6ee
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/aixf77.py
@@ -0,0 +1,80 @@
+"""engine.SCons.Tool.aixf77
+
+Tool-specific initialization for IBM Visual Age f77 Fortran compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/aixf77.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os.path
+
+#import SCons.Platform.aix
+
+import f77
+
+# It would be good to look for the AIX F77 package the same way we're now
+# looking for the C and C++ packages.  This should be as easy as supplying
+# the correct package names in the following list and uncommenting the
+# SCons.Platform.aix_get_xlc() call the in the function below.
+packages = []
+
+def get_xlf77(env):
+    xlf77 = env.get('F77', 'xlf77')
+    xlf77_r = env.get('SHF77', 'xlf77_r')
+    #return SCons.Platform.aix.get_xlc(env, xlf77, xlf77_r, packages)
+    return (None, xlf77, xlf77_r, None)
+
+def generate(env):
+    """
+    Add Builders and construction variables for the Visual Age FORTRAN
+    compiler to an Environment.
+    """
+    path, _f77, _shf77, version = get_xlf77(env)
+    if path:
+        _f77 = os.path.join(path, _f77)
+        _shf77 = os.path.join(path, _shf77)
+
+    f77.generate(env)
+
+    env['F77'] = _f77
+    env['SHF77'] = _shf77
+
+def exists(env):
+    path, _f77, _shf77, version = get_xlf77(env)
+    if path and _f77:
+        xlf77 = os.path.join(path, _f77)
+        if os.path.exists(xlf77):
+            return xlf77
+    return None
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/aixlink.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/aixlink.py
new file mode 100644
index 0000000..d1b3467
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/aixlink.py
@@ -0,0 +1,76 @@
+"""SCons.Tool.aixlink
+
+Tool-specific initialization for the IBM Visual Age linker.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/aixlink.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+import os.path
+
+import SCons.Util
+
+import aixcc
+import link
+
+cplusplus = __import__('c++', globals(), locals(), [])
+
+def smart_linkflags(source, target, env, for_signature):
+    if cplusplus.iscplusplus(source):
+        build_dir = env.subst('$BUILDDIR', target=target, source=source)
+        if build_dir:
+            return '-qtempinc=' + os.path.join(build_dir, 'tempinc')
+    return ''
+
+def generate(env):
+    """
+    Add Builders and construction variables for Visual Age linker to
+    an Environment.
+    """
+    link.generate(env)
+
+    env['SMARTLINKFLAGS'] = smart_linkflags
+    env['LINKFLAGS']      = SCons.Util.CLVar('$SMARTLINKFLAGS')
+    env['SHLINKFLAGS']    = SCons.Util.CLVar('$LINKFLAGS -qmkshrobj -qsuppress=1501-218')
+    env['SHLIBSUFFIX']    = '.a'
+
+def exists(env):
+    path, _cc, _shcc, version = aixcc.get_xlc(env)
+    if path and _cc:
+        xlc = os.path.join(path, _cc)
+        if os.path.exists(xlc):
+            return xlc
+    return None
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/applelink.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/applelink.py
new file mode 100644
index 0000000..fa235f6
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/applelink.py
@@ -0,0 +1,71 @@
+"""SCons.Tool.applelink
+
+Tool-specific initialization for the Apple gnu-like linker.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/applelink.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Util
+
+# Even though the Mac is based on the GNU toolchain, it doesn't understand
+# the -rpath option, so we use the "link" tool instead of "gnulink".
+import link
+
+def generate(env):
+    """Add Builders and construction variables for applelink to an
+    Environment."""
+    link.generate(env)
+
+    env['FRAMEWORKPATHPREFIX'] = '-F'
+    env['_FRAMEWORKPATH'] = '${_concat(FRAMEWORKPATHPREFIX, FRAMEWORKPATH, "", __env__)}'
+    env['_FRAMEWORKS'] = '${_concat("-framework ", FRAMEWORKS, "", __env__)}'
+    env['LINKCOM'] = env['LINKCOM'] + ' $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS'
+    env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -dynamiclib')
+    env['SHLINKCOM'] = env['SHLINKCOM'] + ' $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS'
+
+    # override the default for loadable modules, which are different
+    # on OS X than dynamic shared libs.  echoing what XCode does for
+    # pre/suffixes:
+    env['LDMODULEPREFIX'] = '' 
+    env['LDMODULESUFFIX'] = '' 
+    env['LDMODULEFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -bundle')
+    env['LDMODULECOM'] = '$LDMODULE -o ${TARGET} $LDMODULEFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS'
+
+
+
+def exists(env):
+    return env['PLATFORM'] == 'darwin'
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/ar.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/ar.py
new file mode 100644
index 0000000..688717b
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/ar.py
@@ -0,0 +1,63 @@
+"""SCons.Tool.ar
+
+Tool-specific initialization for ar (library archive).
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/ar.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+
+def generate(env):
+    """Add Builders and construction variables for ar to an Environment."""
+    SCons.Tool.createStaticLibBuilder(env)
+
+    env['AR']          = 'ar'
+    env['ARFLAGS']     = SCons.Util.CLVar('rc')
+    env['ARCOM']       = '$AR $ARFLAGS $TARGET $SOURCES'
+    env['LIBPREFIX']   = 'lib'
+    env['LIBSUFFIX']   = '.a'
+
+    if env.Detect('ranlib'):
+        env['RANLIB']      = 'ranlib'
+        env['RANLIBFLAGS'] = SCons.Util.CLVar('')
+        env['RANLIBCOM']   = '$RANLIB $RANLIBFLAGS $TARGET'
+
+def exists(env):
+    return env.Detect('ar')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/as.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/as.py
new file mode 100644
index 0000000..e9e40ac
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/as.py
@@ -0,0 +1,78 @@
+"""SCons.Tool.as
+
+Tool-specific initialization for as, the generic Posix assembler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/as.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+assemblers = ['as']
+
+ASSuffixes = ['.s', '.asm', '.ASM']
+ASPPSuffixes = ['.spp', '.SPP', '.sx']
+if SCons.Util.case_sensitive_suffixes('.s', '.S'):
+    ASPPSuffixes.extend(['.S'])
+else:
+    ASSuffixes.extend(['.S'])
+
+def generate(env):
+    """Add Builders and construction variables for as to an Environment."""
+    static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+    for suffix in ASSuffixes:
+        static_obj.add_action(suffix, SCons.Defaults.ASAction)
+        shared_obj.add_action(suffix, SCons.Defaults.ASAction)
+        static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
+        shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
+
+    for suffix in ASPPSuffixes:
+        static_obj.add_action(suffix, SCons.Defaults.ASPPAction)
+        shared_obj.add_action(suffix, SCons.Defaults.ASPPAction)
+        static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
+        shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
+
+    env['AS']        = env.Detect(assemblers) or 'as'
+    env['ASFLAGS']   = SCons.Util.CLVar('')
+    env['ASCOM']     = '$AS $ASFLAGS -o $TARGET $SOURCES'
+    env['ASPPFLAGS'] = '$ASFLAGS'
+    env['ASPPCOM']   = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES'
+
+def exists(env):
+    return env.Detect(assemblers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/bcc32.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/bcc32.py
new file mode 100644
index 0000000..f48945e
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/bcc32.py
@@ -0,0 +1,81 @@
+"""SCons.Tool.bcc32
+
+XXX
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/bcc32.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+import os.path
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+def findIt(program, env):
+    # First search in the SCons path and then the OS path:
+    borwin = env.WhereIs(program) or SCons.Util.WhereIs(program)
+    if borwin:
+        dir = os.path.dirname(borwin)
+        env.PrependENVPath('PATH', dir)
+    return borwin
+
+def generate(env):
+    findIt('bcc32', env)
+    """Add Builders and construction variables for bcc to an
+    Environment."""
+    static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+    for suffix in ['.c', '.cpp']:
+        static_obj.add_action(suffix, SCons.Defaults.CAction)
+        shared_obj.add_action(suffix, SCons.Defaults.ShCAction)
+        static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
+        shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
+
+    env['CC']        = 'bcc32'
+    env['CCFLAGS']   = SCons.Util.CLVar('')
+    env['CFLAGS']   = SCons.Util.CLVar('')
+    env['CCCOM']     = '$CC -q $CFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o$TARGET $SOURCES'
+    env['SHCC']      = '$CC'
+    env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
+    env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS')
+    env['SHCCCOM']   = '$SHCC -WD $SHCFLAGS $SHCCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o$TARGET $SOURCES'
+    env['CPPDEFPREFIX']  = '-D'
+    env['CPPDEFSUFFIX']  = ''
+    env['INCPREFIX']  = '-I'
+    env['INCSUFFIX']  = ''
+    env['SHOBJSUFFIX'] = '.dll'
+    env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0
+    env['CFILESUFFIX'] = '.cpp'
+
+def exists(env):
+    return findIt('bcc32', env)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/c++.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/c++.py
new file mode 100644
index 0000000..61ee41f
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/c++.py
@@ -0,0 +1,99 @@
+"""SCons.Tool.c++
+
+Tool-specific initialization for generic Posix C++ compilers.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/c++.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os.path
+
+import SCons.Tool
+import SCons.Defaults
+import SCons.Util
+
+compilers = ['CC', 'c++']
+
+CXXSuffixes = ['.cpp', '.cc', '.cxx', '.c++', '.C++', '.mm']
+if SCons.Util.case_sensitive_suffixes('.c', '.C'):
+    CXXSuffixes.append('.C')
+
+def iscplusplus(source):
+    if not source:
+        # Source might be None for unusual cases like SConf.
+        return 0
+    for s in source:
+        if s.sources:
+            ext = os.path.splitext(str(s.sources[0]))[1]
+            if ext in CXXSuffixes:
+                return 1
+    return 0
+
+def generate(env):
+    """
+    Add Builders and construction variables for Visual Age C++ compilers
+    to an Environment.
+    """
+    import SCons.Tool
+    import SCons.Tool.cc
+    static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+    for suffix in CXXSuffixes:
+        static_obj.add_action(suffix, SCons.Defaults.CXXAction)
+        shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction)
+        static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
+        shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
+
+    SCons.Tool.cc.add_common_cc_variables(env)
+
+    env['CXX']        = 'c++'
+    env['CXXFLAGS']   = SCons.Util.CLVar('')
+    env['CXXCOM']     = '$CXX -o $TARGET -c $CXXFLAGS $CCFLAGS $_CCCOMCOM $SOURCES'
+    env['SHCXX']      = '$CXX'
+    env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
+    env['SHCXXCOM']   = '$SHCXX -o $TARGET -c $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM $SOURCES'
+
+    env['CPPDEFPREFIX']  = '-D'
+    env['CPPDEFSUFFIX']  = ''
+    env['INCPREFIX']  = '-I'
+    env['INCSUFFIX']  = ''
+    env['SHOBJSUFFIX'] = '.os'
+    env['OBJSUFFIX'] = '.o'
+    env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0
+
+    env['CXXFILESUFFIX'] = '.cc'
+
+def exists(env):
+    return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/cc.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/cc.py
new file mode 100644
index 0000000..5e12f6e
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/cc.py
@@ -0,0 +1,102 @@
+"""SCons.Tool.cc
+
+Tool-specific initialization for generic Posix C compilers.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/cc.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Tool
+import SCons.Defaults
+import SCons.Util
+
+CSuffixes = ['.c', '.m']
+if not SCons.Util.case_sensitive_suffixes('.c', '.C'):
+    CSuffixes.append('.C')
+
+def add_common_cc_variables(env):
+    """
+    Add underlying common "C compiler" variables that
+    are used by multiple tools (specifically, c++).
+    """
+    if '_CCCOMCOM' not in env:
+        env['_CCCOMCOM'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS'
+        # It's a hack to test for darwin here, but the alternative
+        # of creating an applecc.py to contain this seems overkill.
+        # Maybe someday the Apple platform will require more setup and
+        # this logic will be moved.
+        env['FRAMEWORKS'] = SCons.Util.CLVar('')
+        env['FRAMEWORKPATH'] = SCons.Util.CLVar('')
+        if env['PLATFORM'] == 'darwin':
+            env['_CCCOMCOM'] = env['_CCCOMCOM'] + ' $_FRAMEWORKPATH'
+
+    if 'CCFLAGS' not in env:
+        env['CCFLAGS']   = SCons.Util.CLVar('')
+
+    if 'SHCCFLAGS' not in env:
+        env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
+
+def generate(env):
+    """
+    Add Builders and construction variables for C compilers to an Environment.
+    """
+    static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+    for suffix in CSuffixes:
+        static_obj.add_action(suffix, SCons.Defaults.CAction)
+        shared_obj.add_action(suffix, SCons.Defaults.ShCAction)
+        static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
+        shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
+
+    add_common_cc_variables(env)
+
+    env['CC']        = 'cc'
+    env['CFLAGS']    = SCons.Util.CLVar('')
+    env['CCCOM']     = '$CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES'
+    env['SHCC']      = '$CC'
+    env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS')
+    env['SHCCCOM']   = '$SHCC -o $TARGET -c $SHCFLAGS $SHCCFLAGS $_CCCOMCOM $SOURCES'
+
+    env['CPPDEFPREFIX']  = '-D'
+    env['CPPDEFSUFFIX']  = ''
+    env['INCPREFIX']  = '-I'
+    env['INCSUFFIX']  = ''
+    env['SHOBJSUFFIX'] = '.os'
+    env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0
+
+    env['CFILESUFFIX'] = '.c'
+
+def exists(env):
+    return env.Detect('cc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/cvf.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/cvf.py
new file mode 100644
index 0000000..c7c516b
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/cvf.py
@@ -0,0 +1,58 @@
+"""engine.SCons.Tool.cvf
+
+Tool-specific initialization for the Compaq Visual Fortran compiler.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/cvf.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import fortran
+
+compilers = ['f90']
+
+def generate(env):
+    """Add Builders and construction variables for compaq visual fortran to an Environment."""
+
+    fortran.generate(env)
+
+    env['FORTRAN']        = 'f90'
+    env['FORTRANCOM']     = '$FORTRAN $FORTRANFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}'
+    env['FORTRANPPCOM']   = '$FORTRAN $FORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}'
+    env['SHFORTRANCOM']   = '$SHFORTRAN $SHFORTRANFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}'
+    env['SHFORTRANPPCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}'
+    env['OBJSUFFIX']      = '.obj'
+    env['FORTRANMODDIR'] = '${TARGET.dir}'
+    env['FORTRANMODDIRPREFIX'] = '/module:'
+    env['FORTRANMODDIRSUFFIX'] = ''
+
+def exists(env):
+    return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/default.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/default.py
new file mode 100644
index 0000000..c2867d2
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/default.py
@@ -0,0 +1,50 @@
+"""SCons.Tool.default
+
+Initialization with a default tool list.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/default.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Tool
+
+def generate(env):
+    """Add default tools."""
+    for t in SCons.Tool.tool_list(env['PLATFORM'], env):
+        SCons.Tool.Tool(t)(env)
+
+def exists(env):
+    return 1
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/dmd.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/dmd.py
new file mode 100644
index 0000000..e07e848
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/dmd.py
@@ -0,0 +1,240 @@
+"""SCons.Tool.dmd
+
+Tool-specific initialization for the Digital Mars D compiler.
+(http://digitalmars.com/d)
+
+Coded by Andy Friesen (andy at ikagames.com)
+15 November 2003
+
+Amended by Russel Winder (russel at russel.org.uk)
+2010-02-07
+
+There are a number of problems with this script at this point in time.
+The one that irritates me the most is the Windows linker setup.  The D
+linker doesn't have a way to add lib paths on the commandline, as far
+as I can see.  You have to specify paths relative to the SConscript or
+use absolute paths.  To hack around it, add '#/blah'.  This will link
+blah.lib from the directory where SConstruct resides.
+
+Compiler variables:
+    DC - The name of the D compiler to use.  Defaults to dmd or gdmd,
+    whichever is found.
+    DPATH - List of paths to search for import modules.
+    DVERSIONS - List of version tags to enable when compiling.
+    DDEBUG - List of debug tags to enable when compiling.
+
+Linker related variables:
+    LIBS - List of library files to link in.
+    DLINK - Name of the linker to use.  Defaults to dmd or gdmd.
+    DLINKFLAGS - List of linker flags.
+
+Lib tool variables:
+    DLIB - Name of the lib tool to use.  Defaults to lib.
+    DLIBFLAGS - List of flags to pass to the lib tool.
+    LIBS - Same as for the linker. (libraries to pull into the .lib)
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/dmd.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+
+import SCons.Action
+import SCons.Builder
+import SCons.Defaults
+import SCons.Scanner.D
+import SCons.Tool
+
+# Adapted from c++.py
+def isD(source):
+    if not source:
+        return 0
+
+    for s in source:
+        if s.sources:
+            ext = os.path.splitext(str(s.sources[0]))[1]
+            if ext == '.d':
+                return 1
+    return 0
+
+smart_link = {}
+
+smart_lib = {}
+
+def generate(env):
+    global smart_link
+    global smart_lib
+
+    static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+    DAction = SCons.Action.Action('$DCOM', '$DCOMSTR')
+
+    static_obj.add_action('.d', DAction)
+    shared_obj.add_action('.d', DAction)
+    static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter)
+    shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter)
+
+    dc = env.Detect(['dmd', 'gdmd'])
+    env['DC'] = dc
+    env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -of$TARGET $SOURCES'
+    env['_DINCFLAGS'] = '$( ${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}  $)'
+    env['_DVERFLAGS'] = '$( ${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}  $)'
+    env['_DDEBUGFLAGS'] = '$( ${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)} $)'
+    env['_DFLAGS'] = '$( ${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)} $)'
+
+    env['DPATH'] = ['#/']
+    env['DFLAGS'] = []
+    env['DVERSIONS'] = []
+    env['DDEBUG'] = []
+
+    if dc:
+        # Add the path to the standard library.
+        # This is merely for the convenience of the dependency scanner.
+        dmd_path = env.WhereIs(dc)
+        if dmd_path:
+            x = dmd_path.rindex(dc)
+            phobosDir = dmd_path[:x] + '/../src/phobos'
+            if os.path.isdir(phobosDir):
+                env.Append(DPATH = [phobosDir])
+
+    env['DINCPREFIX'] = '-I'
+    env['DINCSUFFIX'] = ''
+    env['DVERPREFIX'] = '-version='
+    env['DVERSUFFIX'] = ''
+    env['DDEBUGPREFIX'] = '-debug='
+    env['DDEBUGSUFFIX'] = ''
+    env['DFLAGPREFIX'] = '-'
+    env['DFLAGSUFFIX'] = ''
+    env['DFILESUFFIX'] = '.d'
+
+    # Need to use the Digital Mars linker/lib on windows.
+    # *nix can just use GNU link.
+    if env['PLATFORM'] == 'win32':
+        env['DLINK'] = '$DC'
+        env['DLINKCOM'] = '$DLINK -of$TARGET $SOURCES $DFLAGS $DLINKFLAGS $_DLINKLIBFLAGS'
+        env['DLIB'] = 'lib'
+        env['DLIBCOM'] = '$DLIB $_DLIBFLAGS -c $TARGET $SOURCES $_DLINKLIBFLAGS'
+
+        env['_DLINKLIBFLAGS'] = '$( ${_concat(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'
+        env['_DLIBFLAGS'] = '$( ${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)} $)'
+        env['DLINKFLAGS'] = []
+        env['DLIBLINKPREFIX'] = ''
+        env['DLIBLINKSUFFIX'] = '.lib'
+        env['DLIBFLAGPREFIX'] = '-'
+        env['DLIBFLAGSUFFIX'] = ''
+        env['DLINKFLAGPREFIX'] = '-'
+        env['DLINKFLAGSUFFIX'] = ''
+
+        SCons.Tool.createStaticLibBuilder(env)
+
+        # Basically, we hijack the link and ar builders with our own.
+        # these builders check for the presence of D source, and swap out
+        # the system's defaults for the Digital Mars tools.  If there's no D
+        # source, then we silently return the previous settings.
+        linkcom = env.get('LINKCOM')
+        try:
+            env['SMART_LINKCOM'] = smart_link[linkcom]
+        except KeyError:
+            def _smartLink(source, target, env, for_signature,
+                           defaultLinker=linkcom):
+                if isD(source):
+                    # XXX I'm not sure how to add a $DLINKCOMSTR variable
+                    # so that it works with this _smartLink() logic,
+                    # and I don't have a D compiler/linker to try it out,
+                    # so we'll leave it alone for now.
+                    return '$DLINKCOM'
+                else:
+                    return defaultLinker
+            env['SMART_LINKCOM'] = smart_link[linkcom] = _smartLink
+
+        arcom = env.get('ARCOM')
+        try:
+            env['SMART_ARCOM'] = smart_lib[arcom]
+        except KeyError:
+            def _smartLib(source, target, env, for_signature,
+                         defaultLib=arcom):
+                if isD(source):
+                    # XXX I'm not sure how to add a $DLIBCOMSTR variable
+                    # so that it works with this _smartLib() logic, and
+                    # I don't have a D compiler/archiver to try it out,
+                    # so we'll leave it alone for now.
+                    return '$DLIBCOM'
+                else:
+                    return defaultLib
+            env['SMART_ARCOM'] = smart_lib[arcom] = _smartLib
+
+        # It is worth noting that the final space in these strings is
+        # absolutely pivotal.  SCons sees these as actions and not generators
+        # if it is not there. (very bad)
+        env['ARCOM'] = '$SMART_ARCOM '
+        env['LINKCOM'] = '$SMART_LINKCOM '
+    else: # assuming linux
+        linkcom = env.get('LINKCOM')
+        try:
+            env['SMART_LINKCOM'] = smart_link[linkcom]
+        except KeyError:
+            def _smartLink(source, target, env, for_signature,
+                           defaultLinker=linkcom, dc=dc):
+                if isD(source):
+                    try:
+                        libs = env['LIBS']
+                    except KeyError:
+                        libs = []
+                    if dc == 'dmd':
+                        # TODO: This assumes that the dmd executable is in the
+                        # bin directory and that the libraries are in a peer
+                        # directory lib.  This true of the Digital Mars
+                        # distribution but . . .
+                        import glob
+                        dHome = env.WhereIs(dc).replace('/dmd' , '/..')
+                        if glob.glob(dHome + '/lib/*phobos2*'):
+                            if 'phobos2' not in libs:
+                                env.Append(LIBPATH = [dHome + '/lib'])
+                                env.Append(LIBS = ['phobos2'])
+                                # TODO: Find out when there will be a
+                                # 64-bit version of D.
+                                env.Append(LINKFLAGS = ['-m32'])
+                        else:
+                            if 'phobos' not in libs:
+                                env.Append(LIBS = ['phobos'])
+                    elif dc is 'gdmd':
+                        env.Append(LIBS = ['gphobos'])
+                    if 'pthread' not in libs:
+                        env.Append(LIBS = ['pthread'])
+                    if 'm' not in libs:
+                        env.Append(LIBS = ['m'])
+                return defaultLinker
+            env['SMART_LINKCOM'] = smart_link[linkcom] = _smartLink
+
+        env['LINKCOM'] = '$SMART_LINKCOM '
+
+def exists(env):
+    return env.Detect(['dmd', 'gdmd'])
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/dvi.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/dvi.py
new file mode 100644
index 0000000..d51277b
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/dvi.py
@@ -0,0 +1,64 @@
+"""SCons.Tool.dvi
+
+Common DVI Builder definition for various other Tool modules that use it.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/dvi.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Builder
+import SCons.Tool
+
+DVIBuilder = None
+
+def generate(env):
+    try:
+        env['BUILDERS']['DVI']
+    except KeyError:
+        global DVIBuilder
+
+        if DVIBuilder is None:
+            # The suffix is hard-coded to '.dvi', not configurable via a
+            # construction variable like $DVISUFFIX, because the output
+            # file name is hard-coded within TeX.
+            DVIBuilder = SCons.Builder.Builder(action = {},
+                                               source_scanner = SCons.Tool.LaTeXScanner,
+                                               suffix = '.dvi',
+                                               emitter = {},
+                                               source_ext_match = None)
+
+        env['BUILDERS']['DVI'] = DVIBuilder
+
+def exists(env):
+    # This only puts a skeleton Builder in place, so if someone
+    # references this Tool directly, it's always "available."
+    return 1
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/dvipdf.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/dvipdf.py
new file mode 100644
index 0000000..70329a2
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/dvipdf.py
@@ -0,0 +1,124 @@
+"""SCons.Tool.dvipdf
+
+Tool-specific initialization for dvipdf.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Tool/dvipdf.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Action
+import SCons.Defaults
+import SCons.Tool.pdf
+import SCons.Tool.tex
+import SCons.Util
+
+_null = SCons.Scanner.LaTeX._null
+
+def DviPdfPsFunction(XXXDviAction, target = None, source= None, env=None):
+    """A builder for DVI files that sets the TEXPICTS environment
+       variable before running dvi2ps or dvipdf."""
+
+    try:
+        abspath = source[0].attributes.path
+    except AttributeError :
+        abspath =  ''
+
+    saved_env = SCons.Scanner.LaTeX.modify_env_var(env, 'TEXPICTS', abspath)
+
+    result = XXXDviAction(target, source, env)
+
+    if saved_env is _null:
+        try:
+            del env['ENV']['TEXPICTS']
+        except KeyError:
+            pass # was never set
+    else:
+        env['ENV']['TEXPICTS'] = saved_env
+
+    return result
+
+def DviPdfFunction(target = None, source= None, env=None):
+    result = DviPdfPsFunction(PDFAction,target,source,env)
+    return result
+
+def DviPdfStrFunction(target = None, source= None, env=None):
+    """A strfunction for dvipdf that returns the appropriate
+    command string for the no_exec options."""
+    if env.GetOption("no_exec"):
+        result = env.subst('$DVIPDFCOM',0,target,source)
+    else:
+        result = ''
+    return result
+
+PDFAction = None
+DVIPDFAction = None
+
+def PDFEmitter(target, source, env):
+    """Strips any .aux or .log files from the input source list.
+    These are created by the TeX Builder that in all likelihood was
+    used to generate the .dvi file we're using as input, and we only
+    care about the .dvi file.
+    """
+    def strip_suffixes(n):
+        return not SCons.Util.splitext(str(n))[1] in ['.aux', '.log']
+    source = list(filter(strip_suffixes, source))
+    return (target, source)
+
+def generate(env):
+    """Add Builders and construction variables for dvipdf to an Environment."""
+    global PDFAction
+    if PDFAction is None:
+        PDFAction = SCons.Action.Action('$DVIPDFCOM', '$DVIPDFCOMSTR')
+
+    global DVIPDFAction
+    if DVIPDFAction is None:
+        DVIPDFAction = SCons.Action.Action(DviPdfFunction, strfunction = DviPdfStrFunction)
+
+    import pdf
+    pdf.generate(env)
+
+    bld = env['BUILDERS']['PDF']
+    bld.add_action('.dvi', DVIPDFAction)
+    bld.add_emitter('.dvi', PDFEmitter)
+
+    env['DVIPDF']      = 'dvipdf'
+    env['DVIPDFFLAGS'] = SCons.Util.CLVar('')
+    env['DVIPDFCOM']   = 'cd ${TARGET.dir} && $DVIPDF $DVIPDFFLAGS ${SOURCE.file} ${TARGET.file}'
+
+    # Deprecated synonym.
+    env['PDFCOM']      = ['$DVIPDFCOM']
+
+def exists(env):
+    return env.Detect('dvipdf')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/dvips.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/dvips.py
new file mode 100644
index 0000000..b138a6c
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/dvips.py
@@ -0,0 +1,94 @@
+"""SCons.Tool.dvips
+
+Tool-specific initialization for dvips.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/dvips.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Action
+import SCons.Builder
+import SCons.Tool.dvipdf
+import SCons.Util
+
+def DviPsFunction(target = None, source= None, env=None):
+    result = SCons.Tool.dvipdf.DviPdfPsFunction(PSAction,target,source,env)
+    return result
+
+def DviPsStrFunction(target = None, source= None, env=None):
+    """A strfunction for dvipdf that returns the appropriate
+    command string for the no_exec options."""
+    if env.GetOption("no_exec"):
+        result = env.subst('$PSCOM',0,target,source)
+    else:
+        result = ''
+    return result
+
+PSAction = None
+DVIPSAction = None
+PSBuilder = None
+
+def generate(env):
+    """Add Builders and construction variables for dvips to an Environment."""
+    global PSAction
+    if PSAction is None:
+        PSAction = SCons.Action.Action('$PSCOM', '$PSCOMSTR')
+
+    global DVIPSAction
+    if DVIPSAction is None:
+        DVIPSAction = SCons.Action.Action(DviPsFunction, strfunction = DviPsStrFunction)
+
+    global PSBuilder
+    if PSBuilder is None:
+        PSBuilder = SCons.Builder.Builder(action = PSAction,
+                                          prefix = '$PSPREFIX',
+                                          suffix = '$PSSUFFIX',
+                                          src_suffix = '.dvi',
+                                          src_builder = 'DVI',
+                                          single_source=True)
+
+    env['BUILDERS']['PostScript'] = PSBuilder
+    
+    env['DVIPS']      = 'dvips'
+    env['DVIPSFLAGS'] = SCons.Util.CLVar('')
+    # I'm not quite sure I got the directories and filenames right for variant_dir
+    # We need to be in the correct directory for the sake of latex \includegraphics eps included files.
+    env['PSCOM']      = 'cd ${TARGET.dir} && $DVIPS $DVIPSFLAGS -o ${TARGET.file} ${SOURCE.file}'
+    env['PSPREFIX'] = ''
+    env['PSSUFFIX'] = '.ps'
+
+def exists(env):
+    return env.Detect('dvips')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/f03.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/f03.py
new file mode 100644
index 0000000..aebef24
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/f03.py
@@ -0,0 +1,63 @@
+"""engine.SCons.Tool.f03
+
+Tool-specific initialization for the generic Posix f03 Fortran compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/f03.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+import fortran
+from SCons.Tool.FortranCommon import add_all_to_env, add_f03_to_env
+
+compilers = ['f03']
+
+def generate(env):
+    add_all_to_env(env)
+    add_f03_to_env(env)
+
+    fcomp = env.Detect(compilers) or 'f03'
+    env['F03']  = fcomp
+    env['SHF03']  = fcomp
+
+    env['FORTRAN']  = fcomp
+    env['SHFORTRAN']  = fcomp
+
+
+def exists(env):
+    return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/f77.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/f77.py
new file mode 100644
index 0000000..514b2d3
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/f77.py
@@ -0,0 +1,62 @@
+"""engine.SCons.Tool.f77
+
+Tool-specific initialization for the generic Posix f77 Fortran compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/f77.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Defaults
+import SCons.Scanner.Fortran
+import SCons.Tool
+import SCons.Util
+from SCons.Tool.FortranCommon import add_all_to_env, add_f77_to_env
+
+compilers = ['f77']
+
+def generate(env):
+    add_all_to_env(env)
+    add_f77_to_env(env)
+
+    fcomp = env.Detect(compilers) or 'f77'
+    env['F77']  = fcomp
+    env['SHF77']  = fcomp
+
+    env['FORTRAN']  = fcomp
+    env['SHFORTRAN']  = fcomp
+
+def exists(env):
+    return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/f90.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/f90.py
new file mode 100644
index 0000000..5eb7d0a
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/f90.py
@@ -0,0 +1,62 @@
+"""engine.SCons.Tool.f90
+
+Tool-specific initialization for the generic Posix f90 Fortran compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/f90.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Defaults
+import SCons.Scanner.Fortran
+import SCons.Tool
+import SCons.Util
+from SCons.Tool.FortranCommon import add_all_to_env, add_f90_to_env
+
+compilers = ['f90']
+
+def generate(env):
+    add_all_to_env(env)
+    add_f90_to_env(env)
+
+    fc = env.Detect(compilers) or 'f90'
+    env['F90']  = fc
+    env['SHF90']  = fc
+
+    env['FORTRAN']  = fc
+    env['SHFORTRAN']  = fc
+
+def exists(env):
+    return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/f95.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/f95.py
new file mode 100644
index 0000000..9292014
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/f95.py
@@ -0,0 +1,63 @@
+"""engine.SCons.Tool.f95
+
+Tool-specific initialization for the generic Posix f95 Fortran compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/f95.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+import fortran
+from SCons.Tool.FortranCommon import add_all_to_env, add_f95_to_env
+
+compilers = ['f95']
+
+def generate(env):
+    add_all_to_env(env)
+    add_f95_to_env(env)
+
+    fcomp = env.Detect(compilers) or 'f95'
+    env['F95']  = fcomp
+    env['SHF95']  = fcomp
+
+    env['FORTRAN']  = fcomp
+    env['SHFORTRAN']  = fcomp
+
+
+def exists(env):
+    return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/filesystem.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/filesystem.py
new file mode 100644
index 0000000..a37fc1b
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/filesystem.py
@@ -0,0 +1,98 @@
+"""SCons.Tool.filesystem
+
+Tool-specific initialization for the filesystem tools.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/filesystem.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons
+from SCons.Tool.install import copyFunc
+
+copyToBuilder, copyAsBuilder = None, None
+
+def copyto_emitter(target, source, env):
+    """ changes the path of the source to be under the target (which
+    are assumed to be directories.
+    """
+    n_target = []
+
+    for t in target:
+        n_target = n_target + [t.File( str( s ) ) for s in source]
+
+    return (n_target, source)
+
+def copy_action_func(target, source, env):
+    assert( len(target) == len(source) ), "\ntarget: %s\nsource: %s" %(list(map(str, target)),list(map(str, source)))
+
+    for t, s in zip(target, source):
+        if copyFunc(t.get_path(), s.get_path(), env):
+            return 1
+
+    return 0
+
+def copy_action_str(target, source, env):
+    return env.subst_target_source(env['COPYSTR'], 0, target, source)
+
+copy_action = SCons.Action.Action( copy_action_func, copy_action_str )
+
+def generate(env):
+    try:
+        env['BUILDERS']['CopyTo']
+        env['BUILDERS']['CopyAs']
+    except KeyError, e:
+        global copyToBuilder
+        if copyToBuilder is None:
+            copyToBuilder = SCons.Builder.Builder(
+                             action         = copy_action,
+                             target_factory = env.fs.Dir,
+                             source_factory = env.fs.Entry,
+                             multi          = 1,
+                             emitter        = [ copyto_emitter, ] )
+
+        global copyAsBuilder
+        if copyAsBuilder is None:
+            copyAsBuilder = SCons.Builder.Builder(
+                             action         = copy_action,
+                             target_factory = env.fs.Entry,
+                             source_factory = env.fs.Entry )
+
+        env['BUILDERS']['CopyTo'] = copyToBuilder
+        env['BUILDERS']['CopyAs'] = copyAsBuilder
+
+        env['COPYSTR'] = 'Copy file(s): "$SOURCES" to "$TARGETS"'
+
+def exists(env):
+    return 1
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/fortran.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/fortran.py
new file mode 100644
index 0000000..fb96ab9
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/fortran.py
@@ -0,0 +1,62 @@
+"""SCons.Tool.fortran
+
+Tool-specific initialization for a generic Posix f77/f90 Fortran compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/fortran.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import re
+
+import SCons.Action
+import SCons.Defaults
+import SCons.Scanner.Fortran
+import SCons.Tool
+import SCons.Util
+from SCons.Tool.FortranCommon import add_all_to_env, add_fortran_to_env
+
+compilers = ['f95', 'f90', 'f77']
+
+def generate(env):
+    add_all_to_env(env)
+    add_fortran_to_env(env)
+
+    fc = env.Detect(compilers) or 'f77'
+    env['SHFORTRAN'] = fc
+    env['FORTRAN'] = fc
+
+def exists(env):
+    return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/g++.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/g++.py
new file mode 100644
index 0000000..728d501
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/g++.py
@@ -0,0 +1,90 @@
+"""SCons.Tool.g++
+
+Tool-specific initialization for g++.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/g++.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os.path
+import re
+import subprocess
+
+import SCons.Tool
+import SCons.Util
+
+cplusplus = __import__('c++', globals(), locals(), [])
+
+compilers = ['g++']
+
+def generate(env):
+    """Add Builders and construction variables for g++ to an Environment."""
+    static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+    cplusplus.generate(env)
+
+    env['CXX']        = env.Detect(compilers)
+
+    # platform specific settings
+    if env['PLATFORM'] == 'aix':
+        env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS -mminimal-toc')
+        env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
+        env['SHOBJSUFFIX'] = '$OBJSUFFIX'
+    elif env['PLATFORM'] == 'hpux':
+        env['SHOBJSUFFIX'] = '.pic.o'
+    elif env['PLATFORM'] == 'sunos':
+        env['SHOBJSUFFIX'] = '.pic.o'
+    # determine compiler version
+    if env['CXX']:
+        #pipe = SCons.Action._subproc(env, [env['CXX'], '-dumpversion'],
+        pipe = SCons.Action._subproc(env, [env['CXX'], '--version'],
+                                     stdin = 'devnull',
+                                     stderr = 'devnull',
+                                     stdout = subprocess.PIPE)
+        if pipe.wait() != 0: return
+        # -dumpversion was added in GCC 3.0.  As long as we're supporting
+        # GCC versions older than that, we should use --version and a
+        # regular expression.
+        #line = pipe.stdout.read().strip()
+        #if line:
+        #    env['CXXVERSION'] = line
+        line = pipe.stdout.readline()
+        match = re.search(r'[0-9]+(\.[0-9]+)+', line)
+        if match:
+            env['CXXVERSION'] = match.group(0)
+
+def exists(env):
+    return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/g77.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/g77.py
new file mode 100644
index 0000000..91ea365
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/g77.py
@@ -0,0 +1,73 @@
+"""engine.SCons.Tool.g77
+
+Tool-specific initialization for g77.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/g77.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Util
+from SCons.Tool.FortranCommon import add_all_to_env, add_f77_to_env
+
+compilers = ['g77', 'f77']
+
+def generate(env):
+    """Add Builders and construction variables for g77 to an Environment."""
+    add_all_to_env(env)
+    add_f77_to_env(env)
+
+    fcomp = env.Detect(compilers) or 'g77'
+    if env['PLATFORM'] in ['cygwin', 'win32']:
+        env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS')
+        env['SHF77FLAGS'] = SCons.Util.CLVar('$F77FLAGS')
+    else:
+        env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS -fPIC')
+        env['SHF77FLAGS'] = SCons.Util.CLVar('$F77FLAGS -fPIC')
+
+    env['FORTRAN'] = fcomp
+    env['SHFORTRAN'] = '$FORTRAN'
+
+    env['F77'] = fcomp
+    env['SHF77'] = '$F77'
+
+    env['INCFORTRANPREFIX'] = "-I"
+    env['INCFORTRANSUFFIX'] = ""
+
+    env['INCF77PREFIX'] = "-I"
+    env['INCF77SUFFIX'] = ""
+
+def exists(env):
+    return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/gas.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/gas.py
new file mode 100644
index 0000000..e11e6ea
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/gas.py
@@ -0,0 +1,53 @@
+"""SCons.Tool.gas
+
+Tool-specific initialization for as, the Gnu assembler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/gas.py 5183 2010/11/25 14:46:21 bdeegan"
+
+as_module = __import__('as', globals(), locals(), [])
+
+assemblers = ['as', 'gas']
+
+def generate(env):
+    """Add Builders and construction variables for as to an Environment."""
+    as_module.generate(env)
+
+    env['AS']        = env.Detect(assemblers) or 'as'
+
+def exists(env):
+    return env.Detect(assemblers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/gcc.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/gcc.py
new file mode 100644
index 0000000..ef244e0
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/gcc.py
@@ -0,0 +1,80 @@
+"""SCons.Tool.gcc
+
+Tool-specific initialization for gcc.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/gcc.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import cc
+import os
+import re
+import subprocess
+
+import SCons.Util
+
+compilers = ['gcc', 'cc']
+
+def generate(env):
+    """Add Builders and construction variables for gcc to an Environment."""
+    cc.generate(env)
+
+    env['CC'] = env.Detect(compilers) or 'gcc'
+    if env['PLATFORM'] in ['cygwin', 'win32']:
+        env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
+    else:
+        env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS -fPIC')
+    # determine compiler version
+    if env['CC']:
+        #pipe = SCons.Action._subproc(env, [env['CC'], '-dumpversion'],
+        pipe = SCons.Action._subproc(env, [env['CC'], '--version'],
+                                     stdin = 'devnull',
+                                     stderr = 'devnull',
+                                     stdout = subprocess.PIPE)
+        if pipe.wait() != 0: return
+        # -dumpversion was added in GCC 3.0.  As long as we're supporting
+        # GCC versions older than that, we should use --version and a
+        # regular expression.
+        #line = pipe.stdout.read().strip()
+        #if line:
+        #    env['CCVERSION'] = line
+        line = pipe.stdout.readline()
+        match = re.search(r'[0-9]+(\.[0-9]+)+', line)
+        if match:
+            env['CCVERSION'] = match.group(0)
+
+def exists(env):
+    return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/gfortran.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/gfortran.py
new file mode 100644
index 0000000..1903466
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/gfortran.py
@@ -0,0 +1,64 @@
+"""SCons.Tool.gfortran
+
+Tool-specific initialization for gfortran, the GNU Fortran 95/Fortran
+2003 compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/gfortran.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Util
+
+import fortran
+
+def generate(env):
+    """Add Builders and construction variables for gfortran to an
+    Environment."""
+    fortran.generate(env)
+
+    for dialect in ['F77', 'F90', 'FORTRAN', 'F95', 'F03']:
+        env['%s' % dialect] = 'gfortran'
+        env['SH%s' % dialect] = '$%s' % dialect
+        if env['PLATFORM'] in ['cygwin', 'win32']:
+            env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS' % dialect)
+        else:
+            env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS -fPIC' % dialect)
+
+        env['INC%sPREFIX' % dialect] = "-I"
+        env['INC%sSUFFIX' % dialect] = ""
+
+def exists(env):
+    return env.Detect('gfortran')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/gnulink.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/gnulink.py
new file mode 100644
index 0000000..f1d6279
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/gnulink.py
@@ -0,0 +1,63 @@
+"""SCons.Tool.gnulink
+
+Tool-specific initialization for the gnu linker.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/gnulink.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Util
+
+import link
+
+linkers = ['g++', 'gcc']
+
+def generate(env):
+    """Add Builders and construction variables for gnulink to an Environment."""
+    link.generate(env)
+
+    if env['PLATFORM'] == 'hpux':
+        env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared -fPIC')
+
+    # __RPATH is set to $_RPATH in the platform specification if that
+    # platform supports it.
+    env.Append(LINKFLAGS=['$__RPATH'])
+    env['RPATHPREFIX'] = '-Wl,-rpath='
+    env['RPATHSUFFIX'] = ''
+    env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
+    
+def exists(env):
+    return env.Detect(linkers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/gs.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/gs.py
new file mode 100644
index 0000000..a35feeb
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/gs.py
@@ -0,0 +1,81 @@
+"""SCons.Tool.gs
+
+Tool-specific initialization for Ghostscript.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/gs.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Action
+import SCons.Platform
+import SCons.Util
+
+# Ghostscript goes by different names on different platforms...
+platform = SCons.Platform.platform_default()
+
+if platform == 'os2':
+    gs = 'gsos2'
+elif platform == 'win32':
+    gs = 'gswin32c'
+else:
+    gs = 'gs'
+
+GhostscriptAction = None
+
+def generate(env):
+    """Add Builders and construction variables for Ghostscript to an
+    Environment."""
+
+    global GhostscriptAction
+    if GhostscriptAction is None:
+        GhostscriptAction = SCons.Action.Action('$GSCOM', '$GSCOMSTR')
+
+    import pdf
+    pdf.generate(env)
+
+    bld = env['BUILDERS']['PDF']
+    bld.add_action('.ps', GhostscriptAction)
+
+    env['GS']      = gs
+    env['GSFLAGS'] = SCons.Util.CLVar('-dNOPAUSE -dBATCH -sDEVICE=pdfwrite')
+    env['GSCOM']   = '$GS $GSFLAGS -sOutputFile=$TARGET $SOURCES'
+
+
+def exists(env):
+    if 'PS2PDF' in env:
+        return env.Detect(env['PS2PDF'])
+    else:
+        return env.Detect(gs) or SCons.Util.WhereIs(gs)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/hpc++.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/hpc++.py
new file mode 100644
index 0000000..06ae4ed
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/hpc++.py
@@ -0,0 +1,84 @@
+"""SCons.Tool.hpc++
+
+Tool-specific initialization for c++ on HP/UX.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/hpc++.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os.path
+
+import SCons.Util
+
+cplusplus = __import__('c++', globals(), locals(), [])
+
+acc = None
+
+# search for the acc compiler and linker front end
+
+try:
+    dirs = os.listdir('/opt')
+except (IOError, OSError):
+    # Not being able to read the directory because it doesn't exist
+    # (IOError) or isn't readable (OSError) is okay.
+    dirs = []
+
+for dir in dirs:
+    cc = '/opt/' + dir + '/bin/aCC'
+    if os.path.exists(cc):
+        acc = cc
+        break
+
+        
+def generate(env):
+    """Add Builders and construction variables for g++ to an Environment."""
+    cplusplus.generate(env)
+
+    if acc:
+        env['CXX']        = acc or 'aCC'
+        env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS +Z')
+        # determine version of aCC
+        line = os.popen(acc + ' -V 2>&1').readline().rstrip()
+        if line.find('aCC: HP ANSI C++') == 0:
+            env['CXXVERSION'] = line.split()[-1]
+
+        if env['PLATFORM'] == 'cygwin':
+            env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
+        else:
+            env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS +Z')
+
+def exists(env):
+    return acc
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/hpcc.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/hpcc.py
new file mode 100644
index 0000000..21deeb7
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/hpcc.py
@@ -0,0 +1,53 @@
+"""SCons.Tool.hpcc
+
+Tool-specific initialization for HP aCC and cc.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/hpcc.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Util
+
+import cc
+
+def generate(env):
+    """Add Builders and construction variables for aCC & cc to an Environment."""
+    cc.generate(env)
+
+    env['CXX']        = 'aCC'
+    env['SHCCFLAGS']  = SCons.Util.CLVar('$CCFLAGS +Z')
+
+def exists(env):
+    return env.Detect('aCC')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/hplink.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/hplink.py
new file mode 100644
index 0000000..ffa8e88
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/hplink.py
@@ -0,0 +1,77 @@
+"""SCons.Tool.hplink
+
+Tool-specific initialization for the HP linker.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/hplink.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+import os.path
+
+import SCons.Util
+
+import link
+
+ccLinker = None
+
+# search for the acc compiler and linker front end
+
+try:
+    dirs = os.listdir('/opt')
+except (IOError, OSError):
+    # Not being able to read the directory because it doesn't exist
+    # (IOError) or isn't readable (OSError) is okay.
+    dirs = []
+
+for dir in dirs:
+    linker = '/opt/' + dir + '/bin/aCC'
+    if os.path.exists(linker):
+        ccLinker = linker
+        break
+
+def generate(env):
+    """
+    Add Builders and construction variables for Visual Age linker to
+    an Environment.
+    """
+    link.generate(env)
+    
+    env['LINKFLAGS']   = SCons.Util.CLVar('-Wl,+s -Wl,+vnocompatwarnings')
+    env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -b')
+    env['SHLIBSUFFIX'] = '.sl'
+
+def exists(env):
+    return ccLinker
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/icc.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/icc.py
new file mode 100644
index 0000000..ed166f2
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/icc.py
@@ -0,0 +1,59 @@
+"""engine.SCons.Tool.icc
+
+Tool-specific initialization for the OS/2 icc compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/icc.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import cc
+
+def generate(env):
+    """Add Builders and construction variables for the OS/2 to an Environment."""
+    cc.generate(env)
+
+    env['CC']         = 'icc'
+    env['CCCOM']      = '$CC $CFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo$TARGET'
+    env['CXXCOM']     = '$CXX $CXXFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo$TARGET'
+    env['CPPDEFPREFIX']  = '/D'
+    env['CPPDEFSUFFIX']  = ''
+    env['INCPREFIX']  = '/I'
+    env['INCSUFFIX']  = ''
+    env['CFILESUFFIX'] = '.c'
+    env['CXXFILESUFFIX'] = '.cc'
+
+def exists(env):
+    return env.Detect('icc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/icl.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/icl.py
new file mode 100644
index 0000000..aeb20d1
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/icl.py
@@ -0,0 +1,52 @@
+"""engine.SCons.Tool.icl
+
+Tool-specific initialization for the Intel C/C++ compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/icl.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Tool.intelc
+
+# This has been completely superceded by intelc.py, which can
+# handle both Windows and Linux versions.
+
+def generate(*args, **kw):
+    """Add Builders and construction variables for icl to an Environment."""
+    return SCons.Tool.intelc.generate(*args, **kw)
+
+def exists(*args, **kw):
+    return SCons.Tool.intelc.exists(*args, **kw)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/ifl.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/ifl.py
new file mode 100644
index 0000000..f7ce5f6
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/ifl.py
@@ -0,0 +1,72 @@
+"""SCons.Tool.ifl
+
+Tool-specific initialization for the Intel Fortran compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/ifl.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Defaults
+from SCons.Scanner.Fortran import FortranScan
+from FortranCommon import add_all_to_env
+
+def generate(env):
+    """Add Builders and construction variables for ifl to an Environment."""
+    fscan = FortranScan("FORTRANPATH")
+    SCons.Tool.SourceFileScanner.add_scanner('.i', fscan)
+    SCons.Tool.SourceFileScanner.add_scanner('.i90', fscan)
+
+    if 'FORTRANFILESUFFIXES' not in env:
+        env['FORTRANFILESUFFIXES'] = ['.i']
+    else:
+        env['FORTRANFILESUFFIXES'].append('.i')
+
+    if 'F90FILESUFFIXES' not in env:
+        env['F90FILESUFFIXES'] = ['.i90']
+    else:
+        env['F90FILESUFFIXES'].append('.i90')
+
+    add_all_to_env(env)
+
+    env['FORTRAN']        = 'ifl'
+    env['SHFORTRAN']      = '$FORTRAN'
+    env['FORTRANCOM']     = '$FORTRAN $FORTRANFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET'
+    env['FORTRANPPCOM']   = '$FORTRAN $FORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET'
+    env['SHFORTRANCOM']   = '$SHFORTRAN $SHFORTRANFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET'
+    env['SHFORTRANPPCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET'
+
+def exists(env):
+    return env.Detect('ifl')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/ifort.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/ifort.py
new file mode 100644
index 0000000..64162af
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/ifort.py
@@ -0,0 +1,88 @@
+"""SCons.Tool.ifort
+
+Tool-specific initialization for newer versions of the Intel Fortran Compiler
+for Linux/Windows (and possibly Mac OS X).
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/ifort.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Defaults
+from SCons.Scanner.Fortran import FortranScan
+from FortranCommon import add_all_to_env
+
+def generate(env):
+    """Add Builders and construction variables for ifort to an Environment."""
+    # ifort supports Fortran 90 and Fortran 95
+    # Additionally, ifort recognizes more file extensions.
+    fscan = FortranScan("FORTRANPATH")
+    SCons.Tool.SourceFileScanner.add_scanner('.i', fscan)
+    SCons.Tool.SourceFileScanner.add_scanner('.i90', fscan)
+
+    if 'FORTRANFILESUFFIXES' not in env:
+        env['FORTRANFILESUFFIXES'] = ['.i']
+    else:
+        env['FORTRANFILESUFFIXES'].append('.i')
+
+    if 'F90FILESUFFIXES' not in env:
+        env['F90FILESUFFIXES'] = ['.i90']
+    else:
+        env['F90FILESUFFIXES'].append('.i90')
+
+    add_all_to_env(env)
+
+    fc = 'ifort'
+
+    for dialect in ['F77', 'F90', 'FORTRAN', 'F95']:
+        env['%s' % dialect] = fc
+        env['SH%s' % dialect] = '$%s' % dialect
+        if env['PLATFORM'] == 'posix':
+            env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS -fPIC' % dialect)
+
+    if env['PLATFORM'] == 'win32':
+        # On Windows, the ifort compiler specifies the object on the
+        # command line with -object:, not -o.  Massage the necessary
+        # command-line construction variables.
+        for dialect in ['F77', 'F90', 'FORTRAN', 'F95']:
+            for var in ['%sCOM' % dialect, '%sPPCOM' % dialect,
+                        'SH%sCOM' % dialect, 'SH%sPPCOM' % dialect]:
+                env[var] = env[var].replace('-o $TARGET', '-object:$TARGET')
+        env['FORTRANMODDIRPREFIX'] = "/module:"
+    else:
+        env['FORTRANMODDIRPREFIX'] = "-module "
+
+def exists(env):
+    return env.Detect('ifort')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/ilink.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/ilink.py
new file mode 100644
index 0000000..2a4b988
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/ilink.py
@@ -0,0 +1,59 @@
+"""SCons.Tool.ilink
+
+Tool-specific initialization for the OS/2 ilink linker.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/ilink.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+def generate(env):
+    """Add Builders and construction variables for ilink to an Environment."""
+    SCons.Tool.createProgBuilder(env)
+    
+    env['LINK']        = 'ilink'
+    env['LINKFLAGS']   = SCons.Util.CLVar('')
+    env['LINKCOM']     = '$LINK $LINKFLAGS /O:$TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+    env['LIBDIRPREFIX']='/LIBPATH:'
+    env['LIBDIRSUFFIX']=''
+    env['LIBLINKPREFIX']=''
+    env['LIBLINKSUFFIX']='$LIBSUFFIX'
+
+def exists(env):
+    return env.Detect('ilink')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/ilink32.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/ilink32.py
new file mode 100644
index 0000000..a7d04e4
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/ilink32.py
@@ -0,0 +1,60 @@
+"""SCons.Tool.ilink32
+
+XXX
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/ilink32.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Tool
+import SCons.Tool.bcc32
+import SCons.Util
+
+def generate(env):
+    """Add Builders and construction variables for Borland ilink to an
+    Environment."""
+    SCons.Tool.createSharedLibBuilder(env)
+    SCons.Tool.createProgBuilder(env)
+
+    env['LINK']        = '$CC'
+    env['LINKFLAGS']   = SCons.Util.CLVar('')
+    env['LINKCOM']     = '$LINK -q $LINKFLAGS -e$TARGET $SOURCES $LIBS'
+    env['LIBDIRPREFIX']=''
+    env['LIBDIRSUFFIX']=''
+    env['LIBLINKPREFIX']=''
+    env['LIBLINKSUFFIX']='$LIBSUFFIX'
+
+
+def exists(env):
+    # Uses bcc32 to do linking as it generally knows where the standard
+    # LIBS are and set up the linking correctly
+    return SCons.Tool.bcc32.findIt('bcc32', env)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/install.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/install.py
new file mode 100644
index 0000000..86a08a9
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/install.py
@@ -0,0 +1,283 @@
+"""SCons.Tool.install
+
+Tool-specific initialization for the install tool.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/install.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+import shutil
+import stat
+
+import SCons.Action
+from SCons.Util import make_path_relative
+
+#
+# We keep track of *all* installed files.
+_INSTALLED_FILES = []
+_UNIQUE_INSTALLED_FILES = None
+
+class CopytreeError(EnvironmentError):
+    pass
+                
+# This is a patched version of shutil.copytree from python 2.5.  It
+# doesn't fail if the dir exists, which regular copytree does
+# (annoyingly).  Note the XXX comment in the docstring.
+def scons_copytree(src, dst, symlinks=False):
+    """Recursively copy a directory tree using copy2().
+
+    The destination directory must not already exist.
+    If exception(s) occur, an CopytreeError is raised with a list of reasons.
+
+    If the optional symlinks flag is true, symbolic links in the
+    source tree result in symbolic links in the destination tree; if
+    it is false, the contents of the files pointed to by symbolic
+    links are copied.
+
+    XXX Consider this example code rather than the ultimate tool.
+
+    """
+    names = os.listdir(src)
+    # garyo at genarts.com fix: check for dir before making dirs.
+    if not os.path.exists(dst):
+        os.makedirs(dst)
+    errors = []
+    for name in names:
+        srcname = os.path.join(src, name)
+        dstname = os.path.join(dst, name)
+        try:
+            if symlinks and os.path.islink(srcname):
+                linkto = os.readlink(srcname)
+                os.symlink(linkto, dstname)
+            elif os.path.isdir(srcname):
+                scons_copytree(srcname, dstname, symlinks)
+            else:
+                shutil.copy2(srcname, dstname)
+            # XXX What about devices, sockets etc.?
+        except (IOError, os.error), why:
+            errors.append((srcname, dstname, str(why)))
+        # catch the CopytreeError from the recursive copytree so that we can
+        # continue with other files
+        except CopytreeError, err:
+            errors.extend(err.args[0])
+    try:
+        shutil.copystat(src, dst)
+    except WindowsError:
+        # can't copy file access times on Windows
+        pass
+    except OSError, why:
+        errors.extend((src, dst, str(why)))
+    if errors:
+        raise CopytreeError, errors
+
+
+#
+# Functions doing the actual work of the Install Builder.
+#
+def copyFunc(dest, source, env):
+    """Install a source file or directory into a destination by copying,
+    (including copying permission/mode bits)."""
+
+    if os.path.isdir(source):
+        if os.path.exists(dest):
+            if not os.path.isdir(dest):
+                raise SCons.Errors.UserError("cannot overwrite non-directory `%s' with a directory `%s'" % (str(dest), str(source)))
+        else:
+            parent = os.path.split(dest)[0]
+            if not os.path.exists(parent):
+                os.makedirs(parent)
+        scons_copytree(source, dest)
+    else:
+        shutil.copy2(source, dest)
+        st = os.stat(source)
+        os.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
+
+    return 0
+
+def installFunc(target, source, env):
+    """Install a source file into a target using the function specified
+    as the INSTALL construction variable."""
+    try:
+        install = env['INSTALL']
+    except KeyError:
+        raise SCons.Errors.UserError('Missing INSTALL construction variable.')
+
+    assert len(target)==len(source), \
+           "Installing source %s into target %s: target and source lists must have same length."%(list(map(str, source)), list(map(str, target)))
+    for t,s in zip(target,source):
+        if install(t.get_path(),s.get_path(),env):
+            return 1
+
+    return 0
+
+def stringFunc(target, source, env):
+    installstr = env.get('INSTALLSTR')
+    if installstr:
+        return env.subst_target_source(installstr, 0, target, source)
+    target = str(target[0])
+    source = str(source[0])
+    if os.path.isdir(source):
+        type = 'directory'
+    else:
+        type = 'file'
+    return 'Install %s: "%s" as "%s"' % (type, source, target)
+
+#
+# Emitter functions
+#
+def add_targets_to_INSTALLED_FILES(target, source, env):
+    """ an emitter that adds all target files to the list stored in the
+    _INSTALLED_FILES global variable. This way all installed files of one
+    scons call will be collected.
+    """
+    global _INSTALLED_FILES, _UNIQUE_INSTALLED_FILES
+    _INSTALLED_FILES.extend(target)
+    _UNIQUE_INSTALLED_FILES = None
+    return (target, source)
+
+class DESTDIR_factory(object):
+    """ a node factory, where all files will be relative to the dir supplied
+    in the constructor.
+    """
+    def __init__(self, env, dir):
+        self.env = env
+        self.dir = env.arg2nodes( dir, env.fs.Dir )[0]
+
+    def Entry(self, name):
+        name = make_path_relative(name)
+        return self.dir.Entry(name)
+
+    def Dir(self, name):
+        name = make_path_relative(name)
+        return self.dir.Dir(name)
+
+#
+# The Builder Definition
+#
+install_action   = SCons.Action.Action(installFunc, stringFunc)
+installas_action = SCons.Action.Action(installFunc, stringFunc)
+
+BaseInstallBuilder               = None
+
+def InstallBuilderWrapper(env, target=None, source=None, dir=None, **kw):
+    if target and dir:
+        import SCons.Errors
+        raise SCons.Errors.UserError("Both target and dir defined for Install(), only one may be defined.")
+    if not dir:
+        dir=target
+
+    import SCons.Script
+    install_sandbox = SCons.Script.GetOption('install_sandbox')
+    if install_sandbox:
+        target_factory = DESTDIR_factory(env, install_sandbox)
+    else:
+        target_factory = env.fs
+
+    try:
+        dnodes = env.arg2nodes(dir, target_factory.Dir)
+    except TypeError:
+        raise SCons.Errors.UserError("Target `%s' of Install() is a file, but should be a directory.  Perhaps you have the Install() arguments backwards?" % str(dir))
+    sources = env.arg2nodes(source, env.fs.Entry)
+    tgt = []
+    for dnode in dnodes:
+        for src in sources:
+            # Prepend './' so the lookup doesn't interpret an initial
+            # '#' on the file name portion as meaning the Node should
+            # be relative to the top-level SConstruct directory.
+            target = env.fs.Entry('.'+os.sep+src.name, dnode)
+            #tgt.extend(BaseInstallBuilder(env, target, src, **kw))
+            tgt.extend(BaseInstallBuilder(env, target, src, **kw))
+    return tgt
+
+def InstallAsBuilderWrapper(env, target=None, source=None, **kw):
+    result = []
+    for src, tgt in map(lambda x, y: (x, y), source, target):
+        #result.extend(BaseInstallBuilder(env, tgt, src, **kw))
+        result.extend(BaseInstallBuilder(env, tgt, src, **kw))
+    return result
+
+added = None
+
+def generate(env):
+
+    from SCons.Script import AddOption, GetOption
+    global added
+    if not added:
+        added = 1
+        AddOption('--install-sandbox',
+                  dest='install_sandbox',
+                  type="string",
+                  action="store",
+                  help='A directory under which all installed files will be placed.')
+
+    global BaseInstallBuilder
+    if BaseInstallBuilder is None:
+        install_sandbox = GetOption('install_sandbox')
+        if install_sandbox:
+            target_factory = DESTDIR_factory(env, install_sandbox)
+        else:
+            target_factory = env.fs
+
+        BaseInstallBuilder = SCons.Builder.Builder(
+                              action         = install_action,
+                              target_factory = target_factory.Entry,
+                              source_factory = env.fs.Entry,
+                              multi          = 1,
+                              emitter        = [ add_targets_to_INSTALLED_FILES, ],
+                              name           = 'InstallBuilder')
+
+    env['BUILDERS']['_InternalInstall'] = InstallBuilderWrapper
+    env['BUILDERS']['_InternalInstallAs'] = InstallAsBuilderWrapper
+
+    # We'd like to initialize this doing something like the following,
+    # but there isn't yet support for a ${SOURCE.type} expansion that
+    # will print "file" or "directory" depending on what's being
+    # installed.  For now we punt by not initializing it, and letting
+    # the stringFunc() that we put in the action fall back to the
+    # hand-crafted default string if it's not set.
+    #
+    #try:
+    #    env['INSTALLSTR']
+    #except KeyError:
+    #    env['INSTALLSTR'] = 'Install ${SOURCE.type}: "$SOURCES" as "$TARGETS"'
+
+    try:
+        env['INSTALL']
+    except KeyError:
+        env['INSTALL']    = copyFunc
+
+def exists(env):
+    return 1
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/intelc.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/intelc.py
new file mode 100644
index 0000000..0562d28
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/intelc.py
@@ -0,0 +1,518 @@
+"""SCons.Tool.icl
+
+Tool-specific initialization for the Intel C/C++ compiler.
+Supports Linux and Windows compilers, v7 and up.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+from __future__ import division
+
+__revision__ = "src/engine/SCons/Tool/intelc.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import math, sys, os.path, glob, string, re
+
+is_windows = sys.platform == 'win32'
+is_win64 = is_windows and (os.environ['PROCESSOR_ARCHITECTURE'] == 'AMD64' or 
+                           ('PROCESSOR_ARCHITEW6432' in os.environ and
+                            os.environ['PROCESSOR_ARCHITEW6432'] == 'AMD64'))
+is_linux = sys.platform == 'linux2'
+is_mac     = sys.platform == 'darwin'
+
+if is_windows:
+    import SCons.Tool.msvc
+elif is_linux:
+    import SCons.Tool.gcc
+elif is_mac:
+    import SCons.Tool.gcc
+import SCons.Util
+import SCons.Warnings
+
+# Exceptions for this tool
+class IntelCError(SCons.Errors.InternalError):
+    pass
+class MissingRegistryError(IntelCError): # missing registry entry
+    pass
+class MissingDirError(IntelCError):     # dir not found
+    pass
+class NoRegistryModuleError(IntelCError): # can't read registry at all
+    pass
+
+def uniquify(s):
+    """Return a sequence containing only one copy of each unique element from input sequence s.
+    Does not preserve order.
+    Input sequence must be hashable (i.e. must be usable as a dictionary key)."""
+    u = {}
+    for x in s:
+        u[x] = 1
+    return list(u.keys())
+
+def linux_ver_normalize(vstr):
+    """Normalize a Linux compiler version number.
+    Intel changed from "80" to "9.0" in 2005, so we assume if the number
+    is greater than 60 it's an old-style number and otherwise new-style.
+    Always returns an old-style float like 80 or 90 for compatibility with Windows.
+    Shades of Y2K!"""
+    # Check for version number like 9.1.026: return 91.026
+    m = re.match(r'([0-9]+)\.([0-9]+)\.([0-9]+)', vstr)
+    if m:
+        vmaj,vmin,build = m.groups()
+        return float(vmaj) * 10. + float(vmin) + float(build) / 1000.;
+    else:
+        f = float(vstr)
+        if is_windows:
+            return f
+        else:
+            if f < 60: return f * 10.0
+            else: return f
+
+def check_abi(abi):
+    """Check for valid ABI (application binary interface) name,
+    and map into canonical one"""
+    if not abi:
+        return None
+    abi = abi.lower()
+    # valid_abis maps input name to canonical name
+    if is_windows:
+        valid_abis = {'ia32'  : 'ia32',
+                      'x86'   : 'ia32',
+                      'ia64'  : 'ia64',
+                      'em64t' : 'em64t',
+                      'amd64' : 'em64t'}
+    if is_linux:
+        valid_abis = {'ia32'   : 'ia32',
+                      'x86'    : 'ia32',
+                      'x86_64' : 'x86_64',
+                      'em64t'  : 'x86_64',
+                      'amd64'  : 'x86_64'}
+    if is_mac:
+        valid_abis = {'ia32'   : 'ia32',
+                      'x86'    : 'ia32',
+                      'x86_64' : 'x86_64',
+                      'em64t'  : 'x86_64'}
+    try:
+        abi = valid_abis[abi]
+    except KeyError:
+        raise SCons.Errors.UserError("Intel compiler: Invalid ABI %s, valid values are %s"% \
+              (abi, list(valid_abis.keys())))
+    return abi
+
+def vercmp(a, b):
+    """Compare strings as floats,
+    but Intel changed Linux naming convention at 9.0"""
+    return cmp(linux_ver_normalize(b), linux_ver_normalize(a))
+
+def get_version_from_list(v, vlist):
+    """See if we can match v (string) in vlist (list of strings)
+    Linux has to match in a fuzzy way."""
+    if is_windows:
+        # Simple case, just find it in the list
+        if v in vlist: return v
+        else: return None
+    else:
+        # Fuzzy match: normalize version number first, but still return
+        # original non-normalized form.
+        fuzz = 0.001
+        for vi in vlist:
+            if math.fabs(linux_ver_normalize(vi) - linux_ver_normalize(v)) < fuzz:
+                return vi
+        # Not found
+        return None
+
+def get_intel_registry_value(valuename, version=None, abi=None):
+    """
+    Return a value from the Intel compiler registry tree. (Windows only)
+    """
+    # Open the key:
+    if is_win64:
+        K = 'Software\\Wow6432Node\\Intel\\Compilers\\C++\\' + version + '\\'+abi.upper()
+    else:
+        K = 'Software\\Intel\\Compilers\\C++\\' + version + '\\'+abi.upper()
+    try:
+        k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
+    except SCons.Util.RegError:
+        raise MissingRegistryError("%s was not found in the registry, for Intel compiler version %s, abi='%s'"%(K, version,abi))
+
+    # Get the value:
+    try:
+        v = SCons.Util.RegQueryValueEx(k, valuename)[0]
+        return v  # or v.encode('iso-8859-1', 'replace') to remove unicode?
+    except SCons.Util.RegError:
+        raise MissingRegistryError("%s\\%s was not found in the registry."%(K, valuename))
+
+
+def get_all_compiler_versions():
+    """Returns a sorted list of strings, like "70" or "80" or "9.0"
+    with most recent compiler version first.
+    """
+    versions=[]
+    if is_windows:
+        if is_win64:
+            keyname = 'Software\\WoW6432Node\\Intel\\Compilers\\C++'
+        else:
+            keyname = 'Software\\Intel\\Compilers\\C++'
+        try:
+            k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE,
+                                        keyname)
+        except WindowsError:
+            return []
+        i = 0
+        versions = []
+        try:
+            while i < 100:
+                subkey = SCons.Util.RegEnumKey(k, i) # raises EnvironmentError
+                # Check that this refers to an existing dir.
+                # This is not 100% perfect but should catch common
+                # installation issues like when the compiler was installed
+                # and then the install directory deleted or moved (rather
+                # than uninstalling properly), so the registry values
+                # are still there.
+                ok = False
+                for try_abi in ('IA32', 'IA32e',  'IA64', 'EM64T'):
+                    try:
+                        d = get_intel_registry_value('ProductDir', subkey, try_abi)
+                    except MissingRegistryError:
+                        continue  # not found in reg, keep going
+                    if os.path.exists(d): ok = True
+                if ok:
+                    versions.append(subkey)
+                else:
+                    try:
+                        # Registry points to nonexistent dir.  Ignore this
+                        # version.
+                        value = get_intel_registry_value('ProductDir', subkey, 'IA32')
+                    except MissingRegistryError, e:
+
+                        # Registry key is left dangling (potentially
+                        # after uninstalling).
+
+                        print \
+                            "scons: *** Ignoring the registry key for the Intel compiler version %s.\n" \
+                            "scons: *** It seems that the compiler was uninstalled and that the registry\n" \
+                            "scons: *** was not cleaned up properly.\n" % subkey
+                    else:
+                        print "scons: *** Ignoring "+str(value)
+
+                i = i + 1
+        except EnvironmentError:
+            # no more subkeys
+            pass
+    elif is_linux:
+        for d in glob.glob('/opt/intel_cc_*'):
+            # Typical dir here is /opt/intel_cc_80.
+            m = re.search(r'cc_(.*)$', d)
+            if m:
+                versions.append(m.group(1))
+        for d in glob.glob('/opt/intel/cc*/*'):
+            # Typical dir here is /opt/intel/cc/9.0 for IA32,
+            # /opt/intel/cce/9.0 for EMT64 (AMD64)
+            m = re.search(r'([0-9][0-9.]*)$', d)
+            if m:
+                versions.append(m.group(1))
+        for d in glob.glob('/opt/intel/Compiler/*'):
+            # Typical dir here is /opt/intel/Compiler/11.1
+            m = re.search(r'([0-9][0-9.]*)$', d)
+            if m:
+                versions.append(m.group(1))
+    elif is_mac:
+        for d in glob.glob('/opt/intel/cc*/*'):
+            # Typical dir here is /opt/intel/cc/9.0 for IA32,
+            # /opt/intel/cce/9.0 for EMT64 (AMD64)
+            m = re.search(r'([0-9][0-9.]*)$', d)
+            if m:
+                versions.append(m.group(1))
+    return sorted(uniquify(versions))       # remove dups
+
+def get_intel_compiler_top(version, abi):
+    """
+    Return the main path to the top-level dir of the Intel compiler,
+    using the given version.
+    The compiler will be in <top>/bin/icl.exe (icc on linux),
+    the include dir is <top>/include, etc.
+    """
+
+    if is_windows:
+        if not SCons.Util.can_read_reg:
+            raise NoRegistryModuleError("No Windows registry module was found")
+        top = get_intel_registry_value('ProductDir', version, abi)
+        # pre-11, icl was in Bin.  11 and later, it's in Bin/<abi> apparently.
+        if not os.path.exists(os.path.join(top, "Bin", "icl.exe")) \
+              and not os.path.exists(os.path.join(top, "Bin", abi, "icl.exe")):
+            raise MissingDirError("Can't find Intel compiler in %s"%(top))
+    elif is_mac or is_linux:
+        def find_in_2008style_dir(version):
+            # first dir is new (>=9.0) style, second is old (8.0) style.
+            dirs=('/opt/intel/cc/%s', '/opt/intel_cc_%s')
+            if abi == 'x86_64':
+                dirs=('/opt/intel/cce/%s',)  # 'e' stands for 'em64t', aka x86_64 aka amd64
+            top=None
+            for d in dirs:
+                if os.path.exists(os.path.join(d%version, "bin", "icc")):
+                    top = d%version
+                    break
+            return top
+        def find_in_2010style_dir(version):
+            dirs=('/opt/intel/Compiler/%s/*'%version)
+            # typically /opt/intel/Compiler/11.1/064 (then bin/intel64/icc)
+            dirs=glob.glob(dirs)
+            # find highest sub-version number by reverse sorting and picking first existing one.
+            dirs.sort()
+            dirs.reverse()
+            top=None
+            for d in dirs:
+                if (os.path.exists(os.path.join(d, "bin", "ia32", "icc")) or
+                    os.path.exists(os.path.join(d, "bin", "intel64", "icc"))):
+                    top = d
+                    break
+            return top
+        top = find_in_2010style_dir(version) or find_in_2008style_dir(version)
+        print "INTELC: top=",top
+        if not top:
+            raise MissingDirError("Can't find version %s Intel compiler in %s (abi='%s')"%(version,top, abi))
+    return top
+
+
+def generate(env, version=None, abi=None, topdir=None, verbose=0):
+    """Add Builders and construction variables for Intel C/C++ compiler
+    to an Environment.
+    args:
+      version: (string) compiler version to use, like "80"
+      abi:     (string) 'win32' or whatever Itanium version wants
+      topdir:  (string) compiler top dir, like
+                         "c:\Program Files\Intel\Compiler70"
+                        If topdir is used, version and abi are ignored.
+      verbose: (int)    if >0, prints compiler version used.
+    """
+    if not (is_mac or is_linux or is_windows):
+        # can't handle this platform
+        return
+
+    if is_windows:
+        SCons.Tool.msvc.generate(env)
+    elif is_linux:
+        SCons.Tool.gcc.generate(env)
+    elif is_mac:
+        SCons.Tool.gcc.generate(env)
+
+    # if version is unspecified, use latest
+    vlist = get_all_compiler_versions()
+    if not version:
+        if vlist:
+            version = vlist[0]
+    else:
+        # User may have specified '90' but we need to get actual dirname '9.0'.
+        # get_version_from_list does that mapping.
+        v = get_version_from_list(version, vlist)
+        if not v:
+            raise SCons.Errors.UserError("Invalid Intel compiler version %s: "%version + \
+                  "installed versions are %s"%(', '.join(vlist)))
+        version = v
+
+    # if abi is unspecified, use ia32
+    # alternatives are ia64 for Itanium, or amd64 or em64t or x86_64 (all synonyms here)
+    abi = check_abi(abi)
+    if abi is None:
+        if is_mac or is_linux:
+            # Check if we are on 64-bit linux, default to 64 then.
+            uname_m = os.uname()[4]
+            if uname_m == 'x86_64':
+                abi = 'x86_64'
+            else:
+                abi = 'ia32'
+        else:
+            if is_win64:
+                abi = 'em64t'
+            else:
+                abi = 'ia32'
+
+    if version and not topdir:
+        try:
+            topdir = get_intel_compiler_top(version, abi)
+        except (SCons.Util.RegError, IntelCError):
+            topdir = None
+
+    if not topdir:
+        # Normally this is an error, but it might not be if the compiler is
+        # on $PATH and the user is importing their env.
+        class ICLTopDirWarning(SCons.Warnings.Warning):
+            pass
+        if (is_mac or is_linux) and not env.Detect('icc') or \
+           is_windows and not env.Detect('icl'):
+
+            SCons.Warnings.enableWarningClass(ICLTopDirWarning)
+            SCons.Warnings.warn(ICLTopDirWarning,
+                                "Failed to find Intel compiler for version='%s', abi='%s'"%
+                                (str(version), str(abi)))
+        else:
+            # should be cleaned up to say what this other version is
+            # since in this case we have some other Intel compiler installed
+            SCons.Warnings.enableWarningClass(ICLTopDirWarning)
+            SCons.Warnings.warn(ICLTopDirWarning,
+                                "Can't find Intel compiler top dir for version='%s', abi='%s'"%
+                                    (str(version), str(abi)))
+
+    if topdir:
+        archdir={'x86_64': 'intel64',
+                 'amd64' : 'intel64',
+                 'em64t' : 'intel64',
+                 'x86'   : 'ia32',
+                 'i386'  : 'ia32',
+                 'ia32'  : 'ia32'
+        }[abi] # for v11 and greater
+        if os.path.exists(os.path.join(topdir, 'bin', archdir)):
+            bindir="bin/%s"%archdir
+            libdir="lib/%s"%archdir
+        else:
+            bindir="bin"
+            libdir="lib"
+        if verbose:
+            print "Intel C compiler: using version %s (%g), abi %s, in '%s/%s'"%\
+                  (repr(version), linux_ver_normalize(version),abi,topdir,bindir)
+            if is_linux:
+                # Show the actual compiler version by running the compiler.
+                os.system('%s/%s/icc --version'%(topdir,bindir))
+            if is_mac:
+                # Show the actual compiler version by running the compiler.
+                os.system('%s/%s/icc --version'%(topdir,bindir))
+
+        env['INTEL_C_COMPILER_TOP'] = topdir
+        if is_linux:
+            paths={'INCLUDE'         : 'include',
+                   'LIB'             : libdir,
+                   'PATH'            : bindir,
+                   'LD_LIBRARY_PATH' : libdir}
+            for p in paths.keys():
+                env.PrependENVPath(p, os.path.join(topdir, paths[p]))
+        if is_mac:
+            paths={'INCLUDE'         : 'include',
+                   'LIB'             : libdir,
+                   'PATH'            : bindir,
+                   'LD_LIBRARY_PATH' : libdir}
+            for p in paths.keys():
+                env.PrependENVPath(p, os.path.join(topdir, paths[p]))
+        if is_windows:
+            #       env key    reg valname   default subdir of top
+            paths=(('INCLUDE', 'IncludeDir', 'Include'),
+                   ('LIB'    , 'LibDir',     'Lib'),
+                   ('PATH'   , 'BinDir',     'Bin'))
+            # We are supposed to ignore version if topdir is set, so set
+            # it to the emptry string if it's not already set.
+            if version is None:
+                version = ''
+            # Each path has a registry entry, use that or default to subdir
+            for p in paths:
+                try:
+                    path=get_intel_registry_value(p[1], version, abi)
+                    # These paths may have $(ICInstallDir)
+                    # which needs to be substituted with the topdir.
+                    path=path.replace('$(ICInstallDir)', topdir + os.sep)
+                except IntelCError:
+                    # Couldn't get it from registry: use default subdir of topdir
+                    env.PrependENVPath(p[0], os.path.join(topdir, p[2]))
+                else:
+                    env.PrependENVPath(p[0], path.split(os.pathsep))
+                    # print "ICL %s: %s, final=%s"%(p[0], path, str(env['ENV'][p[0]]))
+
+    if is_windows:
+        env['CC']        = 'icl'
+        env['CXX']       = 'icl'
+        env['LINK']      = 'xilink'
+    else:
+        env['CC']        = 'icc'
+        env['CXX']       = 'icpc'
+        # Don't reset LINK here;
+        # use smart_link which should already be here from link.py.
+        #env['LINK']      = '$CC'
+        env['AR']        = 'xiar'
+        env['LD']        = 'xild' # not used by default
+
+    # This is not the exact (detailed) compiler version,
+    # just the major version as determined above or specified
+    # by the user.  It is a float like 80 or 90, in normalized form for Linux
+    # (i.e. even for Linux 9.0 compiler, still returns 90 rather than 9.0)
+    if version:
+        env['INTEL_C_COMPILER_VERSION']=linux_ver_normalize(version)
+
+    if is_windows:
+        # Look for license file dir
+        # in system environment, registry, and default location.
+        envlicdir = os.environ.get("INTEL_LICENSE_FILE", '')
+        K = ('SOFTWARE\Intel\Licenses')
+        try:
+            k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
+            reglicdir = SCons.Util.RegQueryValueEx(k, "w_cpp")[0]
+        except (AttributeError, SCons.Util.RegError):
+            reglicdir = ""
+        defaultlicdir = r'C:\Program Files\Common Files\Intel\Licenses'
+
+        licdir = None
+        for ld in [envlicdir, reglicdir]:
+            # If the string contains an '@', then assume it's a network
+            # license (port at system) and good by definition.
+            if ld and (ld.find('@') != -1 or os.path.exists(ld)):
+                licdir = ld
+                break
+        if not licdir:
+            licdir = defaultlicdir
+            if not os.path.exists(licdir):
+                class ICLLicenseDirWarning(SCons.Warnings.Warning):
+                    pass
+                SCons.Warnings.enableWarningClass(ICLLicenseDirWarning)
+                SCons.Warnings.warn(ICLLicenseDirWarning,
+                                    "Intel license dir was not found."
+                                    "  Tried using the INTEL_LICENSE_FILE environment variable (%s), the registry (%s) and the default path (%s)."
+                                    "  Using the default path as a last resort."
+                                        % (envlicdir, reglicdir, defaultlicdir))
+        env['ENV']['INTEL_LICENSE_FILE'] = licdir
+
+def exists(env):
+    if not (is_mac or is_linux or is_windows):
+        # can't handle this platform
+        return 0
+
+    try:
+        versions = get_all_compiler_versions()
+    except (SCons.Util.RegError, IntelCError):
+        versions = None
+    detected = versions is not None and len(versions) > 0
+    if not detected:
+        # try env.Detect, maybe that will work
+        if is_windows:
+            return env.Detect('icl')
+        elif is_linux:
+            return env.Detect('icc')
+        elif is_mac:
+            return env.Detect('icc')
+    return detected
+
+# end of file
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/ipkg.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/ipkg.py
new file mode 100644
index 0000000..da757f1
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/ipkg.py
@@ -0,0 +1,67 @@
+"""SCons.Tool.ipkg
+
+Tool-specific initialization for ipkg.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+The ipkg tool calls the ipkg-build. Its only argument should be the 
+packages fake_root.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/ipkg.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+
+import SCons.Builder
+
+def generate(env):
+    """Add Builders and construction variables for ipkg to an Environment."""
+    try:
+        bld = env['BUILDERS']['Ipkg']
+    except KeyError:
+        bld = SCons.Builder.Builder( action  = '$IPKGCOM',
+                                     suffix  = '$IPKGSUFFIX',
+                                     source_scanner = None,
+                                     target_scanner = None)
+        env['BUILDERS']['Ipkg'] = bld
+
+    env['IPKG']       = 'ipkg-build'
+    env['IPKGCOM']    = '$IPKG $IPKGFLAGS ${SOURCE}'
+    env['IPKGUSER']   = os.popen('id -un').read().strip()
+    env['IPKGGROUP']  = os.popen('id -gn').read().strip()
+    env['IPKGFLAGS']  = SCons.Util.CLVar('-o $IPKGUSER -g $IPKGGROUP')
+    env['IPKGSUFFIX'] = '.ipk'
+
+def exists(env):
+    return env.Detect('ipkg-build')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/jar.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/jar.py
new file mode 100644
index 0000000..a5ffc35
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/jar.py
@@ -0,0 +1,110 @@
+"""SCons.Tool.jar
+
+Tool-specific initialization for jar.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/jar.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Subst
+import SCons.Util
+
+def jarSources(target, source, env, for_signature):
+    """Only include sources that are not a manifest file."""
+    try:
+        env['JARCHDIR']
+    except KeyError:
+        jarchdir_set = False
+    else:
+        jarchdir_set = True
+        jarchdir = env.subst('$JARCHDIR', target=target, source=source)
+        if jarchdir:
+            jarchdir = env.fs.Dir(jarchdir)
+    result = []
+    for src in source:
+        contents = src.get_text_contents()
+        if contents[:16] != "Manifest-Version":
+            if jarchdir_set:
+                _chdir = jarchdir
+            else:
+                try:
+                    _chdir = src.attributes.java_classdir
+                except AttributeError:
+                    _chdir = None
+            if _chdir:
+                # If we are changing the dir with -C, then sources should
+                # be relative to that directory.
+                src = SCons.Subst.Literal(src.get_path(_chdir))
+                result.append('-C')
+                result.append(_chdir)
+            result.append(src)
+    return result
+
+def jarManifest(target, source, env, for_signature):
+    """Look in sources for a manifest file, if any."""
+    for src in source:
+        contents = src.get_text_contents()
+        if contents[:16] == "Manifest-Version":
+            return src
+    return ''
+
+def jarFlags(target, source, env, for_signature):
+    """If we have a manifest, make sure that the 'm'
+    flag is specified."""
+    jarflags = env.subst('$JARFLAGS', target=target, source=source)
+    for src in source:
+        contents = src.get_text_contents()
+        if contents[:16] == "Manifest-Version":
+            if not 'm' in jarflags:
+                return jarflags + 'm'
+            break
+    return jarflags
+
+def generate(env):
+    """Add Builders and construction variables for jar to an Environment."""
+    SCons.Tool.CreateJarBuilder(env)
+
+    env['JAR']        = 'jar'
+    env['JARFLAGS']   = SCons.Util.CLVar('cf')
+    env['_JARFLAGS']  = jarFlags
+    env['_JARMANIFEST'] = jarManifest
+    env['_JARSOURCES'] = jarSources
+    env['_JARCOM']    = '$JAR $_JARFLAGS $TARGET $_JARMANIFEST $_JARSOURCES'
+    env['JARCOM']     = "${TEMPFILE('$_JARCOM')}"
+    env['JARSUFFIX']  = '.jar'
+
+def exists(env):
+    return env.Detect('jar')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/javac.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/javac.py
new file mode 100644
index 0000000..97292f7
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/javac.py
@@ -0,0 +1,230 @@
+"""SCons.Tool.javac
+
+Tool-specific initialization for javac.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Tool/javac.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+import os.path
+
+import SCons.Action
+import SCons.Builder
+from SCons.Node.FS import _my_normcase
+from SCons.Tool.JavaCommon import parse_java_file
+import SCons.Util
+
+def classname(path):
+    """Turn a string (path name) into a Java class name."""
+    return os.path.normpath(path).replace(os.sep, '.')
+
+def emit_java_classes(target, source, env):
+    """Create and return lists of source java files
+    and their corresponding target class files.
+    """
+    java_suffix = env.get('JAVASUFFIX', '.java')
+    class_suffix = env.get('JAVACLASSSUFFIX', '.class')
+
+    target[0].must_be_same(SCons.Node.FS.Dir)
+    classdir = target[0]
+
+    s = source[0].rentry().disambiguate()
+    if isinstance(s, SCons.Node.FS.File):
+        sourcedir = s.dir.rdir()
+    elif isinstance(s, SCons.Node.FS.Dir):
+        sourcedir = s.rdir()
+    else:
+        raise SCons.Errors.UserError("Java source must be File or Dir, not '%s'" % s.__class__)
+
+    slist = []
+    js = _my_normcase(java_suffix)
+    for entry in source:
+        entry = entry.rentry().disambiguate()
+        if isinstance(entry, SCons.Node.FS.File):
+            slist.append(entry)
+        elif isinstance(entry, SCons.Node.FS.Dir):
+            result = SCons.Util.OrderedDict()
+            dirnode = entry.rdir()
+            def find_java_files(arg, dirpath, filenames):
+                java_files = sorted([n for n in filenames
+                                       if _my_normcase(n).endswith(js)])
+                mydir = dirnode.Dir(dirpath)
+                java_paths = [mydir.File(f) for f in java_files]
+                for jp in java_paths:
+                     arg[jp] = True
+            for dirpath, dirnames, filenames in os.walk(dirnode.get_abspath()):
+               find_java_files(result, dirpath, filenames)
+            entry.walk(find_java_files, result)
+
+            slist.extend(list(result.keys()))
+        else:
+            raise SCons.Errors.UserError("Java source must be File or Dir, not '%s'" % entry.__class__)
+
+    version = env.get('JAVAVERSION', '1.4')
+    full_tlist = []
+    for f in slist:
+        tlist = []
+        source_file_based = True
+        pkg_dir = None
+        if not f.is_derived():
+            pkg_dir, classes = parse_java_file(f.rfile().get_abspath(), version)
+            if classes:
+                source_file_based = False
+                if pkg_dir:
+                    d = target[0].Dir(pkg_dir)
+                    p = pkg_dir + os.sep
+                else:
+                    d = target[0]
+                    p = ''
+                for c in classes:
+                    t = d.File(c + class_suffix)
+                    t.attributes.java_classdir = classdir
+                    t.attributes.java_sourcedir = sourcedir
+                    t.attributes.java_classname = classname(p + c)
+                    tlist.append(t)
+
+        if source_file_based:
+            base = f.name[:-len(java_suffix)]
+            if pkg_dir:
+                t = target[0].Dir(pkg_dir).File(base + class_suffix)
+            else:
+                t = target[0].File(base + class_suffix)
+            t.attributes.java_classdir = classdir
+            t.attributes.java_sourcedir = f.dir
+            t.attributes.java_classname = classname(base)
+            tlist.append(t)
+
+        for t in tlist:
+            t.set_specific_source([f])
+
+        full_tlist.extend(tlist)
+
+    return full_tlist, slist
+
+JavaAction = SCons.Action.Action('$JAVACCOM', '$JAVACCOMSTR')
+
+JavaBuilder = SCons.Builder.Builder(action = JavaAction,
+                    emitter = emit_java_classes,
+                    target_factory = SCons.Node.FS.Entry,
+                    source_factory = SCons.Node.FS.Entry)
+
+class pathopt(object):
+    """
+    Callable object for generating javac-style path options from
+    a construction variable (e.g. -classpath, -sourcepath).
+    """
+    def __init__(self, opt, var, default=None):
+        self.opt = opt
+        self.var = var
+        self.default = default
+
+    def __call__(self, target, source, env, for_signature):
+        path = env[self.var]
+        if path and not SCons.Util.is_List(path):
+            path = [path]
+        if self.default:
+            path = path + [ env[self.default] ]
+        if path:
+            return [self.opt, os.pathsep.join(path)]
+            #return self.opt + " " + os.pathsep.join(path)
+        else:
+            return []
+            #return ""
+
+def Java(env, target, source, *args, **kw):
+    """
+    A pseudo-Builder wrapper around the separate JavaClass{File,Dir}
+    Builders.
+    """
+    if not SCons.Util.is_List(target):
+        target = [target]
+    if not SCons.Util.is_List(source):
+        source = [source]
+
+    # Pad the target list with repetitions of the last element in the
+    # list so we have a target for every source element.
+    target = target + ([target[-1]] * (len(source) - len(target)))
+
+    java_suffix = env.subst('$JAVASUFFIX')
+    result = []
+
+    for t, s in zip(target, source):
+        if isinstance(s, SCons.Node.FS.Base):
+            if isinstance(s, SCons.Node.FS.File):
+                b = env.JavaClassFile
+            else:
+                b = env.JavaClassDir
+        else:
+            if os.path.isfile(s):
+                b = env.JavaClassFile
+            elif os.path.isdir(s):
+                b = env.JavaClassDir
+            elif s[-len(java_suffix):] == java_suffix:
+                b = env.JavaClassFile
+            else:
+                b = env.JavaClassDir
+        result.extend(b(t, s, *args, **kw))
+
+    return result
+
+def generate(env):
+    """Add Builders and construction variables for javac to an Environment."""
+    java_file = SCons.Tool.CreateJavaFileBuilder(env)
+    java_class = SCons.Tool.CreateJavaClassFileBuilder(env)
+    java_class_dir = SCons.Tool.CreateJavaClassDirBuilder(env)
+    java_class.add_emitter(None, emit_java_classes)
+    java_class.add_emitter(env.subst('$JAVASUFFIX'), emit_java_classes)
+    java_class_dir.emitter = emit_java_classes
+
+    env.AddMethod(Java)
+
+    env['JAVAC']                    = 'javac'
+    env['JAVACFLAGS']               = SCons.Util.CLVar('')
+    env['JAVABOOTCLASSPATH']        = []
+    env['JAVACLASSPATH']            = []
+    env['JAVASOURCEPATH']           = []
+    env['_javapathopt']             = pathopt
+    env['_JAVABOOTCLASSPATH']       = '${_javapathopt("-bootclasspath", "JAVABOOTCLASSPATH")} '
+    env['_JAVACLASSPATH']           = '${_javapathopt("-classpath", "JAVACLASSPATH")} '
+    env['_JAVASOURCEPATH']          = '${_javapathopt("-sourcepath", "JAVASOURCEPATH", "_JAVASOURCEPATHDEFAULT")} '
+    env['_JAVASOURCEPATHDEFAULT']   = '${TARGET.attributes.java_sourcedir}'
+    env['_JAVACCOM']                = '$JAVAC $JAVACFLAGS $_JAVABOOTCLASSPATH $_JAVACLASSPATH -d ${TARGET.attributes.java_classdir} $_JAVASOURCEPATH $SOURCES'
+    env['JAVACCOM']                 = "${TEMPFILE('$_JAVACCOM')}"
+    env['JAVACLASSSUFFIX']          = '.class'
+    env['JAVASUFFIX']               = '.java'
+
+def exists(env):
+    return 1
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/javah.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/javah.py
new file mode 100644
index 0000000..830b747
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/javah.py
@@ -0,0 +1,137 @@
+"""SCons.Tool.javah
+
+Tool-specific initialization for javah.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/javah.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os.path
+
+import SCons.Action
+import SCons.Builder
+import SCons.Node.FS
+import SCons.Tool.javac
+import SCons.Util
+
+def emit_java_headers(target, source, env):
+    """Create and return lists of Java stub header files that will
+    be created from a set of class files.
+    """
+    class_suffix = env.get('JAVACLASSSUFFIX', '.class')
+    classdir = env.get('JAVACLASSDIR')
+
+    if not classdir:
+        try:
+            s = source[0]
+        except IndexError:
+            classdir = '.'
+        else:
+            try:
+                classdir = s.attributes.java_classdir
+            except AttributeError:
+                classdir = '.'
+    classdir = env.Dir(classdir).rdir()
+
+    if str(classdir) == '.':
+        c_ = None
+    else:
+        c_ = str(classdir) + os.sep
+
+    slist = []
+    for src in source:
+        try:
+            classname = src.attributes.java_classname
+        except AttributeError:
+            classname = str(src)
+            if c_ and classname[:len(c_)] == c_:
+                classname = classname[len(c_):]
+            if class_suffix and classname[-len(class_suffix):] == class_suffix:
+                classname = classname[:-len(class_suffix)]
+            classname = SCons.Tool.javac.classname(classname)
+        s = src.rfile()
+        s.attributes.java_classname = classname
+        slist.append(s)
+
+    s = source[0].rfile()
+    if not hasattr(s.attributes, 'java_classdir'):
+        s.attributes.java_classdir = classdir
+
+    if target[0].__class__ is SCons.Node.FS.File:
+        tlist = target
+    else:
+        if not isinstance(target[0], SCons.Node.FS.Dir):
+            target[0].__class__ = SCons.Node.FS.Dir
+            target[0]._morph()
+        tlist = []
+        for s in source:
+            fname = s.attributes.java_classname.replace('.', '_') + '.h'
+            t = target[0].File(fname)
+            t.attributes.java_lookupdir = target[0]
+            tlist.append(t)
+
+    return tlist, source
+
+def JavaHOutFlagGenerator(target, source, env, for_signature):
+    try:
+        t = target[0]
+    except (AttributeError, IndexError, TypeError):
+        t = target
+    try:
+        return '-d ' + str(t.attributes.java_lookupdir)
+    except AttributeError:
+        return '-o ' + str(t)
+
+def getJavaHClassPath(env,target, source, for_signature):
+    path = "${SOURCE.attributes.java_classdir}"
+    if 'JAVACLASSPATH' in env and env['JAVACLASSPATH']:
+        path = SCons.Util.AppendPath(path, env['JAVACLASSPATH'])
+    return "-classpath %s" % (path)
+
+def generate(env):
+    """Add Builders and construction variables for javah to an Environment."""
+    java_javah = SCons.Tool.CreateJavaHBuilder(env)
+    java_javah.emitter = emit_java_headers
+
+    env['_JAVAHOUTFLAG']    = JavaHOutFlagGenerator
+    env['JAVAH']            = 'javah'
+    env['JAVAHFLAGS']       = SCons.Util.CLVar('')
+    env['_JAVAHCLASSPATH']  = getJavaHClassPath
+    env['JAVAHCOM']         = '$JAVAH $JAVAHFLAGS $_JAVAHOUTFLAG $_JAVAHCLASSPATH ${SOURCES.attributes.java_classname}'
+    env['JAVACLASSSUFFIX']  = '.class'
+
+def exists(env):
+    return env.Detect('javah')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/latex.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/latex.py
new file mode 100644
index 0000000..fa0e988
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/latex.py
@@ -0,0 +1,79 @@
+"""SCons.Tool.latex
+
+Tool-specific initialization for LaTeX.
+Generates .dvi files from .latex or .ltx files
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/latex.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Action
+import SCons.Defaults
+import SCons.Scanner.LaTeX
+import SCons.Util
+import SCons.Tool
+import SCons.Tool.tex
+
+def LaTeXAuxFunction(target = None, source= None, env=None):
+    result = SCons.Tool.tex.InternalLaTeXAuxAction( SCons.Tool.tex.LaTeXAction, target, source, env )
+    if result != 0:
+        SCons.Tool.tex.check_file_error_message(env['LATEX'])
+    return result
+
+LaTeXAuxAction = SCons.Action.Action(LaTeXAuxFunction,
+                              strfunction=SCons.Tool.tex.TeXLaTeXStrFunction)
+
+def generate(env):
+    """Add Builders and construction variables for LaTeX to an Environment."""
+
+    env.AppendUnique(LATEXSUFFIXES=SCons.Tool.LaTeXSuffixes)
+
+    import dvi
+    dvi.generate(env)
+
+    import pdf
+    pdf.generate(env)
+
+    bld = env['BUILDERS']['DVI']
+    bld.add_action('.ltx', LaTeXAuxAction)
+    bld.add_action('.latex', LaTeXAuxAction)
+    bld.add_emitter('.ltx', SCons.Tool.tex.tex_eps_emitter)
+    bld.add_emitter('.latex', SCons.Tool.tex.tex_eps_emitter)
+
+    SCons.Tool.tex.generate_common(env)
+
+def exists(env):
+    return env.Detect('latex')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/lex.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/lex.py
new file mode 100644
index 0000000..dc4cb01
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/lex.py
@@ -0,0 +1,97 @@
+"""SCons.Tool.lex
+
+Tool-specific initialization for lex.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/lex.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os.path
+
+import SCons.Action
+import SCons.Tool
+import SCons.Util
+
+LexAction = SCons.Action.Action("$LEXCOM", "$LEXCOMSTR")
+
+def lexEmitter(target, source, env):
+    sourceBase, sourceExt = os.path.splitext(SCons.Util.to_String(source[0]))
+
+    if sourceExt == ".lm":           # If using Objective-C
+        target = [sourceBase + ".m"] # the extension is ".m".
+
+    # This emitter essentially tries to add to the target all extra
+    # files generated by flex.
+
+    # Different options that are used to trigger the creation of extra files.
+    fileGenOptions = ["--header-file=", "--tables-file="]
+
+    lexflags = env.subst("$LEXFLAGS", target=target, source=source)
+    for option in SCons.Util.CLVar(lexflags):
+        for fileGenOption in fileGenOptions:
+            l = len(fileGenOption)
+            if option[:l] == fileGenOption:
+                # A file generating option is present, so add the
+                # file name to the target list.
+                fileName = option[l:].strip()
+                target.append(fileName)
+    return (target, source)
+
+def generate(env):
+    """Add Builders and construction variables for lex to an Environment."""
+    c_file, cxx_file = SCons.Tool.createCFileBuilders(env)
+
+    # C
+    c_file.add_action(".l", LexAction)
+    c_file.add_emitter(".l", lexEmitter)
+
+    c_file.add_action(".lex", LexAction)
+    c_file.add_emitter(".lex", lexEmitter)
+
+    # Objective-C
+    cxx_file.add_action(".lm", LexAction)
+    cxx_file.add_emitter(".lm", lexEmitter)
+
+    # C++
+    cxx_file.add_action(".ll", LexAction)
+    cxx_file.add_emitter(".ll", lexEmitter)
+
+    env["LEX"]      = env.Detect("flex") or "lex"
+    env["LEXFLAGS"] = SCons.Util.CLVar("")
+    env["LEXCOM"] = "$LEX $LEXFLAGS -t $SOURCES > $TARGET"
+
+def exists(env):
+    return env.Detect(["flex", "lex"])
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/link.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/link.py
new file mode 100644
index 0000000..8fdf8de
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/link.py
@@ -0,0 +1,121 @@
+"""SCons.Tool.link
+
+Tool-specific initialization for the generic Posix linker.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/link.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+import SCons.Warnings
+
+from SCons.Tool.FortranCommon import isfortran
+
+cplusplus = __import__('c++', globals(), locals(), [])
+
+issued_mixed_link_warning = False
+
+def smart_link(source, target, env, for_signature):
+    has_cplusplus = cplusplus.iscplusplus(source)
+    has_fortran = isfortran(env, source)
+    if has_cplusplus and has_fortran:
+        global issued_mixed_link_warning
+        if not issued_mixed_link_warning:
+            msg = "Using $CXX to link Fortran and C++ code together.\n\t" + \
+              "This may generate a buggy executable if the '%s'\n\t" + \
+              "compiler does not know how to deal with Fortran runtimes."
+            SCons.Warnings.warn(SCons.Warnings.FortranCxxMixWarning,
+                                msg % env.subst('$CXX'))
+            issued_mixed_link_warning = True
+        return '$CXX'
+    elif has_fortran:
+        return '$FORTRAN'
+    elif has_cplusplus:
+        return '$CXX'
+    return '$CC'
+
+def shlib_emitter(target, source, env):
+    for tgt in target:
+        tgt.attributes.shared = 1
+    return (target, source)
+
+def generate(env):
+    """Add Builders and construction variables for gnulink to an Environment."""
+    SCons.Tool.createSharedLibBuilder(env)
+    SCons.Tool.createProgBuilder(env)
+
+    env['SHLINK']      = '$LINK'
+    env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared')
+    env['SHLINKCOM']   = '$SHLINK -o $TARGET $SHLINKFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+    # don't set up the emitter, cause AppendUnique will generate a list
+    # starting with None :-(
+    env.Append(SHLIBEMITTER = [shlib_emitter])
+    env['SMARTLINK']   = smart_link
+    env['LINK']        = "$SMARTLINK"
+    env['LINKFLAGS']   = SCons.Util.CLVar('')
+    env['LINKCOM']     = '$LINK -o $TARGET $LINKFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+    env['LIBDIRPREFIX']='-L'
+    env['LIBDIRSUFFIX']=''
+    env['_LIBFLAGS']='${_stripixes(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)}'
+    env['LIBLINKPREFIX']='-l'
+    env['LIBLINKSUFFIX']=''
+
+    if env['PLATFORM'] == 'hpux':
+        env['SHLIBSUFFIX'] = '.sl'
+    elif env['PLATFORM'] == 'aix':
+        env['SHLIBSUFFIX'] = '.a'
+
+    # For most platforms, a loadable module is the same as a shared
+    # library.  Platforms which are different can override these, but
+    # setting them the same means that LoadableModule works everywhere.
+    SCons.Tool.createLoadableModuleBuilder(env)
+    env['LDMODULE'] = '$SHLINK'
+    # don't set up the emitter, cause AppendUnique will generate a list
+    # starting with None :-(
+    env.Append(LDMODULEEMITTER='$SHLIBEMITTER')
+    env['LDMODULEPREFIX'] = '$SHLIBPREFIX' 
+    env['LDMODULESUFFIX'] = '$SHLIBSUFFIX' 
+    env['LDMODULEFLAGS'] = '$SHLINKFLAGS'
+    env['LDMODULECOM'] = '$LDMODULE -o $TARGET $LDMODULEFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+
+
+
+def exists(env):
+    # This module isn't really a Tool on its own, it's common logic for
+    # other linkers.
+    return None
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/linkloc.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/linkloc.py
new file mode 100644
index 0000000..9fb3e19
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/linkloc.py
@@ -0,0 +1,112 @@
+"""SCons.Tool.linkloc
+
+Tool specification for the LinkLoc linker for the Phar Lap ETS embedded
+operating system.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/linkloc.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os.path
+import re
+
+import SCons.Action
+import SCons.Defaults
+import SCons.Errors
+import SCons.Tool
+import SCons.Util
+
+from SCons.Tool.MSCommon import msvs_exists, merge_default_version
+from SCons.Tool.PharLapCommon import addPharLapPaths
+
+_re_linker_command = re.compile(r'(\s)@\s*([^\s]+)')
+
+def repl_linker_command(m):
+    # Replaces any linker command file directives (e.g. "@foo.lnk") with
+    # the actual contents of the file.
+    try:
+        f=open(m.group(2), "r")
+        return m.group(1) + f.read()
+    except IOError:
+        # the linker should return an error if it can't
+        # find the linker command file so we will remain quiet.
+        # However, we will replace the @ with a # so we will not continue
+        # to find it with recursive substitution
+        return m.group(1) + '#' + m.group(2)
+
+class LinklocGenerator(object):
+    def __init__(self, cmdline):
+        self.cmdline = cmdline
+
+    def __call__(self, env, target, source, for_signature):
+        if for_signature:
+            # Expand the contents of any linker command files recursively
+            subs = 1
+            strsub = env.subst(self.cmdline, target=target, source=source)
+            while subs:
+                strsub, subs = _re_linker_command.subn(repl_linker_command, strsub)
+            return strsub
+        else:
+            return "${TEMPFILE('" + self.cmdline + "')}"
+
+def generate(env):
+    """Add Builders and construction variables for ar to an Environment."""
+    SCons.Tool.createSharedLibBuilder(env)
+    SCons.Tool.createProgBuilder(env)
+
+    env['SUBST_CMD_FILE'] = LinklocGenerator
+    env['SHLINK']      = '$LINK'
+    env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS')
+    env['SHLINKCOM']   = '${SUBST_CMD_FILE("$SHLINK $SHLINKFLAGS $_LIBDIRFLAGS $_LIBFLAGS -dll $TARGET $SOURCES")}'
+    env['SHLIBEMITTER']= None
+    env['LINK']        = "linkloc"
+    env['LINKFLAGS']   = SCons.Util.CLVar('')
+    env['LINKCOM']     = '${SUBST_CMD_FILE("$LINK $LINKFLAGS $_LIBDIRFLAGS $_LIBFLAGS -exe $TARGET $SOURCES")}'
+    env['LIBDIRPREFIX']='-libpath '
+    env['LIBDIRSUFFIX']=''
+    env['LIBLINKPREFIX']='-lib '
+    env['LIBLINKSUFFIX']='$LIBSUFFIX'
+
+    # Set-up ms tools paths for default version
+    merge_default_version(env)
+
+    addPharLapPaths(env)
+
+def exists(env):
+    if msvs_exists():
+        return env.Detect('linkloc')
+    else:
+        return 0
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/m4.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/m4.py
new file mode 100644
index 0000000..7403e80
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/m4.py
@@ -0,0 +1,63 @@
+"""SCons.Tool.m4
+
+Tool-specific initialization for m4.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/m4.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Action
+import SCons.Builder
+import SCons.Util
+
+def generate(env):
+    """Add Builders and construction variables for m4 to an Environment."""
+    M4Action = SCons.Action.Action('$M4COM', '$M4COMSTR')
+    bld = SCons.Builder.Builder(action = M4Action, src_suffix = '.m4')
+
+    env['BUILDERS']['M4'] = bld
+
+    # .m4 files might include other files, and it would be pretty hard
+    # to write a scanner for it, so let's just cd to the dir of the m4
+    # file and run from there.
+    # The src_suffix setup is like so: file.c.m4 -> file.c,
+    # file.cpp.m4 -> file.cpp etc.
+    env['M4']      = 'm4'
+    env['M4FLAGS'] = SCons.Util.CLVar('-E')
+    env['M4COM']   = 'cd ${SOURCE.rsrcdir} && $M4 $M4FLAGS < ${SOURCE.file} > ${TARGET.abspath}'
+
+def exists(env):
+    return env.Detect('m4')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/masm.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/masm.py
new file mode 100644
index 0000000..fdc7723
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/masm.py
@@ -0,0 +1,77 @@
+"""SCons.Tool.masm
+
+Tool-specific initialization for the Microsoft Assembler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/masm.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+ASSuffixes = ['.s', '.asm', '.ASM']
+ASPPSuffixes = ['.spp', '.SPP', '.sx']
+if SCons.Util.case_sensitive_suffixes('.s', '.S'):
+    ASPPSuffixes.extend(['.S'])
+else:
+    ASSuffixes.extend(['.S'])
+
+def generate(env):
+    """Add Builders and construction variables for masm to an Environment."""
+    static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+    for suffix in ASSuffixes:
+        static_obj.add_action(suffix, SCons.Defaults.ASAction)
+        shared_obj.add_action(suffix, SCons.Defaults.ASAction)
+        static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
+        shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
+
+    for suffix in ASPPSuffixes:
+        static_obj.add_action(suffix, SCons.Defaults.ASPPAction)
+        shared_obj.add_action(suffix, SCons.Defaults.ASPPAction)
+        static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
+        shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
+
+    env['AS']        = 'ml'
+    env['ASFLAGS']   = SCons.Util.CLVar('/nologo')
+    env['ASPPFLAGS'] = '$ASFLAGS'
+    env['ASCOM']     = '$AS $ASFLAGS /c /Fo$TARGET $SOURCES'
+    env['ASPPCOM']   = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c /Fo$TARGET $SOURCES'
+    env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
+
+def exists(env):
+    return env.Detect('ml')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/midl.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/midl.py
new file mode 100644
index 0000000..e05da26
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/midl.py
@@ -0,0 +1,88 @@
+"""SCons.Tool.midl
+
+Tool-specific initialization for midl (Microsoft IDL compiler).
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/midl.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Action
+import SCons.Builder
+import SCons.Defaults
+import SCons.Scanner.IDL
+import SCons.Util
+
+from MSCommon import msvc_exists
+
+def midl_emitter(target, source, env):
+    """Produces a list of outputs from the MIDL compiler"""
+    base, ext = SCons.Util.splitext(str(target[0]))
+    tlb = target[0]
+    incl = base + '.h'
+    interface = base + '_i.c'
+    t = [tlb, incl, interface]
+
+    midlcom = env['MIDLCOM']
+
+    if midlcom.find('/proxy') != -1:
+        proxy = base + '_p.c'
+        t.append(proxy)
+    if midlcom.find('/dlldata') != -1:
+        dlldata = base + '_data.c'
+        t.append(dlldata)
+    
+    return (t,source)
+
+idl_scanner = SCons.Scanner.IDL.IDLScan()
+
+midl_action = SCons.Action.Action('$MIDLCOM', '$MIDLCOMSTR')
+
+midl_builder = SCons.Builder.Builder(action = midl_action,
+                                     src_suffix = '.idl',
+                                     suffix='.tlb',
+                                     emitter = midl_emitter,
+                                     source_scanner = idl_scanner)
+
+def generate(env):
+    """Add Builders and construction variables for midl to an Environment."""
+
+    env['MIDL']          = 'MIDL.EXE'
+    env['MIDLFLAGS']     = SCons.Util.CLVar('/nologo')
+    env['MIDLCOM']       = '$MIDL $MIDLFLAGS /tlb ${TARGETS[0]} /h ${TARGETS[1]} /iid ${TARGETS[2]} /proxy ${TARGETS[3]} /dlldata ${TARGETS[4]} $SOURCE 2> NUL'
+    env['BUILDERS']['TypeLibrary'] = midl_builder
+
+def exists(env):
+    return msvc_exists()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/mingw.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/mingw.py
new file mode 100644
index 0000000..1bf69ae
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/mingw.py
@@ -0,0 +1,158 @@
+"""SCons.Tool.gcc
+
+Tool-specific initialization for MinGW (http://www.mingw.org/)
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/mingw.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+import os.path
+
+import SCons.Action
+import SCons.Builder
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+# This is what we search for to find mingw:
+key_program = 'mingw32-gcc'
+
+def find(env):
+    # First search in the SCons path and then the OS path:
+    return env.WhereIs(key_program) or SCons.Util.WhereIs(key_program)
+
+def shlib_generator(target, source, env, for_signature):
+    cmd = SCons.Util.CLVar(['$SHLINK', '$SHLINKFLAGS']) 
+
+    dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
+    if dll: cmd.extend(['-o', dll])
+
+    cmd.extend(['$SOURCES', '$_LIBDIRFLAGS', '$_LIBFLAGS'])
+
+    implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX')
+    if implib: cmd.append('-Wl,--out-implib,'+implib.get_string(for_signature))
+
+    def_target = env.FindIxes(target, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')
+    insert_def = env.subst("$WINDOWS_INSERT_DEF")
+    if not insert_def in ['', '0', 0] and def_target: \
+        cmd.append('-Wl,--output-def,'+def_target.get_string(for_signature))
+
+    return [cmd]
+
+def shlib_emitter(target, source, env):
+    dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
+    no_import_lib = env.get('no_import_lib', 0)
+
+    if not dll:
+        raise SCons.Errors.UserError("A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX"))
+    
+    if not no_import_lib and \
+       not env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX'):
+
+        # Append an import library to the list of targets.
+        target.append(env.ReplaceIxes(dll,  
+                                      'SHLIBPREFIX', 'SHLIBSUFFIX',
+                                      'LIBPREFIX', 'LIBSUFFIX'))
+
+    # Append a def file target if there isn't already a def file target
+    # or a def file source. There is no option to disable def file
+    # target emitting, because I can't figure out why someone would ever
+    # want to turn it off.
+    def_source = env.FindIxes(source, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')
+    def_target = env.FindIxes(target, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')
+    if not def_source and not def_target:
+        target.append(env.ReplaceIxes(dll,  
+                                      'SHLIBPREFIX', 'SHLIBSUFFIX',
+                                      'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX'))
+    
+    return (target, source)
+                         
+
+shlib_action = SCons.Action.Action(shlib_generator, generator=1)
+
+res_action = SCons.Action.Action('$RCCOM', '$RCCOMSTR')
+
+res_builder = SCons.Builder.Builder(action=res_action, suffix='.o',
+                                    source_scanner=SCons.Tool.SourceFileScanner)
+SCons.Tool.SourceFileScanner.add_scanner('.rc', SCons.Defaults.CScan)
+
+def generate(env):
+    mingw = find(env)
+    if mingw:
+        dir = os.path.dirname(mingw)
+        env.PrependENVPath('PATH', dir )
+        
+
+    # Most of mingw is the same as gcc and friends...
+    gnu_tools = ['gcc', 'g++', 'gnulink', 'ar', 'gas', 'm4']
+    for tool in gnu_tools:
+        SCons.Tool.Tool(tool)(env)
+
+    #... but a few things differ:
+    env['CC'] = 'gcc'
+    env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
+    env['CXX'] = 'g++'
+    env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
+    env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared')
+    env['SHLINKCOM']   = shlib_action
+    env['LDMODULECOM'] = shlib_action
+    env.Append(SHLIBEMITTER = [shlib_emitter])
+    env['AS'] = 'as'
+
+    env['WIN32DEFPREFIX']        = ''
+    env['WIN32DEFSUFFIX']        = '.def'
+    env['WINDOWSDEFPREFIX']      = '${WIN32DEFPREFIX}'
+    env['WINDOWSDEFSUFFIX']      = '${WIN32DEFSUFFIX}'
+
+    env['SHOBJSUFFIX'] = '.o'
+    env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
+
+    env['RC'] = 'windres'
+    env['RCFLAGS'] = SCons.Util.CLVar('')
+    env['RCINCFLAGS'] = '$( ${_concat(RCINCPREFIX, CPPPATH, RCINCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'
+    env['RCINCPREFIX'] = '--include-dir '
+    env['RCINCSUFFIX'] = ''
+    env['RCCOM'] = '$RC $_CPPDEFFLAGS $RCINCFLAGS ${RCINCPREFIX} ${SOURCE.dir} $RCFLAGS -i $SOURCE -o $TARGET'
+    env['BUILDERS']['RES'] = res_builder
+    
+    # Some setting from the platform also have to be overridden:
+    env['OBJSUFFIX'] = '.o'
+    env['LIBPREFIX'] = 'lib'
+    env['LIBSUFFIX'] = '.a'
+
+def exists(env):
+    return find(env)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/mslib.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/mslib.py
new file mode 100644
index 0000000..8e4f566
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/mslib.py
@@ -0,0 +1,64 @@
+"""SCons.Tool.mslib
+
+Tool-specific initialization for lib (MicroSoft library archiver).
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/mslib.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Tool.msvs
+import SCons.Tool.msvc
+import SCons.Util
+
+from MSCommon import msvc_exists, msvc_setup_env_once
+
+def generate(env):
+    """Add Builders and construction variables for lib to an Environment."""
+    SCons.Tool.createStaticLibBuilder(env)
+
+    # Set-up ms tools paths
+    msvc_setup_env_once(env)
+
+    env['AR']          = 'lib'
+    env['ARFLAGS']     = SCons.Util.CLVar('/nologo')
+    env['ARCOM']       = "${TEMPFILE('$AR $ARFLAGS /OUT:$TARGET $SOURCES')}"
+    env['LIBPREFIX']   = ''
+    env['LIBSUFFIX']   = '.lib'
+
+def exists(env):
+    return msvc_exists()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/mslink.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/mslink.py
new file mode 100644
index 0000000..3569818
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/mslink.py
@@ -0,0 +1,266 @@
+"""SCons.Tool.mslink
+
+Tool-specific initialization for the Microsoft linker.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/mslink.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os.path
+
+import SCons.Action
+import SCons.Defaults
+import SCons.Errors
+import SCons.Platform.win32
+import SCons.Tool
+import SCons.Tool.msvc
+import SCons.Tool.msvs
+import SCons.Util
+
+from MSCommon import msvc_setup_env_once, msvc_exists
+
+def pdbGenerator(env, target, source, for_signature):
+    try:
+        return ['/PDB:%s' % target[0].attributes.pdb, '/DEBUG']
+    except (AttributeError, IndexError):
+        return None
+
+def _dllTargets(target, source, env, for_signature, paramtp):
+    listCmd = []
+    dll = env.FindIxes(target, '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp)
+    if dll: listCmd.append("/out:%s"%dll.get_string(for_signature))
+
+    implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX')
+    if implib: listCmd.append("/implib:%s"%implib.get_string(for_signature))
+
+    return listCmd
+
+def _dllSources(target, source, env, for_signature, paramtp):
+    listCmd = []
+
+    deffile = env.FindIxes(source, "WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX")
+    for src in source:
+        # Check explicitly for a non-None deffile so that the __cmp__
+        # method of the base SCons.Util.Proxy class used for some Node
+        # proxies doesn't try to use a non-existent __dict__ attribute.
+        if deffile and src == deffile:
+            # Treat this source as a .def file.
+            listCmd.append("/def:%s" % src.get_string(for_signature))
+        else:
+            # Just treat it as a generic source file.
+            listCmd.append(src)
+    return listCmd
+
+def windowsShlinkTargets(target, source, env, for_signature):
+    return _dllTargets(target, source, env, for_signature, 'SHLIB')
+
+def windowsShlinkSources(target, source, env, for_signature):
+    return _dllSources(target, source, env, for_signature, 'SHLIB')
+
+def _windowsLdmodTargets(target, source, env, for_signature):
+    """Get targets for loadable modules."""
+    return _dllTargets(target, source, env, for_signature, 'LDMODULE')
+
+def _windowsLdmodSources(target, source, env, for_signature):
+    """Get sources for loadable modules."""
+    return _dllSources(target, source, env, for_signature, 'LDMODULE')
+
+def _dllEmitter(target, source, env, paramtp):
+    """Common implementation of dll emitter."""
+    SCons.Tool.msvc.validate_vars(env)
+
+    extratargets = []
+    extrasources = []
+
+    dll = env.FindIxes(target, '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp)
+    no_import_lib = env.get('no_import_lib', 0)
+
+    if not dll:
+        raise SCons.Errors.UserError('A shared library should have exactly one target with the suffix: %s' % env.subst('$%sSUFFIX' % paramtp))
+
+    insert_def = env.subst("$WINDOWS_INSERT_DEF")
+    if not insert_def in ['', '0', 0] and \
+       not env.FindIxes(source, "WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX"):
+
+        # append a def file to the list of sources
+        extrasources.append(
+            env.ReplaceIxes(dll,
+                            '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp,
+                            "WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX"))
+
+    version_num, suite = SCons.Tool.msvs.msvs_parse_version(env.get('MSVS_VERSION', '6.0'))
+    if version_num >= 8.0 and env.get('WINDOWS_INSERT_MANIFEST', 0):
+        # MSVC 8 automatically generates .manifest files that must be installed
+        extratargets.append(
+            env.ReplaceIxes(dll,
+                            '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp,
+                            "WINDOWSSHLIBMANIFESTPREFIX", "WINDOWSSHLIBMANIFESTSUFFIX"))
+
+    if 'PDB' in env and env['PDB']:
+        pdb = env.arg2nodes('$PDB', target=target, source=source)[0]
+        extratargets.append(pdb)
+        target[0].attributes.pdb = pdb
+
+    if not no_import_lib and \
+       not env.FindIxes(target, "LIBPREFIX", "LIBSUFFIX"):
+        # Append an import library to the list of targets.
+        extratargets.append(
+            env.ReplaceIxes(dll,
+                            '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp,
+                            "LIBPREFIX", "LIBSUFFIX"))
+        # and .exp file is created if there are exports from a DLL
+        extratargets.append(
+            env.ReplaceIxes(dll,
+                            '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp,
+                            "WINDOWSEXPPREFIX", "WINDOWSEXPSUFFIX"))
+
+    return (target+extratargets, source+extrasources)
+
+def windowsLibEmitter(target, source, env):
+    return _dllEmitter(target, source, env, 'SHLIB')
+
+def ldmodEmitter(target, source, env):
+    """Emitter for loadable modules.
+    
+    Loadable modules are identical to shared libraries on Windows, but building
+    them is subject to different parameters (LDMODULE*).
+    """
+    return _dllEmitter(target, source, env, 'LDMODULE')
+
+def prog_emitter(target, source, env):
+    SCons.Tool.msvc.validate_vars(env)
+
+    extratargets = []
+
+    exe = env.FindIxes(target, "PROGPREFIX", "PROGSUFFIX")
+    if not exe:
+        raise SCons.Errors.UserError("An executable should have exactly one target with the suffix: %s" % env.subst("$PROGSUFFIX"))
+
+    version_num, suite = SCons.Tool.msvs.msvs_parse_version(env.get('MSVS_VERSION', '6.0'))
+    if version_num >= 8.0 and env.get('WINDOWS_INSERT_MANIFEST', 0):
+        # MSVC 8 automatically generates .manifest files that have to be installed
+        extratargets.append(
+            env.ReplaceIxes(exe,
+                            "PROGPREFIX", "PROGSUFFIX",
+                            "WINDOWSPROGMANIFESTPREFIX", "WINDOWSPROGMANIFESTSUFFIX"))
+
+    if 'PDB' in env and env['PDB']:
+        pdb = env.arg2nodes('$PDB', target=target, source=source)[0]
+        extratargets.append(pdb)
+        target[0].attributes.pdb = pdb
+
+    return (target+extratargets,source)
+
+def RegServerFunc(target, source, env):
+    if 'register' in env and env['register']:
+        ret = regServerAction([target[0]], [source[0]], env)
+        if ret:
+            raise SCons.Errors.UserError("Unable to register %s" % target[0])
+        else:
+            print "Registered %s sucessfully" % target[0]
+        return ret
+    return 0
+
+regServerAction = SCons.Action.Action("$REGSVRCOM", "$REGSVRCOMSTR")
+regServerCheck = SCons.Action.Action(RegServerFunc, None)
+shlibLinkAction = SCons.Action.Action('${TEMPFILE("$SHLINK $SHLINKFLAGS $_SHLINK_TARGETS $_LIBDIRFLAGS $_LIBFLAGS $_PDB $_SHLINK_SOURCES")}')
+compositeShLinkAction = shlibLinkAction + regServerCheck
+ldmodLinkAction = SCons.Action.Action('${TEMPFILE("$LDMODULE $LDMODULEFLAGS $_LDMODULE_TARGETS $_LIBDIRFLAGS $_LIBFLAGS $_PDB $_LDMODULE_SOURCES")}')
+compositeLdmodAction = ldmodLinkAction + regServerCheck
+
+def generate(env):
+    """Add Builders and construction variables for ar to an Environment."""
+    SCons.Tool.createSharedLibBuilder(env)
+    SCons.Tool.createProgBuilder(env)
+
+    env['SHLINK']      = '$LINK'
+    env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS /dll')
+    env['_SHLINK_TARGETS'] = windowsShlinkTargets
+    env['_SHLINK_SOURCES'] = windowsShlinkSources
+    env['SHLINKCOM']   =  compositeShLinkAction
+    env.Append(SHLIBEMITTER = [windowsLibEmitter])
+    env['LINK']        = 'link'
+    env['LINKFLAGS']   = SCons.Util.CLVar('/nologo')
+    env['_PDB'] = pdbGenerator
+    env['LINKCOM'] = '${TEMPFILE("$LINK $LINKFLAGS /OUT:$TARGET.windows $_LIBDIRFLAGS $_LIBFLAGS $_PDB $SOURCES.windows")}'
+    env.Append(PROGEMITTER = [prog_emitter])
+    env['LIBDIRPREFIX']='/LIBPATH:'
+    env['LIBDIRSUFFIX']=''
+    env['LIBLINKPREFIX']=''
+    env['LIBLINKSUFFIX']='$LIBSUFFIX'
+
+    env['WIN32DEFPREFIX']        = ''
+    env['WIN32DEFSUFFIX']        = '.def'
+    env['WIN32_INSERT_DEF']      = 0
+    env['WINDOWSDEFPREFIX']      = '${WIN32DEFPREFIX}'
+    env['WINDOWSDEFSUFFIX']      = '${WIN32DEFSUFFIX}'
+    env['WINDOWS_INSERT_DEF']    = '${WIN32_INSERT_DEF}'
+
+    env['WIN32EXPPREFIX']        = ''
+    env['WIN32EXPSUFFIX']        = '.exp'
+    env['WINDOWSEXPPREFIX']      = '${WIN32EXPPREFIX}'
+    env['WINDOWSEXPSUFFIX']      = '${WIN32EXPSUFFIX}'
+
+    env['WINDOWSSHLIBMANIFESTPREFIX'] = ''
+    env['WINDOWSSHLIBMANIFESTSUFFIX'] = '${SHLIBSUFFIX}.manifest'
+    env['WINDOWSPROGMANIFESTPREFIX']  = ''
+    env['WINDOWSPROGMANIFESTSUFFIX']  = '${PROGSUFFIX}.manifest'
+
+    env['REGSVRACTION'] = regServerCheck
+    env['REGSVR'] = os.path.join(SCons.Platform.win32.get_system_root(),'System32','regsvr32')
+    env['REGSVRFLAGS'] = '/s '
+    env['REGSVRCOM'] = '$REGSVR $REGSVRFLAGS ${TARGET.windows}'
+
+    # Set-up ms tools paths
+    msvc_setup_env_once(env)
+
+
+    # Loadable modules are on Windows the same as shared libraries, but they
+    # are subject to different build parameters (LDMODULE* variables).
+    # Therefore LDMODULE* variables correspond as much as possible to
+    # SHLINK*/SHLIB* ones.
+    SCons.Tool.createLoadableModuleBuilder(env)
+    env['LDMODULE'] = '$SHLINK'
+    env['LDMODULEPREFIX'] = '$SHLIBPREFIX'
+    env['LDMODULESUFFIX'] = '$SHLIBSUFFIX'
+    env['LDMODULEFLAGS'] = '$SHLINKFLAGS'
+    env['_LDMODULE_TARGETS'] = _windowsLdmodTargets
+    env['_LDMODULE_SOURCES'] = _windowsLdmodSources
+    env['LDMODULEEMITTER'] = [ldmodEmitter]
+    env['LDMODULECOM'] = compositeLdmodAction
+
+def exists(env):
+    return msvc_exists()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/mssdk.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/mssdk.py
new file mode 100644
index 0000000..6ef9a83
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/mssdk.py
@@ -0,0 +1,50 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/mssdk.py 5183 2010/11/25 14:46:21 bdeegan"
+
+"""engine.SCons.Tool.mssdk
+
+Tool-specific initialization for Microsoft SDKs, both Platform
+SDKs and Windows SDKs.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+from MSCommon import mssdk_exists, \
+                     mssdk_setup_env
+
+def generate(env):
+    """Add construction variables for an MS SDK to an Environment."""
+    mssdk_setup_env(env)
+
+def exists(env):
+    return mssdk_exists()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/msvc.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/msvc.py
new file mode 100644
index 0000000..600c11c
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/msvc.py
@@ -0,0 +1,268 @@
+"""engine.SCons.Tool.msvc
+
+Tool-specific initialization for Microsoft Visual C/C++.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/msvc.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os.path
+import re
+import sys
+
+import SCons.Action
+import SCons.Builder
+import SCons.Errors
+import SCons.Platform.win32
+import SCons.Tool
+import SCons.Tool.msvs
+import SCons.Util
+import SCons.Warnings
+import SCons.Scanner.RC
+
+from MSCommon import msvc_exists, msvc_setup_env_once
+
+CSuffixes = ['.c', '.C']
+CXXSuffixes = ['.cc', '.cpp', '.cxx', '.c++', '.C++']
+
+def validate_vars(env):
+    """Validate the PCH and PCHSTOP construction variables."""
+    if 'PCH' in env and env['PCH']:
+        if 'PCHSTOP' not in env:
+            raise SCons.Errors.UserError("The PCHSTOP construction must be defined if PCH is defined.")
+        if not SCons.Util.is_String(env['PCHSTOP']):
+            raise SCons.Errors.UserError("The PCHSTOP construction variable must be a string: %r"%env['PCHSTOP'])
+
+def pch_emitter(target, source, env):
+    """Adds the object file target."""
+
+    validate_vars(env)
+
+    pch = None
+    obj = None
+
+    for t in target:
+        if SCons.Util.splitext(str(t))[1] == '.pch':
+            pch = t
+        if SCons.Util.splitext(str(t))[1] == '.obj':
+            obj = t
+
+    if not obj:
+        obj = SCons.Util.splitext(str(pch))[0]+'.obj'
+
+    target = [pch, obj] # pch must be first, and obj second for the PCHCOM to work
+
+    return (target, source)
+
+def object_emitter(target, source, env, parent_emitter):
+    """Sets up the PCH dependencies for an object file."""
+
+    validate_vars(env)
+
+    parent_emitter(target, source, env)
+
+    # Add a dependency, but only if the target (e.g. 'Source1.obj')
+    # doesn't correspond to the pre-compiled header ('Source1.pch').
+    # If the basenames match, then this was most likely caused by
+    # someone adding the source file to both the env.PCH() and the
+    # env.Program() calls, and adding the explicit dependency would
+    # cause a cycle on the .pch file itself.
+    #
+    # See issue #2505 for a discussion of what to do if it turns
+    # out this assumption causes trouble in the wild:
+    # http://scons.tigris.org/issues/show_bug.cgi?id=2505
+    if 'PCH' in env:
+        pch = env['PCH']
+        if str(target[0]) != SCons.Util.splitext(str(pch))[0] + '.obj':
+            env.Depends(target, pch)
+
+    return (target, source)
+
+def static_object_emitter(target, source, env):
+    return object_emitter(target, source, env,
+                          SCons.Defaults.StaticObjectEmitter)
+
+def shared_object_emitter(target, source, env):
+    return object_emitter(target, source, env,
+                          SCons.Defaults.SharedObjectEmitter)
+
+pch_action = SCons.Action.Action('$PCHCOM', '$PCHCOMSTR')
+pch_builder = SCons.Builder.Builder(action=pch_action, suffix='.pch',
+                                    emitter=pch_emitter,
+                                    source_scanner=SCons.Tool.SourceFileScanner)
+
+
+# Logic to build .rc files into .res files (resource files)
+res_scanner = SCons.Scanner.RC.RCScan()
+res_action  = SCons.Action.Action('$RCCOM', '$RCCOMSTR')
+res_builder = SCons.Builder.Builder(action=res_action,
+                                    src_suffix='.rc',
+                                    suffix='.res',
+                                    src_builder=[],
+                                    source_scanner=res_scanner)
+
+def msvc_batch_key(action, env, target, source):
+    """
+    Returns a key to identify unique batches of sources for compilation.
+
+    If batching is enabled (via the $MSVC_BATCH setting), then all
+    target+source pairs that use the same action, defined by the same
+    environment, and have the same target and source directories, will
+    be batched.
+
+    Returning None specifies that the specified target+source should not
+    be batched with other compilations.
+    """
+    b = env.subst('$MSVC_BATCH')
+    if b in (None, '', '0'):
+        # We're not using batching; return no key.
+        return None
+    t = target[0]
+    s = source[0]
+    if os.path.splitext(t.name)[0] != os.path.splitext(s.name)[0]:
+        # The base names are different, so this *must* be compiled
+        # separately; return no key.
+        return None
+    return (id(action), id(env), t.dir, s.dir)
+
+def msvc_output_flag(target, source, env, for_signature):
+    """
+    Returns the correct /Fo flag for batching.
+
+    If batching is disabled or there's only one source file, then we
+    return an /Fo string that specifies the target explicitly.  Otherwise,
+    we return an /Fo string that just specifies the first target's
+    directory (where the Visual C/C++ compiler will put the .obj files).
+    """
+    b = env.subst('$MSVC_BATCH')
+    if b in (None, '', '0') or len(source) == 1:
+        return '/Fo$TARGET'
+    else:
+        # The Visual C/C++ compiler requires a \ at the end of the /Fo
+        # option to indicate an output directory.  We use os.sep here so
+        # that the test(s) for this can be run on non-Windows systems
+        # without having a hard-coded backslash mess up command-line
+        # argument parsing.
+        return '/Fo${TARGET.dir}' + os.sep
+
+CAction = SCons.Action.Action("$CCCOM", "$CCCOMSTR",
+                              batch_key=msvc_batch_key,
+                              targets='$CHANGED_TARGETS')
+ShCAction = SCons.Action.Action("$SHCCCOM", "$SHCCCOMSTR",
+                                batch_key=msvc_batch_key,
+                                targets='$CHANGED_TARGETS')
+CXXAction = SCons.Action.Action("$CXXCOM", "$CXXCOMSTR",
+                                batch_key=msvc_batch_key,
+                                targets='$CHANGED_TARGETS')
+ShCXXAction = SCons.Action.Action("$SHCXXCOM", "$SHCXXCOMSTR",
+                                  batch_key=msvc_batch_key,
+                                  targets='$CHANGED_TARGETS')
+
+def generate(env):
+    """Add Builders and construction variables for MSVC++ to an Environment."""
+    static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+    # TODO(batch):  shouldn't reach in to cmdgen this way; necessary
+    # for now to bypass the checks in Builder.DictCmdGenerator.__call__()
+    # and allow .cc and .cpp to be compiled in the same command line.
+    static_obj.cmdgen.source_ext_match = False
+    shared_obj.cmdgen.source_ext_match = False
+
+    for suffix in CSuffixes:
+        static_obj.add_action(suffix, CAction)
+        shared_obj.add_action(suffix, ShCAction)
+        static_obj.add_emitter(suffix, static_object_emitter)
+        shared_obj.add_emitter(suffix, shared_object_emitter)
+
+    for suffix in CXXSuffixes:
+        static_obj.add_action(suffix, CXXAction)
+        shared_obj.add_action(suffix, ShCXXAction)
+        static_obj.add_emitter(suffix, static_object_emitter)
+        shared_obj.add_emitter(suffix, shared_object_emitter)
+
+    env['CCPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Z7") or ""}'])
+    env['CCPCHFLAGS'] = SCons.Util.CLVar(['${(PCH and "/Yu%s /Fp%s"%(PCHSTOP or "",File(PCH))) or ""}'])
+    env['_MSVC_OUTPUT_FLAG'] = msvc_output_flag
+    env['_CCCOMCOM']  = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $CCPCHFLAGS $CCPDBFLAGS'
+    env['CC']         = 'cl'
+    env['CCFLAGS']    = SCons.Util.CLVar('/nologo')
+    env['CFLAGS']     = SCons.Util.CLVar('')
+    env['CCCOM']      = '$CC $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CFLAGS $CCFLAGS $_CCCOMCOM'
+    env['SHCC']       = '$CC'
+    env['SHCCFLAGS']  = SCons.Util.CLVar('$CCFLAGS')
+    env['SHCFLAGS']   = SCons.Util.CLVar('$CFLAGS')
+    env['SHCCCOM']    = '$SHCC $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCFLAGS $SHCCFLAGS $_CCCOMCOM'
+    env['CXX']        = '$CC'
+    env['CXXFLAGS']   = SCons.Util.CLVar('$( /TP $)')
+    env['CXXCOM']     = '$CXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CXXFLAGS $CCFLAGS $_CCCOMCOM'
+    env['SHCXX']      = '$CXX'
+    env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
+    env['SHCXXCOM']   = '$SHCXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM'
+    env['CPPDEFPREFIX']  = '/D'
+    env['CPPDEFSUFFIX']  = ''
+    env['INCPREFIX']  = '/I'
+    env['INCSUFFIX']  = ''
+#    env.Append(OBJEMITTER = [static_object_emitter])
+#    env.Append(SHOBJEMITTER = [shared_object_emitter])
+    env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
+
+    env['RC'] = 'rc'
+    env['RCFLAGS'] = SCons.Util.CLVar('')
+    env['RCSUFFIXES']=['.rc','.rc2']
+    env['RCCOM'] = '$RC $_CPPDEFFLAGS $_CPPINCFLAGS $RCFLAGS /fo$TARGET $SOURCES'
+    env['BUILDERS']['RES'] = res_builder
+    env['OBJPREFIX']      = ''
+    env['OBJSUFFIX']      = '.obj'
+    env['SHOBJPREFIX']    = '$OBJPREFIX'
+    env['SHOBJSUFFIX']    = '$OBJSUFFIX'
+
+    # Set-up ms tools paths
+    msvc_setup_env_once(env)
+
+    env['CFILESUFFIX'] = '.c'
+    env['CXXFILESUFFIX'] = '.cc'
+
+    env['PCHPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Yd") or ""}'])
+    env['PCHCOM'] = '$CXX /Fo${TARGETS[1]} $CXXFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Yc$PCHSTOP /Fp${TARGETS[0]} $CCPDBFLAGS $PCHPDBFLAGS'
+    env['BUILDERS']['PCH'] = pch_builder
+
+    if 'ENV' not in env:
+        env['ENV'] = {}
+    if 'SystemRoot' not in env['ENV']:    # required for dlls in the winsxs folders
+        env['ENV']['SystemRoot'] = SCons.Platform.win32.get_system_root()
+
+def exists(env):
+    return msvc_exists()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/msvs.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/msvs.py
new file mode 100644
index 0000000..e191e1d
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/msvs.py
@@ -0,0 +1,1785 @@
+"""SCons.Tool.msvs
+
+Tool-specific initialization for Microsoft Visual Studio project files.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Tool/msvs.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.compat
+
+import base64
+import hashlib
+import ntpath
+import os
+# compat layer imports "cPickle" for us if it's available.
+import pickle
+import re
+import sys
+
+import SCons.Builder
+import SCons.Node.FS
+import SCons.Platform.win32
+import SCons.Script.SConscript
+import SCons.Util
+import SCons.Warnings
+
+from MSCommon import msvc_exists, msvc_setup_env_once
+from SCons.Defaults import processDefines
+
+##############################################################################
+# Below here are the classes and functions for generation of
+# DSP/DSW/SLN/VCPROJ files.
+##############################################################################
+
+def xmlify(s):
+    s = s.replace("&", "&") # do this first
+    s = s.replace("'", "'")
+    s = s.replace('"', """)
+    return s
+
+external_makefile_guid = '{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}'
+
+def _generateGUID(slnfile, name):
+    """This generates a dummy GUID for the sln file to use.  It is
+    based on the MD5 signatures of the sln filename plus the name of
+    the project.  It basically just needs to be unique, and not
+    change with each invocation."""
+    m = hashlib.md5()
+    # Normalize the slnfile path to a Windows path (\ separators) so
+    # the generated file has a consistent GUID even if we generate
+    # it on a non-Windows platform.
+    m.update(ntpath.normpath(str(slnfile)) + str(name))
+    solution = m.hexdigest().upper()
+    # convert most of the signature to GUID form (discard the rest)
+    solution = "{" + solution[:8] + "-" + solution[8:12] + "-" + solution[12:16] + "-" + solution[16:20] + "-" + solution[20:32] + "}"
+    return solution
+
+version_re = re.compile(r'(\d+\.\d+)(.*)')
+
+def msvs_parse_version(s):
+    """
+    Split a Visual Studio version, which may in fact be something like
+    '7.0Exp', into is version number (returned as a float) and trailing
+    "suite" portion.
+    """
+    num, suite = version_re.match(s).groups()
+    return float(num), suite
+
+# os.path.relpath has been introduced in Python 2.6
+# We define it locally for earlier versions of Python
+def relpath(path, start=os.path.curdir):
+    """Return a relative version of a path"""
+    import sys
+    if not path:
+        raise ValueError("no path specified")
+    start_list = os.path.abspath(start).split(os.sep)
+    path_list = os.path.abspath(path).split(os.sep)
+    if 'posix' in sys.builtin_module_names:
+        # Work out how much of the filepath is shared by start and path.
+        i = len(os.path.commonprefix([start_list, path_list]))
+    else:
+        if start_list[0].lower() != path_list[0].lower():
+            unc_path, rest = os.path.splitunc(path)
+            unc_start, rest = os.path.splitunc(start)
+            if bool(unc_path) ^ bool(unc_start):
+                raise ValueError("Cannot mix UNC and non-UNC paths (%s and %s)"
+                                                                    % (path, start))
+            else:
+                raise ValueError("path is on drive %s, start on drive %s"
+                                                    % (path_list[0], start_list[0]))
+        # Work out how much of the filepath is shared by start and path.
+        for i in range(min(len(start_list), len(path_list))):
+            if start_list[i].lower() != path_list[i].lower():
+                break
+        else:
+            i += 1
+    rel_list = [os.pardir] * (len(start_list)-i) + path_list[i:]
+    if not rel_list:
+        return os.path.curdir
+    return os.path.join(*rel_list)
+
+if not "relpath" in os.path.__all__:
+    os.path.relpath = relpath
+
+# This is how we re-invoke SCons from inside MSVS Project files.
+# The problem is that we might have been invoked as either scons.bat
+# or scons.py.  If we were invoked directly as scons.py, then we could
+# use sys.argv[0] to find the SCons "executable," but that doesn't work
+# if we were invoked as scons.bat, which uses "python -c" to execute
+# things and ends up with "-c" as sys.argv[0].  Consequently, we have
+# the MSVS Project file invoke SCons the same way that scons.bat does,
+# which works regardless of how we were invoked.
+def getExecScriptMain(env, xml=None):
+    scons_home = env.get('SCONS_HOME')
+    if not scons_home and 'SCONS_LIB_DIR' in os.environ:
+        scons_home = os.environ['SCONS_LIB_DIR']
+    if scons_home:
+        exec_script_main = "from os.path import join; import sys; sys.path = [ r'%s' ] + sys.path; import SCons.Script; SCons.Script.main()" % scons_home
+    else:
+        version = SCons.__version__
+        exec_script_main = "from os.path import join; import sys; sys.path = [ join(sys.prefix, 'Lib', 'site-packages', 'scons-%(version)s'), join(sys.prefix, 'scons-%(version)s'), join(sys.prefix, 'Lib', 'site-packages', 'scons'), join(sys.prefix, 'scons') ] + sys.path; import SCons.Script; SCons.Script.main()" % locals()
+    if xml:
+        exec_script_main = xmlify(exec_script_main)
+    return exec_script_main
+
+# The string for the Python executable we tell the Project file to use
+# is either sys.executable or, if an external PYTHON_ROOT environment
+# variable exists, $(PYTHON)ROOT\\python.exe (generalized a little to
+# pluck the actual executable name from sys.executable).
+try:
+    python_root = os.environ['PYTHON_ROOT']
+except KeyError:
+    python_executable = sys.executable
+else:
+    python_executable = os.path.join('$$(PYTHON_ROOT)',
+                                     os.path.split(sys.executable)[1])
+
+class Config(object):
+    pass
+
+def splitFully(path):
+    dir, base = os.path.split(path)
+    if dir and dir != '' and dir != path:
+        return splitFully(dir)+[base]
+    if base == '':
+        return []
+    return [base]
+
+def makeHierarchy(sources):
+    '''Break a list of files into a hierarchy; for each value, if it is a string,
+       then it is a file.  If it is a dictionary, it is a folder.  The string is
+       the original path of the file.'''
+
+    hierarchy = {}
+    for file in sources:
+        path = splitFully(file)
+        if len(path):
+            dict = hierarchy
+            for part in path[:-1]:
+                if part not in dict:
+                    dict[part] = {}
+                dict = dict[part]
+            dict[path[-1]] = file
+        #else:
+        #    print 'Warning: failed to decompose path for '+str(file)
+    return hierarchy
+
+class _DSPGenerator(object):
+    """ Base class for DSP generators """
+
+    srcargs = [
+        'srcs',
+        'incs',
+        'localincs',
+        'resources',
+        'misc']
+
+    def __init__(self, dspfile, source, env):
+        self.dspfile = str(dspfile)
+        try:
+            get_abspath = dspfile.get_abspath
+        except AttributeError:
+            self.dspabs = os.path.abspath(dspfile)
+        else:
+            self.dspabs = get_abspath()
+
+        if 'variant' not in env:
+            raise SCons.Errors.InternalError("You must specify a 'variant' argument (i.e. 'Debug' or " +\
+                  "'Release') to create an MSVSProject.")
+        elif SCons.Util.is_String(env['variant']):
+            variants = [env['variant']]
+        elif SCons.Util.is_List(env['variant']):
+            variants = env['variant']
+
+        if 'buildtarget' not in env or env['buildtarget'] == None:
+            buildtarget = ['']
+        elif SCons.Util.is_String(env['buildtarget']):
+            buildtarget = [env['buildtarget']]
+        elif SCons.Util.is_List(env['buildtarget']):
+            if len(env['buildtarget']) != len(variants):
+                raise SCons.Errors.InternalError("Sizes of 'buildtarget' and 'variant' lists must be the same.")
+            buildtarget = []
+            for bt in env['buildtarget']:
+                if SCons.Util.is_String(bt):
+                    buildtarget.append(bt)
+                else:
+                    buildtarget.append(bt.get_abspath())
+        else:
+            buildtarget = [env['buildtarget'].get_abspath()]
+        if len(buildtarget) == 1:
+            bt = buildtarget[0]
+            buildtarget = []
+            for _ in variants:
+                buildtarget.append(bt)
+
+        if 'outdir' not in env or env['outdir'] == None:
+            outdir = ['']
+        elif SCons.Util.is_String(env['outdir']):
+            outdir = [env['outdir']]
+        elif SCons.Util.is_List(env['outdir']):
+            if len(env['outdir']) != len(variants):
+                raise SCons.Errors.InternalError("Sizes of 'outdir' and 'variant' lists must be the same.")
+            outdir = []
+            for s in env['outdir']:
+                if SCons.Util.is_String(s):
+                    outdir.append(s)
+                else:
+                    outdir.append(s.get_abspath())
+        else:
+            outdir = [env['outdir'].get_abspath()]
+        if len(outdir) == 1:
+            s = outdir[0]
+            outdir = []
+            for v in variants:
+                outdir.append(s)
+
+        if 'runfile' not in env or env['runfile'] == None:
+            runfile = buildtarget[-1:]
+        elif SCons.Util.is_String(env['runfile']):
+            runfile = [env['runfile']]
+        elif SCons.Util.is_List(env['runfile']):
+            if len(env['runfile']) != len(variants):
+                raise SCons.Errors.InternalError("Sizes of 'runfile' and 'variant' lists must be the same.")
+            runfile = []
+            for s in env['runfile']:
+                if SCons.Util.is_String(s):
+                    runfile.append(s)
+                else:
+                    runfile.append(s.get_abspath())
+        else:
+            runfile = [env['runfile'].get_abspath()]
+        if len(runfile) == 1:
+            s = runfile[0]
+            runfile = []
+            for v in variants:
+                runfile.append(s)
+
+        self.sconscript = env['MSVSSCONSCRIPT']
+
+        cmdargs = env.get('cmdargs', '')
+
+        self.env = env
+
+        if 'name' in self.env:
+            self.name = self.env['name']
+        else:
+            self.name = os.path.basename(SCons.Util.splitext(self.dspfile)[0])
+        self.name = self.env.subst(self.name)
+
+        sourcenames = [
+            'Source Files',
+            'Header Files',
+            'Local Headers',
+            'Resource Files',
+            'Other Files']
+
+        self.sources = {}
+        for n in sourcenames:
+            self.sources[n] = []
+
+        self.configs = {}
+
+        self.nokeep = 0
+        if 'nokeep' in env and env['variant'] != 0:
+            self.nokeep = 1
+
+        if self.nokeep == 0 and os.path.exists(self.dspabs):
+            self.Parse()
+
+        for t in zip(sourcenames,self.srcargs):
+            if t[1] in self.env:
+                if SCons.Util.is_List(self.env[t[1]]):
+                    for i in self.env[t[1]]:
+                        if not i in self.sources[t[0]]:
+                            self.sources[t[0]].append(i)
+                else:
+                    if not self.env[t[1]] in self.sources[t[0]]:
+                        self.sources[t[0]].append(self.env[t[1]])
+
+        for n in sourcenames:
+            #TODO 2.4: compat layer supports sorted(key=) but not sort(key=)
+            #TODO 2.4: self.sources[n].sort(key=lambda a: a.lower())
+            self.sources[n] = sorted(self.sources[n], key=lambda a: a.lower())
+
+        def AddConfig(self, variant, buildtarget, outdir, runfile, cmdargs, dspfile=dspfile):
+            config = Config()
+            config.buildtarget = buildtarget
+            config.outdir = outdir
+            config.cmdargs = cmdargs
+            config.runfile = runfile
+
+            match = re.match('(.*)\|(.*)', variant)
+            if match:
+                config.variant = match.group(1)
+                config.platform = match.group(2)
+            else:
+                config.variant = variant
+                config.platform = 'Win32'
+
+            self.configs[variant] = config
+            print "Adding '" + self.name + ' - ' + config.variant + '|' + config.platform + "' to '" + str(dspfile) + "'"
+
+        for i in range(len(variants)):
+            AddConfig(self, variants[i], buildtarget[i], outdir[i], runfile[i], cmdargs)
+
+        self.platforms = []
+        for key in self.configs.keys():
+            platform = self.configs[key].platform
+            if not platform in self.platforms:
+                self.platforms.append(platform)
+
+    def Build(self):
+        pass
+
+V6DSPHeader = """\
+# Microsoft Developer Studio Project File - Name="%(name)s" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) External Target" 0x0106
+
+CFG=%(name)s - Win32 %(confkey)s
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "%(name)s.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "%(name)s.mak" CFG="%(name)s - Win32 %(confkey)s"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+"""
+
+class _GenerateV6DSP(_DSPGenerator):
+    """Generates a Project file for MSVS 6.0"""
+
+    def PrintHeader(self):
+        # pick a default config
+        confkeys = sorted(self.configs.keys())
+
+        name = self.name
+        confkey = confkeys[0]
+
+        self.file.write(V6DSPHeader % locals())
+
+        for kind in confkeys:
+            self.file.write('!MESSAGE "%s - Win32 %s" (based on "Win32 (x86) External Target")\n' % (name, kind))
+
+        self.file.write('!MESSAGE \n\n')
+
+    def PrintProject(self):
+        name = self.name
+        self.file.write('# Begin Project\n'
+                        '# PROP AllowPerConfigDependencies 0\n'
+                        '# PROP Scc_ProjName ""\n'
+                        '# PROP Scc_LocalPath ""\n\n')
+
+        first = 1
+        confkeys = sorted(self.configs.keys())
+        for kind in confkeys:
+            outdir = self.configs[kind].outdir
+            buildtarget = self.configs[kind].buildtarget
+            if first == 1:
+                self.file.write('!IF  "$(CFG)" == "%s - Win32 %s"\n\n' % (name, kind))
+                first = 0
+            else:
+                self.file.write('\n!ELSEIF  "$(CFG)" == "%s - Win32 %s"\n\n' % (name, kind))
+
+            env_has_buildtarget = 'MSVSBUILDTARGET' in self.env
+            if not env_has_buildtarget:
+                self.env['MSVSBUILDTARGET'] = buildtarget
+
+            # have to write this twice, once with the BASE settings, and once without
+            for base in ("BASE ",""):
+                self.file.write('# PROP %sUse_MFC 0\n'
+                                '# PROP %sUse_Debug_Libraries ' % (base, base))
+                if kind.lower().find('debug') < 0:
+                    self.file.write('0\n')
+                else:
+                    self.file.write('1\n')
+                self.file.write('# PROP %sOutput_Dir "%s"\n'
+                                '# PROP %sIntermediate_Dir "%s"\n' % (base,outdir,base,outdir))
+                cmd = 'echo Starting SCons && ' + self.env.subst('$MSVSBUILDCOM', 1)
+                self.file.write('# PROP %sCmd_Line "%s"\n'
+                                '# PROP %sRebuild_Opt "-c && %s"\n'
+                                '# PROP %sTarget_File "%s"\n'
+                                '# PROP %sBsc_Name ""\n'
+                                '# PROP %sTarget_Dir ""\n'\
+                                %(base,cmd,base,cmd,base,buildtarget,base,base))
+
+            if not env_has_buildtarget:
+                del self.env['MSVSBUILDTARGET']
+
+        self.file.write('\n!ENDIF\n\n'
+                        '# Begin Target\n\n')
+        for kind in confkeys:
+            self.file.write('# Name "%s - Win32 %s"\n' % (name,kind))
+        self.file.write('\n')
+        first = 0
+        for kind in confkeys:
+            if first == 0:
+                self.file.write('!IF  "$(CFG)" == "%s - Win32 %s"\n\n' % (name,kind))
+                first = 1
+            else:
+                self.file.write('!ELSEIF  "$(CFG)" == "%s - Win32 %s"\n\n' % (name,kind))
+        self.file.write('!ENDIF \n\n')
+        self.PrintSourceFiles()
+        self.file.write('# End Target\n'
+                        '# End Project\n')
+
+        if self.nokeep == 0:
+            # now we pickle some data and add it to the file -- MSDEV will ignore it.
+            pdata = pickle.dumps(self.configs,1)
+            pdata = base64.encodestring(pdata)
+            self.file.write(pdata + '\n')
+            pdata = pickle.dumps(self.sources,1)
+            pdata = base64.encodestring(pdata)
+            self.file.write(pdata + '\n')
+
+    def PrintSourceFiles(self):
+        categories = {'Source Files': 'cpp|c|cxx|l|y|def|odl|idl|hpj|bat',
+                      'Header Files': 'h|hpp|hxx|hm|inl',
+                      'Local Headers': 'h|hpp|hxx|hm|inl',
+                      'Resource Files': 'r|rc|ico|cur|bmp|dlg|rc2|rct|bin|cnt|rtf|gif|jpg|jpeg|jpe',
+                      'Other Files': ''}
+
+        for kind in sorted(categories.keys(), key=lambda a: a.lower()):
+            if not self.sources[kind]:
+                continue # skip empty groups
+
+            self.file.write('# Begin Group "' + kind + '"\n\n')
+            typelist = categories[kind].replace('|', ';')
+            self.file.write('# PROP Default_Filter "' + typelist + '"\n')
+
+            for file in self.sources[kind]:
+                file = os.path.normpath(file)
+                self.file.write('# Begin Source File\n\n'
+                                'SOURCE="' + file + '"\n'
+                                '# End Source File\n')
+            self.file.write('# End Group\n')
+
+        # add the SConscript file outside of the groups
+        self.file.write('# Begin Source File\n\n'
+                        'SOURCE="' + str(self.sconscript) + '"\n'
+                        '# End Source File\n')
+
+    def Parse(self):
+        try:
+            dspfile = open(self.dspabs,'r')
+        except IOError:
+            return # doesn't exist yet, so can't add anything to configs.
+
+        line = dspfile.readline()
+        while line:
+            if line.find("# End Project") > -1:
+                break
+            line = dspfile.readline()
+
+        line = dspfile.readline()
+        datas = line
+        while line and line != '\n':
+            line = dspfile.readline()
+            datas = datas + line
+
+        # OK, we've found our little pickled cache of data.
+        try:
+            datas = base64.decodestring(datas)
+            data = pickle.loads(datas)
+        except KeyboardInterrupt:
+            raise
+        except:
+            return # unable to unpickle any data for some reason
+
+        self.configs.update(data)
+
+        data = None
+        line = dspfile.readline()
+        datas = line
+        while line and line != '\n':
+            line = dspfile.readline()
+            datas = datas + line
+
+        # OK, we've found our little pickled cache of data.
+        # it has a "# " in front of it, so we strip that.
+        try:
+            datas = base64.decodestring(datas)
+            data = pickle.loads(datas)
+        except KeyboardInterrupt:
+            raise
+        except:
+            return # unable to unpickle any data for some reason
+
+        self.sources.update(data)
+
+    def Build(self):
+        try:
+            self.file = open(self.dspabs,'w')
+        except IOError, detail:
+            raise SCons.Errors.InternalError('Unable to open "' + self.dspabs + '" for writing:' + str(detail))
+        else:
+            self.PrintHeader()
+            self.PrintProject()
+            self.file.close()
+
+V7DSPHeader = """\
+<?xml version="1.0" encoding="%(encoding)s"?>
+<VisualStudioProject
+\tProjectType="Visual C++"
+\tVersion="%(versionstr)s"
+\tName="%(name)s"
+\tProjectGUID="%(project_guid)s"
+%(scc_attrs)s
+\tKeyword="MakeFileProj">
+"""
+
+V7DSPConfiguration = """\
+\t\t<Configuration
+\t\t\tName="%(variant)s|%(platform)s"
+\t\t\tOutputDirectory="%(outdir)s"
+\t\t\tIntermediateDirectory="%(outdir)s"
+\t\t\tConfigurationType="0"
+\t\t\tUseOfMFC="0"
+\t\t\tATLMinimizesCRunTimeLibraryUsage="FALSE">
+\t\t\t<Tool
+\t\t\t\tName="VCNMakeTool"
+\t\t\t\tBuildCommandLine="%(buildcmd)s"
+\t\t\t\tReBuildCommandLine="%(rebuildcmd)s"
+\t\t\t\tCleanCommandLine="%(cleancmd)s"
+\t\t\t\tOutput="%(runfile)s"/>
+\t\t</Configuration>
+"""
+
+V8DSPHeader = """\
+<?xml version="1.0" encoding="%(encoding)s"?>
+<VisualStudioProject
+\tProjectType="Visual C++"
+\tVersion="%(versionstr)s"
+\tName="%(name)s"
+\tProjectGUID="%(project_guid)s"
+\tRootNamespace="%(name)s"
+%(scc_attrs)s
+\tKeyword="MakeFileProj">
+"""
+
+V8DSPConfiguration = """\
+\t\t<Configuration
+\t\t\tName="%(variant)s|%(platform)s"
+\t\t\tConfigurationType="0"
+\t\t\tUseOfMFC="0"
+\t\t\tATLMinimizesCRunTimeLibraryUsage="false"
+\t\t\t>
+\t\t\t<Tool
+\t\t\t\tName="VCNMakeTool"
+\t\t\t\tBuildCommandLine="%(buildcmd)s"
+\t\t\t\tReBuildCommandLine="%(rebuildcmd)s"
+\t\t\t\tCleanCommandLine="%(cleancmd)s"
+\t\t\t\tOutput="%(runfile)s"
+\t\t\t\tPreprocessorDefinitions="%(preprocdefs)s"
+\t\t\t\tIncludeSearchPath="%(includepath)s"
+\t\t\t\tForcedIncludes=""
+\t\t\t\tAssemblySearchPath=""
+\t\t\t\tForcedUsingAssemblies=""
+\t\t\t\tCompileAsManaged=""
+\t\t\t/>
+\t\t</Configuration>
+"""
+class _GenerateV7DSP(_DSPGenerator):
+    """Generates a Project file for MSVS .NET"""
+
+    def __init__(self, dspfile, source, env):
+        _DSPGenerator.__init__(self, dspfile, source, env)
+        self.version = env['MSVS_VERSION']
+        self.version_num, self.suite = msvs_parse_version(self.version)
+        if self.version_num >= 9.0:
+            self.versionstr = '9.00'
+            self.dspheader = V8DSPHeader
+            self.dspconfiguration = V8DSPConfiguration
+        elif self.version_num >= 8.0:
+            self.versionstr = '8.00'
+            self.dspheader = V8DSPHeader
+            self.dspconfiguration = V8DSPConfiguration
+        else:
+            if self.version_num >= 7.1:
+                self.versionstr = '7.10'
+            else:
+                self.versionstr = '7.00'
+            self.dspheader = V7DSPHeader
+            self.dspconfiguration = V7DSPConfiguration
+        self.file = None
+
+    def PrintHeader(self):
+        env = self.env
+        versionstr = self.versionstr
+        name = self.name
+        encoding = self.env.subst('$MSVSENCODING')
+        scc_provider = env.get('MSVS_SCC_PROVIDER', '')
+        scc_project_name = env.get('MSVS_SCC_PROJECT_NAME', '')
+        scc_aux_path = env.get('MSVS_SCC_AUX_PATH', '')
+        # MSVS_SCC_LOCAL_PATH is kept  for backwards compatibility purpose and should
+        # be deprecated as soon as possible.
+        scc_local_path_legacy = env.get('MSVS_SCC_LOCAL_PATH', '')
+        scc_connection_root = env.get('MSVS_SCC_CONNECTION_ROOT', os.curdir)
+        scc_local_path = os.path.relpath(scc_connection_root, os.path.dirname(self.dspabs))
+        project_guid = env.get('MSVS_PROJECT_GUID', '')
+        if not project_guid:
+            project_guid = _generateGUID(self.dspfile, '')
+        if scc_provider != '':
+            scc_attrs = '\tSccProjectName="%s"\n' % scc_project_name
+            if scc_aux_path != '':
+                scc_attrs += '\tSccAuxPath="%s"\n' % scc_aux_path
+            scc_attrs += ('\tSccLocalPath="%s"\n'
+                          '\tSccProvider="%s"' % (scc_local_path, scc_provider))
+        elif scc_local_path_legacy != '':
+            # This case is kept for backwards compatibility purpose and should
+            # be deprecated as soon as possible.
+            scc_attrs = ('\tSccProjectName="%s"\n'
+                         '\tSccLocalPath="%s"' % (scc_project_name, scc_local_path_legacy))
+        else:
+            self.dspheader = self.dspheader.replace('%(scc_attrs)s\n', '')
+
+        self.file.write(self.dspheader % locals())
+
+        self.file.write('\t<Platforms>\n')
+        for platform in self.platforms:
+            self.file.write(
+                        '\t\t<Platform\n'
+                        '\t\t\tName="%s"/>\n' % platform)
+        self.file.write('\t</Platforms>\n')
+
+        if self.version_num >= 8.0:
+            self.file.write('\t<ToolFiles>\n'
+                            '\t</ToolFiles>\n')
+
+    def PrintProject(self):
+        self.file.write('\t<Configurations>\n')
+
+        confkeys = sorted(self.configs.keys())
+        for kind in confkeys:
+            variant = self.configs[kind].variant
+            platform = self.configs[kind].platform
+            outdir = self.configs[kind].outdir
+            buildtarget = self.configs[kind].buildtarget
+            runfile     = self.configs[kind].runfile
+            cmdargs = self.configs[kind].cmdargs
+
+            env_has_buildtarget = 'MSVSBUILDTARGET' in self.env
+            if not env_has_buildtarget:
+                self.env['MSVSBUILDTARGET'] = buildtarget
+
+            starting = 'echo Starting SCons && '
+            if cmdargs:
+                cmdargs = ' ' + cmdargs
+            else:
+                cmdargs = ''
+            buildcmd    = xmlify(starting + self.env.subst('$MSVSBUILDCOM', 1) + cmdargs)
+            rebuildcmd  = xmlify(starting + self.env.subst('$MSVSREBUILDCOM', 1) + cmdargs)
+            cleancmd    = xmlify(starting + self.env.subst('$MSVSCLEANCOM', 1) + cmdargs)
+
+            preprocdefs = xmlify(';'.join(processDefines(self.env.get('CPPDEFINES', []))))
+            includepath = xmlify(';'.join(self.env.get('CPPPATH', [])))
+
+            if not env_has_buildtarget:
+                del self.env['MSVSBUILDTARGET']
+
+            self.file.write(self.dspconfiguration % locals())
+
+        self.file.write('\t</Configurations>\n')
+
+        if self.version_num >= 7.1:
+            self.file.write('\t<References>\n'
+                            '\t</References>\n')
+
+        self.PrintSourceFiles()
+
+        self.file.write('</VisualStudioProject>\n')
+
+        if self.nokeep == 0:
+            # now we pickle some data and add it to the file -- MSDEV will ignore it.
+            pdata = pickle.dumps(self.configs,1)
+            pdata = base64.encodestring(pdata)
+            self.file.write('<!-- SCons Data:\n' + pdata + '\n')
+            pdata = pickle.dumps(self.sources,1)
+            pdata = base64.encodestring(pdata)
+            self.file.write(pdata + '-->\n')
+
+    def printSources(self, hierarchy, commonprefix):
+        sorteditems = sorted(hierarchy.items(), key=lambda a: a[0].lower())
+
+        # First folders, then files
+        for key, value in sorteditems:
+            if SCons.Util.is_Dict(value):
+                self.file.write('\t\t\t<Filter\n'
+                                '\t\t\t\tName="%s"\n'
+                                '\t\t\t\tFilter="">\n' % (key))
+                self.printSources(value, commonprefix)
+                self.file.write('\t\t\t</Filter>\n')
+
+        for key, value in sorteditems:
+            if SCons.Util.is_String(value):
+                file = value
+                if commonprefix:
+                    file = os.path.join(commonprefix, value)
+                file = os.path.normpath(file)
+                self.file.write('\t\t\t<File\n'
+                                '\t\t\t\tRelativePath="%s">\n'
+                                '\t\t\t</File>\n' % (file))
+
+    def PrintSourceFiles(self):
+        categories = {'Source Files': 'cpp;c;cxx;l;y;def;odl;idl;hpj;bat',
+                      'Header Files': 'h;hpp;hxx;hm;inl',
+                      'Local Headers': 'h;hpp;hxx;hm;inl',
+                      'Resource Files': 'r;rc;ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe',
+                      'Other Files': ''}
+
+        self.file.write('\t<Files>\n')
+
+        cats = sorted([k for k in categories.keys() if self.sources[k]],
+                      key=lambda a: a.lower())
+        for kind in cats:
+            if len(cats) > 1:
+                self.file.write('\t\t<Filter\n'
+                                '\t\t\tName="%s"\n'
+                                '\t\t\tFilter="%s">\n' % (kind, categories[kind]))
+
+            sources = self.sources[kind]
+
+            # First remove any common prefix
+            commonprefix = None
+            if len(sources) > 1:
+                s = list(map(os.path.normpath, sources))
+                # take the dirname because the prefix may include parts
+                # of the filenames (e.g. if you have 'dir\abcd' and
+                # 'dir\acde' then the cp will be 'dir\a' )
+                cp = os.path.dirname( os.path.commonprefix(s) )
+                if cp and s[0][len(cp)] == os.sep:
+                    # +1 because the filename starts after the separator
+                    sources = [s[len(cp)+1:] for s in sources]
+                    commonprefix = cp
+            elif len(sources) == 1:
+                commonprefix = os.path.dirname( sources[0] )
+                sources[0] = os.path.basename( sources[0] )
+
+            hierarchy = makeHierarchy(sources)
+            self.printSources(hierarchy, commonprefix=commonprefix)
+
+            if len(cats)>1:
+                self.file.write('\t\t</Filter>\n')
+
+        # add the SConscript file outside of the groups
+        self.file.write('\t\t<File\n'
+                        '\t\t\tRelativePath="%s">\n'
+                        '\t\t</File>\n' % str(self.sconscript))
+
+        self.file.write('\t</Files>\n'
+                        '\t<Globals>\n'
+                        '\t</Globals>\n')
+
+    def Parse(self):
+        try:
+            dspfile = open(self.dspabs,'r')
+        except IOError:
+            return # doesn't exist yet, so can't add anything to configs.
+
+        line = dspfile.readline()
+        while line:
+            if line.find('<!-- SCons Data:') > -1:
+                break
+            line = dspfile.readline()
+
+        line = dspfile.readline()
+        datas = line
+        while line and line != '\n':
+            line = dspfile.readline()
+            datas = datas + line
+
+        # OK, we've found our little pickled cache of data.
+        try:
+            datas = base64.decodestring(datas)
+            data = pickle.loads(datas)
+        except KeyboardInterrupt:
+            raise
+        except:
+            return # unable to unpickle any data for some reason
+
+        self.configs.update(data)
+
+        data = None
+        line = dspfile.readline()
+        datas = line
+        while line and line != '\n':
+            line = dspfile.readline()
+            datas = datas + line
+
+        # OK, we've found our little pickled cache of data.
+        try:
+            datas = base64.decodestring(datas)
+            data = pickle.loads(datas)
+        except KeyboardInterrupt:
+            raise
+        except:
+            return # unable to unpickle any data for some reason
+
+        self.sources.update(data)
+
+    def Build(self):
+        try:
+            self.file = open(self.dspabs,'w')
+        except IOError, detail:
+            raise SCons.Errors.InternalError('Unable to open "' + self.dspabs + '" for writing:' + str(detail))
+        else:
+            self.PrintHeader()
+            self.PrintProject()
+            self.file.close()
+			
+V10DSPHeader = """\
+<?xml version="1.0" encoding="%(encoding)s"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+"""
+
+V10DSPProjectConfiguration = """\
+\t\t<ProjectConfiguration Include="%(variant)s|%(platform)s">
+\t\t\t<Configuration>%(variant)s</Configuration>
+\t\t\t<Platform>%(platform)s</Platform>
+\t\t</ProjectConfiguration>
+"""
+
+V10DSPGlobals = """\
+\t<PropertyGroup Label="Globals">
+\t\t<ProjectGuid>%(project_guid)s</ProjectGuid>
+%(scc_attrs)s\t\t<RootNamespace>%(name)s</RootNamespace>
+\t\t<Keyword>MakeFileProj</Keyword>
+\t</PropertyGroup>
+"""
+
+V10DSPPropertyGroupCondition = """\
+\t<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'" Label="Configuration">
+\t\t<ConfigurationType>Makefile</ConfigurationType>
+\t\t<UseOfMfc>false</UseOfMfc>
+\t</PropertyGroup>
+"""
+
+V10DSPImportGroupCondition = """\
+\t<ImportGroup Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'" Label="PropertySheets">
+\t\t<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+\t</ImportGroup>
+"""
+
+V10DSPCommandLine = """\
+\t\t<NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(buildcmd)s</NMakeBuildCommandLine>
+\t\t<NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(rebuildcmd)s</NMakeReBuildCommandLine>
+\t\t<NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(cleancmd)s</NMakeCleanCommandLine>
+\t\t<NMakeOutput Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(runfile)s</NMakeOutput>
+\t\t<NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(preprocdefs)s</NMakePreprocessorDefinitions>
+\t\t<NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(includepath)s</NMakeIncludeSearchPath>
+\t\t<NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
+\t\t<NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
+\t\t<NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
+"""
+
+class _GenerateV10DSP(_DSPGenerator):
+    """Generates a Project file for MSVS 2010"""
+
+    def __init__(self, dspfile, source, env):
+        _DSPGenerator.__init__(self, dspfile, source, env)
+        
+        self.dspheader = V10DSPHeader
+        self.dspconfiguration = V10DSPProjectConfiguration
+        self.dspglobals = V10DSPGlobals
+
+    def PrintHeader(self):
+        env = self.env
+        name = self.name
+        encoding = env.subst('$MSVSENCODING')
+        project_guid = env.get('MSVS_PROJECT_GUID', '')
+        scc_provider = env.get('MSVS_SCC_PROVIDER', '')
+        scc_project_name = env.get('MSVS_SCC_PROJECT_NAME', '')
+        scc_aux_path = env.get('MSVS_SCC_AUX_PATH', '')
+        # MSVS_SCC_LOCAL_PATH is kept  for backwards compatibility purpose and should
+        # be deprecated as soon as possible.
+        scc_local_path_legacy = env.get('MSVS_SCC_LOCAL_PATH', '')
+        scc_connection_root = env.get('MSVS_SCC_CONNECTION_ROOT', os.curdir)
+        scc_local_path = os.path.relpath(scc_connection_root, os.path.dirname(self.dspabs))
+        if not project_guid:
+            project_guid = _generateGUID(self.dspfile, '')
+        if scc_provider != '':
+            scc_attrs = '\t\t<SccProjectName>%s</SccProjectName>\n' % scc_project_name
+            if scc_aux_path != '':
+                scc_attrs += '\t\t<SccAuxPath>%s</SccAuxPath>\n' % scc_aux_path
+            scc_attrs += ('\t\t<SccLocalPath>%s</SccLocalPath>\n'
+                          '\t\t<SccProvider>%s</SccProvider>\n' % (scc_local_path, scc_provider))
+        elif scc_local_path_legacy != '':
+            # This case is kept for backwards compatibility purpose and should
+            # be deprecated as soon as possible.
+            scc_attrs = ('\t\t<SccProjectName>%s</SccProjectName>\n'
+                         '\t\t<SccLocalPath>%s</SccLocalPath>\n' % (scc_project_name, scc_local_path_legacy))
+        else:
+            self.dspglobals = self.dspglobals.replace('%(scc_attrs)s', '')
+            
+        self.file.write(self.dspheader % locals())
+        
+        self.file.write('\t<ItemGroup Label="ProjectConfigurations">\n')
+        
+        confkeys = sorted(self.configs.keys())
+        for kind in confkeys:
+            variant = self.configs[kind].variant
+            platform = self.configs[kind].platform
+            self.file.write(self.dspconfiguration % locals())
+        
+        self.file.write('\t</ItemGroup>\n')
+        
+        self.file.write(self.dspglobals % locals())
+    
+    def PrintProject(self):
+        name = self.name
+        confkeys = sorted(self.configs.keys())
+             
+        self.file.write('\t<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\n')
+        
+        for kind in confkeys:
+            variant = self.configs[kind].variant
+            platform = self.configs[kind].platform
+            self.file.write(V10DSPPropertyGroupCondition % locals())
+
+        self.file.write('\t<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\n')
+        self.file.write('\t<ImportGroup Label="ExtensionSettings">\n')
+        self.file.write('\t</ImportGroup>\n')
+        
+        for kind in confkeys:
+            variant = self.configs[kind].variant
+            platform = self.configs[kind].platform
+            self.file.write(V10DSPImportGroupCondition % locals())
+        
+        self.file.write('\t<PropertyGroup Label="UserMacros" />\n')
+        self.file.write('\t<PropertyGroup>\n')
+        self.file.write('\t<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n')
+        
+        for kind in confkeys:
+            variant = self.configs[kind].variant
+            platform = self.configs[kind].platform
+            outdir = self.configs[kind].outdir
+            buildtarget = self.configs[kind].buildtarget
+            runfile     = self.configs[kind].runfile
+            cmdargs = self.configs[kind].cmdargs
+            
+            env_has_buildtarget = 'MSVSBUILDTARGET' in self.env
+            if not env_has_buildtarget:
+                self.env['MSVSBUILDTARGET'] = buildtarget
+
+            starting = 'echo Starting SCons && '
+            if cmdargs:
+                cmdargs = ' ' + cmdargs
+            else:
+                cmdargs = ''
+            buildcmd    = xmlify(starting + self.env.subst('$MSVSBUILDCOM', 1) + cmdargs)
+            rebuildcmd  = xmlify(starting + self.env.subst('$MSVSREBUILDCOM', 1) + cmdargs)
+            cleancmd    = xmlify(starting + self.env.subst('$MSVSCLEANCOM', 1) + cmdargs)
+
+            preprocdefs = xmlify(';'.join(processDefines(self.env.get('CPPDEFINES', []))))
+            includepath = xmlify(';'.join(self.env.get('CPPPATH', [])))
+
+            if not env_has_buildtarget:
+                del self.env['MSVSBUILDTARGET']
+
+            self.file.write(V10DSPCommandLine % locals())
+        
+        self.file.write('\t</PropertyGroup>\n')
+        
+        #filter settings in MSVS 2010 are stored in separate file
+        self.filtersabs = self.dspabs + '.filters'
+        try:
+            self.filters_file = open(self.filtersabs, 'w')
+        except IOError, detail:
+            raise SCons.Errors.InternalError('Unable to open "' + self.filtersabs + '" for writing:' + str(detail))
+            
+        self.filters_file.write('<?xml version="1.0" encoding="utf-8"?>\n'
+                                '<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\n')
+                                
+        self.PrintSourceFiles()
+        
+        self.filters_file.write('</Project>')
+        self.filters_file.close()
+        
+        self.file.write('\t<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\n'
+                        '\t<ImportGroup Label="ExtensionTargets">\n'
+                        '\t</ImportGroup>\n'
+                        '</Project>\n')
+                        
+        if self.nokeep == 0:
+            # now we pickle some data and add it to the file -- MSDEV will ignore it.
+            pdata = pickle.dumps(self.configs,1)
+            pdata = base64.encodestring(pdata)
+            self.file.write('<!-- SCons Data:\n' + pdata + '\n')
+            pdata = pickle.dumps(self.sources,1)
+            pdata = base64.encodestring(pdata)
+            self.file.write(pdata + '-->\n')
+
+    def printFilters(self, hierarchy, name):
+        sorteditems = sorted(hierarchy.items(), key = lambda a: a[0].lower())
+        
+        for key, value in sorteditems:
+            if SCons.Util.is_Dict(value):
+                filter_name = name + '\\' + key
+                self.filters_file.write('\t\t<Filter Include="%s">\n'
+                                        '\t\t\t<UniqueIdentifier>%s</UniqueIdentifier>\n'
+                                        '\t\t</Filter>\n' % (filter_name, _generateGUID(self.dspabs, filter_name)))
+                self.printFilters(value, filter_name)
+        
+    def printSources(self, hierarchy, kind, commonprefix, filter_name):
+        keywords = {'Source Files': 'ClCompile',
+                    'Header Files': 'ClInclude',
+                    'Local Headers': 'ClInclude',
+                    'Resource Files': 'None',
+                    'Other Files': 'None'}
+                    
+        sorteditems = sorted(hierarchy.items(), key = lambda a: a[0].lower())
+
+        # First folders, then files
+        for key, value in sorteditems:
+            if SCons.Util.is_Dict(value):
+                self.printSources(value, kind, commonprefix, filter_name + '\\' + key)
+
+        for key, value in sorteditems:
+            if SCons.Util.is_String(value):
+                file = value
+                if commonprefix:
+                    file = os.path.join(commonprefix, value)
+                file = os.path.normpath(file)
+                
+                self.file.write('\t\t<%s Include="%s" />\n' % (keywords[kind], file))
+                self.filters_file.write('\t\t<%s Include="%s">\n'
+                                        '\t\t\t<Filter>%s</Filter>\n'
+                                        '\t\t</%s>\n' % (keywords[kind], file, filter_name, keywords[kind]))
+
+    def PrintSourceFiles(self):
+        categories = {'Source Files': 'cpp;c;cxx;l;y;def;odl;idl;hpj;bat',
+                      'Header Files': 'h;hpp;hxx;hm;inl',
+                      'Local Headers': 'h;hpp;hxx;hm;inl',
+                      'Resource Files': 'r;rc;ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe',
+                      'Other Files': ''}
+        
+        cats = sorted([k for k in categories.keys() if self.sources[k]],
+		              key = lambda a: a.lower())
+        
+        # print vcxproj.filters file first
+        self.filters_file.write('\t<ItemGroup>\n')
+        for kind in cats:
+            self.filters_file.write('\t\t<Filter Include="%s">\n'
+                                    '\t\t\t<UniqueIdentifier>{7b42d31d-d53c-4868-8b92-ca2bc9fc052f}</UniqueIdentifier>\n'
+                                    '\t\t\t<Extensions>%s</Extensions>\n'
+                                    '\t\t</Filter>\n' % (kind, categories[kind]))
+                                    
+            # First remove any common prefix
+            sources = self.sources[kind]
+            commonprefix = None
+            if len(sources) > 1:
+                s = list(map(os.path.normpath, sources))
+                # take the dirname because the prefix may include parts
+                # of the filenames (e.g. if you have 'dir\abcd' and
+                # 'dir\acde' then the cp will be 'dir\a' )
+                cp = os.path.dirname( os.path.commonprefix(s) )
+                if cp and s[0][len(cp)] == os.sep:
+                    # +1 because the filename starts after the separator
+                    sources = [s[len(cp)+1:] for s in sources]
+                    commonprefix = cp
+            elif len(sources) == 1:
+                commonprefix = os.path.dirname( sources[0] )
+                sources[0] = os.path.basename( sources[0] )
+            
+            hierarchy = makeHierarchy(sources)
+            self.printFilters(hierarchy, kind)
+            
+        self.filters_file.write('\t</ItemGroup>\n')
+            
+        # then print files and filters
+        for kind in cats:
+            self.file.write('\t<ItemGroup>\n')
+            self.filters_file.write('\t<ItemGroup>\n')
+                
+            # First remove any common prefix
+            sources = self.sources[kind]
+            commonprefix = None
+            if len(sources) > 1:
+                s = list(map(os.path.normpath, sources))
+                # take the dirname because the prefix may include parts
+                # of the filenames (e.g. if you have 'dir\abcd' and
+                # 'dir\acde' then the cp will be 'dir\a' )
+                cp = os.path.dirname( os.path.commonprefix(s) )
+                if cp and s[0][len(cp)] == os.sep:
+                    # +1 because the filename starts after the separator
+                    sources = [s[len(cp)+1:] for s in sources]
+                    commonprefix = cp
+            elif len(sources) == 1:
+                commonprefix = os.path.dirname( sources[0] )
+                sources[0] = os.path.basename( sources[0] )
+            
+            hierarchy = makeHierarchy(sources)
+            self.printSources(hierarchy, kind, commonprefix, kind)
+                        
+            self.file.write('\t</ItemGroup>\n')
+            self.filters_file.write('\t</ItemGroup>\n')
+                
+        # add the SConscript file outside of the groups
+        self.file.write('\t<ItemGroup>\n'
+                        '\t\t<None Include="%s" />\n'
+                        #'\t\t<None Include="SConstruct" />\n'
+                        '\t</ItemGroup>\n' % str(self.sconscript))
+
+    def Parse(self):
+        print "_GenerateV10DSP.Parse()"
+
+    def Build(self):
+        try:
+            self.file = open(self.dspabs, 'w')
+        except IOError, detail:
+            raise SCons.Errors.InternalError('Unable to open "' + self.dspabs + '" for writing:' + str(detail))
+        else:
+            self.PrintHeader()
+            self.PrintProject()
+            self.file.close()
+
+class _DSWGenerator(object):
+    """ Base class for DSW generators """
+    def __init__(self, dswfile, source, env):
+        self.dswfile = os.path.normpath(str(dswfile))
+        self.dsw_folder_path = os.path.dirname(os.path.abspath(self.dswfile))
+        self.env = env
+
+        if 'projects' not in env:
+            raise SCons.Errors.UserError("You must specify a 'projects' argument to create an MSVSSolution.")
+        projects = env['projects']
+        if not SCons.Util.is_List(projects):
+            raise SCons.Errors.InternalError("The 'projects' argument must be a list of nodes.")
+        projects = SCons.Util.flatten(projects)
+        if len(projects) < 1:
+            raise SCons.Errors.UserError("You must specify at least one project to create an MSVSSolution.")
+        self.dspfiles = list(map(str, projects))
+
+        if 'name' in self.env:
+            self.name = self.env['name']
+        else:
+            self.name = os.path.basename(SCons.Util.splitext(self.dswfile)[0])
+        self.name = self.env.subst(self.name)
+
+    def Build(self):
+        pass
+
+class _GenerateV7DSW(_DSWGenerator):
+    """Generates a Solution file for MSVS .NET"""
+    def __init__(self, dswfile, source, env):
+        _DSWGenerator.__init__(self, dswfile, source, env)
+
+        self.file = None
+        self.version = self.env['MSVS_VERSION']
+        self.version_num, self.suite = msvs_parse_version(self.version)
+        self.versionstr = '7.00'
+        if self.version_num >= 10.0:
+            self.versionstr = '11.00'
+        elif self.version_num >= 9.0:
+            self.versionstr = '10.00'
+        elif self.version_num >= 8.0:
+            self.versionstr = '9.00'
+        elif self.version_num >= 7.1:
+            self.versionstr = '8.00'
+
+        if 'slnguid' in env and env['slnguid']:
+            self.slnguid = env['slnguid']
+        else:
+            self.slnguid = _generateGUID(dswfile, self.name)
+
+        self.configs = {}
+
+        self.nokeep = 0
+        if 'nokeep' in env and env['variant'] != 0:
+            self.nokeep = 1
+
+        if self.nokeep == 0 and os.path.exists(self.dswfile):
+            self.Parse()
+
+        def AddConfig(self, variant, dswfile=dswfile):
+            config = Config()
+
+            match = re.match('(.*)\|(.*)', variant)
+            if match:
+                config.variant = match.group(1)
+                config.platform = match.group(2)
+            else:
+                config.variant = variant
+                config.platform = 'Win32'
+
+            self.configs[variant] = config
+            print "Adding '" + self.name + ' - ' + config.variant + '|' + config.platform + "' to '" + str(dswfile) + "'"
+
+        if 'variant' not in env:
+            raise SCons.Errors.InternalError("You must specify a 'variant' argument (i.e. 'Debug' or " +\
+                  "'Release') to create an MSVS Solution File.")
+        elif SCons.Util.is_String(env['variant']):
+            AddConfig(self, env['variant'])
+        elif SCons.Util.is_List(env['variant']):
+            for variant in env['variant']:
+                AddConfig(self, variant)
+
+        self.platforms = []
+        for key in self.configs.keys():
+            platform = self.configs[key].platform
+            if not platform in self.platforms:
+                self.platforms.append(platform)
+
+        def GenerateProjectFilesInfo(self):
+            for dspfile in self.dspfiles:
+                dsp_folder_path, name = os.path.split(dspfile)
+                dsp_folder_path = os.path.abspath(dsp_folder_path)
+                dsp_relative_folder_path = os.path.relpath(dsp_folder_path, self.dsw_folder_path)
+                if dsp_relative_folder_path == os.curdir:
+                    dsp_relative_file_path = name
+                else:
+                    dsp_relative_file_path = os.path.join(dsp_relative_folder_path, name)
+                dspfile_info = {'NAME': name,
+                                'GUID': _generateGUID(dspfile, ''),
+                                'FOLDER_PATH': dsp_folder_path,
+                                'FILE_PATH': dspfile,
+                                'SLN_RELATIVE_FOLDER_PATH': dsp_relative_folder_path,
+                                'SLN_RELATIVE_FILE_PATH': dsp_relative_file_path}
+                self.dspfiles_info.append(dspfile_info)
+                
+        self.dspfiles_info = []
+        GenerateProjectFilesInfo(self)
+
+    def Parse(self):
+        try:
+            dswfile = open(self.dswfile,'r')
+        except IOError:
+            return # doesn't exist yet, so can't add anything to configs.
+
+        line = dswfile.readline()
+        while line:
+            if line[:9] == "EndGlobal":
+                break
+            line = dswfile.readline()
+
+        line = dswfile.readline()
+        datas = line
+        while line:
+            line = dswfile.readline()
+            datas = datas + line
+
+        # OK, we've found our little pickled cache of data.
+        try:
+            datas = base64.decodestring(datas)
+            data = pickle.loads(datas)
+        except KeyboardInterrupt:
+            raise
+        except:
+            return # unable to unpickle any data for some reason
+
+        self.configs.update(data)
+
+    def PrintSolution(self):
+        """Writes a solution file"""
+        self.file.write('Microsoft Visual Studio Solution File, Format Version %s\n' % self.versionstr )
+        if self.version_num >= 10.0:
+            self.file.write('# Visual Studio 2010\n')
+        elif self.version_num >= 9.0:
+            self.file.write('# Visual Studio 2008\n')
+        elif self.version_num >= 8.0:
+            self.file.write('# Visual Studio 2005\n')
+        for dspinfo in self.dspfiles_info:
+            name = dspinfo['NAME']
+            base, suffix = SCons.Util.splitext(name)
+            if suffix == '.vcproj':
+                name = base
+            self.file.write('Project("%s") = "%s", "%s", "%s"\n'
+                            % (external_makefile_guid, name, dspinfo['SLN_RELATIVE_FILE_PATH'], dspinfo['GUID']))
+            if self.version_num >= 7.1 and self.version_num < 8.0:
+                self.file.write('\tProjectSection(ProjectDependencies) = postProject\n'
+                                '\tEndProjectSection\n')
+            self.file.write('EndProject\n')
+
+        self.file.write('Global\n')
+
+        env = self.env
+        if 'MSVS_SCC_PROVIDER' in env:
+            scc_number_of_projects = len(self.dspfiles) + 1
+            slnguid = self.slnguid
+            scc_provider = env.get('MSVS_SCC_PROVIDER', '').replace(' ', r'\u0020')
+            scc_project_name = env.get('MSVS_SCC_PROJECT_NAME', '').replace(' ', r'\u0020')
+            scc_connection_root = env.get('MSVS_SCC_CONNECTION_ROOT', os.curdir)
+            scc_local_path = os.path.relpath(scc_connection_root, self.dsw_folder_path).replace('\\', '\\\\')
+            self.file.write('\tGlobalSection(SourceCodeControl) = preSolution\n'
+                            '\t\tSccNumberOfProjects = %(scc_number_of_projects)d\n'
+                            '\t\tSccProjectName0 = %(scc_project_name)s\n'
+                            '\t\tSccLocalPath0 = %(scc_local_path)s\n'
+                            '\t\tSccProvider0 = %(scc_provider)s\n'
+                            '\t\tCanCheckoutShared = true\n'  % locals())
+            sln_relative_path_from_scc = os.path.relpath(self.dsw_folder_path, scc_connection_root)
+            if sln_relative_path_from_scc != os.curdir:
+                self.file.write('\t\tSccProjectFilePathRelativizedFromConnection0 = %s\\\\\n'
+                                % sln_relative_path_from_scc.replace('\\', '\\\\'))
+            if self.version_num < 8.0:
+                # When present, SolutionUniqueID is automatically removed by VS 2005
+                # TODO: check for Visual Studio versions newer than 2005
+                self.file.write('\t\tSolutionUniqueID = %s\n' % slnguid)
+            for dspinfo in self.dspfiles_info:
+                i = self.dspfiles_info.index(dspinfo) + 1
+                dsp_relative_file_path = dspinfo['SLN_RELATIVE_FILE_PATH'].replace('\\', '\\\\')
+                dsp_scc_relative_folder_path = os.path.relpath(dspinfo['FOLDER_PATH'], scc_connection_root).replace('\\', '\\\\')
+                self.file.write('\t\tSccProjectUniqueName%(i)s = %(dsp_relative_file_path)s\n'
+                                '\t\tSccLocalPath%(i)d = %(scc_local_path)s\n'
+                                '\t\tCanCheckoutShared = true\n'
+                                '\t\tSccProjectFilePathRelativizedFromConnection%(i)s = %(dsp_scc_relative_folder_path)s\\\\\n'
+                                % locals())
+            self.file.write('\tEndGlobalSection\n')
+        if self.version_num >= 8.0:
+            self.file.write('\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n')
+        else:
+            self.file.write('\tGlobalSection(SolutionConfiguration) = preSolution\n')
+
+        confkeys = sorted(self.configs.keys())
+        cnt = 0
+        for name in confkeys:
+            variant = self.configs[name].variant
+            platform = self.configs[name].platform
+            if self.version_num >= 8.0:
+                self.file.write('\t\t%s|%s = %s|%s\n' % (variant, platform, variant, platform))
+            else:
+                self.file.write('\t\tConfigName.%d = %s\n' % (cnt, variant))
+            cnt = cnt + 1
+        self.file.write('\tEndGlobalSection\n')
+        if self.version_num <= 7.1:
+            self.file.write('\tGlobalSection(ProjectDependencies) = postSolution\n'
+                            '\tEndGlobalSection\n')
+        if self.version_num >= 8.0:
+            self.file.write('\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n')
+        else:
+            self.file.write('\tGlobalSection(ProjectConfiguration) = postSolution\n')
+
+        for name in confkeys:
+            variant = self.configs[name].variant
+            platform = self.configs[name].platform
+            if self.version_num >= 8.0:
+                for dspinfo in self.dspfiles_info:
+                    guid = dspinfo['GUID']
+                    self.file.write('\t\t%s.%s|%s.ActiveCfg = %s|%s\n'
+                                    '\t\t%s.%s|%s.Build.0 = %s|%s\n'  % (guid,variant,platform,variant,platform,guid,variant,platform,variant,platform))
+            else:
+                for dspinfo in self.dspfiles_info:
+                    guid = dspinfo['GUID']
+                    self.file.write('\t\t%s.%s.ActiveCfg = %s|%s\n'
+                                    '\t\t%s.%s.Build.0 = %s|%s\n'  %(guid,variant,variant,platform,guid,variant,variant,platform))
+
+        self.file.write('\tEndGlobalSection\n')
+
+        if self.version_num >= 8.0:
+            self.file.write('\tGlobalSection(SolutionProperties) = preSolution\n'
+                            '\t\tHideSolutionNode = FALSE\n'
+                            '\tEndGlobalSection\n')
+        else:
+            self.file.write('\tGlobalSection(ExtensibilityGlobals) = postSolution\n'
+                            '\tEndGlobalSection\n'
+                            '\tGlobalSection(ExtensibilityAddIns) = postSolution\n'
+                            '\tEndGlobalSection\n')
+        self.file.write('EndGlobal\n')
+        if self.nokeep == 0:
+            pdata = pickle.dumps(self.configs,1)
+            pdata = base64.encodestring(pdata)
+            self.file.write(pdata + '\n')
+
+    def Build(self):
+        try:
+            self.file = open(self.dswfile,'w')
+        except IOError, detail:
+            raise SCons.Errors.InternalError('Unable to open "' + self.dswfile + '" for writing:' + str(detail))
+        else:
+            self.PrintSolution()
+            self.file.close()
+
+V6DSWHeader = """\
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "%(name)s"="%(dspfile)s" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+"""
+
+class _GenerateV6DSW(_DSWGenerator):
+    """Generates a Workspace file for MSVS 6.0"""
+
+    def PrintWorkspace(self):
+        """ writes a DSW file """
+        name = self.name
+        dspfile = os.path.relpath(self.dspfiles[0], self.dsw_folder_path)
+        self.file.write(V6DSWHeader % locals())
+
+    def Build(self):
+        try:
+            self.file = open(self.dswfile,'w')
+        except IOError, detail:
+            raise SCons.Errors.InternalError('Unable to open "' + self.dswfile + '" for writing:' + str(detail))
+        else:
+            self.PrintWorkspace()
+            self.file.close()
+
+
+def GenerateDSP(dspfile, source, env):
+    """Generates a Project file based on the version of MSVS that is being used"""
+
+    version_num = 6.0
+    if 'MSVS_VERSION' in env:
+        version_num, suite = msvs_parse_version(env['MSVS_VERSION'])
+    if version_num >= 10.0:
+        g = _GenerateV10DSP(dspfile, source, env)
+        g.Build()
+    elif version_num >= 7.0:
+        g = _GenerateV7DSP(dspfile, source, env)
+        g.Build()
+    else:
+        g = _GenerateV6DSP(dspfile, source, env)
+        g.Build()
+
+def GenerateDSW(dswfile, source, env):
+    """Generates a Solution/Workspace file based on the version of MSVS that is being used"""
+
+    version_num = 6.0
+    if 'MSVS_VERSION' in env:
+        version_num, suite = msvs_parse_version(env['MSVS_VERSION'])
+    if version_num >= 7.0:
+        g = _GenerateV7DSW(dswfile, source, env)
+        g.Build()
+    else:
+        g = _GenerateV6DSW(dswfile, source, env)
+        g.Build()
+
+
+##############################################################################
+# Above here are the classes and functions for generation of
+# DSP/DSW/SLN/VCPROJ files.
+##############################################################################
+
+def GetMSVSProjectSuffix(target, source, env, for_signature):
+    return env['MSVS']['PROJECTSUFFIX']
+
+def GetMSVSSolutionSuffix(target, source, env, for_signature):
+    return env['MSVS']['SOLUTIONSUFFIX']
+
+def GenerateProject(target, source, env):
+    # generate the dsp file, according to the version of MSVS.
+    builddspfile = target[0]
+    dspfile = builddspfile.srcnode()
+
+    # this detects whether or not we're using a VariantDir
+    if not dspfile is builddspfile:
+        try:
+            bdsp = open(str(builddspfile), "w+")
+        except IOError, detail:
+            print 'Unable to open "' + str(dspfile) + '" for writing:',detail,'\n'
+            raise
+
+        bdsp.write("This is just a placeholder file.\nThe real project file is here:\n%s\n" % dspfile.get_abspath())
+
+    GenerateDSP(dspfile, source, env)
+
+    if env.get('auto_build_solution', 1):
+        builddswfile = target[1]
+        dswfile = builddswfile.srcnode()
+
+        if not dswfile is builddswfile:
+
+            try:
+                bdsw = open(str(builddswfile), "w+")
+            except IOError, detail:
+                print 'Unable to open "' + str(dspfile) + '" for writing:',detail,'\n'
+                raise
+
+            bdsw.write("This is just a placeholder file.\nThe real workspace file is here:\n%s\n" % dswfile.get_abspath())
+
+        GenerateDSW(dswfile, source, env)
+
+def GenerateSolution(target, source, env):
+    GenerateDSW(target[0], source, env)
+
+def projectEmitter(target, source, env):
+    """Sets up the DSP dependencies."""
+
+    # todo: Not sure what sets source to what user has passed as target,
+    # but this is what happens. When that is fixed, we also won't have
+    # to make the user always append env['MSVSPROJECTSUFFIX'] to target.
+    if source[0] == target[0]:
+        source = []
+
+    # make sure the suffix is correct for the version of MSVS we're running.
+    (base, suff) = SCons.Util.splitext(str(target[0]))
+    suff = env.subst('$MSVSPROJECTSUFFIX')
+    target[0] = base + suff
+
+    if not source:
+        source = 'prj_inputs:'
+        source = source + env.subst('$MSVSSCONSCOM', 1)
+        source = source + env.subst('$MSVSENCODING', 1)
+
+        if 'buildtarget' in env and env['buildtarget'] != None:
+            if SCons.Util.is_String(env['buildtarget']):
+                source = source + ' "%s"' % env['buildtarget']
+            elif SCons.Util.is_List(env['buildtarget']):
+                for bt in env['buildtarget']:
+                    if SCons.Util.is_String(bt):
+                        source = source + ' "%s"' % bt
+                    else:
+                        try: source = source + ' "%s"' % bt.get_abspath()
+                        except AttributeError: raise SCons.Errors.InternalError("buildtarget can be a string, a node, a list of strings or nodes, or None")
+            else:
+                try: source = source + ' "%s"' % env['buildtarget'].get_abspath()
+                except AttributeError: raise SCons.Errors.InternalError("buildtarget can be a string, a node, a list of strings or nodes, or None")
+
+        if 'outdir' in env and env['outdir'] != None:
+            if SCons.Util.is_String(env['outdir']):
+                source = source + ' "%s"' % env['outdir']
+            elif SCons.Util.is_List(env['outdir']):
+                for s in env['outdir']:
+                    if SCons.Util.is_String(s):
+                        source = source + ' "%s"' % s
+                    else:
+                        try: source = source + ' "%s"' % s.get_abspath()
+                        except AttributeError: raise SCons.Errors.InternalError("outdir can be a string, a node, a list of strings or nodes, or None")
+            else:
+                try: source = source + ' "%s"' % env['outdir'].get_abspath()
+                except AttributeError: raise SCons.Errors.InternalError("outdir can be a string, a node, a list of strings or nodes, or None")
+
+        if 'name' in env:
+            if SCons.Util.is_String(env['name']):
+                source = source + ' "%s"' % env['name']
+            else:
+                raise SCons.Errors.InternalError("name must be a string")
+
+        if 'variant' in env:
+            if SCons.Util.is_String(env['variant']):
+                source = source + ' "%s"' % env['variant']
+            elif SCons.Util.is_List(env['variant']):
+                for variant in env['variant']:
+                    if SCons.Util.is_String(variant):
+                        source = source + ' "%s"' % variant
+                    else:
+                        raise SCons.Errors.InternalError("name must be a string or a list of strings")
+            else:
+                raise SCons.Errors.InternalError("variant must be a string or a list of strings")
+        else:
+            raise SCons.Errors.InternalError("variant must be specified")
+
+        for s in _DSPGenerator.srcargs:
+            if s in env:
+                if SCons.Util.is_String(env[s]):
+                    source = source + ' "%s' % env[s]
+                elif SCons.Util.is_List(env[s]):
+                    for t in env[s]:
+                        if SCons.Util.is_String(t):
+                            source = source + ' "%s"' % t
+                        else:
+                            raise SCons.Errors.InternalError(s + " must be a string or a list of strings")
+                else:
+                    raise SCons.Errors.InternalError(s + " must be a string or a list of strings")
+
+        source = source + ' "%s"' % str(target[0])
+        source = [SCons.Node.Python.Value(source)]
+
+    targetlist = [target[0]]
+    sourcelist = source
+
+    if env.get('auto_build_solution', 1):
+        env['projects'] = [env.File(t).srcnode() for t in targetlist]
+        t, s = solutionEmitter(target, target, env)
+        targetlist = targetlist + t
+
+    return (targetlist, sourcelist)
+
+def solutionEmitter(target, source, env):
+    """Sets up the DSW dependencies."""
+
+    # todo: Not sure what sets source to what user has passed as target,
+    # but this is what happens. When that is fixed, we also won't have
+    # to make the user always append env['MSVSSOLUTIONSUFFIX'] to target.
+    if source[0] == target[0]:
+        source = []
+
+    # make sure the suffix is correct for the version of MSVS we're running.
+    (base, suff) = SCons.Util.splitext(str(target[0]))
+    suff = env.subst('$MSVSSOLUTIONSUFFIX')
+    target[0] = base + suff
+
+    if not source:
+        source = 'sln_inputs:'
+
+        if 'name' in env:
+            if SCons.Util.is_String(env['name']):
+                source = source + ' "%s"' % env['name']
+            else:
+                raise SCons.Errors.InternalError("name must be a string")
+
+        if 'variant' in env:
+            if SCons.Util.is_String(env['variant']):
+                source = source + ' "%s"' % env['variant']
+            elif SCons.Util.is_List(env['variant']):
+                for variant in env['variant']:
+                    if SCons.Util.is_String(variant):
+                        source = source + ' "%s"' % variant
+                    else:
+                        raise SCons.Errors.InternalError("name must be a string or a list of strings")
+            else:
+                raise SCons.Errors.InternalError("variant must be a string or a list of strings")
+        else:
+            raise SCons.Errors.InternalError("variant must be specified")
+
+        if 'slnguid' in env:
+            if SCons.Util.is_String(env['slnguid']):
+                source = source + ' "%s"' % env['slnguid']
+            else:
+                raise SCons.Errors.InternalError("slnguid must be a string")
+
+        if 'projects' in env:
+            if SCons.Util.is_String(env['projects']):
+                source = source + ' "%s"' % env['projects']
+            elif SCons.Util.is_List(env['projects']):
+                for t in env['projects']:
+                    if SCons.Util.is_String(t):
+                        source = source + ' "%s"' % t
+
+        source = source + ' "%s"' % str(target[0])
+        source = [SCons.Node.Python.Value(source)]
+
+    return ([target[0]], source)
+
+projectAction = SCons.Action.Action(GenerateProject, None)
+
+solutionAction = SCons.Action.Action(GenerateSolution, None)
+
+projectBuilder = SCons.Builder.Builder(action = '$MSVSPROJECTCOM',
+                                       suffix = '$MSVSPROJECTSUFFIX',
+                                       emitter = projectEmitter)
+
+solutionBuilder = SCons.Builder.Builder(action = '$MSVSSOLUTIONCOM',
+                                        suffix = '$MSVSSOLUTIONSUFFIX',
+                                        emitter = solutionEmitter)
+
+default_MSVS_SConscript = None
+
+def generate(env):
+    """Add Builders and construction variables for Microsoft Visual
+    Studio project files to an Environment."""
+    try:
+        env['BUILDERS']['MSVSProject']
+    except KeyError:
+        env['BUILDERS']['MSVSProject'] = projectBuilder
+
+    try:
+        env['BUILDERS']['MSVSSolution']
+    except KeyError:
+        env['BUILDERS']['MSVSSolution'] = solutionBuilder
+
+    env['MSVSPROJECTCOM'] = projectAction
+    env['MSVSSOLUTIONCOM'] = solutionAction
+
+    if SCons.Script.call_stack:
+        # XXX Need to find a way to abstract this; the build engine
+        # shouldn't depend on anything in SCons.Script.
+        env['MSVSSCONSCRIPT'] = SCons.Script.call_stack[0].sconscript
+    else:
+        global default_MSVS_SConscript
+        if default_MSVS_SConscript is None:
+            default_MSVS_SConscript = env.File('SConstruct')
+        env['MSVSSCONSCRIPT'] = default_MSVS_SConscript
+
+    env['MSVSSCONS'] = '"%s" -c "%s"' % (python_executable, getExecScriptMain(env))
+    env['MSVSSCONSFLAGS'] = '-C "${MSVSSCONSCRIPT.dir.abspath}" -f ${MSVSSCONSCRIPT.name}'
+    env['MSVSSCONSCOM'] = '$MSVSSCONS $MSVSSCONSFLAGS'
+    env['MSVSBUILDCOM'] = '$MSVSSCONSCOM "$MSVSBUILDTARGET"'
+    env['MSVSREBUILDCOM'] = '$MSVSSCONSCOM "$MSVSBUILDTARGET"'
+    env['MSVSCLEANCOM'] = '$MSVSSCONSCOM -c "$MSVSBUILDTARGET"'
+
+    # Set-up ms tools paths for default version
+    msvc_setup_env_once(env)
+
+    if 'MSVS_VERSION' in env:
+        version_num, suite = msvs_parse_version(env['MSVS_VERSION'])
+    else:
+        (version_num, suite) = (7.0, None) # guess at a default
+    if 'MSVS' not in env:
+        env['MSVS'] = {}
+    if (version_num < 7.0):
+        env['MSVS']['PROJECTSUFFIX']  = '.dsp'
+        env['MSVS']['SOLUTIONSUFFIX'] = '.dsw'
+    elif (version_num < 10.0):
+        env['MSVS']['PROJECTSUFFIX']  = '.vcproj'
+        env['MSVS']['SOLUTIONSUFFIX'] = '.sln'
+    else:
+        env['MSVS']['PROJECTSUFFIX']  = '.vcxproj'
+        env['MSVS']['SOLUTIONSUFFIX'] = '.sln'
+		
+    if (version_num >= 10.0):
+        env['MSVSENCODING'] = 'utf-8'
+    else:
+        env['MSVSENCODING'] = 'Windows-1252'
+
+    env['GET_MSVSPROJECTSUFFIX']  = GetMSVSProjectSuffix
+    env['GET_MSVSSOLUTIONSUFFIX']  = GetMSVSSolutionSuffix
+    env['MSVSPROJECTSUFFIX']  = '${GET_MSVSPROJECTSUFFIX}'
+    env['MSVSSOLUTIONSUFFIX']  = '${GET_MSVSSOLUTIONSUFFIX}'
+    env['SCONS_HOME'] = os.environ.get('SCONS_HOME')
+
+def exists(env):
+    return msvc_exists()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/mwcc.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/mwcc.py
new file mode 100644
index 0000000..86803ff
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/mwcc.py
@@ -0,0 +1,207 @@
+"""SCons.Tool.mwcc
+
+Tool-specific initialization for the Metrowerks CodeWarrior compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/mwcc.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+import os.path
+
+import SCons.Util
+
+def set_vars(env):
+    """Set MWCW_VERSION, MWCW_VERSIONS, and some codewarrior environment vars
+
+    MWCW_VERSIONS is set to a list of objects representing installed versions
+
+    MWCW_VERSION  is set to the version object that will be used for building.
+                  MWCW_VERSION can be set to a string during Environment
+                  construction to influence which version is chosen, otherwise
+                  the latest one from MWCW_VERSIONS is used.
+
+    Returns true if at least one version is found, false otherwise
+    """
+    desired = env.get('MWCW_VERSION', '')
+
+    # return right away if the variables are already set
+    if isinstance(desired, MWVersion):
+        return 1
+    elif desired is None:
+        return 0
+
+    versions = find_versions()
+    version = None
+
+    if desired:
+        for v in versions:
+            if str(v) == desired:
+                version = v
+    elif versions:
+        version = versions[-1]
+
+    env['MWCW_VERSIONS'] = versions
+    env['MWCW_VERSION'] = version
+
+    if version is None:
+      return 0
+
+    env.PrependENVPath('PATH', version.clpath)
+    env.PrependENVPath('PATH', version.dllpath)
+    ENV = env['ENV']
+    ENV['CWFolder'] = version.path
+    ENV['LM_LICENSE_FILE'] = version.license
+    plus = lambda x: '+%s' % x
+    ENV['MWCIncludes'] = os.pathsep.join(map(plus, version.includes))
+    ENV['MWLibraries'] = os.pathsep.join(map(plus, version.libs))
+    return 1
+
+
+def find_versions():
+    """Return a list of MWVersion objects representing installed versions"""
+    versions = []
+
+    ### This function finds CodeWarrior by reading from the registry on
+    ### Windows. Some other method needs to be implemented for other
+    ### platforms, maybe something that calls env.WhereIs('mwcc')
+
+    if SCons.Util.can_read_reg:
+        try:
+            HLM = SCons.Util.HKEY_LOCAL_MACHINE
+            product = 'SOFTWARE\\Metrowerks\\CodeWarrior\\Product Versions'
+            product_key = SCons.Util.RegOpenKeyEx(HLM, product)
+
+            i = 0
+            while True:
+                name = product + '\\' + SCons.Util.RegEnumKey(product_key, i)
+                name_key = SCons.Util.RegOpenKeyEx(HLM, name)
+
+                try:
+                    version = SCons.Util.RegQueryValueEx(name_key, 'VERSION')
+                    path = SCons.Util.RegQueryValueEx(name_key, 'PATH')
+                    mwv = MWVersion(version[0], path[0], 'Win32-X86')
+                    versions.append(mwv)
+                except SCons.Util.RegError:
+                    pass
+
+                i = i + 1
+
+        except SCons.Util.RegError:
+            pass
+
+    return versions
+
+
+class MWVersion(object):
+    def __init__(self, version, path, platform):
+        self.version = version
+        self.path = path
+        self.platform = platform
+        self.clpath = os.path.join(path, 'Other Metrowerks Tools',
+                                   'Command Line Tools')
+        self.dllpath = os.path.join(path, 'Bin')
+
+        # The Metrowerks tools don't store any configuration data so they
+        # are totally dumb when it comes to locating standard headers,
+        # libraries, and other files, expecting all the information
+        # to be handed to them in environment variables. The members set
+        # below control what information scons injects into the environment
+
+        ### The paths below give a normal build environment in CodeWarrior for
+        ### Windows, other versions of CodeWarrior might need different paths.
+
+        msl = os.path.join(path, 'MSL')
+        support = os.path.join(path, '%s Support' % platform)
+
+        self.license = os.path.join(path, 'license.dat')
+        self.includes = [msl, support]
+        self.libs = [msl, support]
+
+    def __str__(self):
+        return self.version
+
+
+CSuffixes = ['.c', '.C']
+CXXSuffixes = ['.cc', '.cpp', '.cxx', '.c++', '.C++']
+
+
+def generate(env):
+    """Add Builders and construction variables for the mwcc to an Environment."""
+    import SCons.Defaults
+    import SCons.Tool
+
+    set_vars(env)
+
+    static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+    for suffix in CSuffixes:
+        static_obj.add_action(suffix, SCons.Defaults.CAction)
+        shared_obj.add_action(suffix, SCons.Defaults.ShCAction)
+
+    for suffix in CXXSuffixes:
+        static_obj.add_action(suffix, SCons.Defaults.CXXAction)
+        shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction)
+
+    env['CCCOMFLAGS'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -nolink -o $TARGET $SOURCES'
+
+    env['CC']         = 'mwcc'
+    env['CCCOM']      = '$CC $CFLAGS $CCFLAGS $CCCOMFLAGS'
+
+    env['CXX']        = 'mwcc'
+    env['CXXCOM']     = '$CXX $CXXFLAGS $CCCOMFLAGS'
+
+    env['SHCC']       = '$CC'
+    env['SHCCFLAGS']  = '$CCFLAGS'
+    env['SHCFLAGS']   = '$CFLAGS'
+    env['SHCCCOM']    = '$SHCC $SHCFLAGS $SHCCFLAGS $CCCOMFLAGS'
+
+    env['SHCXX']       = '$CXX'
+    env['SHCXXFLAGS']  = '$CXXFLAGS'
+    env['SHCXXCOM']    = '$SHCXX $SHCXXFLAGS $CCCOMFLAGS'
+
+    env['CFILESUFFIX'] = '.c'
+    env['CXXFILESUFFIX'] = '.cpp'
+    env['CPPDEFPREFIX']  = '-D'
+    env['CPPDEFSUFFIX']  = ''
+    env['INCPREFIX']  = '-I'
+    env['INCSUFFIX']  = ''
+
+    #env['PCH'] = ?
+    #env['PCHSTOP'] = ?
+
+
+def exists(env):
+    return set_vars(env)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/mwld.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/mwld.py
new file mode 100644
index 0000000..1ee8d6c
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/mwld.py
@@ -0,0 +1,107 @@
+"""SCons.Tool.mwld
+
+Tool-specific initialization for the Metrowerks CodeWarrior linker.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/mwld.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Tool
+
+
+def generate(env):
+    """Add Builders and construction variables for lib to an Environment."""
+    SCons.Tool.createStaticLibBuilder(env)
+    SCons.Tool.createSharedLibBuilder(env)
+    SCons.Tool.createProgBuilder(env)
+
+    env['AR'] = 'mwld'
+    env['ARCOM'] = '$AR $ARFLAGS -library -o $TARGET $SOURCES'
+
+    env['LIBDIRPREFIX'] = '-L'
+    env['LIBDIRSUFFIX'] = ''
+    env['LIBLINKPREFIX'] = '-l'
+    env['LIBLINKSUFFIX'] = '.lib'
+
+    env['LINK'] = 'mwld'
+    env['LINKCOM'] = '$LINK $LINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+
+    env['SHLINK'] = '$LINK'
+    env['SHLINKFLAGS'] = '$LINKFLAGS'
+    env['SHLINKCOM']   = shlib_action
+    env['SHLIBEMITTER']= shlib_emitter
+
+
+def exists(env):
+    import SCons.Tool.mwcc
+    return SCons.Tool.mwcc.set_vars(env)
+
+
+def shlib_generator(target, source, env, for_signature):
+    cmd = ['$SHLINK', '$SHLINKFLAGS', '-shared']
+
+    no_import_lib = env.get('no_import_lib', 0)
+    if no_import_lib: cmd.extend('-noimplib')
+
+    dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
+    if dll: cmd.extend(['-o', dll])
+
+    implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX')
+    if implib: cmd.extend(['-implib', implib.get_string(for_signature)])
+
+    cmd.extend(['$SOURCES', '$_LIBDIRFLAGS', '$_LIBFLAGS'])
+
+    return [cmd]
+
+
+def shlib_emitter(target, source, env):
+    dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
+    no_import_lib = env.get('no_import_lib', 0)
+
+    if not dll:
+        raise SCons.Errors.UserError("A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX"))
+
+    if not no_import_lib and \
+       not env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX'):
+
+        # Append an import library to the list of targets.
+        target.append(env.ReplaceIxes(dll,
+                                      'SHLIBPREFIX', 'SHLIBSUFFIX',
+                                      'LIBPREFIX', 'LIBSUFFIX'))
+
+    return target, source
+
+
+shlib_action = SCons.Action.Action(shlib_generator, generator=1)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/nasm.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/nasm.py
new file mode 100644
index 0000000..36e94d4
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/nasm.py
@@ -0,0 +1,72 @@
+"""SCons.Tool.nasm
+
+Tool-specific initialization for nasm, the famous Netwide Assembler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/nasm.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+ASSuffixes = ['.s', '.asm', '.ASM']
+ASPPSuffixes = ['.spp', '.SPP', '.sx']
+if SCons.Util.case_sensitive_suffixes('.s', '.S'):
+    ASPPSuffixes.extend(['.S'])
+else:
+    ASSuffixes.extend(['.S'])
+
+def generate(env):
+    """Add Builders and construction variables for nasm to an Environment."""
+    static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+    for suffix in ASSuffixes:
+        static_obj.add_action(suffix, SCons.Defaults.ASAction)
+        static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
+
+    for suffix in ASPPSuffixes:
+        static_obj.add_action(suffix, SCons.Defaults.ASPPAction)
+        static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
+
+    env['AS']        = 'nasm'
+    env['ASFLAGS']   = SCons.Util.CLVar('')
+    env['ASPPFLAGS'] = '$ASFLAGS'
+    env['ASCOM']     = '$AS $ASFLAGS -o $TARGET $SOURCES'
+    env['ASPPCOM']   = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES'
+
+def exists(env):
+    return env.Detect('nasm')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/__init__.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/__init__.py
new file mode 100644
index 0000000..b7fe5f2
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/__init__.py
@@ -0,0 +1,312 @@
+"""SCons.Tool.Packaging
+
+SCons Packaging Tool.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Tool/packaging/__init__.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Environment
+from SCons.Variables import *
+from SCons.Errors import *
+from SCons.Util import is_List, make_path_relative
+from SCons.Warnings import warn, Warning
+
+import os, imp
+import SCons.Defaults
+
+__all__ = [ 'src_targz', 'src_tarbz2', 'src_zip', 'tarbz2', 'targz', 'zip', 'rpm', 'msi', 'ipk' ]
+
+#
+# Utility and Builder function
+#
+def Tag(env, target, source, *more_tags, **kw_tags):
+    """ Tag a file with the given arguments, just sets the accordingly named
+    attribute on the file object.
+
+    TODO: FIXME
+    """
+    if not target:
+        target=source
+        first_tag=None
+    else:
+        first_tag=source
+
+    if first_tag:
+        kw_tags[first_tag[0]] = ''
+
+    if len(kw_tags) == 0 and len(more_tags) == 0:
+        raise UserError("No tags given.")
+
+    # XXX: sanity checks
+    for x in more_tags:
+        kw_tags[x] = ''
+
+    if not SCons.Util.is_List(target):
+        target=[target]
+    else:
+        # hmm, sometimes the target list, is a list of a list
+        # make sure it is flattened prior to processing.
+        # TODO: perhaps some bug ?!?
+        target=env.Flatten(target)
+
+    for t in target:
+        for (k,v) in kw_tags.items():
+            # all file tags have to start with PACKAGING_, so we can later
+            # differentiate between "normal" object attributes and the
+            # packaging attributes. As the user should not be bothered with
+            # that, the prefix will be added here if missing.
+            #if not k.startswith('PACKAGING_'):
+            if k[:10] != 'PACKAGING_':
+                k='PACKAGING_'+k
+            setattr(t, k, v)
+
+def Package(env, target=None, source=None, **kw):
+    """ Entry point for the package tool.
+    """
+    # check if we need to find the source files ourself
+    if not source:
+        source = env.FindInstalledFiles()
+
+    if len(source)==0:
+        raise UserError("No source for Package() given")
+
+    # decide which types of packages shall be built. Can be defined through
+    # four mechanisms: command line argument, keyword argument,
+    # environment argument and default selection( zip or tar.gz ) in that
+    # order.
+    try: kw['PACKAGETYPE']=env['PACKAGETYPE']
+    except KeyError: pass
+
+    if not kw.get('PACKAGETYPE'):
+        from SCons.Script import GetOption
+        kw['PACKAGETYPE'] = GetOption('package_type')
+
+    if kw['PACKAGETYPE'] == None:
+        if 'Tar' in env['BUILDERS']:
+            kw['PACKAGETYPE']='targz'
+        elif 'Zip' in env['BUILDERS']:
+            kw['PACKAGETYPE']='zip'
+        else:
+            raise UserError("No type for Package() given")
+
+    PACKAGETYPE=kw['PACKAGETYPE']
+    if not is_List(PACKAGETYPE):
+        PACKAGETYPE=PACKAGETYPE.split(',')
+
+    # load the needed packagers.
+    def load_packager(type):
+        try:
+            file,path,desc=imp.find_module(type, __path__)
+            return imp.load_module(type, file, path, desc)
+        except ImportError, e:
+            raise EnvironmentError("packager %s not available: %s"%(type,str(e)))
+
+    packagers=list(map(load_packager, PACKAGETYPE))
+
+    # set up targets and the PACKAGEROOT
+    try:
+        # fill up the target list with a default target name until the PACKAGETYPE
+        # list is of the same size as the target list.
+        if not target: target = []
+
+        size_diff      = len(PACKAGETYPE)-len(target)
+        default_name   = "%(NAME)s-%(VERSION)s"
+
+        if size_diff>0:
+            default_target = default_name%kw
+            target.extend( [default_target]*size_diff )
+
+        if 'PACKAGEROOT' not in kw:
+            kw['PACKAGEROOT'] = default_name%kw
+
+    except KeyError, e:
+        raise SCons.Errors.UserError( "Missing Packagetag '%s'"%e.args[0] )
+
+    # setup the source files
+    source=env.arg2nodes(source, env.fs.Entry)
+
+    # call the packager to setup the dependencies.
+    targets=[]
+    try:
+        for packager in packagers:
+            t=[target.pop(0)]
+            t=packager.package(env,t,source, **kw)
+            targets.extend(t)
+
+        assert( len(target) == 0 )
+
+    except KeyError, e:
+        raise SCons.Errors.UserError( "Missing Packagetag '%s' for %s packager"\
+                                      % (e.args[0],packager.__name__) )
+    except TypeError, e:
+        # this exception means that a needed argument for the packager is
+        # missing. As our packagers get their "tags" as named function
+        # arguments we need to find out which one is missing.
+        from inspect import getargspec
+        args,varargs,varkw,defaults=getargspec(packager.package)
+        if defaults!=None:
+            args=args[:-len(defaults)] # throw away arguments with default values
+        args.remove('env')
+        args.remove('target')
+        args.remove('source')
+        # now remove any args for which we have a value in kw.
+        args=[x for x in args if x not in kw]
+
+        if len(args)==0:
+            raise # must be a different error, so reraise
+        elif len(args)==1:
+            raise SCons.Errors.UserError( "Missing Packagetag '%s' for %s packager"\
+                                          % (args[0],packager.__name__) )
+        else:
+            raise SCons.Errors.UserError( "Missing Packagetags '%s' for %s packager"\
+                                          % (", ".join(args),packager.__name__) )
+
+    target=env.arg2nodes(target, env.fs.Entry)
+    targets.extend(env.Alias( 'package', targets ))
+    return targets
+
+#
+# SCons tool initialization functions
+#
+
+added = None
+
+def generate(env):
+    from SCons.Script import AddOption
+    global added
+    if not added:
+        added = 1
+        AddOption('--package-type',
+                  dest='package_type',
+                  default=None,
+                  type="string",
+                  action="store",
+                  help='The type of package to create.')
+
+    try:
+        env['BUILDERS']['Package']
+        env['BUILDERS']['Tag']
+    except KeyError:
+        env['BUILDERS']['Package'] = Package
+        env['BUILDERS']['Tag'] = Tag
+
+def exists(env):
+    return 1
+
+# XXX
+def options(opts):
+    opts.AddVariables(
+        EnumVariable( 'PACKAGETYPE',
+                     'the type of package to create.',
+                     None, allowed_values=list(map( str, __all__ )),
+                     ignorecase=2
+                  )
+    )
+
+#
+# Internal utility functions
+#
+
+def copy_attr(f1, f2):
+    """ copies the special packaging file attributes from f1 to f2.
+    """
+    #pattrs = [x for x in dir(f1) if not hasattr(f2, x) and\
+    #                                x.startswith('PACKAGING_')]
+    copyit = lambda x: not hasattr(f2, x) and x[:10] == 'PACKAGING_'
+    pattrs = list(filter(copyit, dir(f1)))
+    for attr in pattrs:
+        setattr(f2, attr, getattr(f1, attr))
+def putintopackageroot(target, source, env, pkgroot, honor_install_location=1):
+    """ Uses the CopyAs builder to copy all source files to the directory given
+    in pkgroot.
+
+    If honor_install_location is set and the copied source file has an
+    PACKAGING_INSTALL_LOCATION attribute, the PACKAGING_INSTALL_LOCATION is
+    used as the new name of the source file under pkgroot.
+
+    The source file will not be copied if it is already under the the pkgroot
+    directory.
+
+    All attributes of the source file will be copied to the new file.
+    """
+    # make sure the packageroot is a Dir object.
+    if SCons.Util.is_String(pkgroot):  pkgroot=env.Dir(pkgroot)
+    if not SCons.Util.is_List(source): source=[source]
+
+    new_source = []
+    for file in source:
+        if SCons.Util.is_String(file): file = env.File(file)
+
+        if file.is_under(pkgroot):
+            new_source.append(file)
+        else:
+            if hasattr(file, 'PACKAGING_INSTALL_LOCATION') and\
+                       honor_install_location:
+                new_name=make_path_relative(file.PACKAGING_INSTALL_LOCATION)
+            else:
+                new_name=make_path_relative(file.get_path())
+
+            new_file=pkgroot.File(new_name)
+            new_file=env.CopyAs(new_file, file)[0]
+            copy_attr(file, new_file)
+            new_source.append(new_file)
+
+    return (target, new_source)
+
+def stripinstallbuilder(target, source, env):
+    """ strips the install builder action from the source list and stores
+    the final installation location as the "PACKAGING_INSTALL_LOCATION" of
+    the source of the source file. This effectively removes the final installed
+    files from the source list while remembering the installation location.
+
+    It also warns about files which have no install builder attached.
+    """
+    def has_no_install_location(file):
+        return not (file.has_builder() and\
+            hasattr(file.builder, 'name') and\
+            (file.builder.name=="InstallBuilder" or\
+             file.builder.name=="InstallAsBuilder"))
+
+    if len(list(filter(has_no_install_location, source))):
+        warn(Warning, "there are files to package which have no\
+        InstallBuilder attached, this might lead to irreproducible packages")
+
+    n_source=[]
+    for s in source:
+        if has_no_install_location(s):
+            n_source.append(s)
+        else:
+            for ss in s.sources:
+                n_source.append(ss)
+                copy_attr(s, ss)
+                setattr(ss, 'PACKAGING_INSTALL_LOCATION', s.get_path())
+
+    return (target, n_source)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/ipk.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/ipk.py
new file mode 100644
index 0000000..aabf0bf
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/ipk.py
@@ -0,0 +1,185 @@
+"""SCons.Tool.Packaging.ipk
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# 
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/packaging/ipk.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Builder
+import SCons.Node.FS
+import os
+
+from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot
+
+def package(env, target, source, PACKAGEROOT, NAME, VERSION, DESCRIPTION,
+            SUMMARY, X_IPK_PRIORITY, X_IPK_SECTION, SOURCE_URL,
+            X_IPK_MAINTAINER, X_IPK_DEPENDS, **kw):
+    """ this function prepares the packageroot directory for packaging with the
+    ipkg builder.
+    """
+    SCons.Tool.Tool('ipkg').generate(env)
+
+    # setup the Ipkg builder
+    bld = env['BUILDERS']['Ipkg']
+    target, source = stripinstallbuilder(target, source, env)
+    target, source = putintopackageroot(target, source, env, PACKAGEROOT)
+
+    # This should be overridable from the construction environment,
+    # which it is by using ARCHITECTURE=.
+    # Guessing based on what os.uname() returns at least allows it
+    # to work for both i386 and x86_64 Linux systems.
+    archmap = {
+        'i686'  : 'i386',
+        'i586'  : 'i386',
+        'i486'  : 'i386',
+    }
+
+    buildarchitecture = os.uname()[4]
+    buildarchitecture = archmap.get(buildarchitecture, buildarchitecture)
+
+    if 'ARCHITECTURE' in kw:
+        buildarchitecture = kw['ARCHITECTURE']
+
+    # setup the kw to contain the mandatory arguments to this fucntion.
+    # do this before calling any builder or setup function
+    loc=locals()
+    del loc['kw']
+    kw.update(loc)
+    del kw['source'], kw['target'], kw['env']
+
+    # generate the specfile
+    specfile = gen_ipk_dir(PACKAGEROOT, source, env, kw)
+
+    # override the default target.
+    if str(target[0])=="%s-%s"%(NAME, VERSION):
+        target=[ "%s_%s_%s.ipk"%(NAME, VERSION, buildarchitecture) ]
+
+    # now apply the Ipkg builder
+    return bld(env, target, specfile, **kw)
+
+def gen_ipk_dir(proot, source, env, kw):
+    # make sure the packageroot is a Dir object.
+    if SCons.Util.is_String(proot): proot=env.Dir(proot)
+
+    #  create the specfile builder
+    s_bld=SCons.Builder.Builder(
+        action  = build_specfiles,
+        )
+
+    # create the specfile targets
+    spec_target=[]
+    control=proot.Dir('CONTROL')
+    spec_target.append(control.File('control'))
+    spec_target.append(control.File('conffiles'))
+    spec_target.append(control.File('postrm'))
+    spec_target.append(control.File('prerm'))
+    spec_target.append(control.File('postinst'))
+    spec_target.append(control.File('preinst'))
+
+    # apply the builder to the specfile targets
+    s_bld(env, spec_target, source, **kw)
+
+    # the packageroot directory does now contain the specfiles.
+    return proot
+
+def build_specfiles(source, target, env):
+    """ filter the targets for the needed files and use the variables in env
+    to create the specfile.
+    """
+    #
+    # At first we care for the CONTROL/control file, which is the main file for ipk.
+    #
+    # For this we need to open multiple files in random order, so we store into
+    # a dict so they can be easily accessed.
+    #
+    #
+    opened_files={}
+    def open_file(needle, haystack):
+        try:
+            return opened_files[needle]
+        except KeyError:
+            file=filter(lambda x: x.get_path().rfind(needle)!=-1, haystack)[0]
+            opened_files[needle]=open(file.abspath, 'w')
+            return opened_files[needle]
+
+    control_file=open_file('control', target)
+
+    if 'X_IPK_DESCRIPTION' not in env:
+        env['X_IPK_DESCRIPTION']="%s\n %s"%(env['SUMMARY'],
+                                            env['DESCRIPTION'].replace('\n', '\n '))
+
+
+    content = """
+Package: $NAME
+Version: $VERSION
+Priority: $X_IPK_PRIORITY
+Section: $X_IPK_SECTION
+Source: $SOURCE_URL
+Architecture: $ARCHITECTURE
+Maintainer: $X_IPK_MAINTAINER
+Depends: $X_IPK_DEPENDS
+Description: $X_IPK_DESCRIPTION
+"""
+
+    control_file.write(env.subst(content))
+
+    #
+    # now handle the various other files, which purpose it is to set post-, 
+    # pre-scripts and mark files as config files.
+    #
+    # We do so by filtering the source files for files which are marked with
+    # the "config" tag and afterwards we do the same for x_ipk_postrm,
+    # x_ipk_prerm, x_ipk_postinst and x_ipk_preinst tags.
+    #
+    # The first one will write the name of the file into the file
+    # CONTROL/configfiles, the latter add the content of the x_ipk_* variable
+    # into the same named file.
+    #
+    for f in [x for x in source if 'PACKAGING_CONFIG' in dir(x)]:
+        config=open_file('conffiles')
+        config.write(f.PACKAGING_INSTALL_LOCATION)
+        config.write('\n')
+
+    for str in 'POSTRM PRERM POSTINST PREINST'.split():
+        name="PACKAGING_X_IPK_%s"%str
+        for f in [x for x in source if name in dir(x)]:
+            file=open_file(name)
+            file.write(env[str])
+
+    #
+    # close all opened files
+    for f in opened_files.values():
+        f.close()
+
+    # call a user specified function
+    if 'CHANGE_SPECFILE' in env:
+        content += env['CHANGE_SPECFILE'](target)
+
+    return 0
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/msi.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/msi.py
new file mode 100644
index 0000000..9edea54
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/msi.py
@@ -0,0 +1,527 @@
+"""SCons.Tool.packaging.msi
+
+The msi packager.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# 
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Tool/packaging/msi.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+import SCons
+from SCons.Action import Action
+from SCons.Builder import Builder
+
+from xml.dom.minidom import *
+from xml.sax.saxutils import escape
+
+from SCons.Tool.packaging import stripinstallbuilder
+
+#
+# Utility functions
+#
+def convert_to_id(s, id_set):
+    """ Some parts of .wxs need an Id attribute (for example: The File and
+    Directory directives. The charset is limited to A-Z, a-z, digits,
+    underscores, periods. Each Id must begin with a letter or with a
+    underscore. Google for "CNDL0015" for information about this.
+
+    Requirements:
+     * the string created must only contain chars from the target charset.
+     * the string created must have a minimal editing distance from the
+       original string.
+     * the string created must be unique for the whole .wxs file.
+
+    Observation:
+     * There are 62 chars in the charset.
+
+    Idea:
+     * filter out forbidden characters. Check for a collision with the help
+       of the id_set. Add the number of the number of the collision at the
+       end of the created string. Furthermore care for a correct start of
+       the string.
+    """
+    charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyz0123456789_.'
+    if s[0] in '0123456789.':
+        s += '_'+s
+    id = [c for c in s if c in charset]
+
+    # did we already generate an id for this file?
+    try:
+        return id_set[id][s]
+    except KeyError:
+        # no we did not so initialize with the id
+        if id not in id_set: id_set[id] = { s : id }
+        # there is a collision, generate an id which is unique by appending
+        # the collision number
+        else: id_set[id][s] = id + str(len(id_set[id]))
+
+        return id_set[id][s]
+
+def is_dos_short_file_name(file):
+    """ examine if the given file is in the 8.3 form.
+    """
+    fname, ext = os.path.splitext(file)
+    proper_ext = len(ext) == 0 or (2 <= len(ext) <= 4) # the ext contains the dot
+    proper_fname = file.isupper() and len(fname) <= 8
+
+    return proper_ext and proper_fname
+
+def gen_dos_short_file_name(file, filename_set):
+    """ see http://support.microsoft.com/default.aspx?scid=kb;en-us;Q142982
+
+    These are no complete 8.3 dos short names. The ~ char is missing and 
+    replaced with one character from the filename. WiX warns about such
+    filenames, since a collision might occur. Google for "CNDL1014" for
+    more information.
+    """
+    # guard this to not confuse the generation
+    if is_dos_short_file_name(file):
+        return file
+
+    fname, ext = os.path.splitext(file) # ext contains the dot
+
+    # first try if it suffices to convert to upper
+    file = file.upper()
+    if is_dos_short_file_name(file):
+        return file
+
+    # strip forbidden characters.
+    forbidden = '."/[]:;=, '
+    fname = [c for c in fname if c not in forbidden]
+
+    # check if we already generated a filename with the same number:
+    # thisis1.txt, thisis2.txt etc.
+    duplicate, num = not None, 1
+    while duplicate:
+        shortname = "%s%s" % (fname[:8-len(str(num))].upper(),\
+                              str(num))
+        if len(ext) >= 2:
+            shortname = "%s%s" % (shortname, ext[:4].upper())
+
+        duplicate, num = shortname in filename_set, num+1
+
+    assert( is_dos_short_file_name(shortname) ), 'shortname is %s, longname is %s' % (shortname, file)
+    filename_set.append(shortname)
+    return shortname
+
+def create_feature_dict(files):
+    """ X_MSI_FEATURE and doc FileTag's can be used to collect files in a
+        hierarchy. This function collects the files into this hierarchy.
+    """
+    dict = {}
+
+    def add_to_dict( feature, file ):
+        if not SCons.Util.is_List( feature ):
+            feature = [ feature ]
+
+        for f in feature:
+            if f not in dict:
+                dict[ f ] = [ file ]
+            else:
+                dict[ f ].append( file )
+
+    for file in files:
+        if hasattr( file, 'PACKAGING_X_MSI_FEATURE' ):
+            add_to_dict(file.PACKAGING_X_MSI_FEATURE, file)
+        elif hasattr( file, 'PACKAGING_DOC' ):
+            add_to_dict( 'PACKAGING_DOC', file )
+        else:
+            add_to_dict( 'default', file )
+
+    return dict
+
+def generate_guids(root):
+    """ generates globally unique identifiers for parts of the xml which need
+    them.
+
+    Component tags have a special requirement. Their UUID is only allowed to
+    change if the list of their contained resources has changed. This allows
+    for clean removal and proper updates.
+
+    To handle this requirement, the uuid is generated with an md5 hashing the
+    whole subtree of a xml node.
+    """
+    from hashlib import md5
+
+    # specify which tags need a guid and in which attribute this should be stored.
+    needs_id = { 'Product'   : 'Id',
+                 'Package'   : 'Id',
+                 'Component' : 'Guid',
+               }
+
+    # find all XMl nodes matching the key, retrieve their attribute, hash their
+    # subtree, convert hash to string and add as a attribute to the xml node.
+    for (key,value) in needs_id.items():
+        node_list = root.getElementsByTagName(key)
+        attribute = value
+        for node in node_list:
+            hash = md5(node.toxml()).hexdigest()
+            hash_str = '%s-%s-%s-%s-%s' % ( hash[:8], hash[8:12], hash[12:16], hash[16:20], hash[20:] )
+            node.attributes[attribute] = hash_str
+
+
+
+def string_wxsfile(target, source, env):
+    return "building WiX file %s"%( target[0].path )
+
+def build_wxsfile(target, source, env):
+    """ compiles a .wxs file from the keywords given in env['msi_spec'] and
+        by analyzing the tree of source nodes and their tags.
+    """
+    file = open(target[0].abspath, 'w')
+
+    try:
+        # Create a document with the Wix root tag
+        doc  = Document()
+        root = doc.createElement( 'Wix' )
+        root.attributes['xmlns']='http://schemas.microsoft.com/wix/2003/01/wi'
+        doc.appendChild( root )
+
+        filename_set = [] # this is to circumvent duplicates in the shortnames
+        id_set       = {} # this is to circumvent duplicates in the ids
+
+        # Create the content
+        build_wxsfile_header_section(root, env)
+        build_wxsfile_file_section(root, source, env['NAME'], env['VERSION'], env['VENDOR'], filename_set, id_set)
+        generate_guids(root)
+        build_wxsfile_features_section(root, source, env['NAME'], env['VERSION'], env['SUMMARY'], id_set)
+        build_wxsfile_default_gui(root)
+        build_license_file(target[0].get_dir(), env)
+
+        # write the xml to a file
+        file.write( doc.toprettyxml() )
+
+        # call a user specified function
+        if 'CHANGE_SPECFILE' in env:
+            env['CHANGE_SPECFILE'](target, source)
+
+    except KeyError, e:
+        raise SCons.Errors.UserError( '"%s" package field for MSI is missing.' % e.args[0] )
+
+#
+# setup function
+#
+def create_default_directory_layout(root, NAME, VERSION, VENDOR, filename_set):
+    """ Create the wix default target directory layout and return the innermost
+    directory.
+
+    We assume that the XML tree delivered in the root argument already contains
+    the Product tag.
+
+    Everything is put under the PFiles directory property defined by WiX.
+    After that a directory  with the 'VENDOR' tag is placed and then a
+    directory with the name of the project and its VERSION. This leads to the
+    following TARGET Directory Layout:
+    C:\<PFiles>\<Vendor>\<Projectname-Version>\
+    Example: C:\Programme\Company\Product-1.2\
+    """
+    doc = Document()
+    d1  = doc.createElement( 'Directory' )
+    d1.attributes['Id']   = 'TARGETDIR'
+    d1.attributes['Name'] = 'SourceDir'
+
+    d2  = doc.createElement( 'Directory' )
+    d2.attributes['Id']   = 'ProgramFilesFolder'
+    d2.attributes['Name'] = 'PFiles'
+
+    d3 = doc.createElement( 'Directory' )
+    d3.attributes['Id']       = 'VENDOR_folder'
+    d3.attributes['Name']     = escape( gen_dos_short_file_name( VENDOR, filename_set ) )
+    d3.attributes['LongName'] = escape( VENDOR )
+
+    d4 = doc.createElement( 'Directory' )
+    project_folder            = "%s-%s" % ( NAME, VERSION )
+    d4.attributes['Id']       = 'MY_DEFAULT_FOLDER'
+    d4.attributes['Name']     = escape( gen_dos_short_file_name( project_folder, filename_set ) )
+    d4.attributes['LongName'] = escape( project_folder )
+
+    d1.childNodes.append( d2 )
+    d2.childNodes.append( d3 )
+    d3.childNodes.append( d4 )
+
+    root.getElementsByTagName('Product')[0].childNodes.append( d1 )
+
+    return d4
+
+#
+# mandatory and optional file tags
+#
+def build_wxsfile_file_section(root, files, NAME, VERSION, VENDOR, filename_set, id_set):
+    """ builds the Component sections of the wxs file with their included files.
+
+    Files need to be specified in 8.3 format and in the long name format, long
+    filenames will be converted automatically.
+
+    Features are specficied with the 'X_MSI_FEATURE' or 'DOC' FileTag.
+    """
+    root       = create_default_directory_layout( root, NAME, VERSION, VENDOR, filename_set )
+    components = create_feature_dict( files )
+    factory    = Document()
+
+    def get_directory( node, dir ):
+        """ returns the node under the given node representing the directory.
+
+        Returns the component node if dir is None or empty.
+        """
+        if dir == '' or not dir:
+            return node
+
+        Directory = node
+        dir_parts = dir.split(os.path.sep)
+
+        # to make sure that our directory ids are unique, the parent folders are
+        # consecutively added to upper_dir
+        upper_dir = ''
+
+        # walk down the xml tree finding parts of the directory
+        dir_parts = [d for d in dir_parts if d != '']
+        for d in dir_parts[:]:
+            already_created = [c for c in Directory.childNodes
+                               if c.nodeName == 'Directory'
+                               and c.attributes['LongName'].value == escape(d)] 
+
+            if already_created != []:
+                Directory = already_created[0]
+                dir_parts.remove(d)
+                upper_dir += d
+            else:
+                break
+
+        for d in dir_parts:
+            nDirectory = factory.createElement( 'Directory' )
+            nDirectory.attributes['LongName'] = escape( d )
+            nDirectory.attributes['Name']     = escape( gen_dos_short_file_name( d, filename_set ) )
+            upper_dir += d
+            nDirectory.attributes['Id']       = convert_to_id( upper_dir, id_set )
+
+            Directory.childNodes.append( nDirectory )
+            Directory = nDirectory
+
+        return Directory
+
+    for file in files:
+        drive, path = os.path.splitdrive( file.PACKAGING_INSTALL_LOCATION )
+        filename = os.path.basename( path )
+        dirname  = os.path.dirname( path )
+
+        h = {
+            # tagname                   : default value
+            'PACKAGING_X_MSI_VITAL'     : 'yes',
+            'PACKAGING_X_MSI_FILEID'    : convert_to_id(filename, id_set),
+            'PACKAGING_X_MSI_LONGNAME'  : filename,
+            'PACKAGING_X_MSI_SHORTNAME' : gen_dos_short_file_name(filename, filename_set),
+            'PACKAGING_X_MSI_SOURCE'    : file.get_path(),
+            }
+
+        # fill in the default tags given above.
+        for k,v in [ (k, v) for (k,v) in h.items() if not hasattr(file, k) ]:
+            setattr( file, k, v )
+
+        File = factory.createElement( 'File' )
+        File.attributes['LongName'] = escape( file.PACKAGING_X_MSI_LONGNAME )
+        File.attributes['Name']     = escape( file.PACKAGING_X_MSI_SHORTNAME )
+        File.attributes['Source']   = escape( file.PACKAGING_X_MSI_SOURCE )
+        File.attributes['Id']       = escape( file.PACKAGING_X_MSI_FILEID )
+        File.attributes['Vital']    = escape( file.PACKAGING_X_MSI_VITAL )
+
+        # create the <Component> Tag under which this file should appear
+        Component = factory.createElement('Component')
+        Component.attributes['DiskId'] = '1'
+        Component.attributes['Id']     = convert_to_id( filename, id_set )
+
+        # hang the component node under the root node and the file node
+        # under the component node.
+        Directory = get_directory( root, dirname )
+        Directory.childNodes.append( Component )
+        Component.childNodes.append( File )
+
+#
+# additional functions
+#
+def build_wxsfile_features_section(root, files, NAME, VERSION, SUMMARY, id_set):
+    """ This function creates the <features> tag based on the supplied xml tree.
+
+    This is achieved by finding all <component>s and adding them to a default target.
+
+    It should be called after the tree has been built completly.  We assume
+    that a MY_DEFAULT_FOLDER Property is defined in the wxs file tree.
+
+    Furthermore a top-level with the name and VERSION of the software will be created.
+
+    An PACKAGING_X_MSI_FEATURE can either be a string, where the feature
+    DESCRIPTION will be the same as its title or a Tuple, where the first
+    part will be its title and the second its DESCRIPTION.
+    """
+    factory = Document()
+    Feature = factory.createElement('Feature')
+    Feature.attributes['Id']                    = 'complete'
+    Feature.attributes['ConfigurableDirectory'] = 'MY_DEFAULT_FOLDER'
+    Feature.attributes['Level']                 = '1'
+    Feature.attributes['Title']                 = escape( '%s %s' % (NAME, VERSION) )
+    Feature.attributes['Description']           = escape( SUMMARY )
+    Feature.attributes['Display']               = 'expand'
+
+    for (feature, files) in create_feature_dict(files).items():
+        SubFeature   = factory.createElement('Feature')
+        SubFeature.attributes['Level'] = '1'
+
+        if SCons.Util.is_Tuple(feature):
+            SubFeature.attributes['Id']    = convert_to_id( feature[0], id_set )
+            SubFeature.attributes['Title'] = escape(feature[0])
+            SubFeature.attributes['Description'] = escape(feature[1])
+        else:
+            SubFeature.attributes['Id'] = convert_to_id( feature, id_set )
+            if feature=='default':
+                SubFeature.attributes['Description'] = 'Main Part'
+                SubFeature.attributes['Title'] = 'Main Part'
+            elif feature=='PACKAGING_DOC':
+                SubFeature.attributes['Description'] = 'Documentation'
+                SubFeature.attributes['Title'] = 'Documentation'
+            else:
+                SubFeature.attributes['Description'] = escape(feature)
+                SubFeature.attributes['Title'] = escape(feature)
+
+        # build the componentrefs. As one of the design decision is that every
+        # file is also a component we walk the list of files and create a
+        # reference.
+        for f in files:
+            ComponentRef = factory.createElement('ComponentRef')
+            ComponentRef.attributes['Id'] = convert_to_id( os.path.basename(f.get_path()), id_set )
+            SubFeature.childNodes.append(ComponentRef)
+
+        Feature.childNodes.append(SubFeature)
+
+    root.getElementsByTagName('Product')[0].childNodes.append(Feature)
+
+def build_wxsfile_default_gui(root):
+    """ this function adds a default GUI to the wxs file
+    """
+    factory = Document()
+    Product = root.getElementsByTagName('Product')[0]
+
+    UIRef   = factory.createElement('UIRef')
+    UIRef.attributes['Id'] = 'WixUI_Mondo'
+    Product.childNodes.append(UIRef)
+
+    UIRef   = factory.createElement('UIRef')
+    UIRef.attributes['Id'] = 'WixUI_ErrorProgressText'
+    Product.childNodes.append(UIRef)
+
+def build_license_file(directory, spec):
+    """ creates a License.rtf file with the content of "X_MSI_LICENSE_TEXT"
+    in the given directory
+    """
+    name, text = '', ''
+
+    try:
+        name = spec['LICENSE']
+        text = spec['X_MSI_LICENSE_TEXT']
+    except KeyError:
+        pass # ignore this as X_MSI_LICENSE_TEXT is optional
+
+    if name!='' or text!='':
+        file = open( os.path.join(directory.get_path(), 'License.rtf'), 'w' )
+        file.write('{\\rtf')
+        if text!='':
+             file.write(text.replace('\n', '\\par '))
+        else:
+             file.write(name+'\\par\\par')
+        file.write('}')
+        file.close()
+
+#
+# mandatory and optional package tags
+#
+def build_wxsfile_header_section(root, spec):
+    """ Adds the xml file node which define the package meta-data.
+    """
+    # Create the needed DOM nodes and add them at the correct position in the tree.
+    factory = Document()
+    Product = factory.createElement( 'Product' )
+    Package = factory.createElement( 'Package' )
+
+    root.childNodes.append( Product )
+    Product.childNodes.append( Package )
+
+    # set "mandatory" default values
+    if 'X_MSI_LANGUAGE' not in spec:
+        spec['X_MSI_LANGUAGE'] = '1033' # select english
+
+    # mandatory sections, will throw a KeyError if the tag is not available
+    Product.attributes['Name']         = escape( spec['NAME'] )
+    Product.attributes['Version']      = escape( spec['VERSION'] )
+    Product.attributes['Manufacturer'] = escape( spec['VENDOR'] )
+    Product.attributes['Language']     = escape( spec['X_MSI_LANGUAGE'] )
+    Package.attributes['Description']  = escape( spec['SUMMARY'] )
+
+    # now the optional tags, for which we avoid the KeyErrror exception
+    if 'DESCRIPTION' in spec:
+        Package.attributes['Comments'] = escape( spec['DESCRIPTION'] )
+
+    if 'X_MSI_UPGRADE_CODE' in spec:
+        Package.attributes['X_MSI_UPGRADE_CODE'] = escape( spec['X_MSI_UPGRADE_CODE'] )
+
+    # We hardcode the media tag as our current model cannot handle it.
+    Media = factory.createElement('Media')
+    Media.attributes['Id']       = '1'
+    Media.attributes['Cabinet']  = 'default.cab'
+    Media.attributes['EmbedCab'] = 'yes'
+    root.getElementsByTagName('Product')[0].childNodes.append(Media)
+
+# this builder is the entry-point for .wxs file compiler.
+wxs_builder = Builder(
+    action         = Action( build_wxsfile, string_wxsfile ),
+    ensure_suffix  = '.wxs' )
+
+def package(env, target, source, PACKAGEROOT, NAME, VERSION,
+            DESCRIPTION, SUMMARY, VENDOR, X_MSI_LANGUAGE, **kw):
+    # make sure that the Wix Builder is in the environment
+    SCons.Tool.Tool('wix').generate(env)
+
+    # get put the keywords for the specfile compiler. These are the arguments
+    # given to the package function and all optional ones stored in kw, minus
+    # the the source, target and env one.
+    loc = locals()
+    del loc['kw']
+    kw.update(loc)
+    del kw['source'], kw['target'], kw['env']
+
+    # strip the install builder from the source files
+    target, source = stripinstallbuilder(target, source, env)
+
+    # put the arguments into the env and call the specfile builder.
+    env['msi_spec'] = kw
+    specfile = wxs_builder(* [env, target, source], **kw)
+
+    # now call the WiX Tool with the built specfile added as a source.
+    msifile  = env.WiX(target, specfile)
+
+    # return the target and source tuple.
+    return (msifile, source+[specfile])
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/rpm.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/rpm.py
new file mode 100644
index 0000000..90b38ba
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/rpm.py
@@ -0,0 +1,365 @@
+"""SCons.Tool.Packaging.rpm
+
+The rpm packager.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Tool/packaging/rpm.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+
+import SCons.Builder
+
+from SCons.Environment import OverrideEnvironment
+from SCons.Tool.packaging import stripinstallbuilder, src_targz
+from SCons.Errors import UserError
+
+def package(env, target, source, PACKAGEROOT, NAME, VERSION,
+            PACKAGEVERSION, DESCRIPTION, SUMMARY, X_RPM_GROUP, LICENSE,
+            **kw):
+    # initialize the rpm tool
+    SCons.Tool.Tool('rpm').generate(env)
+
+    bld = env['BUILDERS']['Rpm']
+
+    # Generate a UserError whenever the target name has been set explicitly,
+    # since rpm does not allow for controlling it. This is detected by
+    # checking if the target has been set to the default by the Package()
+    # Environment function.
+    if str(target[0])!="%s-%s"%(NAME, VERSION):
+        raise UserError( "Setting target is not supported for rpm." )
+    else:
+        # This should be overridable from the construction environment,
+        # which it is by using ARCHITECTURE=.
+        # Guessing based on what os.uname() returns at least allows it
+        # to work for both i386 and x86_64 Linux systems.
+        archmap = {
+            'i686'  : 'i386',
+            'i586'  : 'i386',
+            'i486'  : 'i386',
+        }
+
+        buildarchitecture = os.uname()[4]
+        buildarchitecture = archmap.get(buildarchitecture, buildarchitecture)
+
+        if 'ARCHITECTURE' in kw:
+            buildarchitecture = kw['ARCHITECTURE']
+
+        fmt = '%s-%s-%s.%s.rpm'
+        srcrpm = fmt % (NAME, VERSION, PACKAGEVERSION, 'src')
+        binrpm = fmt % (NAME, VERSION, PACKAGEVERSION, buildarchitecture)
+
+        target = [ srcrpm, binrpm ]
+
+    # get the correct arguments into the kw hash
+    loc=locals()
+    del loc['kw']
+    kw.update(loc)
+    del kw['source'], kw['target'], kw['env']
+
+    # if no "SOURCE_URL" tag is given add a default one.
+    if 'SOURCE_URL' not in kw:
+        #kw['SOURCE_URL']=(str(target[0])+".tar.gz").replace('.rpm', '')
+        kw['SOURCE_URL']=(str(target[0])+".tar.gz").replace('.rpm', '')
+
+    # mangle the source and target list for the rpmbuild
+    env = OverrideEnvironment(env, kw)
+    target, source = stripinstallbuilder(target, source, env)
+    target, source = addspecfile(target, source, env)
+    target, source = collectintargz(target, source, env)
+
+    # now call the rpm builder to actually build the packet.
+    return bld(env, target, source, **kw)
+
+def collectintargz(target, source, env):
+    """ Puts all source files into a tar.gz file. """
+    # the rpm tool depends on a source package, until this is chagned
+    # this hack needs to be here that tries to pack all sources in.
+    sources = env.FindSourceFiles()
+
+    # filter out the target we are building the source list for.
+    #sources = [s for s in sources if not (s in target)]
+    sources = [s for s in sources if s not in target]
+
+    # find the .spec file for rpm and add it since it is not necessarily found
+    # by the FindSourceFiles function.
+    #sources.extend( [s for s in source if str(s).rfind('.spec')!=-1] )
+    spec_file = lambda s: str(s).rfind('.spec') != -1
+    sources.extend( list(filter(spec_file, source)) )
+
+    # as the source contains the url of the source package this rpm package
+    # is built from, we extract the target name
+    #tarball = (str(target[0])+".tar.gz").replace('.rpm', '')
+    tarball = (str(target[0])+".tar.gz").replace('.rpm', '')
+    try:
+        #tarball = env['SOURCE_URL'].split('/')[-1]
+        tarball = env['SOURCE_URL'].split('/')[-1]
+    except KeyError, e:
+        raise SCons.Errors.UserError( "Missing PackageTag '%s' for RPM packager" % e.args[0] )
+
+    tarball = src_targz.package(env, source=sources, target=tarball,
+                                PACKAGEROOT=env['PACKAGEROOT'], )
+
+    return (target, tarball)
+
+def addspecfile(target, source, env):
+    specfile = "%s-%s" % (env['NAME'], env['VERSION'])
+
+    bld = SCons.Builder.Builder(action         = build_specfile,
+                                suffix         = '.spec',
+                                target_factory = SCons.Node.FS.File)
+
+    source.extend(bld(env, specfile, source))
+
+    return (target,source)
+
+def build_specfile(target, source, env):
+    """ Builds a RPM specfile from a dictionary with string metadata and
+    by analyzing a tree of nodes.
+    """
+    file = open(target[0].abspath, 'w')
+    str  = ""
+
+    try:
+        file.write( build_specfile_header(env) )
+        file.write( build_specfile_sections(env) )
+        file.write( build_specfile_filesection(env, source) )
+        file.close()
+
+        # call a user specified function
+        if 'CHANGE_SPECFILE' in env:
+            env['CHANGE_SPECFILE'](target, source)
+
+    except KeyError, e:
+        raise SCons.Errors.UserError( '"%s" package field for RPM is missing.' % e.args[0] )
+
+
+#
+# mandatory and optional package tag section
+#
+def build_specfile_sections(spec):
+    """ Builds the sections of a rpm specfile.
+    """
+    str = ""
+
+    mandatory_sections = {
+        'DESCRIPTION'  : '\n%%description\n%s\n\n', }
+
+    str = str + SimpleTagCompiler(mandatory_sections).compile( spec )
+
+    optional_sections = {
+        'DESCRIPTION_'        : '%%description -l %s\n%s\n\n',
+        'CHANGELOG'           : '%%changelog\n%s\n\n',
+        'X_RPM_PREINSTALL'    : '%%pre\n%s\n\n',
+        'X_RPM_POSTINSTALL'   : '%%post\n%s\n\n',
+        'X_RPM_PREUNINSTALL'  : '%%preun\n%s\n\n',
+        'X_RPM_POSTUNINSTALL' : '%%postun\n%s\n\n',
+        'X_RPM_VERIFY'        : '%%verify\n%s\n\n',
+
+        # These are for internal use but could possibly be overriden
+        'X_RPM_PREP'          : '%%prep\n%s\n\n',
+        'X_RPM_BUILD'         : '%%build\n%s\n\n',
+        'X_RPM_INSTALL'       : '%%install\n%s\n\n',
+        'X_RPM_CLEAN'         : '%%clean\n%s\n\n',
+        }
+
+    # Default prep, build, install and clean rules
+    # TODO: optimize those build steps, to not compile the project a second time
+    if 'X_RPM_PREP' not in spec:
+        spec['X_RPM_PREP'] = '[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT"' + '\n%setup -q'
+
+    if 'X_RPM_BUILD' not in spec:
+        spec['X_RPM_BUILD'] = 'mkdir "$RPM_BUILD_ROOT"'
+
+    if 'X_RPM_INSTALL' not in spec:
+        spec['X_RPM_INSTALL'] = 'scons --install-sandbox="$RPM_BUILD_ROOT" "$RPM_BUILD_ROOT"'
+
+    if 'X_RPM_CLEAN' not in spec:
+        spec['X_RPM_CLEAN'] = '[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT"'
+
+    str = str + SimpleTagCompiler(optional_sections, mandatory=0).compile( spec )
+
+    return str
+
+def build_specfile_header(spec):
+    """ Builds all section but the %file of a rpm specfile
+    """
+    str = ""
+
+    # first the mandatory sections
+    mandatory_header_fields = {
+        'NAME'           : '%%define name %s\nName: %%{name}\n',
+        'VERSION'        : '%%define version %s\nVersion: %%{version}\n',
+        'PACKAGEVERSION' : '%%define release %s\nRelease: %%{release}\n',
+        'X_RPM_GROUP'    : 'Group: %s\n',
+        'SUMMARY'        : 'Summary: %s\n',
+        'LICENSE'        : 'License: %s\n', }
+
+    str = str + SimpleTagCompiler(mandatory_header_fields).compile( spec )
+
+    # now the optional tags
+    optional_header_fields = {
+        'VENDOR'              : 'Vendor: %s\n',
+        'X_RPM_URL'           : 'Url: %s\n',
+        'SOURCE_URL'          : 'Source: %s\n',
+        'SUMMARY_'            : 'Summary(%s): %s\n',
+        'X_RPM_DISTRIBUTION'  : 'Distribution: %s\n',
+        'X_RPM_ICON'          : 'Icon: %s\n',
+        'X_RPM_PACKAGER'      : 'Packager: %s\n',
+        'X_RPM_GROUP_'        : 'Group(%s): %s\n',
+
+        'X_RPM_REQUIRES'      : 'Requires: %s\n',
+        'X_RPM_PROVIDES'      : 'Provides: %s\n',
+        'X_RPM_CONFLICTS'     : 'Conflicts: %s\n',
+        'X_RPM_BUILDREQUIRES' : 'BuildRequires: %s\n',
+
+        'X_RPM_SERIAL'        : 'Serial: %s\n',
+        'X_RPM_EPOCH'         : 'Epoch: %s\n',
+        'X_RPM_AUTOREQPROV'   : 'AutoReqProv: %s\n',
+        'X_RPM_EXCLUDEARCH'   : 'ExcludeArch: %s\n',
+        'X_RPM_EXCLUSIVEARCH' : 'ExclusiveArch: %s\n',
+        'X_RPM_PREFIX'        : 'Prefix: %s\n',
+        'X_RPM_CONFLICTS'     : 'Conflicts: %s\n',
+
+        # internal use
+        'X_RPM_BUILDROOT'     : 'BuildRoot: %s\n', }
+
+    # fill in default values:
+    # Adding a BuildRequires renders the .rpm unbuildable under System, which
+    # are not managed by rpm, since the database to resolve this dependency is
+    # missing (take Gentoo as an example)
+#    if not s.has_key('x_rpm_BuildRequires'):
+#        s['x_rpm_BuildRequires'] = 'scons'
+
+    if 'X_RPM_BUILDROOT' not in spec:
+        spec['X_RPM_BUILDROOT'] = '%{_tmppath}/%{name}-%{version}-%{release}'
+
+    str = str + SimpleTagCompiler(optional_header_fields, mandatory=0).compile( spec )
+    return str
+
+#
+# mandatory and optional file tags
+#
+def build_specfile_filesection(spec, files):
+    """ builds the %file section of the specfile
+    """
+    str  = '%files\n'
+
+    if 'X_RPM_DEFATTR' not in spec:
+        spec['X_RPM_DEFATTR'] = '(-,root,root)'
+
+    str = str + '%%defattr %s\n' % spec['X_RPM_DEFATTR']
+
+    supported_tags = {
+        'PACKAGING_CONFIG'           : '%%config %s',
+        'PACKAGING_CONFIG_NOREPLACE' : '%%config(noreplace) %s',
+        'PACKAGING_DOC'              : '%%doc %s',
+        'PACKAGING_UNIX_ATTR'        : '%%attr %s',
+        'PACKAGING_LANG_'            : '%%lang(%s) %s',
+        'PACKAGING_X_RPM_VERIFY'     : '%%verify %s',
+        'PACKAGING_X_RPM_DIR'        : '%%dir %s',
+        'PACKAGING_X_RPM_DOCDIR'     : '%%docdir %s',
+        'PACKAGING_X_RPM_GHOST'      : '%%ghost %s', }
+
+    for file in files:
+        # build the tagset
+        tags = {}
+        for k in supported_tags.keys():
+            try:
+                tags[k]=getattr(file, k)
+            except AttributeError:
+                pass
+
+        # compile the tagset
+        str = str + SimpleTagCompiler(supported_tags, mandatory=0).compile( tags )
+
+        str = str + ' '
+        str = str + file.PACKAGING_INSTALL_LOCATION
+        str = str + '\n\n'
+
+    return str
+
+class SimpleTagCompiler(object):
+    """ This class is a simple string substition utility:
+    the replacement specfication is stored in the tagset dictionary, something
+    like:
+     { "abc"  : "cdef %s ",
+       "abc_" : "cdef %s %s" }
+
+    the compile function gets a value dictionary, which may look like:
+    { "abc"    : "ghij",
+      "abc_gh" : "ij" }
+
+    The resulting string will be:
+     "cdef ghij cdef gh ij"
+    """
+    def __init__(self, tagset, mandatory=1):
+        self.tagset    = tagset
+        self.mandatory = mandatory
+
+    def compile(self, values):
+        """ compiles the tagset and returns a str containing the result
+        """
+        def is_international(tag):
+            #return tag.endswith('_')
+            return tag[-1:] == '_'
+
+        def get_country_code(tag):
+            return tag[-2:]
+
+        def strip_country_code(tag):
+            return tag[:-2]
+
+        replacements = list(self.tagset.items())
+
+        str = ""
+        #domestic = [ (k,v) for k,v in replacements if not is_international(k) ]
+        domestic = [t for t in replacements if not is_international(t[0])]
+        for key, replacement in domestic:
+            try:
+                str = str + replacement % values[key]
+            except KeyError, e:
+                if self.mandatory:
+                    raise e
+
+        #international = [ (k,v) for k,v in replacements if is_international(k) ]
+        international = [t for t in replacements if is_international(t[0])]
+        for key, replacement in international:
+            try:
+                #int_values_for_key = [ (get_country_code(k),v) for k,v in values.items() if strip_country_code(k) == key ]
+                x = [t for t in values.items() if strip_country_code(t[0]) == key]
+                int_values_for_key = [(get_country_code(t[0]),t[1]) for t in x]
+                for v in int_values_for_key:
+                    str = str + replacement % v
+            except KeyError, e:
+                if self.mandatory:
+                    raise e
+
+        return str
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/src_tarbz2.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/src_tarbz2.py
new file mode 100644
index 0000000..eeab7dc
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/src_tarbz2.py
@@ -0,0 +1,43 @@
+"""SCons.Tool.Packaging.tarbz2
+
+The tarbz2 SRC packager.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# 
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/packaging/src_tarbz2.py 5183 2010/11/25 14:46:21 bdeegan"
+
+from SCons.Tool.packaging import putintopackageroot
+
+def package(env, target, source, PACKAGEROOT, **kw):
+    bld = env['BUILDERS']['Tar']
+    bld.set_suffix('.tar.bz2')
+    target, source = putintopackageroot(target, source, env, PACKAGEROOT, honor_install_location=0)
+    return bld(env, target, source, TARFLAGS='-jc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/src_targz.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/src_targz.py
new file mode 100644
index 0000000..dc14170
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/src_targz.py
@@ -0,0 +1,43 @@
+"""SCons.Tool.Packaging.targz
+
+The targz SRC packager.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/packaging/src_targz.py 5183 2010/11/25 14:46:21 bdeegan"
+
+from SCons.Tool.packaging import putintopackageroot
+
+def package(env, target, source, PACKAGEROOT, **kw):
+    bld = env['BUILDERS']['Tar']
+    bld.set_suffix('.tar.gz')
+    target, source = putintopackageroot(target, source, env, PACKAGEROOT, honor_install_location=0)
+    return bld(env, target, source, TARFLAGS='-zc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/src_zip.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/src_zip.py
new file mode 100644
index 0000000..e23a2f1
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/src_zip.py
@@ -0,0 +1,43 @@
+"""SCons.Tool.Packaging.zip
+
+The zip SRC packager.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# 
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/packaging/src_zip.py 5183 2010/11/25 14:46:21 bdeegan"
+
+from SCons.Tool.packaging import putintopackageroot
+
+def package(env, target, source, PACKAGEROOT, **kw):
+    bld = env['BUILDERS']['Zip']
+    bld.set_suffix('.zip')
+    target, source = putintopackageroot(target, source, env, PACKAGEROOT, honor_install_location=0)
+    return bld(env, target, source)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/tarbz2.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/tarbz2.py
new file mode 100644
index 0000000..33a991f
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/tarbz2.py
@@ -0,0 +1,44 @@
+"""SCons.Tool.Packaging.tarbz2
+
+The tarbz2 SRC packager.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# 
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/packaging/tarbz2.py 5183 2010/11/25 14:46:21 bdeegan"
+
+from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot
+
+def package(env, target, source, PACKAGEROOT, **kw):
+    bld = env['BUILDERS']['Tar']
+    bld.set_suffix('.tar.gz')
+    target, source = putintopackageroot(target, source, env, PACKAGEROOT)
+    target, source = stripinstallbuilder(target, source, env)
+    return bld(env, target, source, TARFLAGS='-jc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/targz.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/targz.py
new file mode 100644
index 0000000..5b9216c
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/targz.py
@@ -0,0 +1,44 @@
+"""SCons.Tool.Packaging.targz
+
+The targz SRC packager.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# 
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/packaging/targz.py 5183 2010/11/25 14:46:21 bdeegan"
+
+from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot
+
+def package(env, target, source, PACKAGEROOT, **kw):
+    bld = env['BUILDERS']['Tar']
+    bld.set_suffix('.tar.gz')
+    target, source = stripinstallbuilder(target, source, env)
+    target, source = putintopackageroot(target, source, env, PACKAGEROOT)
+    return bld(env, target, source, TARFLAGS='-zc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/zip.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/zip.py
new file mode 100644
index 0000000..bcb008b
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/packaging/zip.py
@@ -0,0 +1,44 @@
+"""SCons.Tool.Packaging.zip
+
+The zip SRC packager.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# 
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/packaging/zip.py 5183 2010/11/25 14:46:21 bdeegan"
+
+from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot
+
+def package(env, target, source, PACKAGEROOT, **kw):
+    bld = env['BUILDERS']['Zip']
+    bld.set_suffix('.zip')
+    target, source = stripinstallbuilder(target, source, env)
+    target, source = putintopackageroot(target, source, env, PACKAGEROOT)
+    return bld(env, target, source)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/pdf.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/pdf.py
new file mode 100644
index 0000000..ccfd723
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/pdf.py
@@ -0,0 +1,78 @@
+"""SCons.Tool.pdf
+
+Common PDF Builder definition for various other Tool modules that use it.
+Add an explicit action to run epstopdf to convert .eps files to .pdf
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/pdf.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Builder
+import SCons.Tool
+
+PDFBuilder = None
+
+EpsPdfAction = SCons.Action.Action('$EPSTOPDFCOM', '$EPSTOPDFCOMSTR')
+
+def generate(env):
+    try:
+        env['BUILDERS']['PDF']
+    except KeyError:
+        global PDFBuilder
+        if PDFBuilder is None:
+            PDFBuilder = SCons.Builder.Builder(action = {},
+                                               source_scanner = SCons.Tool.PDFLaTeXScanner,
+                                               prefix = '$PDFPREFIX',
+                                               suffix = '$PDFSUFFIX',
+                                               emitter = {},
+                                               source_ext_match = None,
+                                               single_source=True)
+        env['BUILDERS']['PDF'] = PDFBuilder
+
+    env['PDFPREFIX'] = ''
+    env['PDFSUFFIX'] = '.pdf'
+
+# put the epstopdf builder in this routine so we can add it after 
+# the pdftex builder so that one is the default for no source suffix
+def generate2(env):
+    bld = env['BUILDERS']['PDF']
+    #bld.add_action('.ps',  EpsPdfAction) # this is covered by direct Ghostcript action in gs.py
+    bld.add_action('.eps', EpsPdfAction)
+
+    env['EPSTOPDF']      = 'epstopdf'
+    env['EPSTOPDFFLAGS'] = SCons.Util.CLVar('')
+    env['EPSTOPDFCOM']   = '$EPSTOPDF $EPSTOPDFFLAGS ${SOURCE} --outfile=${TARGET}'
+
+def exists(env):
+    # This only puts a skeleton Builder in place, so if someone
+    # references this Tool directly, it's always "available."
+    return 1
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/pdflatex.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/pdflatex.py
new file mode 100644
index 0000000..4a7385f
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/pdflatex.py
@@ -0,0 +1,83 @@
+"""SCons.Tool.pdflatex
+
+Tool-specific initialization for pdflatex.
+Generates .pdf files from .latex or .ltx files
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/pdflatex.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Action
+import SCons.Util
+import SCons.Tool.pdf
+import SCons.Tool.tex
+
+PDFLaTeXAction = None
+
+def PDFLaTeXAuxFunction(target = None, source= None, env=None):
+    result = SCons.Tool.tex.InternalLaTeXAuxAction( PDFLaTeXAction, target, source, env )
+    if result != 0:
+        SCons.Tool.tex.check_file_error_message(env['PDFLATEX'])
+    return result
+
+PDFLaTeXAuxAction = None
+
+def generate(env):
+    """Add Builders and construction variables for pdflatex to an Environment."""
+    global PDFLaTeXAction
+    if PDFLaTeXAction is None:
+        PDFLaTeXAction = SCons.Action.Action('$PDFLATEXCOM', '$PDFLATEXCOMSTR')
+
+    global PDFLaTeXAuxAction
+    if PDFLaTeXAuxAction is None:
+        PDFLaTeXAuxAction = SCons.Action.Action(PDFLaTeXAuxFunction,
+                              strfunction=SCons.Tool.tex.TeXLaTeXStrFunction)
+
+    env.AppendUnique(LATEXSUFFIXES=SCons.Tool.LaTeXSuffixes)
+
+    import pdf
+    pdf.generate(env)
+
+    bld = env['BUILDERS']['PDF']
+    bld.add_action('.ltx', PDFLaTeXAuxAction)
+    bld.add_action('.latex', PDFLaTeXAuxAction)
+    bld.add_emitter('.ltx', SCons.Tool.tex.tex_pdf_emitter)
+    bld.add_emitter('.latex', SCons.Tool.tex.tex_pdf_emitter)
+
+    SCons.Tool.tex.generate_common(env)
+
+def exists(env):
+    return env.Detect('pdflatex')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/pdftex.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/pdftex.py
new file mode 100644
index 0000000..e76bd3f
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/pdftex.py
@@ -0,0 +1,108 @@
+"""SCons.Tool.pdftex
+
+Tool-specific initialization for pdftex.
+Generates .pdf files from .tex files
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/pdftex.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+import SCons.Action
+import SCons.Util
+import SCons.Tool.tex
+
+PDFTeXAction = None
+
+# This action might be needed more than once if we are dealing with
+# labels and bibtex.
+PDFLaTeXAction = None
+
+def PDFLaTeXAuxAction(target = None, source= None, env=None):
+    result = SCons.Tool.tex.InternalLaTeXAuxAction( PDFLaTeXAction, target, source, env )
+    return result
+
+def PDFTeXLaTeXFunction(target = None, source= None, env=None):
+    """A builder for TeX and LaTeX that scans the source file to
+    decide the "flavor" of the source and then executes the appropriate
+    program."""
+    basedir = os.path.split(str(source[0]))[0]
+    abspath = os.path.abspath(basedir)
+
+    if SCons.Tool.tex.is_LaTeX(source,env,abspath):
+        result = PDFLaTeXAuxAction(target,source,env)
+        if result != 0:
+            SCons.Tool.tex.check_file_error_message(env['PDFLATEX'])
+    else:
+        result = PDFTeXAction(target,source,env)
+        if result != 0:
+            SCons.Tool.tex.check_file_error_message(env['PDFTEX'])
+    return result
+
+PDFTeXLaTeXAction = None
+
+def generate(env):
+    """Add Builders and construction variables for pdftex to an Environment."""
+    global PDFTeXAction
+    if PDFTeXAction is None:
+        PDFTeXAction = SCons.Action.Action('$PDFTEXCOM', '$PDFTEXCOMSTR')
+
+    global PDFLaTeXAction
+    if PDFLaTeXAction is None:
+        PDFLaTeXAction = SCons.Action.Action("$PDFLATEXCOM", "$PDFLATEXCOMSTR")
+
+    global PDFTeXLaTeXAction
+    if PDFTeXLaTeXAction is None:
+        PDFTeXLaTeXAction = SCons.Action.Action(PDFTeXLaTeXFunction,
+                              strfunction=SCons.Tool.tex.TeXLaTeXStrFunction)
+
+    env.AppendUnique(LATEXSUFFIXES=SCons.Tool.LaTeXSuffixes)
+
+    import pdf
+    pdf.generate(env)
+
+    bld = env['BUILDERS']['PDF']
+    bld.add_action('.tex', PDFTeXLaTeXAction)
+    bld.add_emitter('.tex', SCons.Tool.tex.tex_pdf_emitter)
+
+    # Add the epstopdf builder after the pdftex builder 
+    # so pdftex is the default for no source suffix
+    pdf.generate2(env)
+
+    SCons.Tool.tex.generate_common(env)
+
+def exists(env):
+    return env.Detect('pdftex')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/qt.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/qt.py
new file mode 100644
index 0000000..de3346d
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/qt.py
@@ -0,0 +1,336 @@
+
+"""SCons.Tool.qt
+
+Tool-specific initialization for Qt.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/qt.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os.path
+import re
+
+import SCons.Action
+import SCons.Builder
+import SCons.Defaults
+import SCons.Scanner
+import SCons.Tool
+import SCons.Util
+
+class ToolQtWarning(SCons.Warnings.Warning):
+    pass
+
+class GeneratedMocFileNotIncluded(ToolQtWarning):
+    pass
+
+class QtdirNotFound(ToolQtWarning):
+    pass
+
+SCons.Warnings.enableWarningClass(ToolQtWarning)
+
+header_extensions = [".h", ".hxx", ".hpp", ".hh"]
+if SCons.Util.case_sensitive_suffixes('.h', '.H'):
+    header_extensions.append('.H')
+cplusplus = __import__('c++', globals(), locals(), [])
+cxx_suffixes = cplusplus.CXXSuffixes
+
+def checkMocIncluded(target, source, env):
+    moc = target[0]
+    cpp = source[0]
+    # looks like cpp.includes is cleared before the build stage :-(
+    # not really sure about the path transformations (moc.cwd? cpp.cwd?) :-/
+    path = SCons.Defaults.CScan.path(env, moc.cwd)
+    includes = SCons.Defaults.CScan(cpp, env, path)
+    if not moc in includes:
+        SCons.Warnings.warn(
+            GeneratedMocFileNotIncluded,
+            "Generated moc file '%s' is not included by '%s'" %
+            (str(moc), str(cpp)))
+
+def find_file(filename, paths, node_factory):
+    for dir in paths:
+        node = node_factory(filename, dir)
+        if node.rexists():
+            return node
+    return None
+
+class _Automoc(object):
+    """
+    Callable class, which works as an emitter for Programs, SharedLibraries and
+    StaticLibraries.
+    """
+
+    def __init__(self, objBuilderName):
+        self.objBuilderName = objBuilderName
+        
+    def __call__(self, target, source, env):
+        """
+        Smart autoscan function. Gets the list of objects for the Program
+        or Lib. Adds objects and builders for the special qt files.
+        """
+        try:
+            if int(env.subst('$QT_AUTOSCAN')) == 0:
+                return target, source
+        except ValueError:
+            pass
+        try:
+            debug = int(env.subst('$QT_DEBUG'))
+        except ValueError:
+            debug = 0
+        
+        # some shortcuts used in the scanner
+        splitext = SCons.Util.splitext
+        objBuilder = getattr(env, self.objBuilderName)
+  
+        # some regular expressions:
+        # Q_OBJECT detection
+        q_object_search = re.compile(r'[^A-Za-z0-9]Q_OBJECT[^A-Za-z0-9]') 
+        # cxx and c comment 'eater'
+        #comment = re.compile(r'(//.*)|(/\*(([^*])|(\*[^/]))*\*/)')
+        # CW: something must be wrong with the regexp. See also bug #998222
+        #     CURRENTLY THERE IS NO TEST CASE FOR THAT
+        
+        # The following is kind of hacky to get builders working properly (FIXME)
+        objBuilderEnv = objBuilder.env
+        objBuilder.env = env
+        mocBuilderEnv = env.Moc.env
+        env.Moc.env = env
+        
+        # make a deep copy for the result; MocH objects will be appended
+        out_sources = source[:]
+
+        for obj in source:
+            if not obj.has_builder():
+                # binary obj file provided
+                if debug:
+                    print "scons: qt: '%s' seems to be a binary. Discarded." % str(obj)
+                continue
+            cpp = obj.sources[0]
+            if not splitext(str(cpp))[1] in cxx_suffixes:
+                if debug:
+                    print "scons: qt: '%s' is no cxx file. Discarded." % str(cpp) 
+                # c or fortran source
+                continue
+            #cpp_contents = comment.sub('', cpp.get_text_contents())
+            cpp_contents = cpp.get_text_contents()
+            h=None
+            for h_ext in header_extensions:
+                # try to find the header file in the corresponding source
+                # directory
+                hname = splitext(cpp.name)[0] + h_ext
+                h = find_file(hname, (cpp.get_dir(),), env.File)
+                if h:
+                    if debug:
+                        print "scons: qt: Scanning '%s' (header of '%s')" % (str(h), str(cpp))
+                    #h_contents = comment.sub('', h.get_text_contents())
+                    h_contents = h.get_text_contents()
+                    break
+            if not h and debug:
+                print "scons: qt: no header for '%s'." % (str(cpp))
+            if h and q_object_search.search(h_contents):
+                # h file with the Q_OBJECT macro found -> add moc_cpp
+                moc_cpp = env.Moc(h)
+                moc_o = objBuilder(moc_cpp)
+                out_sources.append(moc_o)
+                #moc_cpp.target_scanner = SCons.Defaults.CScan
+                if debug:
+                    print "scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(h), str(moc_cpp))
+            if cpp and q_object_search.search(cpp_contents):
+                # cpp file with Q_OBJECT macro found -> add moc
+                # (to be included in cpp)
+                moc = env.Moc(cpp)
+                env.Ignore(moc, moc)
+                if debug:
+                    print "scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(cpp), str(moc))
+                #moc.source_scanner = SCons.Defaults.CScan
+        # restore the original env attributes (FIXME)
+        objBuilder.env = objBuilderEnv
+        env.Moc.env = mocBuilderEnv
+
+        return (target, out_sources)
+
+AutomocShared = _Automoc('SharedObject')
+AutomocStatic = _Automoc('StaticObject')
+
+def _detect(env):
+    """Not really safe, but fast method to detect the QT library"""
+    QTDIR = None
+    if not QTDIR:
+        QTDIR = env.get('QTDIR',None)
+    if not QTDIR:
+        QTDIR = os.environ.get('QTDIR',None)
+    if not QTDIR:
+        moc = env.WhereIs('moc')
+        if moc:
+            QTDIR = os.path.dirname(os.path.dirname(moc))
+            SCons.Warnings.warn(
+                QtdirNotFound,
+                "Could not detect qt, using moc executable as a hint (QTDIR=%s)" % QTDIR)
+        else:
+            QTDIR = None
+            SCons.Warnings.warn(
+                QtdirNotFound,
+                "Could not detect qt, using empty QTDIR")
+    return QTDIR
+
+def uicEmitter(target, source, env):
+    adjustixes = SCons.Util.adjustixes
+    bs = SCons.Util.splitext(str(source[0].name))[0]
+    bs = os.path.join(str(target[0].get_dir()),bs)
+    # first target (header) is automatically added by builder
+    if len(target) < 2:
+        # second target is implementation
+        target.append(adjustixes(bs,
+                                 env.subst('$QT_UICIMPLPREFIX'),
+                                 env.subst('$QT_UICIMPLSUFFIX')))
+    if len(target) < 3:
+        # third target is moc file
+        target.append(adjustixes(bs,
+                                 env.subst('$QT_MOCHPREFIX'),
+                                 env.subst('$QT_MOCHSUFFIX')))
+    return target, source
+
+def uicScannerFunc(node, env, path):
+    lookout = []
+    lookout.extend(env['CPPPATH'])
+    lookout.append(str(node.rfile().dir))
+    includes = re.findall("<include.*?>(.*?)</include>", node.get_text_contents())
+    result = []
+    for incFile in includes:
+        dep = env.FindFile(incFile,lookout)
+        if dep:
+            result.append(dep)
+    return result
+
+uicScanner = SCons.Scanner.Base(uicScannerFunc,
+                                name = "UicScanner", 
+                                node_class = SCons.Node.FS.File,
+                                node_factory = SCons.Node.FS.File,
+                                recursive = 0)
+
+def generate(env):
+    """Add Builders and construction variables for qt to an Environment."""
+    CLVar = SCons.Util.CLVar
+    Action = SCons.Action.Action
+    Builder = SCons.Builder.Builder
+
+    env.SetDefault(QTDIR  = _detect(env),
+                   QT_BINPATH = os.path.join('$QTDIR', 'bin'),
+                   QT_CPPPATH = os.path.join('$QTDIR', 'include'),
+                   QT_LIBPATH = os.path.join('$QTDIR', 'lib'),
+                   QT_MOC = os.path.join('$QT_BINPATH','moc'),
+                   QT_UIC = os.path.join('$QT_BINPATH','uic'),
+                   QT_LIB = 'qt', # may be set to qt-mt
+
+                   QT_AUTOSCAN = 1, # scan for moc'able sources
+
+                   # Some QT specific flags. I don't expect someone wants to
+                   # manipulate those ...
+                   QT_UICIMPLFLAGS = CLVar(''),
+                   QT_UICDECLFLAGS = CLVar(''),
+                   QT_MOCFROMHFLAGS = CLVar(''),
+                   QT_MOCFROMCXXFLAGS = CLVar('-i'),
+
+                   # suffixes/prefixes for the headers / sources to generate
+                   QT_UICDECLPREFIX = '',
+                   QT_UICDECLSUFFIX = '.h',
+                   QT_UICIMPLPREFIX = 'uic_',
+                   QT_UICIMPLSUFFIX = '$CXXFILESUFFIX',
+                   QT_MOCHPREFIX = 'moc_',
+                   QT_MOCHSUFFIX = '$CXXFILESUFFIX',
+                   QT_MOCCXXPREFIX = '',
+                   QT_MOCCXXSUFFIX = '.moc',
+                   QT_UISUFFIX = '.ui',
+
+                   # Commands for the qt support ...
+                   # command to generate header, implementation and moc-file
+                   # from a .ui file
+                   QT_UICCOM = [
+                    CLVar('$QT_UIC $QT_UICDECLFLAGS -o ${TARGETS[0]} $SOURCE'),
+                    CLVar('$QT_UIC $QT_UICIMPLFLAGS -impl ${TARGETS[0].file} '
+                          '-o ${TARGETS[1]} $SOURCE'),
+                    CLVar('$QT_MOC $QT_MOCFROMHFLAGS -o ${TARGETS[2]} ${TARGETS[0]}')],
+                   # command to generate meta object information for a class
+                   # declarated in a header
+                   QT_MOCFROMHCOM = (
+                          '$QT_MOC $QT_MOCFROMHFLAGS -o ${TARGETS[0]} $SOURCE'),
+                   # command to generate meta object information for a class
+                   # declarated in a cpp file
+                   QT_MOCFROMCXXCOM = [
+                    CLVar('$QT_MOC $QT_MOCFROMCXXFLAGS -o ${TARGETS[0]} $SOURCE'),
+                    Action(checkMocIncluded,None)])
+
+    # ... and the corresponding builders
+    uicBld = Builder(action=SCons.Action.Action('$QT_UICCOM', '$QT_UICCOMSTR'),
+                     emitter=uicEmitter,
+                     src_suffix='$QT_UISUFFIX',
+                     suffix='$QT_UICDECLSUFFIX',
+                     prefix='$QT_UICDECLPREFIX',
+                     source_scanner=uicScanner)
+    mocBld = Builder(action={}, prefix={}, suffix={})
+    for h in header_extensions:
+        act = SCons.Action.Action('$QT_MOCFROMHCOM', '$QT_MOCFROMHCOMSTR')
+        mocBld.add_action(h, act)
+        mocBld.prefix[h] = '$QT_MOCHPREFIX'
+        mocBld.suffix[h] = '$QT_MOCHSUFFIX'
+    for cxx in cxx_suffixes:
+        act = SCons.Action.Action('$QT_MOCFROMCXXCOM', '$QT_MOCFROMCXXCOMSTR')
+        mocBld.add_action(cxx, act)
+        mocBld.prefix[cxx] = '$QT_MOCCXXPREFIX'
+        mocBld.suffix[cxx] = '$QT_MOCCXXSUFFIX'
+
+    # register the builders 
+    env['BUILDERS']['Uic'] = uicBld
+    env['BUILDERS']['Moc'] = mocBld
+    static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+    static_obj.add_src_builder('Uic')
+    shared_obj.add_src_builder('Uic')
+
+    # We use the emitters of Program / StaticLibrary / SharedLibrary
+    # to scan for moc'able files
+    # We can't refer to the builders directly, we have to fetch them
+    # as Environment attributes because that sets them up to be called
+    # correctly later by our emitter.
+    env.AppendUnique(PROGEMITTER =[AutomocStatic],
+                     SHLIBEMITTER=[AutomocShared],
+                     LIBEMITTER  =[AutomocStatic],
+                     # Of course, we need to link against the qt libraries
+                     CPPPATH=["$QT_CPPPATH"],
+                     LIBPATH=["$QT_LIBPATH"],
+                     LIBS=['$QT_LIB'])
+
+def exists(env):
+    return _detect(env)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/rmic.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/rmic.py
new file mode 100644
index 0000000..c8edc23
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/rmic.py
@@ -0,0 +1,120 @@
+"""SCons.Tool.rmic
+
+Tool-specific initialization for rmic.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/rmic.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os.path
+
+import SCons.Action
+import SCons.Builder
+import SCons.Node.FS
+import SCons.Util
+
+def emit_rmic_classes(target, source, env):
+    """Create and return lists of Java RMI stub and skeleton
+    class files to be created from a set of class files.
+    """
+    class_suffix = env.get('JAVACLASSSUFFIX', '.class')
+    classdir = env.get('JAVACLASSDIR')
+
+    if not classdir:
+        try:
+            s = source[0]
+        except IndexError:
+            classdir = '.'
+        else:
+            try:
+                classdir = s.attributes.java_classdir
+            except AttributeError:
+                classdir = '.'
+    classdir = env.Dir(classdir).rdir()
+    if str(classdir) == '.':
+        c_ = None
+    else:
+        c_ = str(classdir) + os.sep
+
+    slist = []
+    for src in source:
+        try:
+            classname = src.attributes.java_classname
+        except AttributeError:
+            classname = str(src)
+            if c_ and classname[:len(c_)] == c_:
+                classname = classname[len(c_):]
+            if class_suffix and classname[:-len(class_suffix)] == class_suffix:
+                classname = classname[-len(class_suffix):]
+        s = src.rfile()
+        s.attributes.java_classdir = classdir
+        s.attributes.java_classname = classname
+        slist.append(s)
+
+    stub_suffixes = ['_Stub']
+    if env.get('JAVAVERSION') == '1.4':
+        stub_suffixes.append('_Skel')
+
+    tlist = []
+    for s in source:
+        for suff in stub_suffixes:
+            fname = s.attributes.java_classname.replace('.', os.sep) + \
+                    suff + class_suffix
+            t = target[0].File(fname)
+            t.attributes.java_lookupdir = target[0]
+            tlist.append(t)
+
+    return tlist, source
+
+RMICAction = SCons.Action.Action('$RMICCOM', '$RMICCOMSTR')
+
+RMICBuilder = SCons.Builder.Builder(action = RMICAction,
+                     emitter = emit_rmic_classes,
+                     src_suffix = '$JAVACLASSSUFFIX',
+                     target_factory = SCons.Node.FS.Dir,
+                     source_factory = SCons.Node.FS.File)
+
+def generate(env):
+    """Add Builders and construction variables for rmic to an Environment."""
+    env['BUILDERS']['RMIC'] = RMICBuilder
+
+    env['RMIC']            = 'rmic'
+    env['RMICFLAGS']       = SCons.Util.CLVar('')
+    env['RMICCOM']         = '$RMIC $RMICFLAGS -d ${TARGET.attributes.java_lookupdir} -classpath ${SOURCE.attributes.java_classdir} ${SOURCES.attributes.java_classname}'
+    env['JAVACLASSSUFFIX']  = '.class'
+
+def exists(env):
+    return env.Detect('rmic')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/rpcgen.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/rpcgen.py
new file mode 100644
index 0000000..1bac02c
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/rpcgen.py
@@ -0,0 +1,70 @@
+"""SCons.Tool.rpcgen
+
+Tool-specific initialization for RPCGEN tools.
+
+Three normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/rpcgen.py 5183 2010/11/25 14:46:21 bdeegan"
+
+from SCons.Builder import Builder
+import SCons.Util
+
+cmd = "cd ${SOURCE.dir} && $RPCGEN -%s $RPCGENFLAGS %s -o ${TARGET.abspath} ${SOURCE.file}"
+
+rpcgen_client   = cmd % ('l', '$RPCGENCLIENTFLAGS')
+rpcgen_header   = cmd % ('h', '$RPCGENHEADERFLAGS')
+rpcgen_service  = cmd % ('m', '$RPCGENSERVICEFLAGS')
+rpcgen_xdr      = cmd % ('c', '$RPCGENXDRFLAGS')
+
+def generate(env):
+    "Add RPCGEN Builders and construction variables for an Environment."
+    
+    client  = Builder(action=rpcgen_client,  suffix='_clnt.c', src_suffix='.x')
+    header  = Builder(action=rpcgen_header,  suffix='.h',      src_suffix='.x')
+    service = Builder(action=rpcgen_service, suffix='_svc.c',  src_suffix='.x')
+    xdr     = Builder(action=rpcgen_xdr,     suffix='_xdr.c',  src_suffix='.x')
+    env.Append(BUILDERS={'RPCGenClient'  : client,
+                         'RPCGenHeader'  : header,
+                         'RPCGenService' : service,
+                         'RPCGenXDR'     : xdr})
+    env['RPCGEN'] = 'rpcgen'
+    env['RPCGENFLAGS'] = SCons.Util.CLVar('')
+    env['RPCGENCLIENTFLAGS'] = SCons.Util.CLVar('')
+    env['RPCGENHEADERFLAGS'] = SCons.Util.CLVar('')
+    env['RPCGENSERVICEFLAGS'] = SCons.Util.CLVar('')
+    env['RPCGENXDRFLAGS'] = SCons.Util.CLVar('')
+
+def exists(env):
+    return env.Detect('rpcgen')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/rpm.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/rpm.py
new file mode 100644
index 0000000..52f7cb3
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/rpm.py
@@ -0,0 +1,132 @@
+"""SCons.Tool.rpm
+
+Tool-specific initialization for rpm.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+The rpm tool calls the rpmbuild command. The first and only argument should a
+tar.gz consisting of the source file and a specfile.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/rpm.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+import re
+import shutil
+import subprocess
+
+import SCons.Builder
+import SCons.Node.FS
+import SCons.Util
+import SCons.Action
+import SCons.Defaults
+
+def get_cmd(source, env):
+    tar_file_with_included_specfile = source
+    if SCons.Util.is_List(source):
+        tar_file_with_included_specfile = source[0]
+    return "%s %s %s"%(env['RPM'], env['RPMFLAGS'],
+                       tar_file_with_included_specfile.abspath )
+
+def build_rpm(target, source, env):
+    # create a temporary rpm build root.
+    tmpdir = os.path.join( os.path.dirname( target[0].abspath ), 'rpmtemp' )
+    if os.path.exists(tmpdir):
+        shutil.rmtree(tmpdir)
+
+    # now create the mandatory rpm directory structure.
+    for d in ['RPMS', 'SRPMS', 'SPECS', 'BUILD']:
+        os.makedirs( os.path.join( tmpdir, d ) )
+
+    # set the topdir as an rpmflag.
+    env.Prepend( RPMFLAGS = '--define \'_topdir %s\'' % tmpdir )
+
+    # now call rpmbuild to create the rpm package.
+    handle  = subprocess.Popen(get_cmd(source, env),
+                               stdout=subprocess.PIPE,
+                               stderr=subprocess.STDOUT,
+                               shell=True)
+    output = handle.stdout.read()
+    status = handle.wait()
+
+    if status:
+        raise SCons.Errors.BuildError( node=target[0],
+                                       errstr=output,
+                                       filename=str(target[0]) )
+    else:
+        # XXX: assume that LC_ALL=c is set while running rpmbuild
+        output_files = re.compile( 'Wrote: (.*)' ).findall( output )
+
+        for output, input in zip( output_files, target ):
+            rpm_output = os.path.basename(output)
+            expected   = os.path.basename(input.get_path())
+
+            assert expected == rpm_output, "got %s but expected %s" % (rpm_output, expected)
+            shutil.copy( output, input.abspath )
+
+
+    # cleanup before leaving.
+    shutil.rmtree(tmpdir)
+
+    return status
+
+def string_rpm(target, source, env):
+    try:
+        return env['RPMCOMSTR']
+    except KeyError:
+        return get_cmd(source, env)
+
+rpmAction = SCons.Action.Action(build_rpm, string_rpm)
+
+RpmBuilder = SCons.Builder.Builder(action = SCons.Action.Action('$RPMCOM', '$RPMCOMSTR'),
+                                   source_scanner = SCons.Defaults.DirScanner,
+                                   suffix = '$RPMSUFFIX')
+
+
+
+def generate(env):
+    """Add Builders and construction variables for rpm to an Environment."""
+    try:
+        bld = env['BUILDERS']['Rpm']
+    except KeyError:
+        bld = RpmBuilder
+        env['BUILDERS']['Rpm'] = bld
+
+    env.SetDefault(RPM          = 'LC_ALL=c rpmbuild')
+    env.SetDefault(RPMFLAGS     = SCons.Util.CLVar('-ta'))
+    env.SetDefault(RPMCOM       = rpmAction)
+    env.SetDefault(RPMSUFFIX    = '.rpm')
+
+def exists(env):
+    return env.Detect('rpmbuild')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sgiar.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sgiar.py
new file mode 100644
index 0000000..5ee52fd
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sgiar.py
@@ -0,0 +1,68 @@
+"""SCons.Tool.sgiar
+
+Tool-specific initialization for SGI ar (library archive).  If CC
+exists, static libraries should be built with it, so the prelinker has
+a chance to resolve C++ template instantiations.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/sgiar.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+def generate(env):
+    """Add Builders and construction variables for ar to an Environment."""
+    SCons.Tool.createStaticLibBuilder(env)
+    
+    if env.Detect('CC'):
+        env['AR']          = 'CC'
+        env['ARFLAGS']     = SCons.Util.CLVar('-ar')
+        env['ARCOM']       = '$AR $ARFLAGS -o $TARGET $SOURCES'
+    else:
+        env['AR']          = 'ar'
+        env['ARFLAGS']     = SCons.Util.CLVar('r')
+        env['ARCOM']       = '$AR $ARFLAGS $TARGET $SOURCES'
+        
+    env['SHLINK']      = '$LINK'
+    env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared')
+    env['SHLINKCOM']   = '$SHLINK $SHLINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+    env['LIBPREFIX']   = 'lib'
+    env['LIBSUFFIX']   = '.a'
+
+def exists(env):
+    return env.Detect('CC') or env.Detect('ar')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sgic++.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sgic++.py
new file mode 100644
index 0000000..2a8ca70
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sgic++.py
@@ -0,0 +1,58 @@
+"""SCons.Tool.sgic++
+
+Tool-specific initialization for MIPSpro C++ on SGI.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/sgic++.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Util
+
+cplusplus = __import__('c++', globals(), locals(), [])
+
+def generate(env):
+    """Add Builders and construction variables for SGI MIPS C++ to an Environment."""
+
+    cplusplus.generate(env)
+
+    env['CXX']         = 'CC'
+    env['CXXFLAGS']    = SCons.Util.CLVar('-LANG:std')
+    env['SHCXX']       = '$CXX'
+    env['SHOBJSUFFIX'] = '.o'
+    env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
+    
+def exists(env):
+    return env.Detect('CC')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sgicc.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sgicc.py
new file mode 100644
index 0000000..322b64c
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sgicc.py
@@ -0,0 +1,53 @@
+"""SCons.Tool.sgicc
+
+Tool-specific initialization for MIPSPro cc on SGI.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/sgicc.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import cc
+
+def generate(env):
+    """Add Builders and construction variables for gcc to an Environment."""
+    cc.generate(env)
+
+    env['CXX']        = 'CC'
+    env['SHOBJSUFFIX'] = '.o'
+    env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
+
+def exists(env):
+    return env.Detect('cc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sgilink.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sgilink.py
new file mode 100644
index 0000000..f38f8ed
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sgilink.py
@@ -0,0 +1,63 @@
+"""SCons.Tool.sgilink
+
+Tool-specific initialization for the SGI MIPSPro linker on SGI.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/sgilink.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Util
+
+import link
+
+linkers = ['CC', 'cc']
+
+def generate(env):
+    """Add Builders and construction variables for MIPSPro to an Environment."""
+    link.generate(env)
+    
+    env['LINK'] = env.Detect(linkers) or 'cc'
+    env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared')
+
+    # __RPATH is set to $_RPATH in the platform specification if that
+    # platform supports it.
+    env.Append(LINKFLAGS=['$__RPATH'])
+    env['RPATHPREFIX'] = '-rpath '
+    env['RPATHSUFFIX'] = ''
+    env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
+
+def exists(env):
+    return env.Detect(linkers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sunar.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sunar.py
new file mode 100644
index 0000000..1ef0287
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sunar.py
@@ -0,0 +1,67 @@
+"""engine.SCons.Tool.sunar
+
+Tool-specific initialization for Solaris (Forte) ar (library archive). If CC
+exists, static libraries should be built with it, so that template
+instantians can be resolved.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/sunar.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+def generate(env):
+    """Add Builders and construction variables for ar to an Environment."""
+    SCons.Tool.createStaticLibBuilder(env)
+    
+    if env.Detect('CC'):
+        env['AR']          = 'CC'
+        env['ARFLAGS']     = SCons.Util.CLVar('-xar')
+        env['ARCOM']       = '$AR $ARFLAGS -o $TARGET $SOURCES'
+    else:
+        env['AR']          = 'ar'
+        env['ARFLAGS']     = SCons.Util.CLVar('r')
+        env['ARCOM']       = '$AR $ARFLAGS $TARGET $SOURCES'
+
+    env['SHLINK']      = '$LINK'
+    env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -G')
+    env['SHLINKCOM']   = '$SHLINK $SHLINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+    env['LIBPREFIX']   = 'lib'
+    env['LIBSUFFIX']   = '.a'
+
+def exists(env):
+    return env.Detect('CC') or env.Detect('ar')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sunc++.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sunc++.py
new file mode 100644
index 0000000..eb5796c
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sunc++.py
@@ -0,0 +1,142 @@
+"""SCons.Tool.sunc++
+
+Tool-specific initialization for C++ on SunOS / Solaris.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/sunc++.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons
+
+import os
+import re
+import subprocess
+
+cplusplus = __import__('c++', globals(), locals(), [])
+
+package_info = {}
+
+def get_package_info(package_name, pkginfo, pkgchk):
+    try:
+        return package_info[package_name]
+    except KeyError:
+        version = None
+        pathname = None
+        try:
+            sadm_contents = open('/var/sadm/install/contents', 'r').read()
+        except EnvironmentError:
+            pass
+        else:
+            sadm_re = re.compile('^(\S*/bin/CC)(=\S*)? %s$' % package_name, re.M)
+            sadm_match = sadm_re.search(sadm_contents)
+            if sadm_match:
+                pathname = os.path.dirname(sadm_match.group(1))
+
+        try:
+            p = subprocess.Popen([pkginfo, '-l', package_name],
+                                 stdout=subprocess.PIPE,
+                                 stderr=open('/dev/null', 'w'))
+        except EnvironmentError:
+            pass
+        else:
+            pkginfo_contents = p.communicate()[0]
+            version_re = re.compile('^ *VERSION:\s*(.*)$', re.M)
+            version_match = version_re.search(pkginfo_contents)
+            if version_match:
+                version = version_match.group(1)
+
+        if pathname is None:
+            try:
+                p = subprocess.Popen([pkgchk, '-l', package_name],
+                                     stdout=subprocess.PIPE,
+                                     stderr=open('/dev/null', 'w'))
+            except EnvironmentError:
+                pass
+            else:
+                pkgchk_contents = p.communicate()[0]
+                pathname_re = re.compile(r'^Pathname:\s*(.*/bin/CC)$', re.M)
+                pathname_match = pathname_re.search(pkgchk_contents)
+                if pathname_match:
+                    pathname = os.path.dirname(pathname_match.group(1))
+
+        package_info[package_name] = (pathname, version)
+        return package_info[package_name]
+
+# use the package installer tool lslpp to figure out where cppc and what
+# version of it is installed
+def get_cppc(env):
+    cxx = env.subst('$CXX')
+    if cxx:
+        cppcPath = os.path.dirname(cxx)
+    else:
+        cppcPath = None
+
+    cppcVersion = None
+
+    pkginfo = env.subst('$PKGINFO')
+    pkgchk = env.subst('$PKGCHK')
+
+    for package in ['SPROcpl']:
+        path, version = get_package_info(package, pkginfo, pkgchk)
+        if path and version:
+            cppcPath, cppcVersion = path, version
+            break
+
+    return (cppcPath, 'CC', 'CC', cppcVersion)
+
+def generate(env):
+    """Add Builders and construction variables for SunPRO C++."""
+    path, cxx, shcxx, version = get_cppc(env)
+    if path:
+        cxx = os.path.join(path, cxx)
+        shcxx = os.path.join(path, shcxx)
+
+    cplusplus.generate(env)
+
+    env['CXX'] = cxx
+    env['SHCXX'] = shcxx
+    env['CXXVERSION'] = version
+    env['SHCXXFLAGS']   = SCons.Util.CLVar('$CXXFLAGS -KPIC')
+    env['SHOBJPREFIX']  = 'so_'
+    env['SHOBJSUFFIX']  = '.o'
+    
+def exists(env):
+    path, cxx, shcxx, version = get_cppc(env)
+    if path and cxx:
+        cppc = os.path.join(path, cxx)
+        if os.path.exists(cppc):
+            return cppc
+    return None
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/suncc.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/suncc.py
new file mode 100644
index 0000000..df99aca
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/suncc.py
@@ -0,0 +1,58 @@
+"""SCons.Tool.suncc
+
+Tool-specific initialization for Sun Solaris (Forte) CC and cc.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/suncc.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Util
+
+import cc
+
+def generate(env):
+    """
+    Add Builders and construction variables for Forte C and C++ compilers
+    to an Environment.
+    """
+    cc.generate(env)
+
+    env['CXX']          = 'CC'
+    env['SHCCFLAGS']    = SCons.Util.CLVar('$CCFLAGS -KPIC')
+    env['SHOBJPREFIX']  = 'so_'
+    env['SHOBJSUFFIX']  = '.o'
+
+def exists(env):
+    return env.Detect('CC')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sunf77.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sunf77.py
new file mode 100644
index 0000000..6cc4d1d
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sunf77.py
@@ -0,0 +1,63 @@
+"""SCons.Tool.sunf77
+
+Tool-specific initialization for sunf77, the Sun Studio F77 compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/sunf77.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Util
+
+from FortranCommon import add_all_to_env
+
+compilers = ['sunf77', 'f77']
+
+def generate(env):
+    """Add Builders and construction variables for sunf77 to an Environment."""
+    add_all_to_env(env)
+
+    fcomp = env.Detect(compilers) or 'f77'
+    env['FORTRAN']  = fcomp
+    env['F77']      = fcomp
+
+    env['SHFORTRAN']  = '$FORTRAN'
+    env['SHF77']      = '$F77'
+
+    env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS -KPIC')
+    env['SHF77FLAGS'] = SCons.Util.CLVar('$F77FLAGS -KPIC')
+
+def exists(env):
+    return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sunf90.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sunf90.py
new file mode 100644
index 0000000..86b5560
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sunf90.py
@@ -0,0 +1,64 @@
+"""SCons.Tool.sunf90
+
+Tool-specific initialization for sunf90, the Sun Studio F90 compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/sunf90.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Util
+
+from FortranCommon import add_all_to_env
+
+compilers = ['sunf90', 'f90']
+
+def generate(env):
+    """Add Builders and construction variables for sun f90 compiler to an
+    Environment."""
+    add_all_to_env(env)
+
+    fcomp = env.Detect(compilers) or 'f90'
+    env['FORTRAN']  = fcomp
+    env['F90']      = fcomp
+
+    env['SHFORTRAN']  = '$FORTRAN'
+    env['SHF90']      = '$F90'
+
+    env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS -KPIC')
+    env['SHF90FLAGS'] = SCons.Util.CLVar('$F90FLAGS -KPIC')
+
+def exists(env):
+    return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sunf95.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sunf95.py
new file mode 100644
index 0000000..9bce81e
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sunf95.py
@@ -0,0 +1,64 @@
+"""SCons.Tool.sunf95
+
+Tool-specific initialization for sunf95, the Sun Studio F95 compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/sunf95.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Util
+
+from FortranCommon import add_all_to_env
+
+compilers = ['sunf95', 'f95']
+
+def generate(env):
+    """Add Builders and construction variables for sunf95 to an
+    Environment."""
+    add_all_to_env(env)
+
+    fcomp = env.Detect(compilers) or 'f95'
+    env['FORTRAN']  = fcomp
+    env['F95']      = fcomp
+
+    env['SHFORTRAN']  = '$FORTRAN'
+    env['SHF95']      = '$F95'
+
+    env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS -KPIC')
+    env['SHF95FLAGS'] = SCons.Util.CLVar('$F95FLAGS -KPIC')
+
+def exists(env):
+    return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sunlink.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sunlink.py
new file mode 100644
index 0000000..30975a6
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/sunlink.py
@@ -0,0 +1,77 @@
+"""SCons.Tool.sunlink
+
+Tool-specific initialization for the Sun Solaris (Forte) linker.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/sunlink.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+import os.path
+
+import SCons.Util
+
+import link
+
+ccLinker = None
+
+# search for the acc compiler and linker front end
+
+try:
+    dirs = os.listdir('/opt')
+except (IOError, OSError):
+    # Not being able to read the directory because it doesn't exist
+    # (IOError) or isn't readable (OSError) is okay.
+    dirs = []
+
+for d in dirs:
+    linker = '/opt/' + d + '/bin/CC'
+    if os.path.exists(linker):
+        ccLinker = linker
+        break
+
+def generate(env):
+    """Add Builders and construction variables for Forte to an Environment."""
+    link.generate(env)
+    
+    env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -G')
+
+    env.Append(LINKFLAGS=['$__RPATH'])
+    env['RPATHPREFIX'] = '-R'
+    env['RPATHSUFFIX'] = ''
+    env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
+
+def exists(env):
+    return ccLinker
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/swig.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/swig.py
new file mode 100644
index 0000000..a96b360
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/swig.py
@@ -0,0 +1,182 @@
+"""SCons.Tool.swig
+
+Tool-specific initialization for swig.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/swig.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os.path
+import re
+import subprocess
+
+import SCons.Action
+import SCons.Defaults
+import SCons.Scanner
+import SCons.Tool
+import SCons.Util
+
+SwigAction = SCons.Action.Action('$SWIGCOM', '$SWIGCOMSTR')
+
+def swigSuffixEmitter(env, source):
+    if '-c++' in SCons.Util.CLVar(env.subst("$SWIGFLAGS", source=source)):
+        return '$SWIGCXXFILESUFFIX'
+    else:
+        return '$SWIGCFILESUFFIX'
+
+# Match '%module test', as well as '%module(directors="1") test'
+# Also allow for test to be quoted (SWIG permits double quotes, but not single)
+_reModule = re.compile(r'%module(\s*\(.*\))?\s+("?)(.+)\2')
+
+def _find_modules(src):
+    """Find all modules referenced by %module lines in `src`, a SWIG .i file.
+       Returns a list of all modules, and a flag set if SWIG directors have
+       been requested (SWIG will generate an additional header file in this
+       case.)"""
+    directors = 0
+    mnames = []
+    try:
+        matches = _reModule.findall(open(src).read())
+    except IOError:
+        # If the file's not yet generated, guess the module name from the filename
+        matches = []
+        mnames.append(os.path.splitext(src)[0])
+
+    for m in matches:
+        mnames.append(m[2])
+        directors = directors or m[0].find('directors') >= 0
+    return mnames, directors
+
+def _add_director_header_targets(target, env):
+    # Directors only work with C++ code, not C
+    suffix = env.subst(env['SWIGCXXFILESUFFIX'])
+    # For each file ending in SWIGCXXFILESUFFIX, add a new target director
+    # header by replacing the ending with SWIGDIRECTORSUFFIX.
+    for x in target[:]:
+        n = x.name
+        d = x.dir
+        if n[-len(suffix):] == suffix:
+            target.append(d.File(n[:-len(suffix)] + env['SWIGDIRECTORSUFFIX']))
+
+def _swigEmitter(target, source, env):
+    swigflags = env.subst("$SWIGFLAGS", target=target, source=source)
+    flags = SCons.Util.CLVar(swigflags)
+    for src in source:
+        src = str(src.rfile())
+        mnames = None
+        if "-python" in flags and "-noproxy" not in flags:
+            if mnames is None:
+                mnames, directors = _find_modules(src)
+            if directors:
+                _add_director_header_targets(target, env)
+            python_files = [m + ".py" for m in mnames]
+            outdir = env.subst('$SWIGOUTDIR', target=target, source=source)
+            # .py files should be generated in SWIGOUTDIR if specified,
+            # otherwise in the same directory as the target
+            if outdir:
+                python_files = [env.fs.File(os.path.join(outdir, j)) for j in python_files]
+            else:
+                python_files = [target[0].dir.File(m) for m in python_files]
+            target.extend(python_files)
+        if "-java" in flags:
+            if mnames is None:
+                mnames, directors = _find_modules(src)
+            if directors:
+                _add_director_header_targets(target, env)
+            java_files = [[m + ".java", m + "JNI.java"] for m in mnames]
+            java_files = SCons.Util.flatten(java_files)
+            outdir = env.subst('$SWIGOUTDIR', target=target, source=source)
+            if outdir:
+                 java_files = [os.path.join(outdir, j) for j in java_files]
+            java_files = list(map(env.fs.File, java_files))
+            for jf in java_files:
+                t_from_s = lambda t, p, s, x: t.dir
+                SCons.Util.AddMethod(jf, t_from_s, 'target_from_source')
+            target.extend(java_files)
+    return (target, source)
+
+def _get_swig_version(env):
+    """Run the SWIG command line tool to get and return the version number"""
+    pipe = SCons.Action._subproc(env, [env['SWIG'], '-version'],
+                                 stdin = 'devnull',
+                                 stderr = 'devnull',
+                                 stdout = subprocess.PIPE)
+    if pipe.wait() != 0: return
+
+    out = pipe.stdout.read()
+    match = re.search(r'SWIG Version\s+(\S+)$', out, re.MULTILINE)
+    if match:
+        return match.group(1)
+
+def generate(env):
+    """Add Builders and construction variables for swig to an Environment."""
+    c_file, cxx_file = SCons.Tool.createCFileBuilders(env)
+
+    c_file.suffix['.i'] = swigSuffixEmitter
+    cxx_file.suffix['.i'] = swigSuffixEmitter
+
+    c_file.add_action('.i', SwigAction)
+    c_file.add_emitter('.i', _swigEmitter)
+    cxx_file.add_action('.i', SwigAction)
+    cxx_file.add_emitter('.i', _swigEmitter)
+
+    java_file = SCons.Tool.CreateJavaFileBuilder(env)
+
+    java_file.suffix['.i'] = swigSuffixEmitter
+
+    java_file.add_action('.i', SwigAction)
+    java_file.add_emitter('.i', _swigEmitter)
+
+    env['SWIG']              = 'swig'
+    env['SWIGVERSION']       = _get_swig_version(env)
+    env['SWIGFLAGS']         = SCons.Util.CLVar('')
+    env['SWIGDIRECTORSUFFIX'] = '_wrap.h'
+    env['SWIGCFILESUFFIX']   = '_wrap$CFILESUFFIX'
+    env['SWIGCXXFILESUFFIX'] = '_wrap$CXXFILESUFFIX'
+    env['_SWIGOUTDIR']       = r'${"-outdir \"%s\"" % SWIGOUTDIR}'
+    env['SWIGPATH']          = []
+    env['SWIGINCPREFIX']     = '-I'
+    env['SWIGINCSUFFIX']     = ''
+    env['_SWIGINCFLAGS']     = '$( ${_concat(SWIGINCPREFIX, SWIGPATH, SWIGINCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'
+    env['SWIGCOM']           = '$SWIG -o $TARGET ${_SWIGOUTDIR} ${_SWIGINCFLAGS} $SWIGFLAGS $SOURCES'
+
+    expr = '^[ \t]*%[ \t]*(?:include|import|extern)[ \t]*(<|"?)([^>\s"]+)(?:>|"?)'
+    scanner = SCons.Scanner.ClassicCPP("SWIGScan", ".i", "SWIGPATH", expr)
+
+    env.Append(SCANNERS = scanner)
+
+def exists(env):
+    return env.Detect(['swig'])
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/tar.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/tar.py
new file mode 100644
index 0000000..15ae5c5
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/tar.py
@@ -0,0 +1,73 @@
+"""SCons.Tool.tar
+
+Tool-specific initialization for tar.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/tar.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Action
+import SCons.Builder
+import SCons.Defaults
+import SCons.Node.FS
+import SCons.Util
+
+tars = ['tar', 'gtar']
+
+TarAction = SCons.Action.Action('$TARCOM', '$TARCOMSTR')
+
+TarBuilder = SCons.Builder.Builder(action = TarAction,
+                                   source_factory = SCons.Node.FS.Entry,
+                                   source_scanner = SCons.Defaults.DirScanner,
+                                   suffix = '$TARSUFFIX',
+                                   multi = 1)
+
+
+def generate(env):
+    """Add Builders and construction variables for tar to an Environment."""
+    try:
+        bld = env['BUILDERS']['Tar']
+    except KeyError:
+        bld = TarBuilder
+        env['BUILDERS']['Tar'] = bld
+
+    env['TAR']        = env.Detect(tars) or 'gtar'
+    env['TARFLAGS']   = SCons.Util.CLVar('-c')
+    env['TARCOM']     = '$TAR $TARFLAGS -f $TARGET $SOURCES'
+    env['TARSUFFIX']  = '.tar'
+
+def exists(env):
+    return env.Detect(tars)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/tex.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/tex.py
new file mode 100644
index 0000000..dd5c164
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/tex.py
@@ -0,0 +1,832 @@
+"""SCons.Tool.tex
+
+Tool-specific initialization for TeX.
+Generates .dvi files from .tex files
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/tex.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os.path
+import re
+import shutil
+import sys
+import platform
+import glob
+
+import SCons.Action
+import SCons.Node
+import SCons.Node.FS
+import SCons.Util
+import SCons.Scanner.LaTeX
+
+Verbose = False
+
+must_rerun_latex = True
+
+# these are files that just need to be checked for changes and then rerun latex
+check_suffixes = ['.toc', '.lof', '.lot', '.out', '.nav', '.snm']
+
+# these are files that require bibtex or makeindex to be run when they change
+all_suffixes = check_suffixes + ['.bbl', '.idx', '.nlo', '.glo', '.acn']
+
+#
+# regular expressions used to search for Latex features
+# or outputs that require rerunning latex
+#
+# search for all .aux files opened by latex (recorded in the .fls file)
+openout_aux_re = re.compile(r"INPUT *(.*\.aux)")
+
+#printindex_re = re.compile(r"^[^%]*\\printindex", re.MULTILINE)
+#printnomenclature_re = re.compile(r"^[^%]*\\printnomenclature", re.MULTILINE)
+#printglossary_re = re.compile(r"^[^%]*\\printglossary", re.MULTILINE)
+
+# search to find rerun warnings
+warning_rerun_str = '(^LaTeX Warning:.*Rerun)|(^Package \w+ Warning:.*Rerun)'
+warning_rerun_re = re.compile(warning_rerun_str, re.MULTILINE)
+
+# search to find citation rerun warnings
+rerun_citations_str = "^LaTeX Warning:.*\n.*Rerun to get citations correct"
+rerun_citations_re = re.compile(rerun_citations_str, re.MULTILINE)
+
+# search to find undefined references or citations warnings
+undefined_references_str = '(^LaTeX Warning:.*undefined references)|(^Package \w+ Warning:.*undefined citations)'
+undefined_references_re = re.compile(undefined_references_str, re.MULTILINE)
+
+# used by the emitter
+auxfile_re = re.compile(r".", re.MULTILINE)
+tableofcontents_re = re.compile(r"^[^%\n]*\\tableofcontents", re.MULTILINE)
+makeindex_re = re.compile(r"^[^%\n]*\\makeindex", re.MULTILINE)
+bibliography_re = re.compile(r"^[^%\n]*\\bibliography", re.MULTILINE)
+bibunit_re = re.compile(r"^[^%\n]*\\begin\{bibunit\}", re.MULTILINE)
+listoffigures_re = re.compile(r"^[^%\n]*\\listoffigures", re.MULTILINE)
+listoftables_re = re.compile(r"^[^%\n]*\\listoftables", re.MULTILINE)
+hyperref_re = re.compile(r"^[^%\n]*\\usepackage.*\{hyperref\}", re.MULTILINE)
+makenomenclature_re = re.compile(r"^[^%\n]*\\makenomenclature", re.MULTILINE)
+makeglossary_re = re.compile(r"^[^%\n]*\\makeglossary", re.MULTILINE)
+makeglossaries_re = re.compile(r"^[^%\n]*\\makeglossaries", re.MULTILINE)
+makeacronyms_re = re.compile(r"^[^%\n]*\\makeglossaries", re.MULTILINE)
+beamer_re = re.compile(r"^[^%\n]*\\documentclass\{beamer\}", re.MULTILINE)
+
+# search to find all files included by Latex
+include_re = re.compile(r'^[^%\n]*\\(?:include|input){([^}]*)}', re.MULTILINE)
+includeOnly_re = re.compile(r'^[^%\n]*\\(?:include){([^}]*)}', re.MULTILINE)
+
+# search to find all graphics files included by Latex
+includegraphics_re = re.compile(r'^[^%\n]*\\(?:includegraphics(?:\[[^\]]+\])?){([^}]*)}', re.MULTILINE)
+
+# search to find all files opened by Latex (recorded in .log file)
+openout_re = re.compile(r"OUTPUT *(.*)")
+
+# list of graphics file extensions for TeX and LaTeX
+TexGraphics   = SCons.Scanner.LaTeX.TexGraphics
+LatexGraphics = SCons.Scanner.LaTeX.LatexGraphics
+
+# An Action sufficient to build any generic tex file.
+TeXAction = None
+
+# An action to build a latex file.  This action might be needed more
+# than once if we are dealing with labels and bibtex.
+LaTeXAction = None
+
+# An action to run BibTeX on a file.
+BibTeXAction = None
+
+# An action to run MakeIndex on a file.
+MakeIndexAction = None
+
+# An action to run MakeIndex (for nomencl) on a file.
+MakeNclAction = None
+
+# An action to run MakeIndex (for glossary) on a file.
+MakeGlossaryAction = None
+
+# An action to run MakeIndex (for acronyms) on a file.
+MakeAcronymsAction = None
+
+# Used as a return value of modify_env_var if the variable is not set.
+_null = SCons.Scanner.LaTeX._null
+
+modify_env_var = SCons.Scanner.LaTeX.modify_env_var
+
+def check_file_error_message(utility, filename='log'):
+    msg = '%s returned an error, check the %s file\n' % (utility, filename)
+    sys.stdout.write(msg)
+
+def FindFile(name,suffixes,paths,env,requireExt=False):
+    if requireExt:
+        name,ext = SCons.Util.splitext(name)
+        # if the user gave an extension use it.
+        if ext:
+            name = name + ext
+    if Verbose:
+        print " searching for '%s' with extensions: " % name,suffixes
+
+    for path in paths:
+        testName = os.path.join(path,name)
+        if Verbose:
+            print " look for '%s'" % testName
+        if os.path.exists(testName):
+            if Verbose:
+                print " found '%s'" % testName
+            return env.fs.File(testName)
+        else:
+            name_ext = SCons.Util.splitext(testName)[1]
+            if name_ext:
+                continue
+
+            # if no suffix try adding those passed in
+            for suffix in suffixes:
+                testNameExt = testName + suffix
+                if Verbose:
+                    print " look for '%s'" % testNameExt
+
+                if os.path.exists(testNameExt):
+                    if Verbose:
+                        print " found '%s'" % testNameExt
+                    return env.fs.File(testNameExt)
+    if Verbose:
+        print " did not find '%s'" % name
+    return None
+
+def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None):
+    """A builder for LaTeX files that checks the output in the aux file
+    and decides how many times to use LaTeXAction, and BibTeXAction."""
+
+    global must_rerun_latex
+
+    # This routine is called with two actions. In this file for DVI builds
+    # with LaTeXAction and from the pdflatex.py with PDFLaTeXAction
+    # set this up now for the case where the user requests a different extension
+    # for the target filename
+    if (XXXLaTeXAction == LaTeXAction):
+       callerSuffix = ".dvi"
+    else:
+       callerSuffix = env['PDFSUFFIX']
+
+    basename = SCons.Util.splitext(str(source[0]))[0]
+    basedir = os.path.split(str(source[0]))[0]
+    basefile = os.path.split(str(basename))[1]
+    abspath = os.path.abspath(basedir)
+
+    targetext = os.path.splitext(str(target[0]))[1]
+    targetdir = os.path.split(str(target[0]))[0]
+
+    saved_env = {}
+    for var in SCons.Scanner.LaTeX.LaTeX.env_variables:
+        saved_env[var] = modify_env_var(env, var, abspath)
+
+    # Create base file names with the target directory since the auxiliary files
+    # will be made there.   That's because the *COM variables have the cd
+    # command in the prolog. We check
+    # for the existence of files before opening them--even ones like the
+    # aux file that TeX always creates--to make it possible to write tests
+    # with stubs that don't necessarily generate all of the same files.
+
+    targetbase = os.path.join(targetdir, basefile)
+
+    # if there is a \makeindex there will be a .idx and thus
+    # we have to run makeindex at least once to keep the build
+    # happy even if there is no index.
+    # Same for glossaries and nomenclature
+    src_content = source[0].get_text_contents()
+    run_makeindex = makeindex_re.search(src_content) and not os.path.exists(targetbase + '.idx')
+    run_nomenclature = makenomenclature_re.search(src_content) and not os.path.exists(targetbase + '.nlo')
+    run_glossary = makeglossary_re.search(src_content) and not os.path.exists(targetbase + '.glo')
+    run_glossaries = makeglossaries_re.search(src_content) and not os.path.exists(targetbase + '.glo')
+    run_acronyms = makeacronyms_re.search(src_content) and not os.path.exists(targetbase + '.acn')
+
+    saved_hashes = {}
+    suffix_nodes = {}
+
+    for suffix in all_suffixes:
+        theNode = env.fs.File(targetbase + suffix)
+        suffix_nodes[suffix] = theNode
+        saved_hashes[suffix] = theNode.get_csig()
+
+    if Verbose:
+        print "hashes: ",saved_hashes
+
+    must_rerun_latex = True
+
+    #
+    # routine to update MD5 hash and compare
+    #
+    def check_MD5(filenode, suffix):
+        global must_rerun_latex
+        # two calls to clear old csig
+        filenode.clear_memoized_values()
+        filenode.ninfo = filenode.new_ninfo()
+        new_md5 = filenode.get_csig()
+
+        if saved_hashes[suffix] == new_md5:
+            if Verbose:
+                print "file %s not changed" % (targetbase+suffix)
+            return False        # unchanged
+        saved_hashes[suffix] = new_md5
+        must_rerun_latex = True
+        if Verbose:
+            print "file %s changed, rerunning Latex, new hash = " % (targetbase+suffix), new_md5
+        return True     # changed
+
+    # generate the file name that latex will generate
+    resultfilename = targetbase + callerSuffix
+
+    count = 0
+
+    while (must_rerun_latex and count < int(env.subst('$LATEXRETRIES'))) :
+        result = XXXLaTeXAction(target, source, env)
+        if result != 0:
+            return result
+
+        count = count + 1
+
+        must_rerun_latex = False
+        # Decide if various things need to be run, or run again.
+
+        # Read the log file to find warnings/errors
+        logfilename = targetbase + '.log'
+        logContent = ''
+        if os.path.exists(logfilename):
+            logContent = open(logfilename, "rb").read()
+
+
+        # Read the fls file to find all .aux files
+        flsfilename = targetbase + '.fls'
+        flsContent = ''
+        auxfiles = []
+        if os.path.exists(flsfilename):
+            flsContent = open(flsfilename, "rb").read()
+            auxfiles = openout_aux_re.findall(flsContent)
+            # remove duplicates
+            dups = {}
+            for x in auxfiles:
+                dups[x] = 1
+            auxfiles = list(dups.keys())
+
+        if Verbose:
+            print "auxfiles ",auxfiles
+
+        # Now decide if bibtex will need to be run.
+        # The information that bibtex reads from the .aux file is
+        # pass-independent. If we find (below) that the .bbl file is unchanged,
+        # then the last latex saw a correct bibliography.
+        # Therefore only do this on the first pass
+        if count == 1:
+            for auxfilename in auxfiles:
+                target_aux = os.path.join(targetdir, auxfilename)
+                if os.path.exists(target_aux):
+                    content = open(target_aux, "rb").read()
+                    if content.find("bibdata") != -1:
+                        if Verbose:
+                            print "Need to run bibtex"
+                        bibfile = env.fs.File(SCons.Util.splitext(target_aux)[0])
+                        result = BibTeXAction(bibfile, bibfile, env)
+                        if result != 0:
+                            check_file_error_message(env['BIBTEX'], 'blg')
+                        must_rerun_latex = must_rerun_latex or check_MD5(suffix_nodes['.bbl'],'.bbl')
+
+        # Now decide if latex will need to be run again due to index.
+        if check_MD5(suffix_nodes['.idx'],'.idx') or (count == 1 and run_makeindex):
+            # We must run makeindex
+            if Verbose:
+                print "Need to run makeindex"
+            idxfile = suffix_nodes['.idx']
+            result = MakeIndexAction(idxfile, idxfile, env)
+            if result != 0:
+                check_file_error_message(env['MAKEINDEX'], 'ilg')
+                return result
+
+        # TO-DO: need to add a way for the user to extend this list for whatever
+        # auxiliary files they create in other (or their own) packages
+        # Harder is case is where an action needs to be called -- that should be rare (I hope?)
+
+        for index in check_suffixes:
+            check_MD5(suffix_nodes[index],index)
+
+        # Now decide if latex will need to be run again due to nomenclature.
+        if check_MD5(suffix_nodes['.nlo'],'.nlo') or (count == 1 and run_nomenclature):
+            # We must run makeindex
+            if Verbose:
+                print "Need to run makeindex for nomenclature"
+            nclfile = suffix_nodes['.nlo']
+            result = MakeNclAction(nclfile, nclfile, env)
+            if result != 0:
+                check_file_error_message('%s (nomenclature)' % env['MAKENCL'],
+                                         'nlg')
+                #return result
+
+        # Now decide if latex will need to be run again due to glossary.
+        if check_MD5(suffix_nodes['.glo'],'.glo') or (count == 1 and run_glossaries) or (count == 1 and run_glossary):
+            # We must run makeindex
+            if Verbose:
+                print "Need to run makeindex for glossary"
+            glofile = suffix_nodes['.glo']
+            result = MakeGlossaryAction(glofile, glofile, env)
+            if result != 0:
+                check_file_error_message('%s (glossary)' % env['MAKEGLOSSARY'],
+                                         'glg')
+                #return result
+
+        # Now decide if latex will need to be run again due to acronyms.
+        if check_MD5(suffix_nodes['.acn'],'.acn') or (count == 1 and run_acronyms):
+            # We must run makeindex
+            if Verbose:
+                print "Need to run makeindex for acronyms"
+            acrfile = suffix_nodes['.acn']
+            result = MakeAcronymsAction(acrfile, acrfile, env)
+            if result != 0:
+                check_file_error_message('%s (acronyms)' % env['MAKEACRONYMS'],
+                                         'alg')
+                return result
+
+        # Now decide if latex needs to be run yet again to resolve warnings.
+        if warning_rerun_re.search(logContent):
+            must_rerun_latex = True
+            if Verbose:
+                print "rerun Latex due to latex or package rerun warning"
+
+        if rerun_citations_re.search(logContent):
+            must_rerun_latex = True
+            if Verbose:
+                print "rerun Latex due to 'Rerun to get citations correct' warning"
+
+        if undefined_references_re.search(logContent):
+            must_rerun_latex = True
+            if Verbose:
+                print "rerun Latex due to undefined references or citations"
+
+        if (count >= int(env.subst('$LATEXRETRIES')) and must_rerun_latex):
+            print "reached max number of retries on Latex ,",int(env.subst('$LATEXRETRIES'))
+# end of while loop
+
+    # rename Latex's output to what the target name is
+    if not (str(target[0]) == resultfilename  and  os.path.exists(resultfilename)):
+        if os.path.exists(resultfilename):
+            print "move %s to %s" % (resultfilename, str(target[0]), )
+            shutil.move(resultfilename,str(target[0]))
+
+    # Original comment (when TEXPICTS was not restored):
+    # The TEXPICTS enviroment variable is needed by a dvi -> pdf step
+    # later on Mac OSX so leave it
+    #
+    # It is also used when searching for pictures (implicit dependencies).
+    # Why not set the variable again in the respective builder instead
+    # of leaving local modifications in the environment? What if multiple
+    # latex builds in different directories need different TEXPICTS?
+    for var in SCons.Scanner.LaTeX.LaTeX.env_variables:
+        if var == 'TEXPICTS':
+            continue
+        if saved_env[var] is _null:
+            try:
+                del env['ENV'][var]
+            except KeyError:
+                pass # was never set
+        else:
+            env['ENV'][var] = saved_env[var]
+
+    return result
+
+def LaTeXAuxAction(target = None, source= None, env=None):
+    result = InternalLaTeXAuxAction( LaTeXAction, target, source, env )
+    return result
+
+LaTeX_re = re.compile("\\\\document(style|class)")
+
+def is_LaTeX(flist,env,abspath):
+    """Scan a file list to decide if it's TeX- or LaTeX-flavored."""
+
+    # We need to scan files that are included in case the
+    # \documentclass command is in them.
+
+    # get path list from both env['TEXINPUTS'] and env['ENV']['TEXINPUTS']
+    savedpath = modify_env_var(env, 'TEXINPUTS', abspath)
+    paths = env['ENV']['TEXINPUTS']
+    if SCons.Util.is_List(paths):
+        pass
+    else:
+        # Split at os.pathsep to convert into absolute path
+        paths = paths.split(os.pathsep)
+
+    # now that we have the path list restore the env
+    if savedpath is _null:
+        try:
+            del env['ENV']['TEXINPUTS']
+        except KeyError:
+            pass # was never set
+    else:
+        env['ENV']['TEXINPUTS'] = savedpath
+    if Verbose:
+        print "is_LaTeX search path ",paths
+        print "files to search :",flist
+
+    # Now that we have the search path and file list, check each one
+    for f in flist:
+        if Verbose:
+            print " checking for Latex source ",str(f)
+
+        content = f.get_text_contents()
+        if LaTeX_re.search(content):
+            if Verbose:
+                print "file %s is a LaTeX file" % str(f)
+            return 1
+        if Verbose:
+            print "file %s is not a LaTeX file" % str(f)
+
+        # now find included files
+        inc_files = [ ]
+        inc_files.extend( include_re.findall(content) )
+        if Verbose:
+            print "files included by '%s': "%str(f),inc_files
+        # inc_files is list of file names as given. need to find them
+        # using TEXINPUTS paths.
+
+        # search the included files
+        for src in inc_files:
+            srcNode = FindFile(src,['.tex','.ltx','.latex'],paths,env,requireExt=False)
+            # make this a list since is_LaTeX takes a list.
+            fileList = [srcNode,]
+            if Verbose:
+                print "FindFile found ",srcNode
+            if srcNode is not None:
+                file_test = is_LaTeX(fileList, env, abspath)
+
+            # return on first file that finds latex is needed.
+            if file_test:
+                return file_test
+
+        if Verbose:
+            print " done scanning ",str(f)
+
+    return 0
+
+def TeXLaTeXFunction(target = None, source= None, env=None):
+    """A builder for TeX and LaTeX that scans the source file to
+    decide the "flavor" of the source and then executes the appropriate
+    program."""
+
+    # find these paths for use in is_LaTeX to search for included files
+    basedir = os.path.split(str(source[0]))[0]
+    abspath = os.path.abspath(basedir)
+
+    if is_LaTeX(source,env,abspath):
+        result = LaTeXAuxAction(target,source,env)
+        if result != 0:
+            check_file_error_message(env['LATEX'])
+    else:
+        result = TeXAction(target,source,env)
+        if result != 0:
+            check_file_error_message(env['TEX'])
+    return result
+
+def TeXLaTeXStrFunction(target = None, source= None, env=None):
+    """A strfunction for TeX and LaTeX that scans the source file to
+    decide the "flavor" of the source and then returns the appropriate
+    command string."""
+    if env.GetOption("no_exec"):
+
+        # find these paths for use in is_LaTeX to search for included files
+        basedir = os.path.split(str(source[0]))[0]
+        abspath = os.path.abspath(basedir)
+
+        if is_LaTeX(source,env,abspath):
+            result = env.subst('$LATEXCOM',0,target,source)+" ..."
+        else:
+            result = env.subst("$TEXCOM",0,target,source)+" ..."
+    else:
+        result = ''
+    return result
+
+def tex_eps_emitter(target, source, env):
+    """An emitter for TeX and LaTeX sources when
+    executing tex or latex. It will accept .ps and .eps
+    graphics files
+    """
+    (target, source) = tex_emitter_core(target, source, env, TexGraphics)
+
+    return (target, source)
+
+def tex_pdf_emitter(target, source, env):
+    """An emitter for TeX and LaTeX sources when
+    executing pdftex or pdflatex. It will accept graphics
+    files of types .pdf, .jpg, .png, .gif, and .tif
+    """
+    (target, source) = tex_emitter_core(target, source, env, LatexGraphics)
+
+    return (target, source)
+
+def ScanFiles(theFile, target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir, aux_files):
+    """ For theFile (a Node) update any file_tests and search for graphics files
+    then find all included files and call ScanFiles recursively for each of them"""
+
+    content = theFile.get_text_contents()
+    if Verbose:
+        print " scanning ",str(theFile)
+
+    for i in range(len(file_tests_search)):
+        if file_tests[i][0] is None:
+            file_tests[i][0] = file_tests_search[i].search(content)
+
+    incResult = includeOnly_re.search(content)
+    if incResult:
+        aux_files.append(os.path.join(targetdir, incResult.group(1)))
+    if Verbose:
+        print "\include file names : ", aux_files
+    # recursively call this on each of the included files
+    inc_files = [ ]
+    inc_files.extend( include_re.findall(content) )
+    if Verbose:
+        print "files included by '%s': "%str(theFile),inc_files
+    # inc_files is list of file names as given. need to find them
+    # using TEXINPUTS paths.
+
+    for src in inc_files:
+        srcNode = FindFile(src,['.tex','.ltx','.latex'],paths,env,requireExt=False)
+        if srcNode is not None:
+            file_tests = ScanFiles(srcNode, target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir, aux_files)
+    if Verbose:
+        print " done scanning ",str(theFile)
+    return file_tests
+
+def tex_emitter_core(target, source, env, graphics_extensions):
+    """An emitter for TeX and LaTeX sources.
+    For LaTeX sources we try and find the common created files that
+    are needed on subsequent runs of latex to finish tables of contents,
+    bibliographies, indices, lists of figures, and hyperlink references.
+    """
+    basename = SCons.Util.splitext(str(source[0]))[0]
+    basefile = os.path.split(str(basename))[1]
+    targetdir = os.path.split(str(target[0]))[0]
+    targetbase = os.path.join(targetdir, basefile)
+
+    basedir = os.path.split(str(source[0]))[0]
+    abspath = os.path.abspath(basedir)
+    target[0].attributes.path = abspath
+
+    #
+    # file names we will make use of in searching the sources and log file
+    #
+    emit_suffixes = ['.aux', '.log', '.ilg', '.blg', '.nls', '.nlg', '.gls', '.glg', '.alg'] + all_suffixes
+    auxfilename = targetbase + '.aux'
+    logfilename = targetbase + '.log'
+    flsfilename = targetbase + '.fls'
+
+    env.SideEffect(auxfilename,target[0])
+    env.SideEffect(logfilename,target[0])
+    env.SideEffect(flsfilename,target[0])
+    if Verbose:
+        print "side effect :",auxfilename,logfilename,flsfilename
+    env.Clean(target[0],auxfilename)
+    env.Clean(target[0],logfilename)
+    env.Clean(target[0],flsfilename)
+
+    content = source[0].get_text_contents()
+
+    idx_exists = os.path.exists(targetbase + '.idx')
+    nlo_exists = os.path.exists(targetbase + '.nlo')
+    glo_exists = os.path.exists(targetbase + '.glo')
+    acr_exists = os.path.exists(targetbase + '.acn')
+
+    # set up list with the regular expressions
+    # we use to find features used
+    file_tests_search = [auxfile_re,
+                         makeindex_re,
+                         bibliography_re,
+                         bibunit_re,
+                         tableofcontents_re,
+                         listoffigures_re,
+                         listoftables_re,
+                         hyperref_re,
+                         makenomenclature_re,
+                         makeglossary_re,
+                         makeglossaries_re,
+                         makeacronyms_re,
+                         beamer_re ]
+    # set up list with the file suffixes that need emitting
+    # when a feature is found
+    file_tests_suff = [['.aux','aux_file'],
+                  ['.idx', '.ind', '.ilg','makeindex'],
+                  ['.bbl', '.blg','bibliography'],
+                  ['.bbl', '.blg','bibunit'],
+                  ['.toc','contents'],
+                  ['.lof','figures'],
+                  ['.lot','tables'],
+                  ['.out','hyperref'],
+                  ['.nlo', '.nls', '.nlg','nomenclature'],
+                  ['.glo', '.gls', '.glg','glossary'],
+                  ['.glo', '.gls', '.glg','glossaries'],
+                  ['.acn', '.acr', '.alg','acronyms'],
+                  ['.nav', '.snm', '.out', '.toc','beamer'] ]
+    # build the list of lists
+    file_tests = []
+    for i in range(len(file_tests_search)):
+        file_tests.append( [None, file_tests_suff[i]] )
+
+    # TO-DO: need to add a way for the user to extend this list for whatever
+    # auxiliary files they create in other (or their own) packages
+
+    # get path list from both env['TEXINPUTS'] and env['ENV']['TEXINPUTS']
+    savedpath = modify_env_var(env, 'TEXINPUTS', abspath)
+    paths = env['ENV']['TEXINPUTS']
+    if SCons.Util.is_List(paths):
+        pass
+    else:
+        # Split at os.pathsep to convert into absolute path
+        paths = paths.split(os.pathsep)
+
+    # now that we have the path list restore the env
+    if savedpath is _null:
+        try:
+            del env['ENV']['TEXINPUTS']
+        except KeyError:
+            pass # was never set
+    else:
+        env['ENV']['TEXINPUTS'] = savedpath
+    if Verbose:
+        print "search path ",paths
+
+    aux_files = []
+    file_tests = ScanFiles(source[0], target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir, aux_files)
+
+    for (theSearch,suffix_list) in file_tests:
+        # add side effects if feature is present.If file is to be generated,add all side effects
+        if (theSearch != None) or (not source[0].exists() ):
+            file_list = [targetbase,]
+            # for bibunit we need a list of files
+            if suffix_list[-1] == 'bibunit':
+                file_basename = os.path.join(targetdir, 'bu*.aux')
+                file_list = glob.glob(file_basename)
+                # remove the suffix '.aux'
+                for i in range(len(file_list)):
+                    file_list[i] = SCons.Util.splitext(file_list[i])[0]
+            # now define the side effects
+            for file_name in file_list:
+                for suffix in suffix_list[:-1]:
+                    env.SideEffect(file_name + suffix,target[0])
+                    if Verbose:
+                        print "side effect :",file_name + suffix
+                    env.Clean(target[0],file_name + suffix)
+
+    for aFile in aux_files:
+        aFile_base = SCons.Util.splitext(aFile)[0]
+        env.SideEffect(aFile_base + '.aux',target[0])
+        if Verbose:
+            print "side effect :",aFile_base + '.aux'
+        env.Clean(target[0],aFile_base + '.aux')
+    # read fls file to get all other files that latex creates and will read on the next pass
+    # remove files from list that we explicitly dealt with above
+    if os.path.exists(flsfilename):
+        content = open(flsfilename, "rb").read()
+        out_files = openout_re.findall(content)
+        myfiles = [auxfilename, logfilename, flsfilename, targetbase+'.dvi',targetbase+'.pdf']
+        for filename in out_files[:]:
+            if filename in myfiles:
+                out_files.remove(filename)
+        env.SideEffect(out_files,target[0])
+        if Verbose:
+            print "side effect :",out_files
+        env.Clean(target[0],out_files)
+
+    return (target, source)
+
+
+TeXLaTeXAction = None
+
+def generate(env):
+    """Add Builders and construction variables for TeX to an Environment."""
+
+    global TeXLaTeXAction
+    if TeXLaTeXAction is None:
+        TeXLaTeXAction = SCons.Action.Action(TeXLaTeXFunction,
+                              strfunction=TeXLaTeXStrFunction)
+
+    env.AppendUnique(LATEXSUFFIXES=SCons.Tool.LaTeXSuffixes)
+
+    generate_common(env)
+
+    import dvi
+    dvi.generate(env)
+
+    bld = env['BUILDERS']['DVI']
+    bld.add_action('.tex', TeXLaTeXAction)
+    bld.add_emitter('.tex', tex_eps_emitter)
+
+def generate_common(env):
+    """Add internal Builders and construction variables for LaTeX to an Environment."""
+
+    # A generic tex file Action, sufficient for all tex files.
+    global TeXAction
+    if TeXAction is None:
+        TeXAction = SCons.Action.Action("$TEXCOM", "$TEXCOMSTR")
+
+    # An Action to build a latex file.  This might be needed more
+    # than once if we are dealing with labels and bibtex.
+    global LaTeXAction
+    if LaTeXAction is None:
+        LaTeXAction = SCons.Action.Action("$LATEXCOM", "$LATEXCOMSTR")
+
+    # Define an action to run BibTeX on a file.
+    global BibTeXAction
+    if BibTeXAction is None:
+        BibTeXAction = SCons.Action.Action("$BIBTEXCOM", "$BIBTEXCOMSTR")
+
+    # Define an action to run MakeIndex on a file.
+    global MakeIndexAction
+    if MakeIndexAction is None:
+        MakeIndexAction = SCons.Action.Action("$MAKEINDEXCOM", "$MAKEINDEXCOMSTR")
+
+    # Define an action to run MakeIndex on a file for nomenclatures.
+    global MakeNclAction
+    if MakeNclAction is None:
+        MakeNclAction = SCons.Action.Action("$MAKENCLCOM", "$MAKENCLCOMSTR")
+
+    # Define an action to run MakeIndex on a file for glossaries.
+    global MakeGlossaryAction
+    if MakeGlossaryAction is None:
+        MakeGlossaryAction = SCons.Action.Action("$MAKEGLOSSARYCOM", "$MAKEGLOSSARYCOMSTR")
+
+    # Define an action to run MakeIndex on a file for acronyms.
+    global MakeAcronymsAction
+    if MakeAcronymsAction is None:
+        MakeAcronymsAction = SCons.Action.Action("$MAKEACRONYMSCOM", "$MAKEACRONYMSCOMSTR")
+
+    CDCOM = 'cd '
+    if platform.system() == 'Windows':
+        # allow cd command to change drives on Windows
+        CDCOM = 'cd /D '
+
+    env['TEX']      = 'tex'
+    env['TEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode -recorder')
+    env['TEXCOM']   = CDCOM + '${TARGET.dir} && $TEX $TEXFLAGS ${SOURCE.file}'
+
+    env['PDFTEX']      = 'pdftex'
+    env['PDFTEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode -recorder')
+    env['PDFTEXCOM']   = CDCOM + '${TARGET.dir} && $PDFTEX $PDFTEXFLAGS ${SOURCE.file}'
+
+    env['LATEX']        = 'latex'
+    env['LATEXFLAGS']   = SCons.Util.CLVar('-interaction=nonstopmode -recorder')
+    env['LATEXCOM']     = CDCOM + '${TARGET.dir} && $LATEX $LATEXFLAGS ${SOURCE.file}'
+    env['LATEXRETRIES'] = 3
+
+    env['PDFLATEX']      = 'pdflatex'
+    env['PDFLATEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode -recorder')
+    env['PDFLATEXCOM']   = CDCOM + '${TARGET.dir} && $PDFLATEX $PDFLATEXFLAGS ${SOURCE.file}'
+
+    env['BIBTEX']      = 'bibtex'
+    env['BIBTEXFLAGS'] = SCons.Util.CLVar('')
+    env['BIBTEXCOM']   = CDCOM + '${TARGET.dir} && $BIBTEX $BIBTEXFLAGS ${SOURCE.filebase}'
+
+    env['MAKEINDEX']      = 'makeindex'
+    env['MAKEINDEXFLAGS'] = SCons.Util.CLVar('')
+    env['MAKEINDEXCOM']   = CDCOM + '${TARGET.dir} && $MAKEINDEX $MAKEINDEXFLAGS ${SOURCE.file}'
+
+    env['MAKEGLOSSARY']      = 'makeindex'
+    env['MAKEGLOSSARYSTYLE'] = '${SOURCE.filebase}.ist'
+    env['MAKEGLOSSARYFLAGS'] = SCons.Util.CLVar('-s ${MAKEGLOSSARYSTYLE} -t ${SOURCE.filebase}.glg')
+    env['MAKEGLOSSARYCOM']   = CDCOM + '${TARGET.dir} && $MAKEGLOSSARY ${SOURCE.filebase}.glo $MAKEGLOSSARYFLAGS -o ${SOURCE.filebase}.gls'
+
+    env['MAKEACRONYMS']      = 'makeindex'
+    env['MAKEACRONYMSSTYLE'] = '${SOURCE.filebase}.ist'
+    env['MAKEACRONYMSFLAGS'] = SCons.Util.CLVar('-s ${MAKEACRONYMSSTYLE} -t ${SOURCE.filebase}.alg')
+    env['MAKEACRONYMSCOM']   = CDCOM + '${TARGET.dir} && $MAKEACRONYMS ${SOURCE.filebase}.acn $MAKEACRONYMSFLAGS -o ${SOURCE.filebase}.acr'
+
+    env['MAKENCL']      = 'makeindex'
+    env['MAKENCLSTYLE'] = 'nomencl.ist'
+    env['MAKENCLFLAGS'] = '-s ${MAKENCLSTYLE} -t ${SOURCE.filebase}.nlg'
+    env['MAKENCLCOM']   = CDCOM + '${TARGET.dir} && $MAKENCL ${SOURCE.filebase}.nlo $MAKENCLFLAGS -o ${SOURCE.filebase}.nls'
+
+def exists(env):
+    return env.Detect('tex')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/textfile.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/textfile.py
new file mode 100644
index 0000000..1a5bf5f
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/textfile.py
@@ -0,0 +1,175 @@
+# -*- python -*-
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__doc__ = """
+Textfile/Substfile builder for SCons.
+
+    Create file 'target' which typically is a textfile.  The 'source'
+    may be any combination of strings, Nodes, or lists of same.  A
+    'linesep' will be put between any part written and defaults to
+    os.linesep.
+
+    The only difference between the Textfile builder and the Substfile
+    builder is that strings are converted to Value() nodes for the
+    former and File() nodes for the latter.  To insert files in the
+    former or strings in the latter, wrap them in a File() or Value(),
+    respectively.
+
+    The values of SUBST_DICT first have any construction variables
+    expanded (its keys are not expanded).  If a value of SUBST_DICT is
+    a python callable function, it is called and the result is expanded
+    as the value.  Values are substituted in a "random" order; if any
+    substitution could be further expanded by another subsitition, it
+    is unpredictible whether the expansion will occur.
+"""
+
+__revision__ = "src/engine/SCons/Tool/textfile.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons
+
+import os
+import re
+
+from SCons.Node import Node
+from SCons.Node.Python import Value
+from SCons.Util import is_String, is_Sequence, is_Dict
+
+def _do_subst(node, subs):
+    """
+    Fetch the node contents and replace all instances of the keys with
+    their values.  For example, if subs is
+        {'%VERSION%': '1.2345', '%BASE%': 'MyProg', '%prefix%': '/bin'},
+    then all instances of %VERSION% in the file will be replaced with
+    1.2345 and so forth.
+    """
+    contents = node.get_text_contents()
+    if not subs: return contents
+    for (k,v) in subs:
+        contents = re.sub(k, v, contents)
+    return contents
+
+def _action(target, source, env):
+    # prepare the line separator
+    linesep = env['LINESEPARATOR']
+    if linesep is None:
+        linesep = os.linesep
+    elif is_String(linesep):
+        pass
+    elif isinstance(linesep, Value):
+        linesep = linesep.get_text_contents()
+    else:
+        raise SCons.Errors.UserError(
+                           'unexpected type/class for LINESEPARATOR: %s'
+                                         % repr(linesep), None)
+
+    # create a dictionary to use for the substitutions
+    if 'SUBST_DICT' not in env:
+        subs = None    # no substitutions
+    else:
+        d = env['SUBST_DICT']
+        if is_Dict(d):
+            d = list(d.items())
+        elif is_Sequence(d):
+            pass
+        else:
+            raise SCons.Errors.UserError('SUBST_DICT must be dict or sequence')
+        subs = []
+        for (k,v) in d:
+            if callable(v):
+                v = v()
+            if is_String(v):
+                v = env.subst(v)
+            else:
+                v = str(v)
+            subs.append((k,v))
+
+    # write the file
+    try:
+        fd = open(target[0].get_path(), "wb")
+    except (OSError,IOError), e:
+        raise SCons.Errors.UserError("Can't write target file %s" % target[0])
+    # separate lines by 'linesep' only if linesep is not empty
+    lsep = None
+    for s in source:
+        if lsep: fd.write(lsep)
+        fd.write(_do_subst(s, subs))
+        lsep = linesep
+    fd.close()
+
+def _strfunc(target, source, env):
+    return "Creating '%s'" % target[0]
+
+def _convert_list_R(newlist, sources):
+    for elem in sources:
+        if is_Sequence(elem):
+            _convert_list_R(newlist, elem)
+        elif isinstance(elem, Node):
+            newlist.append(elem)
+        else:
+            newlist.append(Value(elem))
+def _convert_list(target, source, env):
+    if len(target) != 1:
+        raise SCons.Errors.UserError("Only one target file allowed")
+    newlist = []
+    _convert_list_R(newlist, source)
+    return target, newlist
+
+_common_varlist = ['SUBST_DICT', 'LINESEPARATOR']
+
+_text_varlist = _common_varlist + ['TEXTFILEPREFIX', 'TEXTFILESUFFIX']
+_text_builder = SCons.Builder.Builder(
+    action = SCons.Action.Action(_action, _strfunc, varlist = _text_varlist),
+    source_factory = Value,
+    emitter = _convert_list,
+    prefix = '$TEXTFILEPREFIX',
+    suffix = '$TEXTFILESUFFIX',
+    )
+
+_subst_varlist = _common_varlist + ['SUBSTFILEPREFIX', 'TEXTFILESUFFIX']
+_subst_builder = SCons.Builder.Builder(
+    action = SCons.Action.Action(_action, _strfunc, varlist = _subst_varlist),
+    source_factory = SCons.Node.FS.File,
+    emitter = _convert_list,
+    prefix = '$SUBSTFILEPREFIX',
+    suffix = '$SUBSTFILESUFFIX',
+    src_suffix = ['.in'],
+    )
+
+def generate(env):
+    env['LINESEPARATOR'] = os.linesep
+    env['BUILDERS']['Textfile'] = _text_builder
+    env['TEXTFILEPREFIX'] = ''
+    env['TEXTFILESUFFIX'] = '.txt'
+    env['BUILDERS']['Substfile'] = _subst_builder
+    env['SUBSTFILEPREFIX'] = ''
+    env['SUBSTFILESUFFIX'] = ''
+
+def exists(env):
+    return 1
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/tlib.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/tlib.py
new file mode 100644
index 0000000..0326a84
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/tlib.py
@@ -0,0 +1,53 @@
+"""SCons.Tool.tlib
+
+XXX
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/tlib.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Tool
+import SCons.Tool.bcc32
+import SCons.Util
+
+def generate(env):
+    SCons.Tool.bcc32.findIt('tlib', env)
+    """Add Builders and construction variables for ar to an Environment."""
+    SCons.Tool.createStaticLibBuilder(env)
+    env['AR']          = 'tlib'
+    env['ARFLAGS']     = SCons.Util.CLVar('')
+    env['ARCOM']       = '$AR $TARGET $ARFLAGS /a $SOURCES'
+    env['LIBPREFIX']   = ''
+    env['LIBSUFFIX']   = '.lib'
+
+def exists(env):
+    return SCons.Tool.bcc32.findIt('tlib', env)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/wix.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/wix.py
new file mode 100644
index 0000000..4728399
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/wix.py
@@ -0,0 +1,99 @@
+"""SCons.Tool.wix
+
+Tool-specific initialization for wix, the Windows Installer XML Tool.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/wix.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import SCons.Builder
+import SCons.Action
+import os
+
+def generate(env):
+    """Add Builders and construction variables for WiX to an Environment."""
+    if not exists(env):
+      return
+
+    env['WIXCANDLEFLAGS'] = ['-nologo']
+    env['WIXCANDLEINCLUDE'] = []
+    env['WIXCANDLECOM'] = '$WIXCANDLE $WIXCANDLEFLAGS -I $WIXCANDLEINCLUDE -o ${TARGET} ${SOURCE}'
+
+    env['WIXLIGHTFLAGS'].append( '-nologo' )
+    env['WIXLIGHTCOM'] = "$WIXLIGHT $WIXLIGHTFLAGS -out ${TARGET} ${SOURCES}"
+
+    object_builder = SCons.Builder.Builder(
+        action      = '$WIXCANDLECOM',
+        suffix      = '.wxiobj',
+        src_suffix  = '.wxs')
+
+    linker_builder = SCons.Builder.Builder(
+        action      = '$WIXLIGHTCOM',
+        src_suffix  = '.wxiobj',
+        src_builder = object_builder)
+
+    env['BUILDERS']['WiX'] = linker_builder
+
+def exists(env):
+    env['WIXCANDLE'] = 'candle.exe'
+    env['WIXLIGHT']  = 'light.exe'
+
+    # try to find the candle.exe and light.exe tools and 
+    # add the install directory to light libpath.
+    #for path in os.environ['PATH'].split(os.pathsep):
+    for path in os.environ['PATH'].split(os.pathsep):
+        if not path:
+            continue
+
+        # workaround for some weird python win32 bug.
+        if path[0] == '"' and path[-1:]=='"':
+            path = path[1:-1]
+
+        # normalize the path
+        path = os.path.normpath(path)
+
+        # search for the tools in the PATH environment variable
+        try:
+            if env['WIXCANDLE'] in os.listdir(path) and\
+               env['WIXLIGHT']  in os.listdir(path):
+                   env.PrependENVPath('PATH', path)
+                   env['WIXLIGHTFLAGS'] = [ os.path.join( path, 'wixui.wixlib' ),
+                                            '-loc',
+                                            os.path.join( path, 'WixUI_en-us.wxl' ) ]
+                   return 1
+        except OSError:
+            pass # ignore this, could be a stale PATH entry.
+
+    return None
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/yacc.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/yacc.py
new file mode 100644
index 0000000..167aab8
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/yacc.py
@@ -0,0 +1,130 @@
+"""SCons.Tool.yacc
+
+Tool-specific initialization for yacc.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/yacc.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os.path
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+YaccAction = SCons.Action.Action("$YACCCOM", "$YACCCOMSTR")
+
+def _yaccEmitter(target, source, env, ysuf, hsuf):
+    yaccflags = env.subst("$YACCFLAGS", target=target, source=source)
+    flags = SCons.Util.CLVar(yaccflags)
+    targetBase, targetExt = os.path.splitext(SCons.Util.to_String(target[0]))
+
+    if '.ym' in ysuf:                # If using Objective-C
+        target = [targetBase + ".m"] # the extension is ".m".
+
+
+    # If -d is specified on the command line, yacc will emit a .h
+    # or .hpp file with the same name as the .c or .cpp output file.
+    if '-d' in flags:
+        target.append(targetBase + env.subst(hsuf, target=target, source=source))
+
+    # If -g is specified on the command line, yacc will emit a .vcg
+    # file with the same base name as the .y, .yacc, .ym or .yy file.
+    if "-g" in flags:
+        base, ext = os.path.splitext(SCons.Util.to_String(source[0]))
+        target.append(base + env.subst("$YACCVCGFILESUFFIX"))
+
+    # With --defines and --graph, the name of the file is totally defined
+    # in the options.
+    fileGenOptions = ["--defines=", "--graph="]
+    for option in flags:
+        for fileGenOption in fileGenOptions:
+            l = len(fileGenOption)
+            if option[:l] == fileGenOption:
+                # A file generating option is present, so add the file
+                # name to the list of targets.
+                fileName = option[l:].strip()
+                target.append(fileName)
+
+    return (target, source)
+
+def yEmitter(target, source, env):
+    return _yaccEmitter(target, source, env, ['.y', '.yacc'], '$YACCHFILESUFFIX')
+
+def ymEmitter(target, source, env):
+    return _yaccEmitter(target, source, env, ['.ym'], '$YACCHFILESUFFIX')
+
+def yyEmitter(target, source, env):
+    return _yaccEmitter(target, source, env, ['.yy'], '$YACCHXXFILESUFFIX')
+
+def generate(env):
+    """Add Builders and construction variables for yacc to an Environment."""
+    c_file, cxx_file = SCons.Tool.createCFileBuilders(env)
+
+    # C
+    c_file.add_action('.y', YaccAction)
+    c_file.add_emitter('.y', yEmitter)
+
+    c_file.add_action('.yacc', YaccAction)
+    c_file.add_emitter('.yacc', yEmitter)
+
+    # Objective-C
+    c_file.add_action('.ym', YaccAction)
+    c_file.add_emitter('.ym', ymEmitter)
+
+    # C++
+    cxx_file.add_action('.yy', YaccAction)
+    cxx_file.add_emitter('.yy', yyEmitter)
+
+    env['YACC']      = env.Detect('bison') or 'yacc'
+    env['YACCFLAGS'] = SCons.Util.CLVar('')
+    env['YACCCOM']   = '$YACC $YACCFLAGS -o $TARGET $SOURCES'
+    env['YACCHFILESUFFIX'] = '.h'
+
+    # Apparently, OS X now creates file.hpp like everybody else
+    # I have no idea when it changed; it was fixed in 10.4
+    #if env['PLATFORM'] == 'darwin':
+    #    # Bison on Mac OS X just appends ".h" to the generated target .cc
+    #    # or .cpp file name.  Hooray for delayed expansion of variables.
+    #    env['YACCHXXFILESUFFIX'] = '${TARGET.suffix}.h'
+    #else:
+    #    env['YACCHXXFILESUFFIX'] = '.hpp'
+    env['YACCHXXFILESUFFIX'] = '.hpp'
+
+    env['YACCVCGFILESUFFIX'] = '.vcg'
+
+def exists(env):
+    return env.Detect(['bison', 'yacc'])
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/zip.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/zip.py
new file mode 100644
index 0000000..e605794
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Tool/zip.py
@@ -0,0 +1,99 @@
+"""SCons.Tool.zip
+
+Tool-specific initialization for zip.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/zip.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os.path
+
+import SCons.Builder
+import SCons.Defaults
+import SCons.Node.FS
+import SCons.Util
+
+try:
+    import zipfile
+    internal_zip = 1
+except ImportError:
+    internal_zip = 0
+
+if internal_zip:
+    zipcompression = zipfile.ZIP_DEFLATED
+    def zip(target, source, env):
+        compression = env.get('ZIPCOMPRESSION', 0)
+        zf = zipfile.ZipFile(str(target[0]), 'w', compression)
+        for s in source:
+            if s.isdir():
+                for dirpath, dirnames, filenames in os.walk(str(s)):
+                    for fname in filenames:
+                        path = os.path.join(dirpath, fname)
+                        if os.path.isfile(path):
+                            zf.write(path)
+            else:
+                zf.write(str(s))
+        zf.close()
+else:
+    zipcompression = 0
+    zip = "$ZIP $ZIPFLAGS ${TARGET.abspath} $SOURCES"
+
+
+zipAction = SCons.Action.Action(zip, varlist=['ZIPCOMPRESSION'])
+
+ZipBuilder = SCons.Builder.Builder(action = SCons.Action.Action('$ZIPCOM', '$ZIPCOMSTR'),
+                                   source_factory = SCons.Node.FS.Entry,
+                                   source_scanner = SCons.Defaults.DirScanner,
+                                   suffix = '$ZIPSUFFIX',
+                                   multi = 1)
+
+
+def generate(env):
+    """Add Builders and construction variables for zip to an Environment."""
+    try:
+        bld = env['BUILDERS']['Zip']
+    except KeyError:
+        bld = ZipBuilder
+        env['BUILDERS']['Zip'] = bld
+
+    env['ZIP']        = 'zip'
+    env['ZIPFLAGS']   = SCons.Util.CLVar('')
+    env['ZIPCOM']     = zipAction
+    env['ZIPCOMPRESSION'] =  zipcompression
+    env['ZIPSUFFIX']  = '.zip'
+
+def exists(env):
+    return internal_zip or env.Detect('zip')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Util.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Util.py
new file mode 100644
index 0000000..33f369b
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Util.py
@@ -0,0 +1,1492 @@
+"""SCons.Util
+
+Various utility functions go here.
+"""
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Util.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+import sys
+import copy
+import re
+import types
+
+from collections import UserDict, UserList, UserString
+
+# Don't "from types import ..." these because we need to get at the
+# types module later to look for UnicodeType.
+InstanceType    = types.InstanceType
+MethodType      = types.MethodType
+FunctionType    = types.FunctionType
+try: unicode
+except NameError: UnicodeType = None
+else:             UnicodeType = unicode
+
+def dictify(keys, values, result={}):
+    for k, v in zip(keys, values):
+        result[k] = v
+    return result
+
+_altsep = os.altsep
+if _altsep is None and sys.platform == 'win32':
+    # My ActivePython 2.0.1 doesn't set os.altsep!  What gives?
+    _altsep = '/'
+if _altsep:
+    def rightmost_separator(path, sep):
+        return max(path.rfind(sep), path.rfind(_altsep))
+else:
+    def rightmost_separator(path, sep):
+        return path.rfind(sep)
+
+# First two from the Python Cookbook, just for completeness.
+# (Yeah, yeah, YAGNI...)
+def containsAny(str, set):
+    """Check whether sequence str contains ANY of the items in set."""
+    for c in set:
+        if c in str: return 1
+    return 0
+
+def containsAll(str, set):
+    """Check whether sequence str contains ALL of the items in set."""
+    for c in set:
+        if c not in str: return 0
+    return 1
+
+def containsOnly(str, set):
+    """Check whether sequence str contains ONLY items in set."""
+    for c in str:
+        if c not in set: return 0
+    return 1
+
+def splitext(path):
+    "Same as os.path.splitext() but faster."
+    sep = rightmost_separator(path, os.sep)
+    dot = path.rfind('.')
+    # An ext is only real if it has at least one non-digit char
+    if dot > sep and not containsOnly(path[dot:], "0123456789."):
+        return path[:dot],path[dot:]
+    else:
+        return path,""
+
+def updrive(path):
+    """
+    Make the drive letter (if any) upper case.
+    This is useful because Windows is inconsitent on the case
+    of the drive letter, which can cause inconsistencies when
+    calculating command signatures.
+    """
+    drive, rest = os.path.splitdrive(path)
+    if drive:
+        path = drive.upper() + rest
+    return path
+
+class NodeList(UserList):
+    """This class is almost exactly like a regular list of Nodes
+    (actually it can hold any object), with one important difference.
+    If you try to get an attribute from this list, it will return that
+    attribute from every item in the list.  For example:
+
+    >>> someList = NodeList([ '  foo  ', '  bar  ' ])
+    >>> someList.strip()
+    [ 'foo', 'bar' ]
+    """
+    def __nonzero__(self):
+        return len(self.data) != 0
+
+    def __str__(self):
+        return ' '.join(map(str, self.data))
+
+    def __iter__(self):
+        return iter(self.data)
+
+    def __call__(self, *args, **kwargs):
+        result = [x(*args, **kwargs) for x in self.data]
+        return self.__class__(result)
+
+    def __getattr__(self, name):
+        result = [getattr(x, name) for x in self.data]
+        return self.__class__(result)
+
+
+_get_env_var = re.compile(r'^\$([_a-zA-Z]\w*|{[_a-zA-Z]\w*})$')
+
+def get_environment_var(varstr):
+    """Given a string, first determine if it looks like a reference
+    to a single environment variable, like "$FOO" or "${FOO}".
+    If so, return that variable with no decorations ("FOO").
+    If not, return None."""
+    mo=_get_env_var.match(to_String(varstr))
+    if mo:
+        var = mo.group(1)
+        if var[0] == '{':
+            return var[1:-1]
+        else:
+            return var
+    else:
+        return None
+
+class DisplayEngine(object):
+    print_it = True
+    def __call__(self, text, append_newline=1):
+        if not self.print_it:
+            return
+        if append_newline: text = text + '\n'
+        try:
+            sys.stdout.write(unicode(text))
+        except IOError:
+            # Stdout might be connected to a pipe that has been closed
+            # by now. The most likely reason for the pipe being closed
+            # is that the user has press ctrl-c. It this is the case,
+            # then SCons is currently shutdown. We therefore ignore
+            # IOError's here so that SCons can continue and shutdown
+            # properly so that the .sconsign is correctly written
+            # before SCons exits.
+            pass
+
+    def set_mode(self, mode):
+        self.print_it = mode
+
+def render_tree(root, child_func, prune=0, margin=[0], visited={}):
+    """
+    Render a tree of nodes into an ASCII tree view.
+    root - the root node of the tree
+    child_func - the function called to get the children of a node
+    prune - don't visit the same node twice
+    margin - the format of the left margin to use for children of root.
+       1 results in a pipe, and 0 results in no pipe.
+    visited - a dictionary of visited nodes in the current branch if not prune,
+       or in the whole tree if prune.
+    """
+
+    rname = str(root)
+
+    children = child_func(root)
+    retval = ""
+    for pipe in margin[:-1]:
+        if pipe:
+            retval = retval + "| "
+        else:
+            retval = retval + "  "
+
+    if rname in visited:
+        return retval + "+-[" + rname + "]\n"
+
+    retval = retval + "+-" + rname + "\n"
+    if not prune:
+        visited = copy.copy(visited)
+    visited[rname] = 1
+
+    for i in range(len(children)):
+        margin.append(i<len(children)-1)
+        retval = retval + render_tree(children[i], child_func, prune, margin, visited
+)
+        margin.pop()
+
+    return retval
+
+IDX = lambda N: N and 1 or 0
+
+def print_tree(root, child_func, prune=0, showtags=0, margin=[0], visited={}):
+    """
+    Print a tree of nodes.  This is like render_tree, except it prints
+    lines directly instead of creating a string representation in memory,
+    so that huge trees can be printed.
+
+    root - the root node of the tree
+    child_func - the function called to get the children of a node
+    prune - don't visit the same node twice
+    showtags - print status information to the left of each node line
+    margin - the format of the left margin to use for children of root.
+       1 results in a pipe, and 0 results in no pipe.
+    visited - a dictionary of visited nodes in the current branch if not prune,
+       or in the whole tree if prune.
+    """
+
+    rname = str(root)
+
+    if showtags:
+
+        if showtags == 2:
+            legend = (' E         = exists\n' +
+                      '  R        = exists in repository only\n' +
+                      '   b       = implicit builder\n' +
+                      '   B       = explicit builder\n' +
+                      '    S      = side effect\n' +
+                      '     P     = precious\n' +
+                      '      A    = always build\n' +
+                      '       C   = current\n' +
+                      '        N  = no clean\n' +
+                      '         H = no cache\n' +
+                      '\n')
+            sys.stdout.write(unicode(legend))
+
+        tags = ['[']
+        tags.append(' E'[IDX(root.exists())])
+        tags.append(' R'[IDX(root.rexists() and not root.exists())])
+        tags.append(' BbB'[[0,1][IDX(root.has_explicit_builder())] +
+                           [0,2][IDX(root.has_builder())]])
+        tags.append(' S'[IDX(root.side_effect)])
+        tags.append(' P'[IDX(root.precious)])
+        tags.append(' A'[IDX(root.always_build)])
+        tags.append(' C'[IDX(root.is_up_to_date())])
+        tags.append(' N'[IDX(root.noclean)])
+        tags.append(' H'[IDX(root.nocache)])
+        tags.append(']')
+
+    else:
+        tags = []
+
+    def MMM(m):
+        return ["  ","| "][m]
+    margins = list(map(MMM, margin[:-1]))
+
+    children = child_func(root)
+
+    if prune and rname in visited and children:
+        sys.stdout.write(''.join(tags + margins + ['+-[', rname, ']']) + u'\n')
+        return
+
+    sys.stdout.write(''.join(tags + margins + ['+-', rname]) + u'\n')
+
+    visited[rname] = 1
+
+    if children:
+        margin.append(1)
+        idx = IDX(showtags)
+        for C in children[:-1]:
+            print_tree(C, child_func, prune, idx, margin, visited)
+        margin[-1] = 0
+        print_tree(children[-1], child_func, prune, idx, margin, visited)
+        margin.pop()
+
+
+
+# Functions for deciding if things are like various types, mainly to
+# handle UserDict, UserList and UserString like their underlying types.
+#
+# Yes, all of this manual testing breaks polymorphism, and the real
+# Pythonic way to do all of this would be to just try it and handle the
+# exception, but handling the exception when it's not the right type is
+# often too slow.
+
+# We are using the following trick to speed up these
+# functions. Default arguments are used to take a snapshot of the
+# the global functions and constants used by these functions. This
+# transforms accesses to global variable into local variables
+# accesses (i.e. LOAD_FAST instead of LOAD_GLOBAL).
+
+DictTypes = (dict, UserDict)
+ListTypes = (list, UserList)
+SequenceTypes = (list, tuple, UserList)
+
+# Note that profiling data shows a speed-up when comparing
+# explicitely with str and unicode instead of simply comparing
+# with basestring. (at least on Python 2.5.1)
+StringTypes = (str, unicode, UserString)
+
+# Empirically, it is faster to check explicitely for str and
+# unicode than for basestring.
+BaseStringTypes = (str, unicode)
+
+def is_Dict(obj, isinstance=isinstance, DictTypes=DictTypes):
+    return isinstance(obj, DictTypes)
+
+def is_List(obj, isinstance=isinstance, ListTypes=ListTypes):
+    return isinstance(obj, ListTypes)
+
+def is_Sequence(obj, isinstance=isinstance, SequenceTypes=SequenceTypes):
+    return isinstance(obj, SequenceTypes)
+
+def is_Tuple(obj, isinstance=isinstance, tuple=tuple):
+    return isinstance(obj, tuple)
+
+def is_String(obj, isinstance=isinstance, StringTypes=StringTypes):
+    return isinstance(obj, StringTypes)
+
+def is_Scalar(obj, isinstance=isinstance, StringTypes=StringTypes, SequenceTypes=SequenceTypes):
+    # Profiling shows that there is an impressive speed-up of 2x
+    # when explicitely checking for strings instead of just not
+    # sequence when the argument (i.e. obj) is already a string.
+    # But, if obj is a not string then it is twice as fast to
+    # check only for 'not sequence'. The following code therefore
+    # assumes that the obj argument is a string must of the time.
+    return isinstance(obj, StringTypes) or not isinstance(obj, SequenceTypes)
+
+def do_flatten(sequence, result, isinstance=isinstance, 
+               StringTypes=StringTypes, SequenceTypes=SequenceTypes):
+    for item in sequence:
+        if isinstance(item, StringTypes) or not isinstance(item, SequenceTypes):
+            result.append(item)
+        else:
+            do_flatten(item, result)
+
+def flatten(obj, isinstance=isinstance, StringTypes=StringTypes, 
+            SequenceTypes=SequenceTypes, do_flatten=do_flatten):
+    """Flatten a sequence to a non-nested list.
+
+    Flatten() converts either a single scalar or a nested sequence
+    to a non-nested list. Note that flatten() considers strings
+    to be scalars instead of sequences like Python would.
+    """
+    if isinstance(obj, StringTypes) or not isinstance(obj, SequenceTypes):
+        return [obj]
+    result = []
+    for item in obj:
+        if isinstance(item, StringTypes) or not isinstance(item, SequenceTypes):
+            result.append(item)
+        else:
+            do_flatten(item, result)
+    return result
+
+def flatten_sequence(sequence, isinstance=isinstance, StringTypes=StringTypes, 
+                     SequenceTypes=SequenceTypes, do_flatten=do_flatten):
+    """Flatten a sequence to a non-nested list.
+
+    Same as flatten(), but it does not handle the single scalar
+    case. This is slightly more efficient when one knows that
+    the sequence to flatten can not be a scalar.
+    """
+    result = []
+    for item in sequence:
+        if isinstance(item, StringTypes) or not isinstance(item, SequenceTypes):
+            result.append(item)
+        else:
+            do_flatten(item, result)
+    return result
+
+# Generic convert-to-string functions that abstract away whether or
+# not the Python we're executing has Unicode support.  The wrapper
+# to_String_for_signature() will use a for_signature() method if the
+# specified object has one.
+#
+def to_String(s, 
+              isinstance=isinstance, str=str,
+              UserString=UserString, BaseStringTypes=BaseStringTypes):
+    if isinstance(s,BaseStringTypes):
+        # Early out when already a string!
+        return s
+    elif isinstance(s, UserString):
+        # s.data can only be either a unicode or a regular
+        # string. Please see the UserString initializer.
+        return s.data
+    else:
+        return str(s)
+
+def to_String_for_subst(s, 
+                        isinstance=isinstance, str=str, to_String=to_String,
+                        BaseStringTypes=BaseStringTypes, SequenceTypes=SequenceTypes,
+                        UserString=UserString):
+                        
+    # Note that the test cases are sorted by order of probability.
+    if isinstance(s, BaseStringTypes):
+        return s
+    elif isinstance(s, SequenceTypes):
+        l = []
+        for e in s:
+            l.append(to_String_for_subst(e))
+        return ' '.join( s )
+    elif isinstance(s, UserString):
+        # s.data can only be either a unicode or a regular
+        # string. Please see the UserString initializer.
+        return s.data
+    else:
+        return str(s)
+
+def to_String_for_signature(obj, to_String_for_subst=to_String_for_subst, 
+                            AttributeError=AttributeError):
+    try:
+        f = obj.for_signature
+    except AttributeError:
+        return to_String_for_subst(obj)
+    else:
+        return f()
+
+
+# The SCons "semi-deep" copy.
+#
+# This makes separate copies of lists (including UserList objects)
+# dictionaries (including UserDict objects) and tuples, but just copies
+# references to anything else it finds.
+#
+# A special case is any object that has a __semi_deepcopy__() method,
+# which we invoke to create the copy, which is used by the BuilderDict
+# class because of its extra initialization argument.
+#
+# The dispatch table approach used here is a direct rip-off from the
+# normal Python copy module.
+
+_semi_deepcopy_dispatch = d = {}
+
+def _semi_deepcopy_dict(x):
+    copy = {}
+    for key, val in x.items():
+        # The regular Python copy.deepcopy() also deepcopies the key,
+        # as follows:
+        #
+        #    copy[semi_deepcopy(key)] = semi_deepcopy(val)
+        #
+        # Doesn't seem like we need to, but we'll comment it just in case.
+        copy[key] = semi_deepcopy(val)
+    return copy
+d[dict] = _semi_deepcopy_dict
+
+def _semi_deepcopy_list(x):
+    return list(map(semi_deepcopy, x))
+d[list] = _semi_deepcopy_list
+
+def _semi_deepcopy_tuple(x):
+    return tuple(map(semi_deepcopy, x))
+d[tuple] = _semi_deepcopy_tuple
+
+def semi_deepcopy(x):
+    copier = _semi_deepcopy_dispatch.get(type(x))
+    if copier:
+        return copier(x)
+    else:
+        if hasattr(x, '__semi_deepcopy__') and callable(x.__semi_deepcopy__):
+            return x.__semi_deepcopy__()
+        elif isinstance(x, UserDict):
+            return x.__class__(_semi_deepcopy_dict(x))
+        elif isinstance(x, UserList):
+            return x.__class__(_semi_deepcopy_list(x))
+        
+        return x
+
+
+
+class Proxy(object):
+    """A simple generic Proxy class, forwarding all calls to
+    subject.  So, for the benefit of the python newbie, what does
+    this really mean?  Well, it means that you can take an object, let's
+    call it 'objA', and wrap it in this Proxy class, with a statement
+    like this
+
+                 proxyObj = Proxy(objA),
+
+    Then, if in the future, you do something like this
+
+                 x = proxyObj.var1,
+
+    since Proxy does not have a 'var1' attribute (but presumably objA does),
+    the request actually is equivalent to saying
+
+                 x = objA.var1
+
+    Inherit from this class to create a Proxy.
+
+    Note that, with new-style classes, this does *not* work transparently
+    for Proxy subclasses that use special .__*__() method names, because
+    those names are now bound to the class, not the individual instances.
+    You now need to know in advance which .__*__() method names you want
+    to pass on to the underlying Proxy object, and specifically delegate
+    their calls like this:
+
+        class Foo(Proxy):
+            __str__ = Delegate('__str__')
+    """
+
+    def __init__(self, subject):
+        """Wrap an object as a Proxy object"""
+        self._subject = subject
+
+    def __getattr__(self, name):
+        """Retrieve an attribute from the wrapped object.  If the named
+           attribute doesn't exist, AttributeError is raised"""
+        return getattr(self._subject, name)
+
+    def get(self):
+        """Retrieve the entire wrapped object"""
+        return self._subject
+
+    def __cmp__(self, other):
+        if issubclass(other.__class__, self._subject.__class__):
+            return cmp(self._subject, other)
+        return cmp(self.__dict__, other.__dict__)
+
+class Delegate(object):
+    """A Python Descriptor class that delegates attribute fetches
+    to an underlying wrapped subject of a Proxy.  Typical use:
+
+        class Foo(Proxy):
+            __str__ = Delegate('__str__')
+    """
+    def __init__(self, attribute):
+        self.attribute = attribute
+    def __get__(self, obj, cls):
+        if isinstance(obj, cls):
+            return getattr(obj._subject, self.attribute)
+        else:
+            return self
+
+# attempt to load the windows registry module:
+can_read_reg = 0
+try:
+    import winreg
+
+    can_read_reg = 1
+    hkey_mod = winreg
+
+    RegOpenKeyEx    = winreg.OpenKeyEx
+    RegEnumKey      = winreg.EnumKey
+    RegEnumValue    = winreg.EnumValue
+    RegQueryValueEx = winreg.QueryValueEx
+    RegError        = winreg.error
+
+except ImportError:
+    try:
+        import win32api
+        import win32con
+        can_read_reg = 1
+        hkey_mod = win32con
+
+        RegOpenKeyEx    = win32api.RegOpenKeyEx
+        RegEnumKey      = win32api.RegEnumKey
+        RegEnumValue    = win32api.RegEnumValue
+        RegQueryValueEx = win32api.RegQueryValueEx
+        RegError        = win32api.error
+
+    except ImportError:
+        class _NoError(Exception):
+            pass
+        RegError = _NoError
+
+if can_read_reg:
+    HKEY_CLASSES_ROOT  = hkey_mod.HKEY_CLASSES_ROOT
+    HKEY_LOCAL_MACHINE = hkey_mod.HKEY_LOCAL_MACHINE
+    HKEY_CURRENT_USER  = hkey_mod.HKEY_CURRENT_USER
+    HKEY_USERS         = hkey_mod.HKEY_USERS
+
+    def RegGetValue(root, key):
+        """This utility function returns a value in the registry
+        without having to open the key first.  Only available on
+        Windows platforms with a version of Python that can read the
+        registry.  Returns the same thing as
+        SCons.Util.RegQueryValueEx, except you just specify the entire
+        path to the value, and don't have to bother opening the key
+        first.  So:
+
+        Instead of:
+          k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE,
+                r'SOFTWARE\Microsoft\Windows\CurrentVersion')
+          out = SCons.Util.RegQueryValueEx(k,
+                'ProgramFilesDir')
+
+        You can write:
+          out = SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE,
+                r'SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir')
+        """
+        # I would use os.path.split here, but it's not a filesystem
+        # path...
+        p = key.rfind('\\') + 1
+        keyp = key[:p-1]          # -1 to omit trailing slash
+        val = key[p:]
+        k = RegOpenKeyEx(root, keyp)
+        return RegQueryValueEx(k,val)
+else:
+    try:
+        e = WindowsError
+    except NameError:
+        # Make sure we have a definition of WindowsError so we can
+        # run platform-independent tests of Windows functionality on
+        # platforms other than Windows.  (WindowsError is, in fact, an
+        # OSError subclass on Windows.)
+        class WindowsError(OSError):
+            pass
+        import builtins
+        builtins.WindowsError = WindowsError
+    else:
+        del e
+        
+    HKEY_CLASSES_ROOT = None
+    HKEY_LOCAL_MACHINE = None
+    HKEY_CURRENT_USER = None
+    HKEY_USERS = None
+
+    def RegGetValue(root, key):
+        raise WindowsError
+
+    def RegOpenKeyEx(root, key):
+        raise WindowsError
+
+if sys.platform == 'win32':
+
+    def WhereIs(file, path=None, pathext=None, reject=[]):
+        if path is None:
+            try:
+                path = os.environ['PATH']
+            except KeyError:
+                return None
+        if is_String(path):
+            path = path.split(os.pathsep)
+        if pathext is None:
+            try:
+                pathext = os.environ['PATHEXT']
+            except KeyError:
+                pathext = '.COM;.EXE;.BAT;.CMD'
+        if is_String(pathext):
+            pathext = pathext.split(os.pathsep)
+        for ext in pathext:
+            if ext.lower() == file[-len(ext):].lower():
+                pathext = ['']
+                break
+        if not is_List(reject) and not is_Tuple(reject):
+            reject = [reject]
+        for dir in path:
+            f = os.path.join(dir, file)
+            for ext in pathext:
+                fext = f + ext
+                if os.path.isfile(fext):
+                    try:
+                        reject.index(fext)
+                    except ValueError:
+                        return os.path.normpath(fext)
+                    continue
+        return None
+
+elif os.name == 'os2':
+
+    def WhereIs(file, path=None, pathext=None, reject=[]):
+        if path is None:
+            try:
+                path = os.environ['PATH']
+            except KeyError:
+                return None
+        if is_String(path):
+            path = path.split(os.pathsep)
+        if pathext is None:
+            pathext = ['.exe', '.cmd']
+        for ext in pathext:
+            if ext.lower() == file[-len(ext):].lower():
+                pathext = ['']
+                break
+        if not is_List(reject) and not is_Tuple(reject):
+            reject = [reject]
+        for dir in path:
+            f = os.path.join(dir, file)
+            for ext in pathext:
+                fext = f + ext
+                if os.path.isfile(fext):
+                    try:
+                        reject.index(fext)
+                    except ValueError:
+                        return os.path.normpath(fext)
+                    continue
+        return None
+
+else:
+
+    def WhereIs(file, path=None, pathext=None, reject=[]):
+        import stat
+        if path is None:
+            try:
+                path = os.environ['PATH']
+            except KeyError:
+                return None
+        if is_String(path):
+            path = path.split(os.pathsep)
+        if not is_List(reject) and not is_Tuple(reject):
+            reject = [reject]
+        for d in path:
+            f = os.path.join(d, file)
+            if os.path.isfile(f):
+                try:
+                    st = os.stat(f)
+                except OSError:
+                    # os.stat() raises OSError, not IOError if the file
+                    # doesn't exist, so in this case we let IOError get
+                    # raised so as to not mask possibly serious disk or
+                    # network issues.
+                    continue
+                if stat.S_IMODE(st[stat.ST_MODE]) & 0111:
+                    try:
+                        reject.index(f)
+                    except ValueError:
+                        return os.path.normpath(f)
+                    continue
+        return None
+
+def PrependPath(oldpath, newpath, sep = os.pathsep, 
+                delete_existing=1, canonicalize=None):
+    """This prepends newpath elements to the given oldpath.  Will only
+    add any particular path once (leaving the first one it encounters
+    and ignoring the rest, to preserve path order), and will
+    os.path.normpath and os.path.normcase all paths to help assure
+    this.  This can also handle the case where the given old path
+    variable is a list instead of a string, in which case a list will
+    be returned instead of a string.
+
+    Example:
+      Old Path: "/foo/bar:/foo"
+      New Path: "/biz/boom:/foo"
+      Result:   "/biz/boom:/foo:/foo/bar"
+
+    If delete_existing is 0, then adding a path that exists will
+    not move it to the beginning; it will stay where it is in the
+    list.
+
+    If canonicalize is not None, it is applied to each element of 
+    newpath before use.
+    """
+
+    orig = oldpath
+    is_list = 1
+    paths = orig
+    if not is_List(orig) and not is_Tuple(orig):
+        paths = paths.split(sep)
+        is_list = 0
+
+    if is_String(newpath):
+        newpaths = newpath.split(sep)
+    elif not is_List(newpath) and not is_Tuple(newpath):
+        newpaths = [ newpath ]  # might be a Dir
+    else:
+        newpaths = newpath
+
+    if canonicalize:
+        newpaths=list(map(canonicalize, newpaths))
+
+    if not delete_existing:
+        # First uniquify the old paths, making sure to 
+        # preserve the first instance (in Unix/Linux,
+        # the first one wins), and remembering them in normpaths.
+        # Then insert the new paths at the head of the list
+        # if they're not already in the normpaths list.
+        result = []
+        normpaths = []
+        for path in paths:
+            if not path:
+                continue
+            normpath = os.path.normpath(os.path.normcase(path))
+            if normpath not in normpaths:
+                result.append(path)
+                normpaths.append(normpath)
+        newpaths.reverse()      # since we're inserting at the head
+        for path in newpaths:
+            if not path:
+                continue
+            normpath = os.path.normpath(os.path.normcase(path))
+            if normpath not in normpaths:
+                result.insert(0, path)
+                normpaths.append(normpath)
+        paths = result
+
+    else:
+        newpaths = newpaths + paths # prepend new paths
+
+        normpaths = []
+        paths = []
+        # now we add them only if they are unique
+        for path in newpaths:
+            normpath = os.path.normpath(os.path.normcase(path))
+            if path and not normpath in normpaths:
+                paths.append(path)
+                normpaths.append(normpath)
+
+    if is_list:
+        return paths
+    else:
+        return sep.join(paths)
+
+def AppendPath(oldpath, newpath, sep = os.pathsep, 
+               delete_existing=1, canonicalize=None):
+    """This appends new path elements to the given old path.  Will
+    only add any particular path once (leaving the last one it
+    encounters and ignoring the rest, to preserve path order), and
+    will os.path.normpath and os.path.normcase all paths to help
+    assure this.  This can also handle the case where the given old
+    path variable is a list instead of a string, in which case a list
+    will be returned instead of a string.
+
+    Example:
+      Old Path: "/foo/bar:/foo"
+      New Path: "/biz/boom:/foo"
+      Result:   "/foo/bar:/biz/boom:/foo"
+
+    If delete_existing is 0, then adding a path that exists
+    will not move it to the end; it will stay where it is in the list.
+
+    If canonicalize is not None, it is applied to each element of 
+    newpath before use.
+    """
+
+    orig = oldpath
+    is_list = 1
+    paths = orig
+    if not is_List(orig) and not is_Tuple(orig):
+        paths = paths.split(sep)
+        is_list = 0
+
+    if is_String(newpath):
+        newpaths = newpath.split(sep)
+    elif not is_List(newpath) and not is_Tuple(newpath):
+        newpaths = [ newpath ]  # might be a Dir
+    else:
+        newpaths = newpath
+
+    if canonicalize:
+        newpaths=list(map(canonicalize, newpaths))
+
+    if not delete_existing:
+        # add old paths to result, then
+        # add new paths if not already present
+        # (I thought about using a dict for normpaths for speed,
+        # but it's not clear hashing the strings would be faster
+        # than linear searching these typically short lists.)
+        result = []
+        normpaths = []
+        for path in paths:
+            if not path:
+                continue
+            result.append(path)
+            normpaths.append(os.path.normpath(os.path.normcase(path)))
+        for path in newpaths:
+            if not path:
+                continue
+            normpath = os.path.normpath(os.path.normcase(path))
+            if normpath not in normpaths:
+                result.append(path)
+                normpaths.append(normpath)
+        paths = result
+    else:
+        # start w/ new paths, add old ones if not present,
+        # then reverse.
+        newpaths = paths + newpaths # append new paths
+        newpaths.reverse()
+
+        normpaths = []
+        paths = []
+        # now we add them only if they are unique
+        for path in newpaths:
+            normpath = os.path.normpath(os.path.normcase(path))
+            if path and not normpath in normpaths:
+                paths.append(path)
+                normpaths.append(normpath)
+        paths.reverse()
+
+    if is_list:
+        return paths
+    else:
+        return sep.join(paths)
+
+if sys.platform == 'cygwin':
+    def get_native_path(path):
+        """Transforms an absolute path into a native path for the system.  In
+        Cygwin, this converts from a Cygwin path to a Windows one."""
+        return os.popen('cygpath -w ' + path).read().replace('\n', '')
+else:
+    def get_native_path(path):
+        """Transforms an absolute path into a native path for the system.
+        Non-Cygwin version, just leave the path alone."""
+        return path
+
+display = DisplayEngine()
+
+def Split(arg):
+    if is_List(arg) or is_Tuple(arg):
+        return arg
+    elif is_String(arg):
+        return arg.split()
+    else:
+        return [arg]
+
+class CLVar(UserList):
+    """A class for command-line construction variables.
+
+    This is a list that uses Split() to split an initial string along
+    white-space arguments, and similarly to split any strings that get
+    added.  This allows us to Do the Right Thing with Append() and
+    Prepend() (as well as straight Python foo = env['VAR'] + 'arg1
+    arg2') regardless of whether a user adds a list or a string to a
+    command-line construction variable.
+    """
+    def __init__(self, seq = []):
+        UserList.__init__(self, Split(seq))
+    def __add__(self, other):
+        return UserList.__add__(self, CLVar(other))
+    def __radd__(self, other):
+        return UserList.__radd__(self, CLVar(other))
+    def __coerce__(self, other):
+        return (self, CLVar(other))
+    def __str__(self):
+        return ' '.join(self.data)
+
+# A dictionary that preserves the order in which items are added.
+# Submitted by David Benjamin to ActiveState's Python Cookbook web site:
+#     http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747
+# Including fixes/enhancements from the follow-on discussions.
+class OrderedDict(UserDict):
+    def __init__(self, dict = None):
+        self._keys = []
+        UserDict.__init__(self, dict)
+
+    def __delitem__(self, key):
+        UserDict.__delitem__(self, key)
+        self._keys.remove(key)
+
+    def __setitem__(self, key, item):
+        UserDict.__setitem__(self, key, item)
+        if key not in self._keys: self._keys.append(key)
+
+    def clear(self):
+        UserDict.clear(self)
+        self._keys = []
+
+    def copy(self):
+        dict = OrderedDict()
+        dict.update(self)
+        return dict
+
+    def items(self):
+        return list(zip(self._keys, list(self.values())))
+
+    def keys(self):
+        return self._keys[:]
+
+    def popitem(self):
+        try:
+            key = self._keys[-1]
+        except IndexError:
+            raise KeyError('dictionary is empty')
+
+        val = self[key]
+        del self[key]
+
+        return (key, val)
+
+    def setdefault(self, key, failobj = None):
+        UserDict.setdefault(self, key, failobj)
+        if key not in self._keys: self._keys.append(key)
+
+    def update(self, dict):
+        for (key, val) in dict.items():
+            self.__setitem__(key, val)
+
+    def values(self):
+        return list(map(self.get, self._keys))
+
+class Selector(OrderedDict):
+    """A callable ordered dictionary that maps file suffixes to
+    dictionary values.  We preserve the order in which items are added
+    so that get_suffix() calls always return the first suffix added."""
+    def __call__(self, env, source, ext=None):
+        if ext is None:
+            try:
+                ext = source[0].suffix
+            except IndexError:
+                ext = ""
+        try:
+            return self[ext]
+        except KeyError:
+            # Try to perform Environment substitution on the keys of
+            # the dictionary before giving up.
+            s_dict = {}
+            for (k,v) in self.items():
+                if k is not None:
+                    s_k = env.subst(k)
+                    if s_k in s_dict:
+                        # We only raise an error when variables point
+                        # to the same suffix.  If one suffix is literal
+                        # and a variable suffix contains this literal,
+                        # the literal wins and we don't raise an error.
+                        raise KeyError(s_dict[s_k][0], k, s_k)
+                    s_dict[s_k] = (k,v)
+            try:
+                return s_dict[ext][1]
+            except KeyError:
+                try:
+                    return self[None]
+                except KeyError:
+                    return None
+
+
+if sys.platform == 'cygwin':
+    # On Cygwin, os.path.normcase() lies, so just report back the
+    # fact that the underlying Windows OS is case-insensitive.
+    def case_sensitive_suffixes(s1, s2):
+        return 0
+else:
+    def case_sensitive_suffixes(s1, s2):
+        return (os.path.normcase(s1) != os.path.normcase(s2))
+
+def adjustixes(fname, pre, suf, ensure_suffix=False):
+    if pre:
+        path, fn = os.path.split(os.path.normpath(fname))
+        if fn[:len(pre)] != pre:
+            fname = os.path.join(path, pre + fn)
+    # Only append a suffix if the suffix we're going to add isn't already
+    # there, and if either we've been asked to ensure the specific suffix
+    # is present or there's no suffix on it at all.
+    if suf and fname[-len(suf):] != suf and \
+       (ensure_suffix or not splitext(fname)[1]):
+            fname = fname + suf
+    return fname
+
+
+
+# From Tim Peters,
+# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52560
+# ASPN: Python Cookbook: Remove duplicates from a sequence
+# (Also in the printed Python Cookbook.)
+
+def unique(s):
+    """Return a list of the elements in s, but without duplicates.
+
+    For example, unique([1,2,3,1,2,3]) is some permutation of [1,2,3],
+    unique("abcabc") some permutation of ["a", "b", "c"], and
+    unique(([1, 2], [2, 3], [1, 2])) some permutation of
+    [[2, 3], [1, 2]].
+
+    For best speed, all sequence elements should be hashable.  Then
+    unique() will usually work in linear time.
+
+    If not possible, the sequence elements should enjoy a total
+    ordering, and if list(s).sort() doesn't raise TypeError it's
+    assumed that they do enjoy a total ordering.  Then unique() will
+    usually work in O(N*log2(N)) time.
+
+    If that's not possible either, the sequence elements must support
+    equality-testing.  Then unique() will usually work in quadratic
+    time.
+    """
+
+    n = len(s)
+    if n == 0:
+        return []
+
+    # Try using a dict first, as that's the fastest and will usually
+    # work.  If it doesn't work, it will usually fail quickly, so it
+    # usually doesn't cost much to *try* it.  It requires that all the
+    # sequence elements be hashable, and support equality comparison.
+    u = {}
+    try:
+        for x in s:
+            u[x] = 1
+    except TypeError:
+        pass    # move on to the next method
+    else:
+        return list(u.keys())
+    del u
+
+    # We can't hash all the elements.  Second fastest is to sort,
+    # which brings the equal elements together; then duplicates are
+    # easy to weed out in a single pass.
+    # NOTE:  Python's list.sort() was designed to be efficient in the
+    # presence of many duplicate elements.  This isn't true of all
+    # sort functions in all languages or libraries, so this approach
+    # is more effective in Python than it may be elsewhere.
+    try:
+        t = sorted(s)
+    except TypeError:
+        pass    # move on to the next method
+    else:
+        assert n > 0
+        last = t[0]
+        lasti = i = 1
+        while i < n:
+            if t[i] != last:
+                t[lasti] = last = t[i]
+                lasti = lasti + 1
+            i = i + 1
+        return t[:lasti]
+    del t
+
+    # Brute force is all that's left.
+    u = []
+    for x in s:
+        if x not in u:
+            u.append(x)
+    return u
+
+
+
+# From Alex Martelli,
+# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52560
+# ASPN: Python Cookbook: Remove duplicates from a sequence
+# First comment, dated 2001/10/13.
+# (Also in the printed Python Cookbook.)
+
+def uniquer(seq, idfun=None):
+    if idfun is None:
+        def idfun(x): return x
+    seen = {}
+    result = []
+    for item in seq:
+        marker = idfun(item)
+        # in old Python versions:
+        # if seen.has_key(marker)
+        # but in new ones:
+        if marker in seen: continue
+        seen[marker] = 1
+        result.append(item)
+    return result
+
+# A more efficient implementation of Alex's uniquer(), this avoids the
+# idfun() argument and function-call overhead by assuming that all
+# items in the sequence are hashable.
+
+def uniquer_hashables(seq):
+    seen = {}
+    result = []
+    for item in seq:
+        #if not item in seen:
+        if item not in seen:
+            seen[item] = 1
+            result.append(item)
+    return result
+
+
+
+# Much of the logic here was originally based on recipe 4.9 from the
+# Python CookBook, but we had to dumb it way down for Python 1.5.2.
+class LogicalLines(object):
+
+    def __init__(self, fileobj):
+        self.fileobj = fileobj
+
+    def readline(self):
+        result = []
+        while True:
+            line = self.fileobj.readline()
+            if not line:
+                break
+            if line[-2:] == '\\\n':
+                result.append(line[:-2])
+            else:
+                result.append(line)
+                break
+        return ''.join(result)
+
+    def readlines(self):
+        result = []
+        while True:
+            line = self.readline()
+            if not line:
+                break
+            result.append(line)
+        return result
+
+
+
+class UniqueList(UserList):
+    def __init__(self, seq = []):
+        UserList.__init__(self, seq)
+        self.unique = True
+    def __make_unique(self):
+        if not self.unique:
+            self.data = uniquer_hashables(self.data)
+            self.unique = True
+    def __lt__(self, other):
+        self.__make_unique()
+        return UserList.__lt__(self, other)
+    def __le__(self, other):
+        self.__make_unique()
+        return UserList.__le__(self, other)
+    def __eq__(self, other):
+        self.__make_unique()
+        return UserList.__eq__(self, other)
+    def __ne__(self, other):
+        self.__make_unique()
+        return UserList.__ne__(self, other)
+    def __gt__(self, other):
+        self.__make_unique()
+        return UserList.__gt__(self, other)
+    def __ge__(self, other):
+        self.__make_unique()
+        return UserList.__ge__(self, other)
+    def __cmp__(self, other):
+        self.__make_unique()
+        return UserList.__cmp__(self, other)
+    def __len__(self):
+        self.__make_unique()
+        return UserList.__len__(self)
+    def __getitem__(self, i):
+        self.__make_unique()
+        return UserList.__getitem__(self, i)
+    def __setitem__(self, i, item):
+        UserList.__setitem__(self, i, item)
+        self.unique = False
+    def __getslice__(self, i, j):
+        self.__make_unique()
+        return UserList.__getslice__(self, i, j)
+    def __setslice__(self, i, j, other):
+        UserList.__setslice__(self, i, j, other)
+        self.unique = False
+    def __add__(self, other):
+        result = UserList.__add__(self, other)
+        result.unique = False
+        return result
+    def __radd__(self, other):
+        result = UserList.__radd__(self, other)
+        result.unique = False
+        return result
+    def __iadd__(self, other):
+        result = UserList.__iadd__(self, other)
+        result.unique = False
+        return result
+    def __mul__(self, other):
+        result = UserList.__mul__(self, other)
+        result.unique = False
+        return result
+    def __rmul__(self, other):
+        result = UserList.__rmul__(self, other)
+        result.unique = False
+        return result
+    def __imul__(self, other):
+        result = UserList.__imul__(self, other)
+        result.unique = False
+        return result
+    def append(self, item):
+        UserList.append(self, item)
+        self.unique = False
+    def insert(self, i):
+        UserList.insert(self, i)
+        self.unique = False
+    def count(self, item):
+        self.__make_unique()
+        return UserList.count(self, item)
+    def index(self, item):
+        self.__make_unique()
+        return UserList.index(self, item)
+    def reverse(self):
+        self.__make_unique()
+        UserList.reverse(self)
+    def sort(self, *args, **kwds):
+        self.__make_unique()
+        return UserList.sort(self, *args, **kwds)
+    def extend(self, other):
+        UserList.extend(self, other)
+        self.unique = False
+
+
+class Unbuffered(object):
+    """
+    A proxy class that wraps a file object, flushing after every write,
+    and delegating everything else to the wrapped object.
+    """
+    def __init__(self, file):
+        self.file = file
+        self.softspace = 0  ## backward compatibility; not supported in Py3k
+    def write(self, arg):
+        try:
+            self.file.write(arg)
+            self.file.flush()
+        except IOError:
+            # Stdout might be connected to a pipe that has been closed
+            # by now. The most likely reason for the pipe being closed
+            # is that the user has press ctrl-c. It this is the case,
+            # then SCons is currently shutdown. We therefore ignore
+            # IOError's here so that SCons can continue and shutdown
+            # properly so that the .sconsign is correctly written
+            # before SCons exits.
+            pass
+    def __getattr__(self, attr):
+        return getattr(self.file, attr)
+
+def make_path_relative(path):
+    """ makes an absolute path name to a relative pathname.
+    """
+    if os.path.isabs(path):
+        drive_s,path = os.path.splitdrive(path)
+
+        import re
+        if not drive_s:
+            path=re.compile("/*(.*)").findall(path)[0]
+        else:
+            path=path[1:]
+
+    assert( not os.path.isabs( path ) ), path
+    return path
+
+
+
+# The original idea for AddMethod() and RenameFunction() come from the
+# following post to the ActiveState Python Cookbook:
+#
+#	ASPN: Python Cookbook : Install bound methods in an instance
+#	http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/223613
+#
+# That code was a little fragile, though, so the following changes
+# have been wrung on it:
+#
+# * Switched the installmethod() "object" and "function" arguments,
+#   so the order reflects that the left-hand side is the thing being
+#   "assigned to" and the right-hand side is the value being assigned.
+#
+# * Changed explicit type-checking to the "try: klass = object.__class__"
+#   block in installmethod() below so that it still works with the
+#   old-style classes that SCons uses.
+#
+# * Replaced the by-hand creation of methods and functions with use of
+#   the "new" module, as alluded to in Alex Martelli's response to the
+#   following Cookbook post:
+#
+#	ASPN: Python Cookbook : Dynamically added methods to a class
+#	http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/81732
+
+def AddMethod(obj, function, name=None):
+    """
+    Adds either a bound method to an instance or an unbound method to
+    a class. If name is ommited the name of the specified function
+    is used by default.
+    Example:
+      a = A()
+      def f(self, x, y):
+        self.z = x + y
+      AddMethod(f, A, "add")
+      a.add(2, 4)
+      print a.z
+      AddMethod(lambda self, i: self.l[i], a, "listIndex")
+      print a.listIndex(5)
+    """
+    if name is None:
+        name = function.func_name
+    else:
+        function = RenameFunction(function, name)
+
+    if hasattr(obj, '__class__') and obj.__class__ is not type:
+        # "obj" is an instance, so it gets a bound method.
+        setattr(obj, name, MethodType(function, obj, obj.__class__))
+    else:
+        # "obj" is a class, so it gets an unbound method.
+        setattr(obj, name, MethodType(function, None, obj))
+
+def RenameFunction(function, name):
+    """
+    Returns a function identical to the specified function, but with
+    the specified name.
+    """
+    return FunctionType(function.func_code,
+                        function.func_globals,
+                        name,
+                        function.func_defaults)
+
+
+md5 = False
+def MD5signature(s):
+    return str(s)
+
+def MD5filesignature(fname, chunksize=65536):
+    f = open(fname, "rb")
+    result = f.read()
+    f.close()
+    return result
+
+try:
+    import hashlib
+except ImportError:
+    pass
+else:
+    if hasattr(hashlib, 'md5'):
+        md5 = True
+        def MD5signature(s):
+            m = hashlib.md5()
+            m.update(str(s))
+            return m.hexdigest()
+
+        def MD5filesignature(fname, chunksize=65536):
+            m = hashlib.md5()
+            f = open(fname, "rb")
+            while True:
+                blck = f.read(chunksize)
+                if not blck:
+                    break
+                m.update(str(blck))
+            f.close()
+            return m.hexdigest()
+            
+def MD5collect(signatures):
+    """
+    Collects a list of signatures into an aggregate signature.
+
+    signatures - a list of signatures
+    returns - the aggregate signature
+    """
+    if len(signatures) == 1:
+        return signatures[0]
+    else:
+        return MD5signature(', '.join(signatures))
+
+
+
+def silent_intern(x):
+    """
+    Perform sys.intern() on the passed argument and return the result.
+    If the input is ineligible (e.g. a unicode string) the original argument is
+    returned and no exception is thrown.
+    """
+    try:
+        return sys.intern(x)
+    except TypeError:
+        return x
+
+
+
+# From Dinu C. Gherman,
+# Python Cookbook, second edition, recipe 6.17, p. 277.
+# Also:
+# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/68205
+# ASPN: Python Cookbook: Null Object Design Pattern
+
+#TODO??? class Null(object):
+class Null(object):
+    """ Null objects always and reliably "do nothing." """
+    def __new__(cls, *args, **kwargs):
+        if not '_instance' in vars(cls):
+            cls._instance = super(Null, cls).__new__(cls, *args, **kwargs)
+        return cls._instance
+    def __init__(self, *args, **kwargs):
+        pass
+    def __call__(self, *args, **kwargs):
+        return self
+    def __repr__(self):
+        return "Null(0x%08X)" % id(self)
+    def __nonzero__(self):
+        return False
+    def __getattr__(self, name):
+        return self
+    def __setattr__(self, name, value):
+        return self
+    def __delattr__(self, name):
+        return self
+
+class NullSeq(Null):
+    def __len__(self):
+        return 0
+    def __iter__(self):
+        return iter(())
+    def __getitem__(self, i):
+        return self
+    def __delitem__(self, i):
+        return self
+    def __setitem__(self, i, v):
+        return self
+
+
+del __revision__
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Variables/BoolVariable.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Variables/BoolVariable.py
new file mode 100644
index 0000000..63b2e7b
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Variables/BoolVariable.py
@@ -0,0 +1,89 @@
+"""engine.SCons.Variables.BoolVariable
+
+This file defines the option type for SCons implementing true/false values.
+
+Usage example:
+
+  opts = Variables()
+  opts.Add(BoolVariable('embedded', 'build for an embedded system', 0))
+  ...
+  if env['embedded'] == 1:
+    ...
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Variables/BoolVariable.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__all__ = ['BoolVariable',]
+
+import SCons.Errors
+
+__true_strings  = ('y', 'yes', 'true', 't', '1', 'on' , 'all' )
+__false_strings = ('n', 'no', 'false', 'f', '0', 'off', 'none')
+
+
+def _text2bool(val):
+    """
+    Converts strings to True/False depending on the 'truth' expressed by
+    the string. If the string can't be converted, the original value
+    will be returned.
+
+    See '__true_strings' and '__false_strings' for values considered
+    'true' or 'false respectivly.
+
+    This is usable as 'converter' for SCons' Variables.
+    """
+    lval = val.lower()
+    if lval in __true_strings: return True
+    if lval in __false_strings: return False
+    raise ValueError("Invalid value for boolean option: %s" % val)
+
+
+def _validator(key, val, env):
+    """
+    Validates the given value to be either '0' or '1'.
+    
+    This is usable as 'validator' for SCons' Variables.
+    """
+    if not env[key] in (True, False):
+        raise SCons.Errors.UserError(
+            'Invalid value for boolean option %s: %s' % (key, env[key]))
+
+
+def BoolVariable(key, help, default):
+    """
+    The input parameters describe a boolen option, thus they are
+    returned with the correct converter and validator appended. The
+    'help' text will by appended by '(yes|no) to show the valid
+    valued. The result is usable for input to opts.Add().
+    """
+    return (key, '%s (yes|no)' % help, default,
+            _validator, _text2bool)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Variables/EnumVariable.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Variables/EnumVariable.py
new file mode 100644
index 0000000..27865ec
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Variables/EnumVariable.py
@@ -0,0 +1,103 @@
+"""engine.SCons.Variables.EnumVariable
+
+This file defines the option type for SCons allowing only specified
+input-values.
+
+Usage example:
+
+  opts = Variables()
+  opts.Add(EnumVariable('debug', 'debug output and symbols', 'no',
+                      allowed_values=('yes', 'no', 'full'),
+                      map={}, ignorecase=2))
+  ...
+  if env['debug'] == 'full':
+    ...
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Variables/EnumVariable.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__all__ = ['EnumVariable',]
+
+
+import SCons.Errors
+
+def _validator(key, val, env, vals):
+    if not val in vals:
+        raise SCons.Errors.UserError(
+            'Invalid value for option %s: %s' % (key, val))
+
+
+def EnumVariable(key, help, default, allowed_values, map={}, ignorecase=0):
+    """
+    The input parameters describe a option with only certain values
+    allowed. They are returned with an appropriate converter and
+    validator appended. The result is usable for input to
+    Variables.Add().
+
+    'key' and 'default' are the values to be passed on to Variables.Add().
+
+    'help' will be appended by the allowed values automatically
+
+    'allowed_values' is a list of strings, which are allowed as values
+    for this option.
+
+    The 'map'-dictionary may be used for converting the input value
+    into canonical values (eg. for aliases).
+
+    'ignorecase' defines the behaviour of the validator:
+
+    If ignorecase == 0, the validator/converter are case-sensitive.
+    If ignorecase == 1, the validator/converter are case-insensitive.
+    If ignorecase == 2, the validator/converter is case-insensitive and
+                        the converted value will always be lower-case.
+
+    The 'validator' tests whether the value is in the list of allowed
+    values. The 'converter' converts input values according to the
+    given 'map'-dictionary (unmapped input values are returned
+    unchanged). 
+    """
+    help = '%s (%s)' % (help, '|'.join(allowed_values))
+    # define validator
+    if ignorecase >= 1:
+        validator = lambda key, val, env: \
+                    _validator(key, val.lower(), env, allowed_values)
+    else:
+        validator = lambda key, val, env: \
+                    _validator(key, val, env, allowed_values)
+    # define converter
+    if ignorecase == 2:
+        converter = lambda val: map.get(val.lower(), val).lower()
+    elif ignorecase == 1:
+        converter = lambda val: map.get(val.lower(), val)
+    else:
+        converter = lambda val: map.get(val, val)
+    return (key, help, default, validator, converter)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Variables/ListVariable.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Variables/ListVariable.py
new file mode 100644
index 0000000..17db4a0
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Variables/ListVariable.py
@@ -0,0 +1,135 @@
+"""engine.SCons.Variables.ListVariable
+
+This file defines the option type for SCons implementing 'lists'.
+
+A 'list' option may either be 'all', 'none' or a list of names
+separated by comma. After the option has been processed, the option
+value holds either the named list elements, all list elemens or no
+list elements at all.
+
+Usage example:
+
+  list_of_libs = Split('x11 gl qt ical')
+
+  opts = Variables()
+  opts.Add(ListVariable('shared',
+                      'libraries to build as shared libraries',
+                      'all',
+                      elems = list_of_libs))
+  ...
+  for lib in list_of_libs:
+     if lib in env['shared']:
+         env.SharedObject(...)
+     else:
+         env.Object(...)
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Variables/ListVariable.py 5183 2010/11/25 14:46:21 bdeegan"
+
+# Know Bug: This should behave like a Set-Type, but does not really,
+# since elements can occur twice.
+
+__all__ = ['ListVariable',]
+
+import collections
+
+import SCons.Util
+
+
+class _ListVariable(collections.UserList):
+    def __init__(self, initlist=[], allowedElems=[]):
+        collections.UserList.__init__(self, [_f for _f in initlist if _f])
+        self.allowedElems = sorted(allowedElems)
+
+    def __cmp__(self, other):
+        raise NotImplementedError
+    def __eq__(self, other):
+        raise NotImplementedError
+    def __ge__(self, other):
+        raise NotImplementedError
+    def __gt__(self, other):
+        raise NotImplementedError
+    def __le__(self, other):
+        raise NotImplementedError
+    def __lt__(self, other):
+        raise NotImplementedError
+    def __str__(self):
+        if len(self) == 0:
+            return 'none'
+        self.data.sort()
+        if self.data == self.allowedElems:
+            return 'all'
+        else:
+            return ','.join(self)
+    def prepare_to_store(self):
+        return self.__str__()
+
+def _converter(val, allowedElems, mapdict):
+    """
+    """
+    if val == 'none':
+        val = []
+    elif val == 'all':
+        val = allowedElems
+    else:
+        val = [_f for _f in val.split(',') if _f]
+        val = [mapdict.get(v, v) for v in val]
+        notAllowed = [v for v in val if not v in allowedElems]
+        if notAllowed:
+            raise ValueError("Invalid value(s) for option: %s" %
+                             ','.join(notAllowed))
+    return _ListVariable(val, allowedElems)
+
+
+## def _validator(key, val, env):
+##     """
+##     """
+##     # todo: write validater for pgk list
+##     return 1
+
+
+def ListVariable(key, help, default, names, map={}):
+    """
+    The input parameters describe a 'package list' option, thus they
+    are returned with the correct converter and validater appended. The
+    result is usable for input to opts.Add() .
+
+    A 'package list' option may either be 'all', 'none' or a list of
+    package names (separated by space).
+    """
+    names_str = 'allowed names: %s' % ' '.join(names)
+    if SCons.Util.is_List(default):
+        default = ','.join(default)
+    help = '\n    '.join(
+        (help, '(all|none|comma-separated list of names)', names_str))
+    return (key, help, default,
+            None, #_validator,
+            lambda val: _converter(val, names, map))
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Variables/PackageVariable.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Variables/PackageVariable.py
new file mode 100644
index 0000000..6da64f0
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Variables/PackageVariable.py
@@ -0,0 +1,106 @@
+"""engine.SCons.Variables.PackageVariable
+
+This file defines the option type for SCons implementing 'package
+activation'.
+
+To be used whenever a 'package' may be enabled/disabled and the
+package path may be specified.
+
+Usage example:
+
+  Examples:
+      x11=no   (disables X11 support)
+      x11=yes  (will search for the package installation dir)
+      x11=/usr/local/X11 (will check this path for existance)
+
+  To replace autoconf's --with-xxx=yyy 
+
+  opts = Variables()
+  opts.Add(PackageVariable('x11',
+                         'use X11 installed here (yes = search some places',
+                         'yes'))
+  ...
+  if env['x11'] == True:
+      dir = ... search X11 in some standard places ...
+      env['x11'] = dir 
+  if env['x11']:
+      ... build with x11 ...
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Variables/PackageVariable.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__all__ = ['PackageVariable',]
+
+import SCons.Errors
+
+__enable_strings  = ('1', 'yes', 'true',  'on', 'enable', 'search')
+__disable_strings = ('0', 'no',  'false', 'off', 'disable')
+
+def _converter(val):
+    """
+    """
+    lval = val.lower()
+    if lval in __enable_strings: return True
+    if lval in __disable_strings: return False
+    #raise ValueError("Invalid value for boolean option: %s" % val)
+    return val
+
+
+def _validator(key, val, env, searchfunc):
+    # NB: searchfunc is currenty undocumented and unsupported
+    """
+    """
+    # todo: write validator, check for path
+    import os
+    if env[key] is True:
+        if searchfunc:
+            env[key] = searchfunc(key, val)
+    elif env[key] and not os.path.exists(val):
+        raise SCons.Errors.UserError(
+            'Path does not exist for option %s: %s' % (key, val))
+
+
+def PackageVariable(key, help, default, searchfunc=None):
+    # NB: searchfunc is currenty undocumented and unsupported
+    """
+    The input parameters describe a 'package list' option, thus they
+    are returned with the correct converter and validator appended. The
+    result is usable for input to opts.Add() .
+
+    A 'package list' option may either be 'all', 'none' or a list of
+    package names (seperated by space).
+    """
+    help = '\n    '.join(
+        (help, '( yes | no | /path/to/%s )' % key))
+    return (key, help, default,
+            lambda k, v, e: _validator(k,v,e,searchfunc),
+            _converter)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Variables/PathVariable.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Variables/PathVariable.py
new file mode 100644
index 0000000..bf08362
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Variables/PathVariable.py
@@ -0,0 +1,147 @@
+"""SCons.Variables.PathVariable
+
+This file defines an option type for SCons implementing path settings.
+
+To be used whenever a a user-specified path override should be allowed.
+
+Arguments to PathVariable are:
+  option-name  = name of this option on the command line (e.g. "prefix")
+  option-help  = help string for option
+  option-dflt  = default value for this option
+  validator    = [optional] validator for option value.  Predefined
+                 validators are:
+
+                     PathAccept -- accepts any path setting; no validation
+                     PathIsDir  -- path must be an existing directory
+                     PathIsDirCreate -- path must be a dir; will create
+                     PathIsFile -- path must be a file
+                     PathExists -- path must exist (any type) [default]
+
+                 The validator is a function that is called and which
+                 should return True or False to indicate if the path
+                 is valid.  The arguments to the validator function
+                 are: (key, val, env).  The key is the name of the
+                 option, the val is the path specified for the option,
+                 and the env is the env to which the Otions have been
+                 added.
+
+Usage example:
+
+  Examples:
+      prefix=/usr/local
+
+  opts = Variables()
+
+  opts = Variables()
+  opts.Add(PathVariable('qtdir',
+                      'where the root of Qt is installed',
+                      qtdir, PathIsDir))
+  opts.Add(PathVariable('qt_includes',
+                      'where the Qt includes are installed',
+                      '$qtdir/includes', PathIsDirCreate))
+  opts.Add(PathVariable('qt_libraries',
+                      'where the Qt library is installed',
+                      '$qtdir/lib'))
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Variables/PathVariable.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__all__ = ['PathVariable',]
+
+import os
+import os.path
+
+import SCons.Errors
+
+class _PathVariableClass(object):
+
+    def PathAccept(self, key, val, env):
+        """Accepts any path, no checking done."""
+        pass
+    
+    def PathIsDir(self, key, val, env):
+        """Validator to check if Path is a directory."""
+        if not os.path.isdir(val):
+            if os.path.isfile(val):
+                m = 'Directory path for option %s is a file: %s'
+            else:
+                m = 'Directory path for option %s does not exist: %s'
+            raise SCons.Errors.UserError(m % (key, val))
+
+    def PathIsDirCreate(self, key, val, env):
+        """Validator to check if Path is a directory,
+           creating it if it does not exist."""
+        if os.path.isfile(val):
+            m = 'Path for option %s is a file, not a directory: %s'
+            raise SCons.Errors.UserError(m % (key, val))
+        if not os.path.isdir(val):
+            os.makedirs(val)
+
+    def PathIsFile(self, key, val, env):
+        """validator to check if Path is a file"""
+        if not os.path.isfile(val):
+            if os.path.isdir(val):
+                m = 'File path for option %s is a directory: %s'
+            else:
+                m = 'File path for option %s does not exist: %s'
+            raise SCons.Errors.UserError(m % (key, val))
+
+    def PathExists(self, key, val, env):
+        """validator to check if Path exists"""
+        if not os.path.exists(val):
+            m = 'Path for option %s does not exist: %s'
+            raise SCons.Errors.UserError(m % (key, val))
+
+    def __call__(self, key, help, default, validator=None):
+        # NB: searchfunc is currenty undocumented and unsupported
+        """
+        The input parameters describe a 'path list' option, thus they
+        are returned with the correct converter and validator appended. The
+        result is usable for input to opts.Add() .
+
+        The 'default' option specifies the default path to use if the
+        user does not specify an override with this option.
+
+        validator is a validator, see this file for examples
+        """
+        if validator is None:
+            validator = self.PathExists
+
+        if SCons.Util.is_List(key) or SCons.Util.is_Tuple(key):
+            return (key, '%s ( /path/to/%s )' % (help, key[0]), default,
+                    validator, None)
+        else:
+            return (key, '%s ( /path/to/%s )' % (help, key), default,
+                    validator, None)
+
+PathVariable = _PathVariableClass()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Variables/__init__.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Variables/__init__.py
new file mode 100644
index 0000000..8ebc5a4
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Variables/__init__.py
@@ -0,0 +1,312 @@
+"""engine.SCons.Variables
+
+This file defines the Variables class that is used to add user-friendly
+customizable variables to an SCons build.
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Variables/__init__.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os.path
+import sys
+
+import SCons.Environment
+import SCons.Errors
+import SCons.Util
+import SCons.Warnings
+
+from BoolVariable import BoolVariable  # okay
+from EnumVariable import EnumVariable  # okay
+from ListVariable import ListVariable  # naja
+from PackageVariable import PackageVariable # naja
+from PathVariable import PathVariable # okay
+
+
+class Variables(object):
+    instance=None
+
+    """
+    Holds all the options, updates the environment with the variables,
+    and renders the help text.
+    """
+    def __init__(self, files=[], args={}, is_global=1):
+        """
+        files - [optional] List of option configuration files to load
+            (backward compatibility) If a single string is passed it is
+                                     automatically placed in a file list
+        """
+        self.options = []
+        self.args = args
+        if not SCons.Util.is_List(files):
+            if files:
+                files = [ files ]
+            else:
+                files = []
+        self.files = files
+        self.unknown = {}
+
+        # create the singleton instance
+        if is_global:
+            self=Variables.instance
+
+            if not Variables.instance:
+                Variables.instance=self
+
+    def _do_add(self, key, help="", default=None, validator=None, converter=None):
+        class Variable(object):
+            pass
+
+        option = Variable()
+
+        # if we get a list or a tuple, we take the first element as the
+        # option key and store the remaining in aliases.
+        if SCons.Util.is_List(key) or SCons.Util.is_Tuple(key):
+            option.key     = key[0]
+            option.aliases = key[1:]
+        else:
+            option.key     = key
+            option.aliases = [ key ]
+        option.help = help
+        option.default = default
+        option.validator = validator
+        option.converter = converter
+
+        self.options.append(option)
+        
+        # options might be added after the 'unknown' dict has been set up,
+        # so we remove the key and all its aliases from that dict
+        for alias in list(option.aliases) + [ option.key ]:
+            if alias in self.unknown:
+                del self.unknown[alias]
+
+    def keys(self):
+        """
+        Returns the keywords for the options
+        """
+        return [o.key for o in self.options]
+
+    def Add(self, key, help="", default=None, validator=None, converter=None, **kw):
+        """
+        Add an option.
+
+        key - the name of the variable, or a list or tuple of arguments
+        help - optional help text for the options
+        default - optional default value
+        validator - optional function that is called to validate the option's value
+                    Called with (key, value, environment)
+        converter - optional function that is called to convert the option's value before
+                    putting it in the environment.
+        """
+
+        if SCons.Util.is_List(key) or isinstance(key, tuple):
+            self._do_add(*key)
+            return
+
+        if not SCons.Util.is_String(key) or \
+            not SCons.Environment.is_valid_construction_var(key):
+                raise SCons.Errors.UserError("Illegal Variables.Add() key `%s'" % str(key))
+
+        self._do_add(key, help, default, validator, converter)
+
+    def AddVariables(self, *optlist):
+        """
+        Add a list of options.
+
+        Each list element is a tuple/list of arguments to be passed on
+        to the underlying method for adding options.
+
+        Example:
+          opt.AddVariables(
+            ('debug', '', 0),
+            ('CC', 'The C compiler'),
+            ('VALIDATE', 'An option for testing validation', 'notset',
+             validator, None),
+            )
+        """
+        for o in optlist:
+            self._do_add(*o)
+
+
+    def Update(self, env, args=None):
+        """
+        Update an environment with the option variables.
+
+        env - the environment to update.
+        """
+
+        values = {}
+
+        # first set the defaults:
+        for option in self.options:
+            if not option.default is None:
+                values[option.key] = option.default
+
+        # next set the value specified in the options file
+        for filename in self.files:
+            if os.path.exists(filename):
+                dir = os.path.split(os.path.abspath(filename))[0]
+                if dir:
+                    sys.path.insert(0, dir)
+                try:
+                    values['__name__'] = filename
+                    exec open(filename, 'rU').read() in {}, values
+                finally:
+                    if dir:
+                        del sys.path[0]
+                    del values['__name__']
+
+        # set the values specified on the command line
+        if args is None:
+            args = self.args
+
+        for arg, value in args.items():
+            added = False
+            for option in self.options:
+                if arg in list(option.aliases) + [ option.key ]:
+                    values[option.key] = value
+                    added = True
+            if not added:
+                self.unknown[arg] = value
+
+        # put the variables in the environment:
+        # (don't copy over variables that are not declared as options)
+        for option in self.options:
+            try:
+                env[option.key] = values[option.key]
+            except KeyError:
+                pass
+
+        # Call the convert functions:
+        for option in self.options:
+            if option.converter and option.key in values:
+                value = env.subst('${%s}'%option.key)
+                try:
+                    try:
+                        env[option.key] = option.converter(value)
+                    except TypeError:
+                        env[option.key] = option.converter(value, env)
+                except ValueError, x:
+                    raise SCons.Errors.UserError('Error converting option: %s\n%s'%(option.key, x))
+
+
+        # Finally validate the values:
+        for option in self.options:
+            if option.validator and option.key in values:
+                option.validator(option.key, env.subst('${%s}'%option.key), env)
+
+    def UnknownVariables(self):
+        """
+        Returns any options in the specified arguments lists that
+        were not known, declared options in this object.
+        """
+        return self.unknown
+
+    def Save(self, filename, env):
+        """
+        Saves all the options in the given file.  This file can
+        then be used to load the options next run.  This can be used
+        to create an option cache file.
+
+        filename - Name of the file to save into
+        env - the environment get the option values from
+        """
+
+        # Create the file and write out the header
+        try:
+            fh = open(filename, 'w')
+
+            try:
+                # Make an assignment in the file for each option
+                # within the environment that was assigned a value
+                # other than the default.
+                for option in self.options:
+                    try:
+                        value = env[option.key]
+                        try:
+                            prepare = value.prepare_to_store
+                        except AttributeError:
+                            try:
+                                eval(repr(value))
+                            except KeyboardInterrupt:
+                                raise
+                            except:
+                                # Convert stuff that has a repr() that
+                                # cannot be evaluated into a string
+                                value = SCons.Util.to_String(value)
+                        else:
+                            value = prepare()
+
+                        defaultVal = env.subst(SCons.Util.to_String(option.default))
+                        if option.converter:
+                            defaultVal = option.converter(defaultVal)
+
+                        if str(env.subst('${%s}' % option.key)) != str(defaultVal):
+                            fh.write('%s = %s\n' % (option.key, repr(value)))
+                    except KeyError:
+                        pass
+            finally:
+                fh.close()
+
+        except IOError, x:
+            raise SCons.Errors.UserError('Error writing options to file: %s\n%s' % (filename, x))
+
+    def GenerateHelpText(self, env, sort=None):
+        """
+        Generate the help text for the options.
+
+        env - an environment that is used to get the current values
+              of the options.
+        """
+
+        if sort:
+            options = sorted(self.options, key=lambda x: x.key)
+        else:
+            options = self.options
+
+        def format(opt, self=self, env=env):
+            if opt.key in env:
+                actual = env.subst('${%s}' % opt.key)
+            else:
+                actual = None
+            return self.FormatVariableHelpText(env, opt.key, opt.help, opt.default, actual, opt.aliases)
+        lines = [_f for _f in map(format, options) if _f]
+
+        return ''.join(lines)
+
+    format  = '\n%s: %s\n    default: %s\n    actual: %s\n'
+    format_ = '\n%s: %s\n    default: %s\n    actual: %s\n    aliases: %s\n'
+
+    def FormatVariableHelpText(self, env, key, help, default, actual, aliases=[]):
+        # Don't display the key name itself as an alias.
+        aliases = [a for a in aliases if a != key]
+        if len(aliases)==0:
+            return self.format % (key, help, default, actual)
+        else:
+            return self.format_ % (key, help, default, actual, aliases)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/Warnings.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/Warnings.py
new file mode 100644
index 0000000..33b1473
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/Warnings.py
@@ -0,0 +1,246 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+"""SCons.Warnings
+
+This file implements the warnings framework for SCons.
+
+"""
+
+__revision__ = "src/engine/SCons/Warnings.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import sys
+
+import SCons.Errors
+
+class Warning(SCons.Errors.UserError):
+    pass
+
+class WarningOnByDefault(Warning):
+    pass
+
+
+# NOTE:  If you add a new warning class, add it to the man page, too!
+
+class CacheWriteErrorWarning(Warning):
+    pass
+
+class CorruptSConsignWarning(WarningOnByDefault):
+    pass
+
+class DependencyWarning(Warning):
+    pass
+
+class DuplicateEnvironmentWarning(WarningOnByDefault):
+    pass
+
+class FutureReservedVariableWarning(WarningOnByDefault):
+    pass
+
+class LinkWarning(WarningOnByDefault):
+    pass
+
+class MisleadingKeywordsWarning(WarningOnByDefault):
+    pass
+
+class MissingSConscriptWarning(WarningOnByDefault):
+    pass
+
+class NoMD5ModuleWarning(WarningOnByDefault):
+    pass
+
+class NoMetaclassSupportWarning(WarningOnByDefault):
+    pass
+
+class NoObjectCountWarning(WarningOnByDefault):
+    pass
+
+class NoParallelSupportWarning(WarningOnByDefault):
+    pass
+
+class ReservedVariableWarning(WarningOnByDefault):
+    pass
+
+class StackSizeWarning(WarningOnByDefault):
+    pass
+
+class VisualCMissingWarning(WarningOnByDefault):
+    pass
+
+# Used when MSVC_VERSION and MSVS_VERSION do not point to the
+# same version (MSVS_VERSION is deprecated)
+class VisualVersionMismatch(WarningOnByDefault):
+    pass
+
+class VisualStudioMissingWarning(Warning):
+    pass
+
+class FortranCxxMixWarning(LinkWarning):
+    pass
+
+
+# Deprecation warnings
+
+class FutureDeprecatedWarning(Warning):
+    pass
+
+class DeprecatedWarning(Warning):
+    pass
+
+class MandatoryDeprecatedWarning(DeprecatedWarning):
+    pass
+
+
+# Special case; base always stays DeprecatedWarning
+class PythonVersionWarning(DeprecatedWarning):
+    pass
+
+class DeprecatedSourceCodeWarning(FutureDeprecatedWarning):
+    pass
+
+class DeprecatedBuildDirWarning(DeprecatedWarning):
+    pass
+
+class TaskmasterNeedsExecuteWarning(DeprecatedWarning):
+    pass
+
+class DeprecatedCopyWarning(MandatoryDeprecatedWarning):
+    pass
+
+class DeprecatedOptionsWarning(MandatoryDeprecatedWarning):
+    pass
+
+class DeprecatedSourceSignaturesWarning(MandatoryDeprecatedWarning):
+    pass
+
+class DeprecatedTargetSignaturesWarning(MandatoryDeprecatedWarning):
+    pass
+
+class DeprecatedDebugOptionsWarning(MandatoryDeprecatedWarning):
+    pass
+
+class DeprecatedSigModuleWarning(MandatoryDeprecatedWarning):
+    pass
+
+class DeprecatedBuilderKeywordsWarning(MandatoryDeprecatedWarning):
+    pass
+
+
+# The below is a list of 2-tuples.  The first element is a class object.
+# The second element is true if that class is enabled, false if it is disabled.
+_enabled = []
+
+# If set, raise the warning as an exception
+_warningAsException = 0
+
+# If not None, a function to call with the warning
+_warningOut = None
+
+def suppressWarningClass(clazz):
+    """Suppresses all warnings that are of type clazz or
+    derived from clazz."""
+    _enabled.insert(0, (clazz, 0))
+
+def enableWarningClass(clazz):
+    """Enables all warnings that are of type clazz or
+    derived from clazz."""
+    _enabled.insert(0, (clazz, 1))
+
+def warningAsException(flag=1):
+    """Turn warnings into exceptions.  Returns the old value of the flag."""
+    global _warningAsException
+    old = _warningAsException
+    _warningAsException = flag
+    return old
+
+def warn(clazz, *args):
+    global _enabled, _warningAsException, _warningOut
+
+    warning = clazz(args)
+    for clazz, flag in _enabled:
+        if isinstance(warning, clazz):
+            if flag:
+                if _warningAsException:
+                    raise warning
+
+                if _warningOut:
+                    _warningOut(warning)
+            break
+
+def process_warn_strings(arguments):
+    """Process string specifications of enabling/disabling warnings,
+    as passed to the --warn option or the SetOption('warn') function.
+    
+
+    An argument to this option should be of the form <warning-class>
+    or no-<warning-class>.  The warning class is munged in order
+    to get an actual class name from the classes above, which we
+    need to pass to the {enable,disable}WarningClass() functions.
+    The supplied <warning-class> is split on hyphens, each element
+    is capitalized, then smushed back together.  Then the string
+    "Warning" is appended to get the class name.
+
+    For example, 'deprecated' will enable the DeprecatedWarning
+    class.  'no-dependency' will disable the DependencyWarning class.
+
+    As a special case, --warn=all and --warn=no-all will enable or
+    disable (respectively) the base Warning class of all warnings.
+
+    """
+
+    def _capitalize(s):
+        if s[:5] == "scons":
+            return "SCons" + s[5:]
+        else:
+            return s.capitalize()
+
+    for arg in arguments:
+
+        elems = arg.lower().split('-')
+        enable = 1
+        if elems[0] == 'no':
+            enable = 0
+            del elems[0]
+
+        if len(elems) == 1 and elems[0] == 'all':
+            class_name = "Warning"
+        else:
+            class_name = ''.join(map(_capitalize, elems)) + "Warning"
+        try:
+            clazz = globals()[class_name]
+        except KeyError:
+            sys.stderr.write("No warning type: '%s'\n" % arg)
+        else:
+            if enable:
+                enableWarningClass(clazz)
+            elif issubclass(clazz, MandatoryDeprecatedWarning):
+                fmt = "Can not disable mandataory warning: '%s'\n"
+                sys.stderr.write(fmt % arg)
+            else:
+                suppressWarningClass(clazz)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/__init__.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/__init__.py
new file mode 100644
index 0000000..42e0f5b
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/__init__.py
@@ -0,0 +1,49 @@
+"""SCons
+
+The main package for the SCons software construction utility.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/__init__.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__version__ = "2.1.0.alpha.20101125"
+
+__build__ = "r5183[MODIFIED]"
+
+__buildsys__ = "ubuntu"
+
+__date__ = "2010/11/25 14:46:21"
+
+__developer__ = "bdeegan"
+
+# make sure compatibility is always in place
+import SCons.compat
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/__init__.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/__init__.py
new file mode 100644
index 0000000..207e7c4
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/__init__.py
@@ -0,0 +1,237 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__doc__ = """
+SCons compatibility package for old Python versions
+
+This subpackage holds modules that provide backwards-compatible
+implementations of various things that we'd like to use in SCons but which
+only show up in later versions of Python than the early, old version(s)
+we still support.
+
+Other code will not generally reference things in this package through
+the SCons.compat namespace.  The modules included here add things to
+the builtins namespace or the global module list so that the rest
+of our code can use the objects and names imported here regardless of
+Python version.
+
+Simply enough, things that go in the builtins name space come from
+our _scons_builtins module.
+
+The rest of the things here will be in individual compatibility modules
+that are either: 1) suitably modified copies of the future modules that
+we want to use; or 2) backwards compatible re-implementations of the
+specific portions of a future module's API that we want to use.
+
+GENERAL WARNINGS:  Implementations of functions in the SCons.compat
+modules are *NOT* guaranteed to be fully compliant with these functions in
+later versions of Python.  We are only concerned with adding functionality
+that we actually use in SCons, so be wary if you lift this code for
+other uses.  (That said, making these more nearly the same as later,
+official versions is still a desirable goal, we just don't need to be
+obsessive about it.)
+
+We name the compatibility modules with an initial '_scons_' (for example,
+_scons_subprocess.py is our compatibility module for subprocess) so
+that we can still try to import the real module name and fall back to
+our compatibility module if we get an ImportError.  The import_as()
+function defined below loads the module as the "real" name (without the
+'_scons'), after which all of the "import {module}" statements in the
+rest of our code will find our pre-loaded compatibility module.
+"""
+
+__revision__ = "src/engine/SCons/compat/__init__.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import os
+import sys
+import imp   # Use the "imp" module to protect imports from fixers.
+
+def import_as(module, name):
+    """
+    Imports the specified module (from our local directory) as the
+    specified name, returning the loaded module object.
+    """
+    dir = os.path.split(__file__)[0]
+    return imp.load_module(name, *imp.find_module(module, [dir]))
+
+def rename_module(new, old):
+    """
+    Attempts to import the old module and load it under the new name.
+    Used for purely cosmetic name changes in Python 3.x.
+    """
+    try:
+        sys.modules[new] = imp.load_module(old, *imp.find_module(old))
+        return True
+    except ImportError:
+        return False
+
+
+rename_module('builtins', '__builtin__')
+import _scons_builtins
+
+
+try:
+    import hashlib
+except ImportError:
+    # Pre-2.5 Python has no hashlib module.
+    try:
+        import_as('_scons_hashlib', 'hashlib')
+    except ImportError:
+        # If we failed importing our compatibility module, it probably
+        # means this version of Python has no md5 module.  Don't do
+        # anything and let the higher layer discover this fact, so it
+        # can fall back to using timestamp.
+        pass
+
+try:
+    set
+except NameError:
+    # Pre-2.4 Python has no native set type
+    import_as('_scons_sets', 'sets')
+    import builtins, sets
+    builtins.set = sets.Set
+
+
+try:
+    import collections
+except ImportError:
+    # Pre-2.4 Python has no collections module.
+    import_as('_scons_collections', 'collections')
+else:
+    try:
+        collections.UserDict
+    except AttributeError:
+        exec('from UserDict import UserDict as _UserDict')
+        collections.UserDict = _UserDict
+        del _UserDict
+    try:
+        collections.UserList
+    except AttributeError:
+        exec('from UserList import UserList as _UserList')
+        collections.UserList = _UserList
+        del _UserList
+    try:
+        collections.UserString
+    except AttributeError:
+        exec('from UserString import UserString as _UserString')
+        collections.UserString = _UserString
+        del _UserString
+
+
+try:
+    import io
+except ImportError:
+    # Pre-2.6 Python has no io module.
+    import_as('_scons_io', 'io')
+
+
+try:
+    os.devnull
+except AttributeError:
+    # Pre-2.4 Python has no os.devnull attribute
+    _names = sys.builtin_module_names
+    if 'posix' in _names:
+        os.devnull = '/dev/null'
+    elif 'nt' in _names:
+        os.devnull = 'nul'
+    os.path.devnull = os.devnull
+try:
+    os.path.lexists
+except AttributeError:
+    # Pre-2.4 Python has no os.path.lexists function
+    def lexists(path):
+        return os.path.exists(path) or os.path.islink(path)
+    os.path.lexists = lexists
+
+
+# When we're using the '-3' option during regression tests, importing
+# cPickle gives a warning no matter how it's done, so always use the
+# real profile module, whether it's fast or not.
+if os.environ.get('SCONS_HORRIBLE_REGRESSION_TEST_HACK') is None:
+    # Not a regression test with '-3', so try to use faster version.
+    # In 3.x, 'pickle' automatically loads the fast version if available.
+    rename_module('pickle', 'cPickle')
+
+
+# In 3.x, 'profile' automatically loads the fast version if available.
+rename_module('profile', 'cProfile')
+
+
+# Before Python 3.0, the 'queue' module was named 'Queue'.
+rename_module('queue', 'Queue')
+
+
+# Before Python 3.0, the 'winreg' module was named '_winreg'
+rename_module('winreg', '_winreg')
+
+
+try:
+    import subprocess
+except ImportError:
+    # Pre-2.4 Python has no subprocess module.
+    import_as('_scons_subprocess', 'subprocess')
+
+try:
+    sys.intern
+except AttributeError:
+    # Pre-2.6 Python has no sys.intern() function.
+    import builtins
+    try:
+        sys.intern = builtins.intern
+    except AttributeError:
+        # Pre-2.x Python has no builtin intern() function.
+        def intern(x):
+           return x
+        sys.intern = intern
+        del intern
+try:
+    sys.maxsize
+except AttributeError:
+    # Pre-2.6 Python has no sys.maxsize attribute
+    # Wrapping sys in () is silly, but protects it from 2to3 renames fixer
+    sys.maxsize = (sys).maxint
+
+
+if os.environ.get('SCONS_HORRIBLE_REGRESSION_TEST_HACK') is not None:
+    # We can't apply the 'callable' fixer until the floor is 2.6, but the
+    # '-3' option to Python 2.6 and 2.7 generates almost ten thousand
+    # warnings.  This hack allows us to run regression tests with the '-3'
+    # option by replacing the callable() built-in function with a hack
+    # that performs the same function but doesn't generate the warning.
+    # Note that this hack is ONLY intended to be used for regression
+    # testing, and should NEVER be used for real runs.
+    from types import ClassType
+    def callable(obj):
+        if hasattr(obj, '__call__'): return True
+        if isinstance(obj, (ClassType, type)): return True
+        return False
+    import builtins
+    builtins.callable = callable
+    del callable
+
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_builtins.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_builtins.py
new file mode 100644
index 0000000..52549e7
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_builtins.py
@@ -0,0 +1,150 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+# Portions of the following are derived from the compat.py file in
+# Twisted, under the following copyright:
+#
+# Copyright (c) 2001-2004 Twisted Matrix Laboratories
+
+__doc__ = """
+Compatibility idioms for builtins names
+
+This module adds names to the builtins module for things that we want
+to use in SCons but which don't show up until later Python versions than
+the earliest ones we support.
+
+This module checks for the following builtins names:
+
+        all()
+        any()
+        sorted()
+        memoryview()
+
+Implementations of functions are *NOT* guaranteed to be fully compliant
+with these functions in later versions of Python.  We are only concerned
+with adding functionality that we actually use in SCons, so be wary
+if you lift this code for other uses.  (That said, making these more
+nearly the same as later, official versions is still a desirable goal,
+we just don't need to be obsessive about it.)
+
+If you're looking at this with pydoc and various names don't show up in
+the FUNCTIONS or DATA output, that means those names are already built in
+to this version of Python and we don't need to add them from this module.
+"""
+
+__revision__ = "src/engine/SCons/compat/_scons_builtins.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import builtins
+
+try:
+    all
+except NameError:
+    # Pre-2.5 Python has no all() function.
+    def all(iterable):
+        """
+        Returns True if all elements of the iterable are true.
+        """
+        for element in iterable:
+            if not element:
+                return False
+        return True
+    builtins.all = all
+    all = all
+
+try:
+    any
+except NameError:
+    # Pre-2.5 Python has no any() function.
+    def any(iterable):
+        """
+        Returns True if any element of the iterable is true.
+        """
+        for element in iterable:
+            if element:
+                return True
+        return False
+    builtins.any = any
+    any = any
+
+try:
+    memoryview
+except NameError:
+    # Pre-2.7 doesn't have the memoryview() built-in.
+    class memoryview(object):
+        def __init__(self, obj):
+            # wrapping buffer in () keeps the fixer from changing it
+            self.obj = (buffer)(obj)
+        def __getitem__(self, indx):
+            if isinstance(indx, slice):
+                return self.obj[indx.start:indx.stop]
+            else:
+                return self.obj[indx]
+    builtins.memoryview = memoryview
+
+try:
+    sorted
+except NameError:
+    # Pre-2.4 Python has no sorted() function.
+    #
+    # The pre-2.4 Python list.sort() method does not support
+    # list.sort(key=) nor list.sort(reverse=) keyword arguments, so
+    # we must implement the functionality of those keyword arguments
+    # by hand instead of passing them to list.sort().
+    def sorted(iterable, cmp=None, key=None, reverse=False):
+        if key is not None:
+            result = [(key(x), x) for x in iterable]
+        else:
+            result = iterable[:]
+        if cmp is None:
+            # Pre-2.3 Python does not support list.sort(None).
+            result.sort()
+        else:
+            result.sort(cmp)
+        if key is not None:
+            result = [t1 for t0,t1 in result]
+        if reverse:
+            result.reverse()
+        return result
+    builtins.sorted = sorted
+
+#if sys.version_info[:3] in ((2, 2, 0), (2, 2, 1)):
+#    def lstrip(s, c=string.whitespace):
+#        while s and s[0] in c:
+#            s = s[1:]
+#        return s
+#    def rstrip(s, c=string.whitespace):
+#        while s and s[-1] in c:
+#            s = s[:-1]
+#        return s
+#    def strip(s, c=string.whitespace, l=lstrip, r=rstrip):
+#        return l(r(s, c), c)
+#
+#    object.__setattr__(str, 'lstrip', lstrip)
+#    object.__setattr__(str, 'rstrip', rstrip)
+#    object.__setattr__(str, 'strip', strip)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_collections.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_collections.py
new file mode 100644
index 0000000..1216731
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_collections.py
@@ -0,0 +1,45 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__doc__ = """
+collections compatibility module for older (pre-2.4) Python versions
+
+This does not not NOT (repeat, *NOT*) provide complete collections
+functionality.  It only wraps the portions of collections functionality
+used by SCons, in an interface that looks enough like collections for
+our purposes.
+"""
+
+__revision__ = "src/engine/SCons/compat/_scons_collections.py 5183 2010/11/25 14:46:21 bdeegan"
+
+# Use exec to hide old names from fixers.
+exec("""if True:
+            from UserDict import UserDict
+            from UserList import UserList
+            from UserString import UserString""")
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_dbm.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_dbm.py
new file mode 100644
index 0000000..39e3011
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_dbm.py
@@ -0,0 +1,45 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__doc__ = """
+dbm compatibility module for Python versions that don't have dbm.
+
+This does not not NOT (repeat, *NOT*) provide complete dbm functionality.
+It's just a stub on which to hang just enough pieces of dbm functionality
+that the whichdb.whichdb() implementstation in the various 2.X versions of
+Python won't blow up even if dbm wasn't compiled in.
+"""
+
+__revision__ = "src/engine/SCons/compat/_scons_dbm.py 5183 2010/11/25 14:46:21 bdeegan"
+
+class error(Exception):
+    pass
+
+def open(*args, **kw):
+    raise error()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_hashlib.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_hashlib.py
new file mode 100644
index 0000000..70af329
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_hashlib.py
@@ -0,0 +1,76 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__doc__ = """
+hashlib backwards-compatibility module for older (pre-2.5) Python versions
+
+This does not not NOT (repeat, *NOT*) provide complete hashlib
+functionality.  It only wraps the portions of MD5 functionality used
+by SCons, in an interface that looks like hashlib (or enough for our
+purposes, anyway).  In fact, this module will raise an ImportError if
+the underlying md5 module isn't available.
+"""
+
+__revision__ = "src/engine/SCons/compat/_scons_hashlib.py 5183 2010/11/25 14:46:21 bdeegan"
+
+import md5
+from string import hexdigits
+
+class md5obj(object):
+
+    md5_module = md5
+
+    def __init__(self, name, string=''):
+        if not name in ('MD5', 'md5'):
+            raise ValueError("unsupported hash type")
+        self.name = 'md5'
+        self.m = self.md5_module.md5()
+
+    def __repr__(self):
+        return '<%s HASH object @ %#x>' % (self.name, id(self))
+
+    def copy(self):
+        import copy
+        result = copy.copy(self)
+        result.m = self.m.copy()
+        return result
+
+    def digest(self):
+        return self.m.digest()
+
+    def update(self, arg):
+        return self.m.update(arg)
+
+    def hexdigest(self):
+        return self.m.hexdigest()
+
+new = md5obj
+
+def md5(string=''):
+    return md5obj('md5', string)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_io.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_io.py
new file mode 100644
index 0000000..f230ef9
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_io.py
@@ -0,0 +1,45 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__doc__ = """
+io compatibility module for older (pre-2.6) Python versions
+
+This does not not NOT (repeat, *NOT*) provide complete io
+functionality.  It only wraps the portions of io functionality used
+by SCons, in an interface that looks enough like io for our purposes.
+"""
+
+__revision__ = "src/engine/SCons/compat/_scons_io.py 5183 2010/11/25 14:46:21 bdeegan"
+
+# Use the "imp" module to protect the imports below from fixers.
+import imp
+
+_cStringIO = imp.load_module('cStringIO', *imp.find_module('cStringIO'))
+StringIO = _cStringIO.StringIO
+del _cStringIO
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_sets.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_sets.py
new file mode 100644
index 0000000..0fde994
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_sets.py
@@ -0,0 +1,563 @@
+"""Classes to represent arbitrary sets (including sets of sets).
+
+This module implements sets using dictionaries whose values are
+ignored.  The usual operations (union, intersection, deletion, etc.)
+are provided as both methods and operators.
+
+Important: sets are not sequences!  While they support 'x in s',
+'len(s)', and 'for x in s', none of those operations are unique for
+sequences; for example, mappings support all three as well.  The
+characteristic operation for sequences is subscripting with small
+integers: s[i], for i in range(len(s)).  Sets don't support
+subscripting at all.  Also, sequences allow multiple occurrences and
+their elements have a definite order; sets on the other hand don't
+record multiple occurrences and don't remember the order of element
+insertion (which is why they don't support s[i]).
+
+The following classes are provided:
+
+BaseSet -- All the operations common to both mutable and immutable
+    sets. This is an abstract class, not meant to be directly
+    instantiated.
+
+Set -- Mutable sets, subclass of BaseSet; not hashable.
+
+ImmutableSet -- Immutable sets, subclass of BaseSet; hashable.
+    An iterable argument is mandatory to create an ImmutableSet.
+
+_TemporarilyImmutableSet -- A wrapper around a Set, hashable,
+    giving the same hash value as the immutable set equivalent
+    would have.  Do not use this class directly.
+
+Only hashable objects can be added to a Set. In particular, you cannot
+really add a Set as an element to another Set; if you try, what is
+actually added is an ImmutableSet built from it (it compares equal to
+the one you tried adding).
+
+When you ask if `x in y' where x is a Set and y is a Set or
+ImmutableSet, x is wrapped into a _TemporarilyImmutableSet z, and
+what's tested is actually `z in y'.
+
+"""
+
+# Code history:
+#
+# - Greg V. Wilson wrote the first version, using a different approach
+#   to the mutable/immutable problem, and inheriting from dict.
+#
+# - Alex Martelli modified Greg's version to implement the current
+#   Set/ImmutableSet approach, and make the data an attribute.
+#
+# - Guido van Rossum rewrote much of the code, made some API changes,
+#   and cleaned up the docstrings.
+#
+# - Raymond Hettinger added a number of speedups and other
+#   improvements.
+
+# protect this import from the fixers...
+exec('from itertools import ifilterfalse as filterfalse')
+
+__all__ = ['BaseSet', 'Set', 'ImmutableSet']
+
+class BaseSet(object):
+    """Common base class for mutable and immutable sets."""
+
+    __slots__ = ['_data']
+
+    # Constructor
+
+    def __init__(self):
+        """This is an abstract class."""
+        # Don't call this from a concrete subclass!
+        if self.__class__ is BaseSet:
+            raise TypeError("BaseSet is an abstract class.  "
+                              "Use Set or ImmutableSet.")
+
+    # Standard protocols: __len__, __repr__, __str__, __iter__
+
+    def __len__(self):
+        """Return the number of elements of a set."""
+        return len(self._data)
+
+    def __repr__(self):
+        """Return string representation of a set.
+
+        This looks like 'Set([<list of elements>])'.
+        """
+        return self._repr()
+
+    # __str__ is the same as __repr__
+    __str__ = __repr__
+
+    def _repr(self, sort_them=False):
+        elements = list(self._data.keys())
+        if sort_them:
+            elements.sort()
+        return '%s(%r)' % (self.__class__.__name__, elements)
+
+    def __iter__(self):
+        """Return an iterator over the elements or a set.
+
+        This is the keys iterator for the underlying dict.
+        """
+        # Wrapping name in () prevents fixer from "fixing" this
+        return (self._data.iterkeys)()
+
+    # Three-way comparison is not supported.  However, because __eq__ is
+    # tried before __cmp__, if Set x == Set y, x.__eq__(y) returns True and
+    # then cmp(x, y) returns 0 (Python doesn't actually call __cmp__ in this
+    # case).
+
+    def __cmp__(self, other):
+        raise TypeError("can't compare sets using cmp()")
+
+    # Equality comparisons using the underlying dicts.  Mixed-type comparisons
+    # are allowed here, where Set == z for non-Set z always returns False,
+    # and Set != z always True.  This allows expressions like "x in y" to
+    # give the expected result when y is a sequence of mixed types, not
+    # raising a pointless TypeError just because y contains a Set, or x is
+    # a Set and y contain's a non-set ("in" invokes only __eq__).
+    # Subtle:  it would be nicer if __eq__ and __ne__ could return
+    # NotImplemented instead of True or False.  Then the other comparand
+    # would get a chance to determine the result, and if the other comparand
+    # also returned NotImplemented then it would fall back to object address
+    # comparison (which would always return False for __eq__ and always
+    # True for __ne__).  However, that doesn't work, because this type
+    # *also* implements __cmp__:  if, e.g., __eq__ returns NotImplemented,
+    # Python tries __cmp__ next, and the __cmp__ here then raises TypeError.
+
+    def __eq__(self, other):
+        if isinstance(other, BaseSet):
+            return self._data == other._data
+        else:
+            return False
+
+    def __ne__(self, other):
+        if isinstance(other, BaseSet):
+            return self._data != other._data
+        else:
+            return True
+
+    # Copying operations
+
+    def copy(self):
+        """Return a shallow copy of a set."""
+        result = self.__class__()
+        result._data.update(self._data)
+        return result
+
+    __copy__ = copy # For the copy module
+
+    def __deepcopy__(self, memo):
+        """Return a deep copy of a set; used by copy module."""
+        # This pre-creates the result and inserts it in the memo
+        # early, in case the deep copy recurses into another reference
+        # to this same set.  A set can't be an element of itself, but
+        # it can certainly contain an object that has a reference to
+        # itself.
+        from copy import deepcopy
+        result = self.__class__()
+        memo[id(self)] = result
+        data = result._data
+        value = True
+        for elt in self:
+            data[deepcopy(elt, memo)] = value
+        return result
+
+    # Standard set operations: union, intersection, both differences.
+    # Each has an operator version (e.g. __or__, invoked with |) and a
+    # method version (e.g. union).
+    # Subtle:  Each pair requires distinct code so that the outcome is
+    # correct when the type of other isn't suitable.  For example, if
+    # we did "union = __or__" instead, then Set().union(3) would return
+    # NotImplemented instead of raising TypeError (albeit that *why* it
+    # raises TypeError as-is is also a bit subtle).
+
+    def __or__(self, other):
+        """Return the union of two sets as a new set.
+
+        (I.e. all elements that are in either set.)
+        """
+        if not isinstance(other, BaseSet):
+            return NotImplemented
+        return self.union(other)
+
+    def union(self, other):
+        """Return the union of two sets as a new set.
+
+        (I.e. all elements that are in either set.)
+        """
+        result = self.__class__(self)
+        result._update(other)
+        return result
+
+    def __and__(self, other):
+        """Return the intersection of two sets as a new set.
+
+        (I.e. all elements that are in both sets.)
+        """
+        if not isinstance(other, BaseSet):
+            return NotImplemented
+        return self.intersection(other)
+
+    def intersection(self, other):
+        """Return the intersection of two sets as a new set.
+
+        (I.e. all elements that are in both sets.)
+        """
+        if not isinstance(other, BaseSet):
+            other = Set(other)
+        if len(self) <= len(other):
+            little, big = self, other
+        else:
+            little, big = other, self
+        common = iter(filter(big._data.has_key, little))
+        return self.__class__(common)
+
+    def __xor__(self, other):
+        """Return the symmetric difference of two sets as a new set.
+
+        (I.e. all elements that are in exactly one of the sets.)
+        """
+        if not isinstance(other, BaseSet):
+            return NotImplemented
+        return self.symmetric_difference(other)
+
+    def symmetric_difference(self, other):
+        """Return the symmetric difference of two sets as a new set.
+
+        (I.e. all elements that are in exactly one of the sets.)
+        """
+        result = self.__class__()
+        data = result._data
+        value = True
+        selfdata = self._data
+        try:
+            otherdata = other._data
+        except AttributeError:
+            otherdata = Set(other)._data
+        for elt in filterfalse(otherdata.has_key, selfdata):
+            data[elt] = value
+        for elt in filterfalse(selfdata.has_key, otherdata):
+            data[elt] = value
+        return result
+
+    def  __sub__(self, other):
+        """Return the difference of two sets as a new Set.
+
+        (I.e. all elements that are in this set and not in the other.)
+        """
+        if not isinstance(other, BaseSet):
+            return NotImplemented
+        return self.difference(other)
+
+    def difference(self, other):
+        """Return the difference of two sets as a new Set.
+
+        (I.e. all elements that are in this set and not in the other.)
+        """
+        result = self.__class__()
+        data = result._data
+        try:
+            otherdata = other._data
+        except AttributeError:
+            otherdata = Set(other)._data
+        value = True
+        for elt in filterfalse(otherdata.has_key, self):
+            data[elt] = value
+        return result
+
+    # Membership test
+
+    def __contains__(self, element):
+        """Report whether an element is a member of a set.
+
+        (Called in response to the expression `element in self'.)
+        """
+        try:
+            return element in self._data
+        except TypeError:
+            transform = getattr(element, "__as_temporarily_immutable__", None)
+            if transform is None:
+                raise # re-raise the TypeError exception we caught
+            return transform() in self._data
+
+    # Subset and superset test
+
+    def issubset(self, other):
+        """Report whether another set contains this set."""
+        self._binary_sanity_check(other)
+        if len(self) > len(other):  # Fast check for obvious cases
+            return False
+        for elt in filterfalse(other._data.has_key, self):
+            return False
+        return True
+
+    def issuperset(self, other):
+        """Report whether this set contains another set."""
+        self._binary_sanity_check(other)
+        if len(self) < len(other):  # Fast check for obvious cases
+            return False
+        for elt in filterfalse(self._data.has_key, other):
+            return False
+        return True
+
+    # Inequality comparisons using the is-subset relation.
+    __le__ = issubset
+    __ge__ = issuperset
+
+    def __lt__(self, other):
+        self._binary_sanity_check(other)
+        return len(self) < len(other) and self.issubset(other)
+
+    def __gt__(self, other):
+        self._binary_sanity_check(other)
+        return len(self) > len(other) and self.issuperset(other)
+
+    # Assorted helpers
+
+    def _binary_sanity_check(self, other):
+        # Check that the other argument to a binary operation is also
+        # a set, raising a TypeError otherwise.
+        if not isinstance(other, BaseSet):
+            raise TypeError("Binary operation only permitted between sets")
+
+    def _compute_hash(self):
+        # Calculate hash code for a set by xor'ing the hash codes of
+        # the elements.  This ensures that the hash code does not depend
+        # on the order in which elements are added to the set.  This is
+        # not called __hash__ because a BaseSet should not be hashable;
+        # only an ImmutableSet is hashable.
+        result = 0
+        for elt in self:
+            result ^= hash(elt)
+        return result
+
+    def _update(self, iterable):
+        # The main loop for update() and the subclass __init__() methods.
+        data = self._data
+
+        # Use the fast update() method when a dictionary is available.
+        if isinstance(iterable, BaseSet):
+            data.update(iterable._data)
+            return
+
+        value = True
+
+        if type(iterable) in (list, tuple, xrange):
+            # Optimized: we know that __iter__() and next() can't
+            # raise TypeError, so we can move 'try:' out of the loop.
+            it = iter(iterable)
+            while True:
+                try:
+                    for element in it:
+                        data[element] = value
+                    return
+                except TypeError:
+                    transform = getattr(element, "__as_immutable__", None)
+                    if transform is None:
+                        raise # re-raise the TypeError exception we caught
+                    data[transform()] = value
+        else:
+            # Safe: only catch TypeError where intended
+            for element in iterable:
+                try:
+                    data[element] = value
+                except TypeError:
+                    transform = getattr(element, "__as_immutable__", None)
+                    if transform is None:
+                        raise # re-raise the TypeError exception we caught
+                    data[transform()] = value
+
+
+class ImmutableSet(BaseSet):
+    """Immutable set class."""
+
+    __slots__ = ['_hashcode']
+
+    # BaseSet + hashing
+
+    def __init__(self, iterable=None):
+        """Construct an immutable set from an optional iterable."""
+        self._hashcode = None
+        self._data = {}
+        if iterable is not None:
+            self._update(iterable)
+
+    def __hash__(self):
+        if self._hashcode is None:
+            self._hashcode = self._compute_hash()
+        return self._hashcode
+
+    def __getstate__(self):
+        return self._data, self._hashcode
+
+    def __setstate__(self, state):
+        self._data, self._hashcode = state
+
+class Set(BaseSet):
+    """ Mutable set class."""
+
+    __slots__ = []
+
+    # BaseSet + operations requiring mutability; no hashing
+
+    def __init__(self, iterable=None):
+        """Construct a set from an optional iterable."""
+        self._data = {}
+        if iterable is not None:
+            self._update(iterable)
+
+    def __getstate__(self):
+        # getstate's results are ignored if it is not
+        return self._data,
+
+    def __setstate__(self, data):
+        self._data, = data
+
+    def __hash__(self):
+        """A Set cannot be hashed."""
+        # We inherit object.__hash__, so we must deny this explicitly
+        raise TypeError("Can't hash a Set, only an ImmutableSet.")
+
+    # In-place union, intersection, differences.
+    # Subtle:  The xyz_update() functions deliberately return None,
+    # as do all mutating operations on built-in container types.
+    # The __xyz__ spellings have to return self, though.
+
+    def __ior__(self, other):
+        """Update a set with the union of itself and another."""
+        self._binary_sanity_check(other)
+        self._data.update(other._data)
+        return self
+
+    def union_update(self, other):
+        """Update a set with the union of itself and another."""
+        self._update(other)
+
+    def __iand__(self, other):
+        """Update a set with the intersection of itself and another."""
+        self._binary_sanity_check(other)
+        self._data = (self & other)._data
+        return self
+
+    def intersection_update(self, other):
+        """Update a set with the intersection of itself and another."""
+        if isinstance(other, BaseSet):
+            self &= other
+        else:
+            self._data = (self.intersection(other))._data
+
+    def __ixor__(self, other):
+        """Update a set with the symmetric difference of itself and another."""
+        self._binary_sanity_check(other)
+        self.symmetric_difference_update(other)
+        return self
+
+    def symmetric_difference_update(self, other):
+        """Update a set with the symmetric difference of itself and another."""
+        data = self._data
+        value = True
+        if not isinstance(other, BaseSet):
+            other = Set(other)
+        if self is other:
+            self.clear()
+        for elt in other:
+            if elt in data:
+                del data[elt]
+            else:
+                data[elt] = value
+
+    def __isub__(self, other):
+        """Remove all elements of another set from this set."""
+        self._binary_sanity_check(other)
+        self.difference_update(other)
+        return self
+
+    def difference_update(self, other):
+        """Remove all elements of another set from this set."""
+        data = self._data
+        if not isinstance(other, BaseSet):
+            other = Set(other)
+        if self is other:
+            self.clear()
+        for elt in filter(data.has_key, other):
+            del data[elt]
+
+    # Python dict-like mass mutations: update, clear
+
+    def update(self, iterable):
+        """Add all values from an iterable (such as a list or file)."""
+        self._update(iterable)
+
+    def clear(self):
+        """Remove all elements from this set."""
+        self._data.clear()
+
+    # Single-element mutations: add, remove, discard
+
+    def add(self, element):
+        """Add an element to a set.
+
+        This has no effect if the element is already present.
+        """
+        try:
+            self._data[element] = True
+        except TypeError:
+            transform = getattr(element, "__as_immutable__", None)
+            if transform is None:
+                raise # re-raise the TypeError exception we caught
+            self._data[transform()] = True
+
+    def remove(self, element):
+        """Remove an element from a set; it must be a member.
+
+        If the element is not a member, raise a KeyError.
+        """
+        try:
+            del self._data[element]
+        except TypeError:
+            transform = getattr(element, "__as_temporarily_immutable__", None)
+            if transform is None:
+                raise # re-raise the TypeError exception we caught
+            del self._data[transform()]
+
+    def discard(self, element):
+        """Remove an element from a set if it is a member.
+
+        If the element is not a member, do nothing.
+        """
+        try:
+            self.remove(element)
+        except KeyError:
+            pass
+
+    def pop(self):
+        """Remove and return an arbitrary set element."""
+        return self._data.popitem()[0]
+
+    def __as_immutable__(self):
+        # Return a copy of self as an immutable set
+        return ImmutableSet(self)
+
+    def __as_temporarily_immutable__(self):
+        # Return self wrapped in a temporarily immutable set
+        return _TemporarilyImmutableSet(self)
+
+
+class _TemporarilyImmutableSet(BaseSet):
+    # Wrap a mutable set as if it was temporarily immutable.
+    # This only supplies hashing and equality comparisons.
+
+    def __init__(self, set):
+        self._set = set
+        self._data = set._data  # Needed by ImmutableSet.__eq__()
+
+    def __hash__(self):
+        return self._set._compute_hash()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_subprocess.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_subprocess.py
new file mode 100644
index 0000000..eebe53d
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/compat/_scons_subprocess.py
@@ -0,0 +1,1281 @@
+# subprocess - Subprocesses with accessible I/O streams
+#
+# For more information about this module, see PEP 324.
+#
+# This module should remain compatible with Python 2.2, see PEP 291.
+#
+# Copyright (c) 2003-2005 by Peter Astrand <astrand at lysator.liu.se>
+#
+# Licensed to PSF under a Contributor Agreement.
+# See http://www.python.org/2.4/license for licensing details.
+
+r"""subprocess - Subprocesses with accessible I/O streams
+
+This module allows you to spawn processes, connect to their
+input/output/error pipes, and obtain their return codes.  This module
+intends to replace several other, older modules and functions, like:
+
+os.system
+os.spawn*
+os.popen*
+popen2.*
+commands.*
+
+Information about how the subprocess module can be used to replace these
+modules and functions can be found below.
+
+
+
+Using the subprocess module
+===========================
+This module defines one class called Popen:
+
+class Popen(args, bufsize=0, executable=None,
+            stdin=None, stdout=None, stderr=None,
+            preexec_fn=None, close_fds=False, shell=False,
+            cwd=None, env=None, universal_newlines=False,
+            startupinfo=None, creationflags=0):
+
+
+Arguments are:
+
+args should be a string, or a sequence of program arguments.  The
+program to execute is normally the first item in the args sequence or
+string, but can be explicitly set by using the executable argument.
+
+On UNIX, with shell=False (default): In this case, the Popen class
+uses os.execvp() to execute the child program.  args should normally
+be a sequence.  A string will be treated as a sequence with the string
+as the only item (the program to execute).
+
+On UNIX, with shell=True: If args is a string, it specifies the
+command string to execute through the shell.  If args is a sequence,
+the first item specifies the command string, and any additional items
+will be treated as additional shell arguments.
+
+On Windows: the Popen class uses CreateProcess() to execute the child
+program, which operates on strings.  If args is a sequence, it will be
+converted to a string using the list2cmdline method.  Please note that
+not all MS Windows applications interpret the command line the same
+way: The list2cmdline is designed for applications using the same
+rules as the MS C runtime.
+
+bufsize, if given, has the same meaning as the corresponding argument
+to the built-in open() function: 0 means unbuffered, 1 means line
+buffered, any other positive value means use a buffer of
+(approximately) that size.  A negative bufsize means to use the system
+default, which usually means fully buffered.  The default value for
+bufsize is 0 (unbuffered).
+
+stdin, stdout and stderr specify the executed programs' standard
+input, standard output and standard error file handles, respectively.
+Valid values are PIPE, an existing file descriptor (a positive
+integer), an existing file object, and None.  PIPE indicates that a
+new pipe to the child should be created.  With None, no redirection
+will occur; the child's file handles will be inherited from the
+parent.  Additionally, stderr can be STDOUT, which indicates that the
+stderr data from the applications should be captured into the same
+file handle as for stdout.
+
+If preexec_fn is set to a callable object, this object will be called
+in the child process just before the child is executed.
+
+If close_fds is true, all file descriptors except 0, 1 and 2 will be
+closed before the child process is executed.
+
+if shell is true, the specified command will be executed through the
+shell.
+
+If cwd is not None, the current directory will be changed to cwd
+before the child is executed.
+
+If env is not None, it defines the environment variables for the new
+process.
+
+If universal_newlines is true, the file objects stdout and stderr are
+opened as a text files, but lines may be terminated by any of '\n',
+the Unix end-of-line convention, '\r', the Macintosh convention or
+'\r\n', the Windows convention.  All of these external representations
+are seen as '\n' by the Python program.  Note: This feature is only
+available if Python is built with universal newline support (the
+default).  Also, the newlines attribute of the file objects stdout,
+stdin and stderr are not updated by the communicate() method.
+
+The startupinfo and creationflags, if given, will be passed to the
+underlying CreateProcess() function.  They can specify things such as
+appearance of the main window and priority for the new process.
+(Windows only)
+
+
+This module also defines two shortcut functions:
+
+call(*popenargs, **kwargs):
+    Run command with arguments.  Wait for command to complete, then
+    return the returncode attribute.
+
+    The arguments are the same as for the Popen constructor.  Example:
+
+    retcode = call(["ls", "-l"])
+
+check_call(*popenargs, **kwargs):
+    Run command with arguments.  Wait for command to complete.  If the
+    exit code was zero then return, otherwise raise
+    CalledProcessError.  The CalledProcessError object will have the
+    return code in the returncode attribute.
+
+    The arguments are the same as for the Popen constructor.  Example:
+
+    check_call(["ls", "-l"])
+
+Exceptions
+----------
+Exceptions raised in the child process, before the new program has
+started to execute, will be re-raised in the parent.  Additionally,
+the exception object will have one extra attribute called
+'child_traceback', which is a string containing traceback information
+from the childs point of view.
+
+The most common exception raised is OSError.  This occurs, for
+example, when trying to execute a non-existent file.  Applications
+should prepare for OSErrors.
+
+A ValueError will be raised if Popen is called with invalid arguments.
+
+check_call() will raise CalledProcessError, if the called process
+returns a non-zero return code.
+
+
+Security
+--------
+Unlike some other popen functions, this implementation will never call
+/bin/sh implicitly.  This means that all characters, including shell
+metacharacters, can safely be passed to child processes.
+
+
+Popen objects
+=============
+Instances of the Popen class have the following methods:
+
+poll()
+    Check if child process has terminated.  Returns returncode
+    attribute.
+
+wait()
+    Wait for child process to terminate.  Returns returncode attribute.
+
+communicate(input=None)
+    Interact with process: Send data to stdin.  Read data from stdout
+    and stderr, until end-of-file is reached.  Wait for process to
+    terminate.  The optional stdin argument should be a string to be
+    sent to the child process, or None, if no data should be sent to
+    the child.
+
+    communicate() returns a tuple (stdout, stderr).
+
+    Note: The data read is buffered in memory, so do not use this
+    method if the data size is large or unlimited.
+
+The following attributes are also available:
+
+stdin
+    If the stdin argument is PIPE, this attribute is a file object
+    that provides input to the child process.  Otherwise, it is None.
+
+stdout
+    If the stdout argument is PIPE, this attribute is a file object
+    that provides output from the child process.  Otherwise, it is
+    None.
+
+stderr
+    If the stderr argument is PIPE, this attribute is file object that
+    provides error output from the child process.  Otherwise, it is
+    None.
+
+pid
+    The process ID of the child process.
+
+returncode
+    The child return code.  A None value indicates that the process
+    hasn't terminated yet.  A negative value -N indicates that the
+    child was terminated by signal N (UNIX only).
+
+
+Replacing older functions with the subprocess module
+====================================================
+In this section, "a ==> b" means that b can be used as a replacement
+for a.
+
+Note: All functions in this section fail (more or less) silently if
+the executed program cannot be found; this module raises an OSError
+exception.
+
+In the following examples, we assume that the subprocess module is
+imported with "from subprocess import *".
+
+
+Replacing /bin/sh shell backquote
+---------------------------------
+output=`mycmd myarg`
+==>
+output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
+
+
+Replacing shell pipe line
+-------------------------
+output=`dmesg | grep hda`
+==>
+p1 = Popen(["dmesg"], stdout=PIPE)
+p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
+output = p2.communicate()[0]
+
+
+Replacing os.system()
+---------------------
+sts = os.system("mycmd" + " myarg")
+==>
+p = Popen("mycmd" + " myarg", shell=True)
+pid, sts = os.waitpid(p.pid, 0)
+
+Note:
+
+* Calling the program through the shell is usually not required.
+
+* It's easier to look at the returncode attribute than the
+  exitstatus.
+
+A more real-world example would look like this:
+
+try:
+    retcode = call("mycmd" + " myarg", shell=True)
+    if retcode < 0:
+        print >>sys.stderr, "Child was terminated by signal", -retcode
+    else:
+        print >>sys.stderr, "Child returned", retcode
+except OSError, e:
+    print >>sys.stderr, "Execution failed:", e
+
+
+Replacing os.spawn*
+-------------------
+P_NOWAIT example:
+
+pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
+==>
+pid = Popen(["/bin/mycmd", "myarg"]).pid
+
+
+P_WAIT example:
+
+retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")
+==>
+retcode = call(["/bin/mycmd", "myarg"])
+
+
+Vector example:
+
+os.spawnvp(os.P_NOWAIT, path, args)
+==>
+Popen([path] + args[1:])
+
+
+Environment example:
+
+os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
+==>
+Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
+
+
+Replacing os.popen*
+-------------------
+pipe = os.popen(cmd, mode='r', bufsize)
+==>
+pipe = Popen(cmd, shell=True, bufsize=bufsize, stdout=PIPE).stdout
+
+pipe = os.popen(cmd, mode='w', bufsize)
+==>
+pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin
+
+
+(child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize)
+==>
+p = Popen(cmd, shell=True, bufsize=bufsize,
+          stdin=PIPE, stdout=PIPE, close_fds=True)
+(child_stdin, child_stdout) = (p.stdin, p.stdout)
+
+
+(child_stdin,
+ child_stdout,
+ child_stderr) = os.popen3(cmd, mode, bufsize)
+==>
+p = Popen(cmd, shell=True, bufsize=bufsize,
+          stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
+(child_stdin,
+ child_stdout,
+ child_stderr) = (p.stdin, p.stdout, p.stderr)
+
+
+(child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize)
+==>
+p = Popen(cmd, shell=True, bufsize=bufsize,
+          stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
+(child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)
+
+
+Replacing popen2.*
+------------------
+Note: If the cmd argument to popen2 functions is a string, the command
+is executed through /bin/sh.  If it is a list, the command is directly
+executed.
+
+(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)
+==>
+p = Popen(["somestring"], shell=True, bufsize=bufsize
+          stdin=PIPE, stdout=PIPE, close_fds=True)
+(child_stdout, child_stdin) = (p.stdout, p.stdin)
+
+
+(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)
+==>
+p = Popen(["mycmd", "myarg"], bufsize=bufsize,
+          stdin=PIPE, stdout=PIPE, close_fds=True)
+(child_stdout, child_stdin) = (p.stdout, p.stdin)
+
+The popen2.Popen3 and popen3.Popen4 basically works as subprocess.Popen,
+except that:
+
+* subprocess.Popen raises an exception if the execution fails
+* the capturestderr argument is replaced with the stderr argument.
+* stdin=PIPE and stdout=PIPE must be specified.
+* popen2 closes all filedescriptors by default, but you have to specify
+  close_fds=True with subprocess.Popen.
+
+
+"""
+
+import sys
+mswindows = (sys.platform == "win32")
+
+import os
+import types
+import traceback
+
+# Exception classes used by this module.
+class CalledProcessError(Exception):
+    """This exception is raised when a process run by check_call() returns
+    a non-zero exit status.  The exit status will be stored in the
+    returncode attribute."""
+    def __init__(self, returncode, cmd):
+        self.returncode = returncode
+        self.cmd = cmd
+    def __str__(self):
+        return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode)
+
+
+if mswindows:
+    try:
+        import threading
+    except ImportError:
+        # SCons:  the threading module is only used by the communicate()
+        # method, which we don't actually use, so don't worry if we
+        # can't import it.
+        pass
+    import msvcrt
+    try:
+        # Try to get _subprocess
+        from _subprocess import *
+        class STARTUPINFO(object):
+            dwFlags = 0
+            hStdInput = None
+            hStdOutput = None
+            hStdError = None
+            wShowWindow = 0
+        class pywintypes(object):
+            error = IOError
+    except ImportError:
+        # If not there, then drop back to requiring pywin32
+        # TODO: Should this be wrapped in try as well? To notify user to install
+        #       pywin32 ? With URL to it?
+        import pywintypes
+        from win32api import GetStdHandle, STD_INPUT_HANDLE, \
+                             STD_OUTPUT_HANDLE, STD_ERROR_HANDLE
+        from win32api import GetCurrentProcess, DuplicateHandle, \
+                             GetModuleFileName, GetVersion
+        from win32con import DUPLICATE_SAME_ACCESS, SW_HIDE
+        from win32pipe import CreatePipe
+        from win32process import CreateProcess, STARTUPINFO, \
+                                 GetExitCodeProcess, STARTF_USESTDHANDLES, \
+                                 STARTF_USESHOWWINDOW, CREATE_NEW_CONSOLE
+        from win32event import WaitForSingleObject, INFINITE, WAIT_OBJECT_0
+
+
+else:
+    import select
+    import errno
+    import fcntl
+    import pickle
+
+    try:
+        fcntl.F_GETFD
+    except AttributeError:
+        fcntl.F_GETFD = 1
+
+    try:
+        fcntl.F_SETFD
+    except AttributeError:
+        fcntl.F_SETFD = 2
+
+__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "CalledProcessError"]
+
+try:
+    MAXFD = os.sysconf("SC_OPEN_MAX")
+except KeyboardInterrupt:
+    raise       # SCons:  don't swallow keyboard interrupts
+except:
+    MAXFD = 256
+
+try:
+    isinstance(1, int)
+except TypeError:
+    def is_int(obj):
+        return isinstance(obj, type(1))
+    def is_int_or_long(obj):
+        return type(obj) in (type(1), type(1L))
+else:
+    def is_int(obj):
+        return isinstance(obj, int)
+    def is_int_or_long(obj):
+        return isinstance(obj, (int, long))
+
+try:
+    types.StringTypes
+except AttributeError:
+    try:
+        types.StringTypes = (str, unicode)
+    except NameError:
+        types.StringTypes = (str,)
+def is_string(obj):
+    return isinstance(obj, types.StringTypes)
+
+_active = []
+
+def _cleanup():
+    for inst in _active[:]:
+        if inst.poll(_deadstate=sys.maxsize) >= 0:
+            try:
+                _active.remove(inst)
+            except ValueError:
+                # This can happen if two threads create a new Popen instance.
+                # It's harmless that it was already removed, so ignore.
+                pass
+
+PIPE = -1
+STDOUT = -2
+
+
+def call(*popenargs, **kwargs):
+    """Run command with arguments.  Wait for command to complete, then
+    return the returncode attribute.
+
+    The arguments are the same as for the Popen constructor.  Example:
+
+    retcode = call(["ls", "-l"])
+    """
+    return apply(Popen, popenargs, kwargs).wait()
+
+
+def check_call(*popenargs, **kwargs):
+    """Run command with arguments.  Wait for command to complete.  If
+    the exit code was zero then return, otherwise raise
+    CalledProcessError.  The CalledProcessError object will have the
+    return code in the returncode attribute.
+
+    The arguments are the same as for the Popen constructor.  Example:
+
+    check_call(["ls", "-l"])
+    """
+    retcode = call(*popenargs, **kwargs)
+    cmd = kwargs.get("args")
+    if cmd is None:
+        cmd = popenargs[0]
+    if retcode:
+        raise CalledProcessError(retcode, cmd)
+    return retcode
+
+
+def list2cmdline(seq):
+    """
+    Translate a sequence of arguments into a command line
+    string, using the same rules as the MS C runtime:
+
+    1) Arguments are delimited by white space, which is either a
+       space or a tab.
+
+    2) A string surrounded by double quotation marks is
+       interpreted as a single argument, regardless of white space
+       contained within.  A quoted string can be embedded in an
+       argument.
+
+    3) A double quotation mark preceded by a backslash is
+       interpreted as a literal double quotation mark.
+
+    4) Backslashes are interpreted literally, unless they
+       immediately precede a double quotation mark.
+
+    5) If backslashes immediately precede a double quotation mark,
+       every pair of backslashes is interpreted as a literal
+       backslash.  If the number of backslashes is odd, the last
+       backslash escapes the next double quotation mark as
+       described in rule 3.
+    """
+
+    # See
+    # http://msdn.microsoft.com/library/en-us/vccelng/htm/progs_12.asp
+    result = []
+    needquote = False
+    for arg in seq:
+        bs_buf = []
+
+        # Add a space to separate this argument from the others
+        if result:
+            result.append(' ')
+
+        needquote = (" " in arg) or ("\t" in arg)
+        if needquote:
+            result.append('"')
+
+        for c in arg:
+            if c == '\\':
+                # Don't know if we need to double yet.
+                bs_buf.append(c)
+            elif c == '"':
+                # Double backspaces.
+                result.append('\\' * len(bs_buf)*2)
+                bs_buf = []
+                result.append('\\"')
+            else:
+                # Normal char
+                if bs_buf:
+                    result.extend(bs_buf)
+                    bs_buf = []
+                result.append(c)
+
+        # Add remaining backspaces, if any.
+        if bs_buf:
+            result.extend(bs_buf)
+
+        if needquote:
+            result.extend(bs_buf)
+            result.append('"')
+
+    return ''.join(result)
+
+class Popen(object):
+    def __init__(self, args, bufsize=0, executable=None,
+                 stdin=None, stdout=None, stderr=None,
+                 preexec_fn=None, close_fds=False, shell=False,
+                 cwd=None, env=None, universal_newlines=False,
+                 startupinfo=None, creationflags=0):
+        """Create new Popen instance."""
+        _cleanup()
+
+        self._child_created = False
+        if not is_int_or_long(bufsize):
+            raise TypeError("bufsize must be an integer")
+
+        if mswindows:
+            if preexec_fn is not None:
+                raise ValueError("preexec_fn is not supported on Windows "
+                                 "platforms")
+            if close_fds:
+                raise ValueError("close_fds is not supported on Windows "
+                                 "platforms")
+        else:
+            # POSIX
+            if startupinfo is not None:
+                raise ValueError("startupinfo is only supported on Windows "
+                                 "platforms")
+            if creationflags != 0:
+                raise ValueError("creationflags is only supported on Windows "
+                                 "platforms")
+
+        self.stdin = None
+        self.stdout = None
+        self.stderr = None
+        self.pid = None
+        self.returncode = None
+        self.universal_newlines = universal_newlines
+
+        # Input and output objects. The general principle is like
+        # this:
+        #
+        # Parent                   Child
+        # ------                   -----
+        # p2cwrite   ---stdin--->  p2cread
+        # c2pread    <--stdout---  c2pwrite
+        # errread    <--stderr---  errwrite
+        #
+        # On POSIX, the child objects are file descriptors.  On
+        # Windows, these are Windows file handles.  The parent objects
+        # are file descriptors on both platforms.  The parent objects
+        # are None when not using PIPEs. The child objects are None
+        # when not redirecting.
+
+        (p2cread, p2cwrite,
+         c2pread, c2pwrite,
+         errread, errwrite) = self._get_handles(stdin, stdout, stderr)
+
+        self._execute_child(args, executable, preexec_fn, close_fds,
+                            cwd, env, universal_newlines,
+                            startupinfo, creationflags, shell,
+                            p2cread, p2cwrite,
+                            c2pread, c2pwrite,
+                            errread, errwrite)
+
+        if p2cwrite:
+            self.stdin = os.fdopen(p2cwrite, 'wb', bufsize)
+        if c2pread:
+            if universal_newlines:
+                self.stdout = os.fdopen(c2pread, 'rU', bufsize)
+            else:
+                self.stdout = os.fdopen(c2pread, 'rb', bufsize)
+        if errread:
+            if universal_newlines:
+                self.stderr = os.fdopen(errread, 'rU', bufsize)
+            else:
+                self.stderr = os.fdopen(errread, 'rb', bufsize)
+
+
+    def _translate_newlines(self, data):
+        data = data.replace("\r\n", "\n")
+        data = data.replace("\r", "\n")
+        return data
+
+
+    def __del__(self):
+        if not self._child_created:
+            # We didn't get to successfully create a child process.
+            return
+        # In case the child hasn't been waited on, check if it's done.
+        self.poll(_deadstate=sys.maxsize)
+        if self.returncode is None and _active is not None:
+            # Child is still running, keep us alive until we can wait on it.
+            _active.append(self)
+
+
+    def communicate(self, input=None):
+        """Interact with process: Send data to stdin.  Read data from
+        stdout and stderr, until end-of-file is reached.  Wait for
+        process to terminate.  The optional input argument should be a
+        string to be sent to the child process, or None, if no data
+        should be sent to the child.
+
+        communicate() returns a tuple (stdout, stderr)."""
+
+        # Optimization: If we are only using one pipe, or no pipe at
+        # all, using select() or threads is unnecessary.
+        if [self.stdin, self.stdout, self.stderr].count(None) >= 2:
+            stdout = None
+            stderr = None
+            if self.stdin:
+                if input:
+                    self.stdin.write(input)
+                self.stdin.close()
+            elif self.stdout:
+                stdout = self.stdout.read()
+            elif self.stderr:
+                stderr = self.stderr.read()
+            self.wait()
+            return (stdout, stderr)
+
+        return self._communicate(input)
+
+
+    if mswindows:
+        #
+        # Windows methods
+        #
+        def _get_handles(self, stdin, stdout, stderr):
+            """Construct and return tupel with IO objects:
+            p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
+            """
+            if stdin is None and stdout is None and stderr is None:
+                return (None, None, None, None, None, None)
+
+            p2cread, p2cwrite = None, None
+            c2pread, c2pwrite = None, None
+            errread, errwrite = None, None
+
+            if stdin is None:
+                p2cread = GetStdHandle(STD_INPUT_HANDLE)
+            elif stdin == PIPE:
+                p2cread, p2cwrite = CreatePipe(None, 0)
+                # Detach and turn into fd
+                p2cwrite = p2cwrite.Detach()
+                p2cwrite = msvcrt.open_osfhandle(p2cwrite, 0)
+            elif is_int(stdin):
+                p2cread = msvcrt.get_osfhandle(stdin)
+            else:
+                # Assuming file-like object
+                p2cread = msvcrt.get_osfhandle(stdin.fileno())
+            p2cread = self._make_inheritable(p2cread)
+
+            if stdout is None:
+                c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE)
+            elif stdout == PIPE:
+                c2pread, c2pwrite = CreatePipe(None, 0)
+                # Detach and turn into fd
+                c2pread = c2pread.Detach()
+                c2pread = msvcrt.open_osfhandle(c2pread, 0)
+            elif is_int(stdout):
+                c2pwrite = msvcrt.get_osfhandle(stdout)
+            else:
+                # Assuming file-like object
+                c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
+            c2pwrite = self._make_inheritable(c2pwrite)
+
+            if stderr is None:
+                errwrite = GetStdHandle(STD_ERROR_HANDLE)
+            elif stderr == PIPE:
+                errread, errwrite = CreatePipe(None, 0)
+                # Detach and turn into fd
+                errread = errread.Detach()
+                errread = msvcrt.open_osfhandle(errread, 0)
+            elif stderr == STDOUT:
+                errwrite = c2pwrite
+            elif is_int(stderr):
+                errwrite = msvcrt.get_osfhandle(stderr)
+            else:
+                # Assuming file-like object
+                errwrite = msvcrt.get_osfhandle(stderr.fileno())
+            errwrite = self._make_inheritable(errwrite)
+
+            return (p2cread, p2cwrite,
+                    c2pread, c2pwrite,
+                    errread, errwrite)
+
+
+        def _make_inheritable(self, handle):
+            """Return a duplicate of handle, which is inheritable"""
+            return DuplicateHandle(GetCurrentProcess(), handle,
+                                   GetCurrentProcess(), 0, 1,
+                                   DUPLICATE_SAME_ACCESS)
+
+
+        def _find_w9xpopen(self):
+            """Find and return absolut path to w9xpopen.exe"""
+            w9xpopen = os.path.join(os.path.dirname(GetModuleFileName(0)),
+                                    "w9xpopen.exe")
+            if not os.path.exists(w9xpopen):
+                # Eeek - file-not-found - possibly an embedding
+                # situation - see if we can locate it in sys.exec_prefix
+                w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix),
+                                        "w9xpopen.exe")
+                if not os.path.exists(w9xpopen):
+                    raise RuntimeError("Cannot locate w9xpopen.exe, which is "
+                                       "needed for Popen to work with your "
+                                       "shell or platform.")
+            return w9xpopen
+
+
+        def _execute_child(self, args, executable, preexec_fn, close_fds,
+                           cwd, env, universal_newlines,
+                           startupinfo, creationflags, shell,
+                           p2cread, p2cwrite,
+                           c2pread, c2pwrite,
+                           errread, errwrite):
+            """Execute program (MS Windows version)"""
+
+            if not isinstance(args, types.StringTypes):
+                args = list2cmdline(args)
+
+            # Process startup details
+            if startupinfo is None:
+                startupinfo = STARTUPINFO()
+            if None not in (p2cread, c2pwrite, errwrite):
+                startupinfo.dwFlags = startupinfo.dwFlags | STARTF_USESTDHANDLES
+                startupinfo.hStdInput = p2cread
+                startupinfo.hStdOutput = c2pwrite
+                startupinfo.hStdError = errwrite
+
+            if shell:
+                startupinfo.dwFlags = startupinfo.dwFlags | STARTF_USESHOWWINDOW
+                startupinfo.wShowWindow = SW_HIDE
+                comspec = os.environ.get("COMSPEC", "cmd.exe")
+                args = comspec + " /c " + args
+                if (GetVersion() >= 0x80000000L or
+                        os.path.basename(comspec).lower() == "command.com"):
+                    # Win9x, or using command.com on NT. We need to
+                    # use the w9xpopen intermediate program. For more
+                    # information, see KB Q150956
+                    # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp)
+                    w9xpopen = self._find_w9xpopen()
+                    args = '"%s" %s' % (w9xpopen, args)
+                    # Not passing CREATE_NEW_CONSOLE has been known to
+                    # cause random failures on win9x.  Specifically a
+                    # dialog: "Your program accessed mem currently in
+                    # use at xxx" and a hopeful warning about the
+                    # stability of your system.  Cost is Ctrl+C wont
+                    # kill children.
+                    creationflags = creationflags | CREATE_NEW_CONSOLE
+
+            # Start the process
+            try:
+                hp, ht, pid, tid = CreateProcess(executable, args,
+                                         # no special security
+                                         None, None,
+                                         # must inherit handles to pass std
+                                         # handles
+                                         1,
+                                         creationflags,
+                                         env,
+                                         cwd,
+                                         startupinfo)
+            except pywintypes.error, e:
+                # Translate pywintypes.error to WindowsError, which is
+                # a subclass of OSError.  FIXME: We should really
+                # translate errno using _sys_errlist (or simliar), but
+                # how can this be done from Python?
+                raise WindowsError(*e.args)
+
+            # Retain the process handle, but close the thread handle
+            self._child_created = True
+            self._handle = hp
+            self.pid = pid
+            ht.Close()
+
+            # Child is launched. Close the parent's copy of those pipe
+            # handles that only the child should have open.  You need
+            # to make sure that no handles to the write end of the
+            # output pipe are maintained in this process or else the
+            # pipe will not close when the child process exits and the
+            # ReadFile will hang.
+            if p2cread is not None:
+                p2cread.Close()
+            if c2pwrite is not None:
+                c2pwrite.Close()
+            if errwrite is not None:
+                errwrite.Close()
+
+
+        def poll(self, _deadstate=None):
+            """Check if child process has terminated.  Returns returncode
+            attribute."""
+            if self.returncode is None:
+                if WaitForSingleObject(self._handle, 0) == WAIT_OBJECT_0:
+                    self.returncode = GetExitCodeProcess(self._handle)
+            return self.returncode
+
+
+        def wait(self):
+            """Wait for child process to terminate.  Returns returncode
+            attribute."""
+            if self.returncode is None:
+                obj = WaitForSingleObject(self._handle, INFINITE)
+                self.returncode = GetExitCodeProcess(self._handle)
+            return self.returncode
+
+
+        def _readerthread(self, fh, buffer):
+            buffer.append(fh.read())
+
+
+        def _communicate(self, input):
+            stdout = None # Return
+            stderr = None # Return
+
+            if self.stdout:
+                stdout = []
+                stdout_thread = threading.Thread(target=self._readerthread,
+                                                 args=(self.stdout, stdout))
+                stdout_thread.setDaemon(True)
+                stdout_thread.start()
+            if self.stderr:
+                stderr = []
+                stderr_thread = threading.Thread(target=self._readerthread,
+                                                 args=(self.stderr, stderr))
+                stderr_thread.setDaemon(True)
+                stderr_thread.start()
+
+            if self.stdin:
+                if input is not None:
+                    self.stdin.write(input)
+                self.stdin.close()
+
+            if self.stdout:
+                stdout_thread.join()
+            if self.stderr:
+                stderr_thread.join()
+
+            # All data exchanged.  Translate lists into strings.
+            if stdout is not None:
+                stdout = stdout[0]
+            if stderr is not None:
+                stderr = stderr[0]
+
+            # Translate newlines, if requested.  We cannot let the file
+            # object do the translation: It is based on stdio, which is
+            # impossible to combine with select (unless forcing no
+            # buffering).
+            if self.universal_newlines and hasattr(file, 'newlines'):
+                if stdout:
+                    stdout = self._translate_newlines(stdout)
+                if stderr:
+                    stderr = self._translate_newlines(stderr)
+
+            self.wait()
+            return (stdout, stderr)
+
+    else:
+        #
+        # POSIX methods
+        #
+        def _get_handles(self, stdin, stdout, stderr):
+            """Construct and return tupel with IO objects:
+            p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
+            """
+            p2cread, p2cwrite = None, None
+            c2pread, c2pwrite = None, None
+            errread, errwrite = None, None
+
+            if stdin is None:
+                pass
+            elif stdin == PIPE:
+                p2cread, p2cwrite = os.pipe()
+            elif is_int(stdin):
+                p2cread = stdin
+            else:
+                # Assuming file-like object
+                p2cread = stdin.fileno()
+
+            if stdout is None:
+                pass
+            elif stdout == PIPE:
+                c2pread, c2pwrite = os.pipe()
+            elif is_int(stdout):
+                c2pwrite = stdout
+            else:
+                # Assuming file-like object
+                c2pwrite = stdout.fileno()
+
+            if stderr is None:
+                pass
+            elif stderr == PIPE:
+                errread, errwrite = os.pipe()
+            elif stderr == STDOUT:
+                errwrite = c2pwrite
+            elif is_int(stderr):
+                errwrite = stderr
+            else:
+                # Assuming file-like object
+                errwrite = stderr.fileno()
+
+            return (p2cread, p2cwrite,
+                    c2pread, c2pwrite,
+                    errread, errwrite)
+
+
+        def _set_cloexec_flag(self, fd):
+            try:
+                cloexec_flag = fcntl.FD_CLOEXEC
+            except AttributeError:
+                cloexec_flag = 1
+
+            old = fcntl.fcntl(fd, fcntl.F_GETFD)
+            fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag)
+
+
+        def _close_fds(self, but):
+            for i in range(3, MAXFD):
+                if i == but:
+                    continue
+                try:
+                    os.close(i)
+                except KeyboardInterrupt:
+                    raise       # SCons:  don't swallow keyboard interrupts
+                except:
+                    pass
+
+
+        def _execute_child(self, args, executable, preexec_fn, close_fds,
+                           cwd, env, universal_newlines,
+                           startupinfo, creationflags, shell,
+                           p2cread, p2cwrite,
+                           c2pread, c2pwrite,
+                           errread, errwrite):
+            """Execute program (POSIX version)"""
+
+            if is_string(args):
+                args = [args]
+
+            if shell:
+                args = ["/bin/sh", "-c"] + args
+
+            if executable is None:
+                executable = args[0]
+
+            # For transferring possible exec failure from child to parent
+            # The first char specifies the exception type: 0 means
+            # OSError, 1 means some other error.
+            errpipe_read, errpipe_write = os.pipe()
+            self._set_cloexec_flag(errpipe_write)
+
+            self.pid = os.fork()
+            self._child_created = True
+            if self.pid == 0:
+                # Child
+                try:
+                    # Close parent's pipe ends
+                    if p2cwrite:
+                        os.close(p2cwrite)
+                    if c2pread:
+                        os.close(c2pread)
+                    if errread:
+                        os.close(errread)
+                    os.close(errpipe_read)
+
+                    # Dup fds for child
+                    if p2cread:
+                        os.dup2(p2cread, 0)
+                    if c2pwrite:
+                        os.dup2(c2pwrite, 1)
+                    if errwrite:
+                        os.dup2(errwrite, 2)
+
+                    # Close pipe fds.  Make sure we don't close the same
+                    # fd more than once, or standard fds.
+                    try:
+                        set
+                    except NameError:
+                        # Fall-back for earlier Python versions, so epydoc
+                        # can use this module directly to execute things.
+                        if p2cread:
+                            os.close(p2cread)
+                        if c2pwrite and c2pwrite not in (p2cread,):
+                            os.close(c2pwrite)
+                        if errwrite and errwrite not in (p2cread, c2pwrite):
+                            os.close(errwrite)
+                    else:
+                        for fd in set((p2cread, c2pwrite, errwrite))-set((0,1,2)):
+                            if fd: os.close(fd)
+
+                    # Close all other fds, if asked for
+                    if close_fds:
+                        self._close_fds(but=errpipe_write)
+
+                    if cwd is not None:
+                        os.chdir(cwd)
+
+                    if preexec_fn:
+                        apply(preexec_fn)
+
+                    if env is None:
+                        os.execvp(executable, args)
+                    else:
+                        os.execvpe(executable, args, env)
+
+                except KeyboardInterrupt:
+                    raise       # SCons:  don't swallow keyboard interrupts
+
+                except:
+                    exc_type, exc_value, tb = sys.exc_info()
+                    # Save the traceback and attach it to the exception object
+                    exc_lines = traceback.format_exception(exc_type,
+                                                           exc_value,
+                                                           tb)
+                    exc_value.child_traceback = ''.join(exc_lines)
+                    os.write(errpipe_write, pickle.dumps(exc_value))
+
+                # This exitcode won't be reported to applications, so it
+                # really doesn't matter what we return.
+                os._exit(255)
+
+            # Parent
+            os.close(errpipe_write)
+            if p2cread and p2cwrite:
+                os.close(p2cread)
+            if c2pwrite and c2pread:
+                os.close(c2pwrite)
+            if errwrite and errread:
+                os.close(errwrite)
+
+            # Wait for exec to fail or succeed; possibly raising exception
+            data = os.read(errpipe_read, 1048576) # Exceptions limited to 1 MB
+            os.close(errpipe_read)
+            if data != "":
+                os.waitpid(self.pid, 0)
+                child_exception = pickle.loads(data)
+                raise child_exception
+
+
+        def _handle_exitstatus(self, sts):
+            if os.WIFSIGNALED(sts):
+                self.returncode = -os.WTERMSIG(sts)
+            elif os.WIFEXITED(sts):
+                self.returncode = os.WEXITSTATUS(sts)
+            else:
+                # Should never happen
+                raise RuntimeError("Unknown child exit status!")
+
+
+        def poll(self, _deadstate=None):
+            """Check if child process has terminated.  Returns returncode
+            attribute."""
+            if self.returncode is None:
+                try:
+                    pid, sts = os.waitpid(self.pid, os.WNOHANG)
+                    if pid == self.pid:
+                        self._handle_exitstatus(sts)
+                except os.error:
+                    if _deadstate is not None:
+                        self.returncode = _deadstate
+            return self.returncode
+
+
+        def wait(self):
+            """Wait for child process to terminate.  Returns returncode
+            attribute."""
+            if self.returncode is None:
+                pid, sts = os.waitpid(self.pid, 0)
+                self._handle_exitstatus(sts)
+            return self.returncode
+
+
+        def _communicate(self, input):
+            read_set = []
+            write_set = []
+            stdout = None # Return
+            stderr = None # Return
+
+            if self.stdin:
+                # Flush stdio buffer.  This might block, if the user has
+                # been writing to .stdin in an uncontrolled fashion.
+                self.stdin.flush()
+                if input:
+                    write_set.append(self.stdin)
+                else:
+                    self.stdin.close()
+            if self.stdout:
+                read_set.append(self.stdout)
+                stdout = []
+            if self.stderr:
+                read_set.append(self.stderr)
+                stderr = []
+
+            input_offset = 0
+            while read_set or write_set:
+                rlist, wlist, xlist = select.select(read_set, write_set, [])
+
+                if self.stdin in wlist:
+                    # When select has indicated that the file is writable,
+                    # we can write up to PIPE_BUF bytes without risk
+                    # blocking.  POSIX defines PIPE_BUF >= 512
+                    m = memoryview(input)[input_offset:input_offset+512]
+                    bytes_written = os.write(self.stdin.fileno(), m)
+                    input_offset = input_offset + bytes_written
+                    if input_offset >= len(input):
+                        self.stdin.close()
+                        write_set.remove(self.stdin)
+
+                if self.stdout in rlist:
+                    data = os.read(self.stdout.fileno(), 1024)
+                    if data == "":
+                        self.stdout.close()
+                        read_set.remove(self.stdout)
+                    stdout.append(data)
+
+                if self.stderr in rlist:
+                    data = os.read(self.stderr.fileno(), 1024)
+                    if data == "":
+                        self.stderr.close()
+                        read_set.remove(self.stderr)
+                    stderr.append(data)
+
+            # All data exchanged.  Translate lists into strings.
+            if stdout is not None:
+                stdout = ''.join(stdout)
+            if stderr is not None:
+                stderr = ''.join(stderr)
+
+            # Translate newlines, if requested.  We cannot let the file
+            # object do the translation: It is based on stdio, which is
+            # impossible to combine with select (unless forcing no
+            # buffering).
+            if self.universal_newlines and hasattr(file, 'newlines'):
+                if stdout:
+                    stdout = self._translate_newlines(stdout)
+                if stderr:
+                    stderr = self._translate_newlines(stderr)
+
+            self.wait()
+            return (stdout, stderr)
+
+
+def _demo_posix():
+    #
+    # Example 1: Simple redirection: Get process list
+    #
+    plist = Popen(["ps"], stdout=PIPE).communicate()[0]
+    print "Process list:"
+    print plist
+
+    #
+    # Example 2: Change uid before executing child
+    #
+    if os.getuid() == 0:
+        p = Popen(["id"], preexec_fn=lambda: os.setuid(100))
+        p.wait()
+
+    #
+    # Example 3: Connecting several subprocesses
+    #
+    print "Looking for 'hda'..."
+    p1 = Popen(["dmesg"], stdout=PIPE)
+    p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
+    print repr(p2.communicate()[0])
+
+    #
+    # Example 4: Catch execution error
+    #
+    print
+    print "Trying a weird file..."
+    try:
+        print Popen(["/this/path/does/not/exist"]).communicate()
+    except OSError, e:
+        if e.errno == errno.ENOENT:
+            print "The file didn't exist.  I thought so..."
+            print "Child traceback:"
+            print e.child_traceback
+        else:
+            print "Error", e.errno
+    else:
+        sys.stderr.write( "Gosh.  No error.\n" )
+
+
+def _demo_windows():
+    #
+    # Example 1: Connecting several subprocesses
+    #
+    print "Looking for 'PROMPT' in set output..."
+    p1 = Popen("set", stdout=PIPE, shell=True)
+    p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE)
+    print repr(p2.communicate()[0])
+
+    #
+    # Example 2: Simple execution of program
+    #
+    print "Executing calc..."
+    p = Popen("calc")
+    p.wait()
+
+
+if __name__ == "__main__":
+    if mswindows:
+        _demo_windows()
+    else:
+        _demo_posix()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/cpp.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/cpp.py
new file mode 100644
index 0000000..6a0c40a
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/cpp.py
@@ -0,0 +1,589 @@
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/cpp.py 5183 2010/11/25 14:46:21 bdeegan"
+
+__doc__ = """
+SCons C Pre-Processor module
+"""
+#TODO 2.3 and before has no sorted()
+import SCons.compat
+
+import os
+import re
+
+#
+# First "subsystem" of regular expressions that we set up:
+#
+# Stuff to turn the C preprocessor directives in a file's contents into
+# a list of tuples that we can process easily.
+#
+
+# A table of regular expressions that fetch the arguments from the rest of
+# a C preprocessor line.  Different directives have different arguments
+# that we want to fetch, using the regular expressions to which the lists
+# of preprocessor directives map.
+cpp_lines_dict = {
+    # Fetch the rest of a #if/#elif/#ifdef/#ifndef as one argument,
+    # separated from the keyword by white space.
+    ('if', 'elif', 'ifdef', 'ifndef',)
+                        : '\s+(.+)',
+
+    # Fetch the rest of a #import/#include/#include_next line as one
+    # argument, with white space optional.
+    ('import', 'include', 'include_next',)
+                        : '\s*(.+)',
+
+    # We don't care what comes after a #else or #endif line.
+    ('else', 'endif',)  : '',
+
+    # Fetch three arguments from a #define line:
+    #   1) The #defined keyword.
+    #   2) The optional parentheses and arguments (if it's a function-like
+    #      macro, '' if it's not).
+    #   3) The expansion value.
+    ('define',)         : '\s+([_A-Za-z][_A-Za-z0-9_]*)(\([^)]*\))?\s*(.*)',
+
+    # Fetch the #undefed keyword from a #undef line.
+    ('undef',)          : '\s+([_A-Za-z][A-Za-z0-9_]*)',
+}
+
+# Create a table that maps each individual C preprocessor directive to
+# the corresponding compiled regular expression that fetches the arguments
+# we care about.
+Table = {}
+for op_list, expr in cpp_lines_dict.items():
+    e = re.compile(expr)
+    for op in op_list:
+        Table[op] = e
+del e
+del op
+del op_list
+
+# Create a list of the expressions we'll use to match all of the
+# preprocessor directives.  These are the same as the directives
+# themselves *except* that we must use a negative lookahead assertion
+# when matching "if" so it doesn't match the "if" in "ifdef."
+override = {
+    'if'                        : 'if(?!def)',
+}
+l = [override.get(x, x) for x in Table.keys()]
+
+
+# Turn the list of expressions into one big honkin' regular expression
+# that will match all the preprocessor lines at once.  This will return
+# a list of tuples, one for each preprocessor line.  The preprocessor
+# directive will be the first element in each tuple, and the rest of
+# the line will be the second element.
+e = '^\s*#\s*(' + '|'.join(l) + ')(.*)$'
+
+# And last but not least, compile the expression.
+CPP_Expression = re.compile(e, re.M)
+
+
+
+
+#
+# Second "subsystem" of regular expressions that we set up:
+#
+# Stuff to translate a C preprocessor expression (as found on a #if or
+# #elif line) into an equivalent Python expression that we can eval().
+#
+
+# A dictionary that maps the C representation of Boolean operators
+# to their Python equivalents.
+CPP_to_Python_Ops_Dict = {
+    '!'         : ' not ',
+    '!='        : ' != ',
+    '&&'        : ' and ',
+    '||'        : ' or ',
+    '?'         : ' and ',
+    ':'         : ' or ',
+    '\r'        : '',
+}
+
+CPP_to_Python_Ops_Sub = lambda m: CPP_to_Python_Ops_Dict[m.group(0)]
+
+# We have to sort the keys by length so that longer expressions
+# come *before* shorter expressions--in particular, "!=" must
+# come before "!" in the alternation.  Without this, the Python
+# re module, as late as version 2.2.2, empirically matches the
+# "!" in "!=" first, instead of finding the longest match.
+# What's up with that?
+l = sorted(CPP_to_Python_Ops_Dict.keys(), key=lambda a: len(a), reverse=True)
+
+# Turn the list of keys into one regular expression that will allow us
+# to substitute all of the operators at once.
+expr = '|'.join(map(re.escape, l))
+
+# ...and compile the expression.
+CPP_to_Python_Ops_Expression = re.compile(expr)
+
+# A separate list of expressions to be evaluated and substituted
+# sequentially, not all at once.
+CPP_to_Python_Eval_List = [
+    ['defined\s+(\w+)',         '"\\1" in __dict__'],
+    ['defined\s*\((\w+)\)',     '"\\1" in __dict__'],
+    ['/\*.*\*/',                ''],
+    ['/\*.*',                   ''],
+    ['//.*',                    ''],
+    ['(0x[0-9A-Fa-f]*)[UL]+',   '\\1'],
+]
+
+# Replace the string representations of the regular expressions in the
+# list with compiled versions.
+for l in CPP_to_Python_Eval_List:
+    l[0] = re.compile(l[0])
+
+# Wrap up all of the above into a handy function.
+def CPP_to_Python(s):
+    """
+    Converts a C pre-processor expression into an equivalent
+    Python expression that can be evaluated.
+    """
+    s = CPP_to_Python_Ops_Expression.sub(CPP_to_Python_Ops_Sub, s)
+    for expr, repl in CPP_to_Python_Eval_List:
+        s = expr.sub(repl, s)
+    return s
+
+
+
+del expr
+del l
+del override
+
+
+
+class FunctionEvaluator(object):
+    """
+    Handles delayed evaluation of a #define function call.
+    """
+    def __init__(self, name, args, expansion):
+        """
+        Squirrels away the arguments and expansion value of a #define
+        macro function for later evaluation when we must actually expand
+        a value that uses it.
+        """
+        self.name = name
+        self.args = function_arg_separator.split(args)
+        try:
+            expansion = expansion.split('##')
+        except AttributeError:
+            pass
+        self.expansion = expansion
+    def __call__(self, *values):
+        """
+        Evaluates the expansion of a #define macro function called
+        with the specified values.
+        """
+        if len(self.args) != len(values):
+            raise ValueError("Incorrect number of arguments to `%s'" % self.name)
+        # Create a dictionary that maps the macro arguments to the
+        # corresponding values in this "call."  We'll use this when we
+        # eval() the expansion so that arguments will get expanded to
+        # the right values.
+        locals = {}
+        for k, v in zip(self.args, values):
+            locals[k] = v
+
+        parts = []
+        for s in self.expansion:
+            if not s in self.args:
+                s = repr(s)
+            parts.append(s)
+        statement = ' + '.join(parts)
+
+        return eval(statement, globals(), locals)
+
+
+
+# Find line continuations.
+line_continuations = re.compile('\\\\\r?\n')
+
+# Search for a "function call" macro on an expansion.  Returns the
+# two-tuple of the "function" name itself, and a string containing the
+# arguments within the call parentheses.
+function_name = re.compile('(\S+)\(([^)]*)\)')
+
+# Split a string containing comma-separated function call arguments into
+# the separate arguments.
+function_arg_separator = re.compile(',\s*')
+
+
+
+class PreProcessor(object):
+    """
+    The main workhorse class for handling C pre-processing.
+    """
+    def __init__(self, current=os.curdir, cpppath=(), dict={}, all=0):
+        global Table
+
+        cpppath = tuple(cpppath)
+
+        self.searchpath = {
+            '"' :       (current,) + cpppath,
+            '<' :       cpppath + (current,),
+        }
+
+        # Initialize our C preprocessor namespace for tracking the
+        # values of #defined keywords.  We use this namespace to look
+        # for keywords on #ifdef/#ifndef lines, and to eval() the
+        # expressions on #if/#elif lines (after massaging them from C to
+        # Python).
+        self.cpp_namespace = dict.copy()
+        self.cpp_namespace['__dict__'] = self.cpp_namespace
+
+        if all:
+           self.do_include = self.all_include
+
+        # For efficiency, a dispatch table maps each C preprocessor
+        # directive (#if, #define, etc.) to the method that should be
+        # called when we see it.  We accomodate state changes (#if,
+        # #ifdef, #ifndef) by pushing the current dispatch table on a
+        # stack and changing what method gets called for each relevant
+        # directive we might see next at this level (#else, #elif).
+        # #endif will simply pop the stack.
+        d = {
+            'scons_current_file'    : self.scons_current_file
+        }
+        for op in Table.keys():
+            d[op] = getattr(self, 'do_' + op)
+        self.default_table = d
+
+    # Controlling methods.
+
+    def tupleize(self, contents):
+        """
+        Turns the contents of a file into a list of easily-processed
+        tuples describing the CPP lines in the file.
+
+        The first element of each tuple is the line's preprocessor
+        directive (#if, #include, #define, etc., minus the initial '#').
+        The remaining elements are specific to the type of directive, as
+        pulled apart by the regular expression.
+        """
+        global CPP_Expression, Table
+        contents = line_continuations.sub('', contents)
+        cpp_tuples = CPP_Expression.findall(contents)
+        return  [(m[0],) + Table[m[0]].match(m[1]).groups() for m in cpp_tuples]
+
+    def __call__(self, file):
+        """
+        Pre-processes a file.
+
+        This is the main public entry point.
+        """
+        self.current_file = file
+        return self.process_contents(self.read_file(file), file)
+
+    def process_contents(self, contents, fname=None):
+        """
+        Pre-processes a file contents.
+
+        This is the main internal entry point.
+        """
+        self.stack = []
+        self.dispatch_table = self.default_table.copy()
+        self.current_file = fname
+        self.tuples = self.tupleize(contents)
+
+        self.initialize_result(fname)
+        while self.tuples:
+            t = self.tuples.pop(0)
+            # Uncomment to see the list of tuples being processed (e.g.,
+            # to validate the CPP lines are being translated correctly).
+            #print t
+            self.dispatch_table[t[0]](t)
+        return self.finalize_result(fname)
+
+    # Dispatch table stack manipulation methods.
+
+    def save(self):
+        """
+        Pushes the current dispatch table on the stack and re-initializes
+        the current dispatch table to the default.
+        """
+        self.stack.append(self.dispatch_table)
+        self.dispatch_table = self.default_table.copy()
+
+    def restore(self):
+        """
+        Pops the previous dispatch table off the stack and makes it the
+        current one.
+        """
+        try: self.dispatch_table = self.stack.pop()
+        except IndexError: pass
+
+    # Utility methods.
+
+    def do_nothing(self, t):
+        """
+        Null method for when we explicitly want the action for a
+        specific preprocessor directive to do nothing.
+        """
+        pass
+
+    def scons_current_file(self, t):
+        self.current_file = t[1]
+
+    def eval_expression(self, t):
+        """
+        Evaluates a C preprocessor expression.
+
+        This is done by converting it to a Python equivalent and
+        eval()ing it in the C preprocessor namespace we use to
+        track #define values.
+        """
+        t = CPP_to_Python(' '.join(t[1:]))
+        try: return eval(t, self.cpp_namespace)
+        except (NameError, TypeError): return 0
+
+    def initialize_result(self, fname):
+        self.result = [fname]
+
+    def finalize_result(self, fname):
+        return self.result[1:]
+
+    def find_include_file(self, t):
+        """
+        Finds the #include file for a given preprocessor tuple.
+        """
+        fname = t[2]
+        for d in self.searchpath[t[1]]:
+            if d == os.curdir:
+                f = fname
+            else:
+                f = os.path.join(d, fname)
+            if os.path.isfile(f):
+                return f
+        return None
+
+    def read_file(self, file):
+        return open(file).read()
+
+    # Start and stop processing include lines.
+
+    def start_handling_includes(self, t=None):
+        """
+        Causes the PreProcessor object to start processing #import,
+        #include and #include_next lines.
+
+        This method will be called when a #if, #ifdef, #ifndef or #elif
+        evaluates True, or when we reach the #else in a #if, #ifdef,
+        #ifndef or #elif block where a condition already evaluated
+        False.
+
+        """
+        d = self.dispatch_table
+        d['import'] = self.do_import
+        d['include'] =  self.do_include
+        d['include_next'] =  self.do_include
+
+    def stop_handling_includes(self, t=None):
+        """
+        Causes the PreProcessor object to stop processing #import,
+        #include and #include_next lines.
+
+        This method will be called when a #if, #ifdef, #ifndef or #elif
+        evaluates False, or when we reach the #else in a #if, #ifdef,
+        #ifndef or #elif block where a condition already evaluated True.
+        """
+        d = self.dispatch_table
+        d['import'] = self.do_nothing
+        d['include'] =  self.do_nothing
+        d['include_next'] =  self.do_nothing
+
+    # Default methods for handling all of the preprocessor directives.
+    # (Note that what actually gets called for a given directive at any
+    # point in time is really controlled by the dispatch_table.)
+
+    def _do_if_else_condition(self, condition):
+        """
+        Common logic for evaluating the conditions on #if, #ifdef and
+        #ifndef lines.
+        """
+        self.save()
+        d = self.dispatch_table
+        if condition:
+            self.start_handling_includes()
+            d['elif'] = self.stop_handling_includes
+            d['else'] = self.stop_handling_includes
+        else:
+            self.stop_handling_includes()
+            d['elif'] = self.do_elif
+            d['else'] = self.start_handling_includes
+
+    def do_ifdef(self, t):
+        """
+        Default handling of a #ifdef line.
+        """
+        self._do_if_else_condition(t[1] in self.cpp_namespace)
+
+    def do_ifndef(self, t):
+        """
+        Default handling of a #ifndef line.
+        """
+        self._do_if_else_condition(t[1] not in self.cpp_namespace)
+
+    def do_if(self, t):
+        """
+        Default handling of a #if line.
+        """
+        self._do_if_else_condition(self.eval_expression(t))
+
+    def do_elif(self, t):
+        """
+        Default handling of a #elif line.
+        """
+        d = self.dispatch_table
+        if self.eval_expression(t):
+            self.start_handling_includes()
+            d['elif'] = self.stop_handling_includes
+            d['else'] = self.stop_handling_includes
+
+    def do_else(self, t):
+        """
+        Default handling of a #else line.
+        """
+        pass
+
+    def do_endif(self, t):
+        """
+        Default handling of a #endif line.
+        """
+        self.restore()
+
+    def do_define(self, t):
+        """
+        Default handling of a #define line.
+        """
+        _, name, args, expansion = t
+        try:
+            expansion = int(expansion)
+        except (TypeError, ValueError):
+            pass
+        if args:
+            evaluator = FunctionEvaluator(name, args[1:-1], expansion)
+            self.cpp_namespace[name] = evaluator
+        else:
+            self.cpp_namespace[name] = expansion
+
+    def do_undef(self, t):
+        """
+        Default handling of a #undef line.
+        """
+        try: del self.cpp_namespace[t[1]]
+        except KeyError: pass
+
+    def do_import(self, t):
+        """
+        Default handling of a #import line.
+        """
+        # XXX finish this -- maybe borrow/share logic from do_include()...?
+        pass
+
+    def do_include(self, t):
+        """
+        Default handling of a #include line.
+        """
+        t = self.resolve_include(t)
+        include_file = self.find_include_file(t)
+        if include_file:
+            #print "include_file =", include_file
+            self.result.append(include_file)
+            contents = self.read_file(include_file)
+            new_tuples = [('scons_current_file', include_file)] + \
+                         self.tupleize(contents) + \
+                         [('scons_current_file', self.current_file)]
+            self.tuples[:] = new_tuples + self.tuples
+
+    # Date: Tue, 22 Nov 2005 20:26:09 -0500
+    # From: Stefan Seefeld <seefeld at sympatico.ca>
+    #
+    # By the way, #include_next is not the same as #include. The difference
+    # being that #include_next starts its search in the path following the
+    # path that let to the including file. In other words, if your system
+    # include paths are ['/foo', '/bar'], and you are looking at a header
+    # '/foo/baz.h', it might issue an '#include_next <baz.h>' which would
+    # correctly resolve to '/bar/baz.h' (if that exists), but *not* see
+    # '/foo/baz.h' again. See http://www.delorie.com/gnu/docs/gcc/cpp_11.html
+    # for more reasoning.
+    #
+    # I have no idea in what context 'import' might be used.
+
+    # XXX is #include_next really the same as #include ?
+    do_include_next = do_include
+
+    # Utility methods for handling resolution of include files.
+
+    def resolve_include(self, t):
+        """Resolve a tuple-ized #include line.
+
+        This handles recursive expansion of values without "" or <>
+        surrounding the name until an initial " or < is found, to handle
+                #include FILE
+        where FILE is a #define somewhere else.
+        """
+        s = t[1]
+        while not s[0] in '<"':
+            #print "s =", s
+            try:
+                s = self.cpp_namespace[s]
+            except KeyError:
+                m = function_name.search(s)
+                s = self.cpp_namespace[m.group(1)]
+                if callable(s):
+                    args = function_arg_separator.split(m.group(2))
+                    s = s(*args)
+            if not s:
+                return None
+        return (t[0], s[0], s[1:-1])
+
+    def all_include(self, t):
+        """
+        """
+        self.result.append(self.resolve_include(t))
+
+class DumbPreProcessor(PreProcessor):
+    """A preprocessor that ignores all #if/#elif/#else/#endif directives
+    and just reports back *all* of the #include files (like the classic
+    SCons scanner did).
+
+    This is functionally equivalent to using a regular expression to
+    find all of the #include lines, only slower.  It exists mainly as
+    an example of how the main PreProcessor class can be sub-classed
+    to tailor its behavior.
+    """
+    def __init__(self, *args, **kw):
+        PreProcessor.__init__(self, *args, **kw)
+        d = self.default_table
+        for func in ['if', 'elif', 'else', 'endif', 'ifdef', 'ifndef']:
+            d[func] = d[func] = self.do_nothing
+
+del __revision__
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/dblite.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/dblite.py
new file mode 100644
index 0000000..f4ba90a
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/dblite.py
@@ -0,0 +1,254 @@
+# dblite.py module contributed by Ralf W. Grosse-Kunstleve.
+# Extended for Unicode by Steven Knight.
+
+import SCons.compat
+
+import builtins
+import os
+# compat layer imports "cPickle" for us if it's available.
+import pickle
+import shutil
+import time
+
+keep_all_files = 00000
+ignore_corrupt_dbfiles = 0
+
+def corruption_warning(filename):
+    print "Warning: Discarding corrupt database:", filename
+
+try: unicode
+except NameError:
+    def is_string(s):
+        return isinstance(s, str)
+else:
+    def is_string(s):
+        return type(s) in (str, unicode)
+
+try:
+    unicode('a')
+except NameError:
+    def unicode(s): return s
+
+dblite_suffix = '.dblite'
+tmp_suffix = '.tmp'
+
+class dblite(object):
+
+  # Squirrel away references to the functions in various modules
+  # that we'll use when our __del__() method calls our sync() method
+  # during shutdown.  We might get destroyed when Python is in the midst
+  # of tearing down the different modules we import in an essentially
+  # arbitrary order, and some of the various modules's global attributes
+  # may already be wiped out from under us.
+  #
+  # See the discussion at:
+  #   http://mail.python.org/pipermail/python-bugs-list/2003-March/016877.html
+
+  _open = builtins.open
+  _pickle_dump = staticmethod(pickle.dump)
+  _os_chmod = os.chmod
+  try:
+      _os_chown = os.chown
+  except AttributeError:
+      _os_chown = None
+  _os_rename = os.rename
+  _os_unlink = os.unlink
+  _shutil_copyfile = shutil.copyfile
+  _time_time = time.time
+
+  def __init__(self, file_base_name, flag, mode):
+    assert flag in (None, "r", "w", "c", "n")
+    if (flag is None): flag = "r"
+    base, ext = os.path.splitext(file_base_name)
+    if ext == dblite_suffix:
+      # There's already a suffix on the file name, don't add one.
+      self._file_name = file_base_name
+      self._tmp_name = base + tmp_suffix
+    else:
+      self._file_name = file_base_name + dblite_suffix
+      self._tmp_name = file_base_name + tmp_suffix
+    self._flag = flag
+    self._mode = mode
+    self._dict = {}
+    self._needs_sync = 00000
+    if self._os_chown is not None and (os.geteuid()==0 or os.getuid()==0):
+      # running as root; chown back to current owner/group when done
+      try:
+        statinfo = os.stat(self._file_name)
+        self._chown_to = statinfo.st_uid
+        self._chgrp_to = statinfo.st_gid
+      except OSError, e:
+        # db file doesn't exist yet.
+        # Check os.environ for SUDO_UID, use if set
+        self._chown_to = int(os.environ.get('SUDO_UID', -1))
+        self._chgrp_to = int(os.environ.get('SUDO_GID', -1))
+    else:
+      self._chown_to = -1        # don't chown
+      self._chgrp_to = -1        # don't chgrp
+    if (self._flag == "n"):
+      self._open(self._file_name, "wb", self._mode)
+    else:
+      try:
+        f = self._open(self._file_name, "rb")
+      except IOError, e:
+        if (self._flag != "c"):
+          raise e
+        self._open(self._file_name, "wb", self._mode)
+      else:
+        p = f.read()
+        if (len(p) > 0):
+          try:
+            self._dict = pickle.loads(p)
+          except (pickle.UnpicklingError, EOFError):
+            if (ignore_corrupt_dbfiles == 0): raise
+            if (ignore_corrupt_dbfiles == 1):
+              corruption_warning(self._file_name)
+
+  def close(self):
+    if (self._needs_sync):
+      self.sync()
+
+  def __del__(self):
+    self.close()
+
+  def sync(self):
+    self._check_writable()
+    f = self._open(self._tmp_name, "wb", self._mode)
+    self._pickle_dump(self._dict, f, 1)
+    f.close()
+    # Windows doesn't allow renaming if the file exists, so unlink
+    # it first, chmod'ing it to make sure we can do so.  On UNIX, we
+    # may not be able to chmod the file if it's owned by someone else
+    # (e.g. from a previous run as root).  We should still be able to
+    # unlink() the file if the directory's writable, though, so ignore
+    # any OSError exception  thrown by the chmod() call.
+    try: self._os_chmod(self._file_name, 0777)
+    except OSError: pass
+    self._os_unlink(self._file_name)
+    self._os_rename(self._tmp_name, self._file_name)
+    if self._os_chown is not None and self._chown_to > 0: # don't chown to root or -1
+      try:
+        self._os_chown(self._file_name, self._chown_to, self._chgrp_to)
+      except OSError:
+        pass
+    self._needs_sync = 00000
+    if (keep_all_files):
+      self._shutil_copyfile(
+        self._file_name,
+        self._file_name + "_" + str(int(self._time_time())))
+
+  def _check_writable(self):
+    if (self._flag == "r"):
+      raise IOError("Read-only database: %s" % self._file_name)
+
+  def __getitem__(self, key):
+    return self._dict[key]
+
+  def __setitem__(self, key, value):
+    self._check_writable()
+    if (not is_string(key)):
+      raise TypeError("key `%s' must be a string but is %s" % (key, type(key)))
+    if (not is_string(value)):
+      raise TypeError("value `%s' must be a string but is %s" % (value, type(value)))
+    self._dict[key] = value
+    self._needs_sync = 0001
+
+  def keys(self):
+    return list(self._dict.keys())
+
+  def has_key(self, key):
+    return key in self._dict
+
+  def __contains__(self, key):
+    return key in self._dict
+
+  def iterkeys(self):
+    # Wrapping name in () prevents fixer from "fixing" this
+    return (self._dict.iterkeys)()
+
+  __iter__ = iterkeys
+
+  def __len__(self):
+    return len(self._dict)
+
+def open(file, flag=None, mode=0666):
+  return dblite(file, flag, mode)
+
+def _exercise():
+  db = open("tmp", "n")
+  assert len(db) == 0
+  db["foo"] = "bar"
+  assert db["foo"] == "bar"
+  db[unicode("ufoo")] = unicode("ubar")
+  assert db[unicode("ufoo")] == unicode("ubar")
+  db.sync()
+  db = open("tmp", "c")
+  assert len(db) == 2, len(db)
+  assert db["foo"] == "bar"
+  db["bar"] = "foo"
+  assert db["bar"] == "foo"
+  db[unicode("ubar")] = unicode("ufoo")
+  assert db[unicode("ubar")] == unicode("ufoo")
+  db.sync()
+  db = open("tmp", "r")
+  assert len(db) == 4, len(db)
+  assert db["foo"] == "bar"
+  assert db["bar"] == "foo"
+  assert db[unicode("ufoo")] == unicode("ubar")
+  assert db[unicode("ubar")] == unicode("ufoo")
+  try:
+    db.sync()
+  except IOError, e:
+    assert str(e) == "Read-only database: tmp.dblite"
+  else:
+    raise RuntimeError("IOError expected.")
+  db = open("tmp", "w")
+  assert len(db) == 4
+  db["ping"] = "pong"
+  db.sync()
+  try:
+    db[(1,2)] = "tuple"
+  except TypeError, e:
+    assert str(e) == "key `(1, 2)' must be a string but is <type 'tuple'>", str(e)
+  else:
+    raise RuntimeError("TypeError exception expected")
+  try:
+    db["list"] = [1,2]
+  except TypeError, e:
+    assert str(e) == "value `[1, 2]' must be a string but is <type 'list'>", str(e)
+  else:
+    raise RuntimeError("TypeError exception expected")
+  db = open("tmp", "r")
+  assert len(db) == 5
+  db = open("tmp", "n")
+  assert len(db) == 0
+  dblite._open("tmp.dblite", "w")
+  db = open("tmp", "r")
+  dblite._open("tmp.dblite", "w").write("x")
+  try:
+    db = open("tmp", "r")
+  except pickle.UnpicklingError:
+    pass
+  else:
+    raise RuntimeError("pickle exception expected.")
+  global ignore_corrupt_dbfiles
+  ignore_corrupt_dbfiles = 2
+  db = open("tmp", "r")
+  assert len(db) == 0
+  os.unlink("tmp.dblite")
+  try:
+    db = open("tmp", "w")
+  except IOError, e:
+    assert str(e) == "[Errno 2] No such file or directory: 'tmp.dblite'", str(e)
+  else:
+    raise RuntimeError("IOError expected.")
+  print "OK"
+
+if (__name__ == "__main__"):
+  _exercise()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/SCons/exitfuncs.py b/scons/scons-local-2.1.0.alpha.20101125/SCons/exitfuncs.py
new file mode 100644
index 0000000..40341c8
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/SCons/exitfuncs.py
@@ -0,0 +1,77 @@
+"""SCons.exitfuncs
+
+Register functions which are executed when SCons exits for any reason.
+
+"""
+
+#
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/exitfuncs.py 5183 2010/11/25 14:46:21 bdeegan"
+
+
+
+_exithandlers = []
+def _run_exitfuncs():
+    """run any registered exit functions
+
+    _exithandlers is traversed in reverse order so functions are executed
+    last in, first out.
+    """
+
+    while _exithandlers:
+        func, targs, kargs =  _exithandlers.pop()
+        func(*targs, **kargs)
+
+def register(func, *targs, **kargs):
+    """register a function to be executed upon normal program termination
+
+    func - function to be called at exit
+    targs - optional arguments to pass to func
+    kargs - optional keyword arguments to pass to func
+    """
+    _exithandlers.append((func, targs, kargs))
+
+import sys
+
+try:
+    x = sys.exitfunc
+
+    # if x isn't our own exit func executive, assume it's another
+    # registered exit function - append it to our list...
+    if x != _run_exitfuncs:
+        register(x)
+
+except AttributeError:
+    pass
+
+# make our exit function get run by python when it exits:    
+sys.exitfunc = _run_exitfuncs
+
+del sys
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons-local-2.1.0.alpha.20101125/scons-2.1.0.alpha.20101125.egg-info b/scons/scons-local-2.1.0.alpha.20101125/scons-2.1.0.alpha.20101125.egg-info
new file mode 100644
index 0000000..a5c98b5
--- /dev/null
+++ b/scons/scons-local-2.1.0.alpha.20101125/scons-2.1.0.alpha.20101125.egg-info
@@ -0,0 +1,13 @@
+Metadata-Version: 1.0
+Name: scons
+Version: 2.1.0.alpha.20101125
+Summary: Open Source next-generation build tool.
+Home-page: http://www.scons.org/
+Author: Steven Knight
+Author-email: knight at baldmt.com
+License: UNKNOWN
+Description: Open Source next-generation build tool.
+        Improved, cross-platform substitute for the classic Make
+        utility.  In short, SCons is an easier, more reliable
+        and faster way to build software.
+Platform: UNKNOWN
diff --git a/scons/scons-time.py b/scons/scons-time.py
index 67b6643..63452a1 100755
--- a/scons/scons-time.py
+++ b/scons/scons-time.py
@@ -9,7 +9,7 @@
 #
 
 #
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 The SCons Foundation
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
 #
 # Permission is hereby granted, free of charge, to any person obtaining
 # a copy of this software and associated documentation files (the
@@ -29,36 +29,58 @@
 # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
+from __future__ import division
 from __future__ import nested_scopes
 
-__revision__ = "src/script/scons-time.py 3842 2008/12/20 22:59:52 scons"
+__revision__ = "src/script/scons-time.py 5183 2010/11/25 14:46:21 bdeegan"
 
 import getopt
 import glob
 import os
-import os.path
 import re
 import shutil
-import string
 import sys
 import tempfile
 import time
 
 try:
-    False
+    sorted
 except NameError:
-    # Pre-2.2 Python has no False keyword.
-    import __builtin__
-    __builtin__.False = not 1
+    # Pre-2.4 Python has no sorted() function.
+    #
+    # The pre-2.4 Python list.sort() method does not support
+    # list.sort(key=) nor list.sort(reverse=) keyword arguments, so
+    # we must implement the functionality of those keyword arguments
+    # by hand instead of passing them to list.sort().
+    def sorted(iterable, cmp=None, key=None, reverse=False):
+        if key is not None:
+            result = [(key(x), x) for x in iterable]
+        else:
+            result = iterable[:]
+        if cmp is None:
+            # Pre-2.3 Python does not support list.sort(None).
+            result.sort()
+        else:
+            result.sort(cmp)
+        if key is not None:
+            result = [t1 for t0,t1 in result]
+        if reverse:
+            result.reverse()
+        return result
 
-try:
-    True
-except NameError:
-    # Pre-2.2 Python has no True keyword.
-    import __builtin__
-    __builtin__.True = not 0
+if os.environ.get('SCONS_HORRIBLE_REGRESSION_TEST_HACK') is not None:
+    # We can't apply the 'callable' fixer until the floor is 2.6, but the
+    # '-3' option to Python 2.6 and 2.7 generates almost ten thousand
+    # warnings.  This hack allows us to run regression tests with the '-3'
+    # option by replacing the callable() built-in function with a hack
+    # that performs the same function but doesn't generate the warning.
+    # Note that this hack is ONLY intended to be used for regression
+    # testing, and should NEVER be used for real runs.
+    from types import ClassType
+    def callable(obj):
+        if hasattr(obj, '__call__'): return True
+        if isinstance(obj, (ClassType, type)): return True
+        return False
 
 def make_temp_file(**kw):
     try:
@@ -79,7 +101,18 @@ def make_temp_file(**kw):
             tempfile.template = save_template
     return result
 
-class Plotter:
+def HACK_for_exec(cmd, *args):
+    '''
+    For some reason, Python won't allow an exec() within a function
+    that also declares an internal function (including lambda functions).
+    This function is a hack that calls exec() in a function with no
+    internal functions.
+    '''
+    if not args:          exec(cmd)
+    elif len(args) == 1:  exec cmd in args[0]
+    else:                 exec cmd in args[0], args[1]
+
+class Plotter(object):
     def increment_size(self, largest):
         """
         Return the size of each horizontal increment line for a specified
@@ -87,12 +120,12 @@ class Plotter:
         between 5 and 9 horizontal lines on the graph, on some set of
         boundaries that are multiples of 10/100/1000/etc.
         """
-        i = largest / 5
+        i = largest // 5
         if not i:
             return largest
         multiplier = 1
         while i >= 10:
-            i = i / 10
+            i = i // 10
             multiplier = multiplier * 10
         return i * multiplier
 
@@ -100,9 +133,9 @@ class Plotter:
         # Round up to next integer.
         largest = int(largest) + 1
         increment = self.increment_size(largest)
-        return ((largest + increment - 1) / increment) * increment
+        return ((largest + increment - 1) // increment) * increment
 
-class Line:
+class Line(object):
     def __init__(self, points, type, title, label, comment, fmt="%s %s"):
         self.points = points
         self.type = type
@@ -166,13 +199,13 @@ class Gnuplotter(Plotter):
         result = []
         for line in self.lines:
             result.extend(line.get_x_values())
-        return filter(lambda r: not r is None, result)
+        return [r for r in result if not r is None]
 
     def get_all_y_values(self):
         result = []
         for line in self.lines:
             result.extend(line.get_y_values())
-        return filter(lambda r: not r is None, result)
+        return [r for r in result if not r is None]
 
     def get_min_x(self):
         try:
@@ -225,10 +258,9 @@ class Gnuplotter(Plotter):
 
         min_y = self.get_min_y()
         max_y = self.max_graph_value(self.get_max_y())
-        range = max_y - min_y
-        incr = range / 10.0
+        incr = (max_y - min_y) / 10.0
         start = min_y + (max_y / 2.0) + (2.0 * incr)
-        position = [ start - (i * incr) for i in xrange(5) ]
+        position = [ start - (i * incr) for i in range(5) ]
 
         inx = 1
         for line in self.lines:
@@ -263,12 +295,11 @@ def unzip(fname):
         open(name, 'w').write(zf.read(name))
 
 def read_tree(dir):
-    def read_files(arg, dirname, fnames):
-        for fn in fnames:
-            fn = os.path.join(dirname, fn)
+    for dirpath, dirnames, filenames in os.walk(dir):
+        for fn in filenames:
+            fn = os.path.join(dirpath, fn)
             if os.path.isfile(fn):
                 open(fn, 'rb').read()
-    os.path.walk('.', read_files, None)
 
 def redirect_to_file(command, log):
     return '%s > %s 2>&1' % (command, log)
@@ -278,7 +309,7 @@ def tee_to_file(command, log):
 
 
     
-class SConsTimer:
+class SConsTimer(object):
     """
     Usage: scons-time SUBCOMMAND [ARGUMENTS]
     Type "scons-time help SUBCOMMAND" for help on a specific subcommand.
@@ -495,9 +526,7 @@ class SConsTimer:
         """
         files = []
         for a in args:
-            g = glob.glob(a)
-            g.sort()
-            files.extend(g)
+            files.extend(sorted(glob.glob(a)))
 
         if tail:
             files = files[-tail:]
@@ -528,7 +557,7 @@ class SConsTimer:
 
         for file in files:
             base = os.path.splitext(file)[0]
-            run, index = string.split(base, '-')[-2:]
+            run, index = base.split('-')[-2:]
 
             run = int(run)
             index = int(index)
@@ -566,11 +595,11 @@ class SConsTimer:
         and returns the next run number after the largest it finds.
         """
         x = re.compile(re.escape(prefix) + '-([0-9]+).*')
-        matches = map(lambda e, x=x: x.match(e), os.listdir(dir))
-        matches = filter(None, matches)
+        matches = [x.match(e) for e in os.listdir(dir)]
+        matches = [_f for _f in matches if _f]
         if not matches:
             return 0
-        run_numbers = map(lambda m: int(m.group(1)), matches)
+        run_numbers = [int(m.group(1)) for m in matches]
         return int(max(run_numbers)) + 1
 
     def gnuplot_results(self, results, fmt='%s %.3f'):
@@ -579,10 +608,7 @@ class SConsTimer:
         """
         gp = Gnuplotter(self.title, self.key_location)
 
-        indices = results.keys()
-        indices.sort()
-
-        for i in indices:
+        for i in sorted(results.keys()):
             try:
                 t = self.run_titles[i]
             except IndexError:
@@ -704,7 +730,7 @@ class SConsTimer:
         lines = open(file).readlines()
         line = [ l for l in lines if l.endswith(object_string) ][0]
         result = [ int(field) for field in line.split()[:4] ]
-        if not index is None:
+        if index is not None:
             result = result[index]
         return result
 
@@ -830,7 +856,7 @@ class SConsTimer:
                 self.title = a
 
         if self.config_file:
-            execfile(self.config_file, self.__dict__)
+            exec open(self.config_file, 'rU').read() in self.__dict__
 
         if self.chdir:
             os.chdir(self.chdir)
@@ -859,19 +885,18 @@ class SConsTimer:
 
         if format == 'ascii':
 
-            def print_function_timing(file, func):
+            for file in args:
                 try:
-                    f, line, func, time = self.get_function_profile(file, func)
+                    f, line, func, time = \
+                            self.get_function_profile(file, function_name)
                 except ValueError, e:
-                    sys.stderr.write("%s: func: %s: %s\n" % (self.name, file, e))
+                    sys.stderr.write("%s: func: %s: %s\n" %
+                                     (self.name, file, e))
                 else:
                     if f.startswith(cwd_):
                         f = f[len(cwd_):]
                     print "%.3f %s:%d(%s)" % (time, f, line, func)
 
-            for file in args:
-                print_function_timing(file, function_name)
-
         elif format == 'gnuplot':
 
             results = self.collect_results(args, self.get_function_time,
@@ -950,11 +975,11 @@ class SConsTimer:
                 self.title = a
 
         if self.config_file:
-            execfile(self.config_file, self.__dict__)
+            HACK_for_exec(open(self.config_file, 'rU').read(), self.__dict__)
 
         if self.chdir:
             os.chdir(self.chdir)
-            logfile_path = lambda x, c=self.chdir: os.path.join(c, x)
+            logfile_path = lambda x: os.path.join(self.chdir, x)
 
         if not args:
 
@@ -1070,11 +1095,11 @@ class SConsTimer:
         object_name = args.pop(0)
 
         if self.config_file:
-            execfile(self.config_file, self.__dict__)
+            HACK_for_exec(open(self.config_file, 'rU').read(), self.__dict__)
 
         if self.chdir:
             os.chdir(self.chdir)
-            logfile_path = lambda x, c=self.chdir: os.path.join(c, x)
+            logfile_path = lambda x: os.path.join(self.chdir, x)
 
         if not args:
 
@@ -1208,7 +1233,7 @@ class SConsTimer:
             sys.exit(1)
 
         if self.config_file:
-            execfile(self.config_file, self.__dict__)
+            exec open(self.config_file, 'rU').read() in self.__dict__
 
         if args:
             self.archive_list = args
@@ -1238,7 +1263,7 @@ class SConsTimer:
             except ValueError:
                 result.append(int(n))
             else:
-                result.extend(range(int(x), int(y)+1))
+                result.extend(list(range(int(x), int(y)+1)))
         return result
 
     def scons_path(self, dir):
@@ -1448,11 +1473,11 @@ class SConsTimer:
                 which = a
 
         if self.config_file:
-            execfile(self.config_file, self.__dict__)
+            HACK_for_exec(open(self.config_file, 'rU').read(), self.__dict__)
 
         if self.chdir:
             os.chdir(self.chdir)
-            logfile_path = lambda x, c=self.chdir: os.path.join(c, x)
+            logfile_path = lambda x: os.path.join(self.chdir, x)
 
         if not args:
 
@@ -1511,3 +1536,9 @@ if __name__ == '__main__':
         sys.exit(1)
 
     ST.execute_subcommand(args)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/scons.py b/scons/scons.py
index 88276a4..df7ee75 100755
--- a/scons/scons.py
+++ b/scons/scons.py
@@ -2,7 +2,7 @@
 #
 # SCons - a Software Constructor
 #
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 The SCons Foundation
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
 #
 # Permission is hereby granted, free of charge, to any person obtaining
 # a copy of this software and associated documentation files (the
@@ -24,17 +24,17 @@
 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #
 
-__revision__ = "src/script/scons.py 3842 2008/12/20 22:59:52 scons"
+__revision__ = "src/script/scons.py 5183 2010/11/25 14:46:21 bdeegan"
 
-__version__ = "1.2.0"
+__version__ = "2.1.0.alpha.20101125"
 
-__build__ = "r3842"
+__build__ = "r5183[MODIFIED]"
 
-__buildsys__ = "scons-dev"
+__buildsys__ = "ubuntu"
 
-__date__ = "2008/12/20 22:59:52"
+__date__ = "2010/11/25 14:46:21"
 
-__developer__ = "scons"
+__developer__ = "bdeegan"
 
 import os
 import os.path
@@ -56,6 +56,19 @@ import sys
 # followed by generic) so we pick up the right version of the build
 # engine modules if they're in either directory.
 
+
+# Check to see if the python version is > 3.0 which is currently unsupported
+# If so exit with error message
+try:
+    if  sys.version_info >= (3,0,0):
+        msg = "scons: *** SCons version %s does not run under Python version %s.\n"
+        sys.stderr.write(msg % (__version__, sys.version.split()[0]))
+        sys.exit(1)
+except AttributeError:
+    # Pre-1.6 Python has no sys.version_info
+    # No need to check version as we then know the version is < 3.0.0 and supported
+    pass
+
 script_dir = sys.path[0]
 
 if script_dir in sys.path:
@@ -63,7 +76,7 @@ if script_dir in sys.path:
 
 libs = []
 
-if os.environ.has_key("SCONS_LIB_DIR"):
+if "SCONS_LIB_DIR" in os.environ:
     libs.append(os.environ["SCONS_LIB_DIR"])
 
 local_version = 'scons-local-' + __version__
@@ -124,12 +137,11 @@ else:
         # check only /foo/lib/scons*.
         prefs.append(sys.prefix)
 
-    temp = map(lambda x: os.path.join(x, 'lib'), prefs)
-    temp.extend(map(lambda x: os.path.join(x,
+    temp = [os.path.join(x, 'lib') for x in prefs]
+    temp.extend([os.path.join(x,
                                            'lib',
                                            'python' + sys.version[:3],
-                                           'site-packages'),
-                           prefs))
+                                           'site-packages') for x in prefs])
     prefs = temp
 
     # Add the parent directory of the current python's library to the
@@ -147,10 +159,23 @@ else:
         # Check /usr/libfoo/scons*.
         prefs.append(libpath)
 
+    try:
+        import pkg_resources
+    except ImportError:
+        pass
+    else:
+        # when running from an egg add the egg's directory 
+        try:
+            d = pkg_resources.get_distribution('scons')
+        except pkg_resources.DistributionNotFound:
+            pass
+        else:
+            prefs.append(d.location)
+
 # Look first for 'scons-__version__' in all of our preference libs,
 # then for 'scons'.
-libs.extend(map(lambda x: os.path.join(x, scons_version), prefs))
-libs.extend(map(lambda x: os.path.join(x, 'scons'), prefs))
+libs.extend([os.path.join(x, scons_version) for x in prefs])
+libs.extend([os.path.join(x, 'scons') for x in prefs])
 
 sys.path = libs + sys.path
 
@@ -163,3 +188,9 @@ if __name__ == "__main__":
     # this does all the work, and calls sys.exit
     # with the proper exit status when done.
     SCons.Script.main()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/scons/sconsign.py b/scons/sconsign.py
index a33b7b4..fb65cf6 100755
--- a/scons/sconsign.py
+++ b/scons/sconsign.py
@@ -2,7 +2,7 @@
 #
 # SCons - a Software Constructor
 #
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 The SCons Foundation
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
 #
 # Permission is hereby granted, free of charge, to any person obtaining
 # a copy of this software and associated documentation files (the
@@ -22,22 +22,20 @@
 # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
 
-__revision__ = "src/script/sconsign.py 3842 2008/12/20 22:59:52 scons"
+__revision__ = "src/script/sconsign.py 5183 2010/11/25 14:46:21 bdeegan"
 
-__version__ = "1.2.0"
+__version__ = "2.1.0.alpha.20101125"
 
-__build__ = "r3842"
+__build__ = "r5183[MODIFIED]"
 
-__buildsys__ = "scons-dev"
+__buildsys__ = "ubuntu"
 
-__date__ = "2008/12/20 22:59:52"
+__date__ = "2010/11/25 14:46:21"
 
-__developer__ = "scons"
+__developer__ = "bdeegan"
 
 import os
-import os.path
 import sys
 import time
 
@@ -64,7 +62,7 @@ if script_dir in sys.path:
 
 libs = []
 
-if os.environ.has_key("SCONS_LIB_DIR"):
+if "SCONS_LIB_DIR" in os.environ:
     libs.append(os.environ["SCONS_LIB_DIR"])
 
 local_version = 'scons-local-' + __version__
@@ -125,12 +123,11 @@ else:
         # check only /foo/lib/scons*.
         prefs.append(sys.prefix)
 
-    temp = map(lambda x: os.path.join(x, 'lib'), prefs)
-    temp.extend(map(lambda x: os.path.join(x,
+    temp = [os.path.join(x, 'lib') for x in prefs]
+    temp.extend([os.path.join(x,
                                            'lib',
                                            'python' + sys.version[:3],
-                                           'site-packages'),
-                           prefs))
+                                           'site-packages') for x in prefs])
     prefs = temp
 
     # Add the parent directory of the current python's library to the
@@ -148,10 +145,23 @@ else:
         # Check /usr/libfoo/scons*.
         prefs.append(libpath)
 
+    try:
+        import pkg_resources
+    except ImportError:
+        pass
+    else:
+        # when running from an egg add the egg's directory 
+        try:
+            d = pkg_resources.get_distribution('scons')
+        except pkg_resources.DistributionNotFound:
+            pass
+        else:
+            prefs.append(d.location)
+
 # Look first for 'scons-__version__' in all of our preference libs,
 # then for 'scons'.
-libs.extend(map(lambda x: os.path.join(x, scons_version), prefs))
-libs.extend(map(lambda x: os.path.join(x, 'scons'), prefs))
+libs.extend([os.path.join(x, scons_version) for x in prefs])
+libs.extend([os.path.join(x, 'scons') for x in prefs])
 
 sys.path = libs + sys.path
 
@@ -159,10 +169,11 @@ sys.path = libs + sys.path
 # END STANDARD SCons SCRIPT HEADER
 ##############################################################################
 
-import cPickle
-import imp
-import string
+import SCons.compat   # so pickle will import cPickle instead
+
 import whichdb
+import pickle
+import imp
 
 import SCons.SConsign
 
@@ -182,7 +193,7 @@ whichdb.whichdb = my_whichdb
 
 def my_import(mname):
     if '.' in mname:
-        i = string.rfind(mname, '.')
+        i = mname.rfind('.')
         parent = my_import(mname[:i])
         fp, pathname, description = imp.find_module(mname[i+1:],
                                                     parent.__path__)
@@ -190,7 +201,7 @@ def my_import(mname):
         fp, pathname, description = imp.find_module(mname)
     return imp.load_module(mname, fp, pathname, description)
 
-class Flagger:
+class Flagger(object):
     default_value = 1
     def __setitem__(self, item, value):
         self.__dict__[item] = value
@@ -237,11 +248,11 @@ def map_bkids(entry, name):
     except AttributeError:
         return None
     result = []
-    for i in xrange(len(bkids)):
+    for i in range(len(bkids)):
         result.append(nodeinfo_string(bkids[i], bkidsigs[i], "        "))
     if result == []:
         return None
-    return string.join(result, "\n        ")
+    return "\n        ".join(result)
 
 map_field = {
     'action'    : map_action,
@@ -270,29 +281,27 @@ def nodeinfo_raw(name, ninfo, prefix=""):
     try:
         keys = ninfo.field_list + ['_version_id']
     except AttributeError:
-        keys = d.keys()
-        keys.sort()
+        keys = sorted(d.keys())
     l = []
     for k in keys:
         l.append('%s: %s' % (repr(k), repr(d.get(k))))
     if '\n' in name:
         name = repr(name)
-    return name + ': {' + string.join(l, ', ') + '}'
+    return name + ': {' + ', '.join(l) + '}'
 
 def nodeinfo_cooked(name, ninfo, prefix=""):
     try:
         field_list = ninfo.field_list
     except AttributeError:
         field_list = []
-    f = lambda x, ni=ninfo, v=Verbose: field(x, ni, v)
     if '\n' in name:
         name = repr(name)
-    outlist = [name+':'] + filter(None, map(f, field_list))
+    outlist = [name+':'] + [_f for _f in [field(x, ninfo, Verbose) for x in field_list] if _f]
     if Verbose:
         sep = '\n    ' + prefix
     else:
         sep = ' '
-    return string.join(outlist, sep)
+    return sep.join(outlist)
 
 nodeinfo_string = nodeinfo_cooked
 
@@ -325,9 +334,7 @@ def printentries(entries, location):
                     print nodeinfo_string(name, entry.ninfo)
                 printfield(name, entry.binfo)
     else:
-        names = entries.keys()
-        names.sort()
-        for name in names:
+        for name in sorted(entries.keys()):
             entry = entries[name]
             try:
                 ninfo = entry.ninfo
@@ -337,7 +344,7 @@ def printentries(entries, location):
                 print nodeinfo_string(name, entry.ninfo)
             printfield(name, entry.binfo)
 
-class Do_SConsignDB:
+class Do_SConsignDB(object):
     def __init__(self, dbm_name, dbm):
         self.dbm_name = dbm_name
         self.dbm = dbm
@@ -375,7 +382,7 @@ class Do_SConsignDB:
                 return
         except KeyboardInterrupt:
             raise
-        except cPickle.UnpicklingError:
+        except pickle.UnpicklingError:
             sys.stderr.write("sconsign: ignoring invalid `%s' file `%s'\n" % (self.dbm_name, fname))
             return
         except Exception, e:
@@ -391,14 +398,12 @@ class Do_SConsignDB:
                 else:
                     self.printentries(dir, val)
         else:
-            keys = db.keys()
-            keys.sort()
-            for dir in keys:
+            for dir in sorted(db.keys()):
                 self.printentries(dir, db[dir])
 
     def printentries(self, dir, val):
         print '=== ' + dir + ':'
-        printentries(cPickle.loads(val), dir)
+        printentries(pickle.loads(val), dir)
 
 def Do_SConsignDir(name):
     try:
@@ -410,7 +415,7 @@ def Do_SConsignDir(name):
         sconsign = SCons.SConsign.Dir(fp)
     except KeyboardInterrupt:
         raise
-    except cPickle.UnpicklingError:
+    except pickle.UnpicklingError:
         sys.stderr.write("sconsign: ignoring invalid .sconsign file `%s'\n" % (name))
         return
     except Exception, e:
@@ -500,3 +505,9 @@ else:
             Do_SConsignDir(a)
 
 sys.exit(0)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/src/SConscript b/src/SConscript
deleted file mode 100644
index 6198ef7..0000000
--- a/src/SConscript
+++ /dev/null
@@ -1,161 +0,0 @@
-#
-# This file is part of Mapnik (c++ mapping toolkit)
-#
-# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-# $Id$
-
-
-import glob
-import os
-
-Import('env')
-
-ABI_VERSION = env['ABI_VERSION']
-
-prefix = env['PREFIX']
-
-lib_dir = os.path.normpath(prefix + '/' + env['LIBDIR_SCHEMA'])
-
-install_prefix = env['DESTDIR'] + '/' + prefix
-
-filesystem = 'boost_filesystem%s' % env['BOOST_APPEND']
-regex = 'boost_regex%s' % env['BOOST_APPEND']
-
-libraries = ['freetype','ltdl','png','tiff','z','jpeg','proj',env['ICU_LIB_NAME'],filesystem,regex]
-
-if '-DHAVE_CAIRO' in env['CXXFLAGS']:
-    # add cairo and cairomm-1.0 to libs
-    libraries.append([lib for lib in env['LIBS'] if lib.startswith('cairo')])
-
-if env['XMLPARSER'] == 'libxml2':
-    libraries.append('xml2')
-
-if env['THREADING'] == 'multi':
-    libraries.append('boost_thread%s' % env['BOOST_APPEND'])
-        
-if env['PLATFORM'] == 'Darwin':
-    if env['HAS_BOOST_SYSTEM']:
-        libraries.append('boost_system%s' % env['BOOST_APPEND'])
-    
-if env['INTERNAL_LIBAGG']:
-    libraries.insert(0, 'agg')
-else:
-    libraries.append([lib for lib in env['LIBS'] if lib.startswith('agg')])
-    
-
-if env['PLATFORM'] == 'Darwin':
-    if env['FULL_LIB_PATH']:
-        lib_path = '%s/libmapnik.dylib' % lib_dir
-    else:
-        lib_path = 'libmapnik.dylib'
-    linkflags = '-Wl,-install_name,%s' % lib_path
-    linkflags += ' -current_version 0.7.1 -compatibility_version 0.7.1'
-elif env['PLATFORM'] == 'SunOS' and env['CXX'].startswith('CC'):
-    linkflags = '-R. -h libmapnik.so'
-else: # Linux and others
-    linkflags = '-Wl,-rpath-link,. -Wl,-soname,libmapnik.so.' + ("%d.%d" % (ABI_VERSION[0],ABI_VERSION[1]))
-
-source = Split(
-    """
-    agg_renderer.cpp
-    datasource_cache.cpp
-    color.cpp
-    envelope.cpp
-    filter_factory.cpp
-    font_engine_freetype.cpp
-    font_set.cpp
-    graphics.cpp
-    image_reader.cpp
-    image_util.cpp
-    layer.cpp
-    line_pattern_symbolizer.cpp
-    map.cpp
-    load_map.cpp
-    memory.cpp
-    params.cpp
-    placement_finder.cpp
-    plugin.cpp
-    png_reader.cpp
-    point_symbolizer.cpp
-    polygon_pattern_symbolizer.cpp
-    save_map.cpp
-    shield_symbolizer.cpp
-    text_symbolizer.cpp
-    tiff_reader.cpp
-    wkb.cpp
-    projection.cpp
-    proj_transform.cpp
-    distance.cpp
-    scale_denominator.cpp
-    memory_datasource.cpp
-    stroke.cpp
-    symbolizer.cpp
-    arrow.cpp
-    unicode.cpp
-    """
-    )
-
-if 'cairo' in env['LIBS']:
-    source += Split(
-        """
-        cairo_renderer.cpp
-        """)
-
-if env['XMLPARSER'] == 'tinyxml':
-    source += Split(
-        """
-        ../tinyxml/tinystr.cpp
-        ../tinyxml/tinyxml.cpp
-        ../tinyxml/tinyxmlerror.cpp
-        ../tinyxml/tinyxmlparser.cpp
-        """)
-elif env['XMLPARSER'] == 'libxml2':
-    source += Split(
-        """
-        libxml2_loader.cpp
-        """)
-
-
-mapnik = env.SharedLibrary('mapnik', source, LIBS=libraries, LINKFLAGS=linkflags)
-if env['PLATFORM'] != 'Darwin':
-    # Symlink command, only works if both files are in same directory
-    def symlink(env, target, source):
-        trgt = str(target[0])
-        src = str(source[0])
-
-        if os.path.islink(trgt) or os.path.exists(trgt):
-            os.remove(trgt)
-        os.symlink(os.path.basename(src), trgt)
-
-    major, minor, micro = ABI_VERSION
-    
-    soFile = "%s.%d.%d.%d" % (os.path.basename(str(mapnik[0])), major, minor, micro)
-    libDir = install_prefix + '/' + env['LIBDIR_SCHEMA']
-    env.Alias(target='install', source=env.InstallAs(target=os.path.join(libDir, soFile), source=mapnik))
-    # Install symlinks
-    link1 = env.Command(os.path.join(libDir, "%s.%d.%d" % (os.path.basename(str(mapnik[0])),major, minor)), 
-                        os.path.join(libDir, soFile), symlink)
-    env.Alias(target='install', source=link1)
-    link2 = env.Command(os.path.join(libDir, os.path.basename(str(mapnik[0]))), 
-                        os.path.join(libDir, "%s.%d.%d" % (os.path.basename(str(mapnik[0])),major, minor)), symlink)
-    env.Alias(target='install', source=link2)
-else:
-    env.Alias(target='install', source=env.Install(install_prefix + '/' + env['LIBDIR_SCHEMA'], mapnik))
-
-includes = glob.glob('../include/mapnik/*.hpp')
-env.Alias(target='install', source=env.Install(install_prefix+'/include/mapnik', includes))
diff --git a/src/agg/agg_renderer.cpp b/src/agg/agg_renderer.cpp
new file mode 100644
index 0000000..42793cf
--- /dev/null
+++ b/src/agg/agg_renderer.cpp
@@ -0,0 +1,249 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/agg_renderer.hpp>
+#include <mapnik/agg_rasterizer.hpp>
+#include <mapnik/marker_cache.hpp>
+#include <mapnik/unicode.hpp>
+#include <mapnik/placement_finder.hpp>
+#include <mapnik/config_error.hpp>
+#include <mapnik/font_set.hpp>
+#include <mapnik/parse_path.hpp>
+#include <mapnik/text_path.hpp>
+#include <mapnik/svg/svg_converter.hpp>
+#include <mapnik/svg/svg_renderer.hpp>
+#include <mapnik/svg/svg_path_adapter.hpp>
+
+
+// agg
+#define AGG_RENDERING_BUFFER row_ptr_cache<int8u>
+#include "agg_rendering_buffer.h"
+#include "agg_pixfmt_rgba.h"
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_basics.h"
+#include "agg_scanline_p.h"
+#include "agg_scanline_u.h"
+#include "agg_renderer_scanline.h"
+#include "agg_path_storage.h"
+#include "agg_span_allocator.h"
+#include "agg_span_pattern_rgba.h"
+#include "agg_image_accessors.h"
+#include "agg_conv_stroke.h"
+#include "agg_conv_dash.h"
+#include "agg_conv_contour.h"
+#include "agg_conv_clip_polyline.h"
+#include "agg_vcgen_stroke.h"
+#include "agg_conv_adaptor_vcgen.h"
+#include "agg_conv_smooth_poly1.h"
+#include "agg_conv_marker.h"
+#include "agg_vcgen_markers_term.h"
+#include "agg_renderer_outline_aa.h"
+#include "agg_rasterizer_outline_aa.h"
+#include "agg_rasterizer_outline.h"
+#include "agg_renderer_outline_image.h"
+#include "agg_span_allocator.h"
+#include "agg_span_pattern_rgba.h"
+#include "agg_renderer_scanline.h"
+#include "agg_pattern_filters_rgba.h"
+#include "agg_renderer_outline_image.h"
+#include "agg_vpgen_clip_polyline.h"
+#include "agg_arrowhead.h"
+
+
+// boost
+#include <boost/utility.hpp>
+
+
+// stl
+#ifdef MAPNIK_DEBUG
+#include <iostream>
+#endif
+
+#include <cmath>
+
+namespace mapnik
+{
+class pattern_source : private boost::noncopyable
+{
+public:
+    pattern_source(image_data_32 const& pattern)
+        : pattern_(pattern) {}
+
+    unsigned int width() const
+    {
+        return pattern_.width();
+    }
+    unsigned int height() const
+    {
+        return pattern_.height();
+    }
+    agg::rgba8 pixel(int x, int y) const
+    {
+        unsigned c = pattern_(x,y);
+        return agg::rgba8(c & 0xff,
+                          (c >> 8) & 0xff,
+                          (c >> 16) & 0xff,
+                          (c >> 24) & 0xff);
+    }
+private:
+    image_data_32 const& pattern_;
+};
+
+
+template <typename T>
+agg_renderer<T>::agg_renderer(Map const& m, T & pixmap, double scale_factor, unsigned offset_x, unsigned offset_y)
+    : feature_style_processor<agg_renderer>(m, scale_factor),
+      pixmap_(pixmap),
+      width_(pixmap_.width()),
+      height_(pixmap_.height()),
+      scale_factor_(scale_factor),
+      t_(m.width(),m.height(),m.get_current_extent(),offset_x,offset_y),
+      font_engine_(),
+      font_manager_(font_engine_),
+      detector_(box2d<double>(-m.buffer_size(), -m.buffer_size(), m.width() + m.buffer_size() ,m.height() + m.buffer_size())),
+      ras_ptr(new rasterizer)
+{
+    boost::optional<color> const& bg = m.background();
+    if (bg) pixmap_.set_background(*bg);
+    
+    boost::optional<std::string> const& image_filename = m.background_image();
+    if (image_filename)
+    {
+        boost::optional<mapnik::marker_ptr> bg_marker = mapnik::marker_cache::instance()->find(*image_filename,true);
+        if (bg_marker && (*bg_marker)->is_bitmap())
+        {
+            mapnik::image_ptr bg_image = *(*bg_marker)->get_bitmap_data();
+            int w = bg_image->width();
+            int h = bg_image->height();
+            if ( w > 0 && h > 0)
+            {
+                // repeat background-image both vertically and horizontally
+                unsigned x_steps = unsigned(std::ceil(width_/double(w)));
+                unsigned y_steps = unsigned(std::ceil(height_/double(h)));
+                for (unsigned x=0;x<x_steps;++x)
+                {
+                    for (unsigned y=0;y<y_steps;++y)
+                    {
+                        pixmap_.set_rectangle_alpha2(*bg_image, x*w, y*h, 1.0f);
+                    }
+                }
+            }
+        }
+    }
+#ifdef MAPNIK_DEBUG
+    std::clog << "scale=" << m.scale() << "\n";
+#endif
+}
+
+template <typename T>
+agg_renderer<T>::~agg_renderer() {}
+
+template <typename T>
+#ifdef MAPNIK_DEBUG
+void agg_renderer<T>::start_map_processing(Map const& map)
+{
+    std::clog << "start map processing bbox="
+              << map.get_current_extent() << "\n";
+#else
+void agg_renderer<T>::start_map_processing(Map const& /*map*/)
+{
+#endif
+    ras_ptr->clip_box(0,0,width_,height_);
+}
+
+template <typename T>
+void agg_renderer<T>::end_map_processing(Map const& )
+{
+#ifdef MAPNIK_DEBUG
+    std::clog << "end map processing\n";
+#endif
+}
+
+template <typename T>
+void agg_renderer<T>::start_layer_processing(layer const& lay)
+{
+#ifdef MAPNIK_DEBUG
+    std::clog << "start layer processing : " << lay.name()  << "\n";
+    std::clog << "datasource = " << lay.datasource().get() << "\n";
+#endif
+    if (lay.clear_label_cache())
+    {
+        detector_.clear();
+    }
+}
+
+template <typename T>
+void agg_renderer<T>::end_layer_processing(layer const&)
+{
+#ifdef MAPNIK_DEBUG
+    std::clog << "end layer processing\n";
+#endif
+}
+
+template <typename T>
+void agg_renderer<T>::render_marker(const int x, const int y, marker &marker, const agg::trans_affine & tr, double opacity)
+{
+    if (marker.is_vector())
+    {
+        typedef agg::pixfmt_rgba32_plain pixfmt;
+        typedef agg::renderer_base<pixfmt> renderer_base;
+        typedef agg::renderer_scanline_aa_solid<renderer_base> renderer_solid;
+
+        ras_ptr->reset();
+        ras_ptr->gamma(agg::gamma_linear());
+        agg::scanline_u8 sl;
+        agg::rendering_buffer buf(pixmap_.raw_data(), width_, height_, width_ * 4);
+        pixfmt pixf(buf);
+        renderer_base renb(pixf);
+
+        box2d<double> const& bbox = (*marker.get_vector_data())->bounding_box();
+        coord<double,2> c = bbox.center();
+        // center the svg marker on '0,0'
+        agg::trans_affine mtx = agg::trans_affine_translation(-c.x,-c.y);
+        // apply symbol transformation to get to map space
+        mtx *= tr;
+        mtx *= agg::trans_affine_scaling(scale_factor_);
+        // render the marker at the center of the marker box
+        mtx.translate(x+0.5 * marker.width(), y+0.5 * marker.height());
+
+        vertex_stl_adapter<svg_path_storage> stl_storage((*marker.get_vector_data())->source());
+        svg_path_adapter svg_path(stl_storage);
+        svg_renderer<svg_path_adapter,
+                     agg::pod_bvector<path_attributes>,
+                     renderer_solid,
+                     agg::pixfmt_rgba32_plain> svg_renderer(svg_path,
+                             (*marker.get_vector_data())->attributes());
+
+        svg_renderer.render(*ras_ptr, sl, renb, mtx, opacity, bbox);
+
+
+    }
+    else
+    {
+        pixmap_.set_rectangle_alpha2(**marker.get_bitmap_data(), x, y, opacity);
+    }
+}
+
+template class agg_renderer<image_32>;
+}
diff --git a/src/agg/process_building_symbolizer.cpp b/src/agg/process_building_symbolizer.cpp
new file mode 100644
index 0000000..dda8090
--- /dev/null
+++ b/src/agg/process_building_symbolizer.cpp
@@ -0,0 +1,155 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/agg_renderer.hpp>
+#include <mapnik/agg_rasterizer.hpp>
+#include <mapnik/segment.hpp>
+
+// boost
+#include <boost/scoped_ptr.hpp>
+
+// agg
+#include "agg_basics.h"
+#include "agg_rendering_buffer.h"
+#include "agg_pixfmt_rgba.h"
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_scanline_u.h"
+#include "agg_renderer_scanline.h"
+#include "agg_conv_stroke.h"
+
+namespace mapnik 
+{
+
+template <typename T>
+void agg_renderer<T>::process(building_symbolizer const& sym,
+                              Feature const& feature,
+                              proj_transform const& prj_trans)
+{
+    typedef  coord_transform2<CoordTransform,geometry_type> path_type;
+    typedef  coord_transform3<CoordTransform,geometry_type> path_type_roof;
+    typedef agg::renderer_base<agg::pixfmt_rgba32_plain> ren_base;
+    typedef agg::renderer_scanline_aa_solid<ren_base> renderer;
+
+    agg::rendering_buffer buf(pixmap_.raw_data(),width_,height_, width_ * 4);
+    agg::pixfmt_rgba32_plain pixf(buf);
+    ren_base renb(pixf);
+
+    color const& fill_  = sym.get_fill();
+    unsigned r=fill_.red();
+    unsigned g=fill_.green();
+    unsigned b=fill_.blue();
+    unsigned a=fill_.alpha();
+    renderer ren(renb);
+    agg::scanline_u8 sl;
+
+    ras_ptr->reset();
+    ras_ptr->gamma(agg::gamma_linear());
+    
+    double height = sym.height() * scale_factor_;
+    
+    for (unsigned i=0;i<feature.num_geometries();++i)
+    {
+        geometry_type const& geom = feature.get_geometry(i);
+        if (geom.num_points() > 2)
+        {
+            boost::scoped_ptr<geometry_type> frame(new geometry_type(LineString));
+            boost::scoped_ptr<geometry_type> roof(new geometry_type(Polygon));
+            std::deque<segment_t> face_segments;
+            double x0(0);
+            double y0(0);
+            unsigned cm = geom.vertex(&x0,&y0);
+            for (unsigned j=1;j<geom.num_points();++j)
+            {
+                double x(0);
+                double y(0);
+                cm = geom.vertex(&x,&y);
+                if (cm == SEG_MOVETO)
+                {
+                    frame->move_to(x,y);
+                }
+                else if (cm == SEG_LINETO)
+                {
+                    frame->line_to(x,y);
+                    face_segments.push_back(segment_t(x0,y0,x,y));
+                }
+                
+                x0 = x;
+                y0 = y;
+            }
+            std::sort(face_segments.begin(),face_segments.end(), y_order);
+            std::deque<segment_t>::const_iterator itr=face_segments.begin();
+            for (;itr!=face_segments.end();++itr)
+            {
+                boost::scoped_ptr<geometry_type> faces(new geometry_type(Polygon));
+                faces->move_to(itr->get<0>(),itr->get<1>());
+                faces->line_to(itr->get<2>(),itr->get<3>());
+                faces->line_to(itr->get<2>(),itr->get<3>() + height);
+                faces->line_to(itr->get<0>(),itr->get<1>() + height);
+
+                path_type faces_path (t_,*faces,prj_trans);
+                ras_ptr->add_path(faces_path);
+                ren.color(agg::rgba8(int(r*0.8), int(g*0.8), int(b*0.8), int(a * sym.get_opacity())));
+                agg::render_scanlines(*ras_ptr, sl, ren);
+                ras_ptr->reset();
+
+                frame->move_to(itr->get<0>(),itr->get<1>());
+                frame->line_to(itr->get<0>(),itr->get<1>()+height);
+            }
+
+            geom.rewind(0);
+            for (unsigned j=0;j<geom.num_points();++j)
+            {
+                double x,y;
+                unsigned cm = geom.vertex(&x,&y);
+                if (cm == SEG_MOVETO)
+                {
+                    frame->move_to(x,y+height);
+                    roof->move_to(x,y+height);
+                }
+                else if (cm == SEG_LINETO)
+                {
+                    frame->line_to(x,y+height);
+                    roof->line_to(x,y+height);
+                }
+            }
+            path_type path(t_,*frame,prj_trans);
+            agg::conv_stroke<path_type> stroke(path);
+            ras_ptr->add_path(stroke);
+            ren.color(agg::rgba8(int(r*0.8), int(g*0.8), int(b*0.8), int(255 * sym.get_opacity())));
+            agg::render_scanlines(*ras_ptr, sl, ren);
+            ras_ptr->reset();
+
+            path_type roof_path (t_,*roof,prj_trans);
+            ras_ptr->add_path(roof_path);
+            ren.color(agg::rgba8(r, g, b, int(a * sym.get_opacity())));
+            agg::render_scanlines(*ras_ptr, sl, ren);
+        }
+    }
+}
+
+template void agg_renderer<image_32>::process(building_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+
+}
diff --git a/src/agg/process_glyph_symbolizer.cpp b/src/agg/process_glyph_symbolizer.cpp
new file mode 100644
index 0000000..e3b31b3
--- /dev/null
+++ b/src/agg/process_glyph_symbolizer.cpp
@@ -0,0 +1,100 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/agg_renderer.hpp>
+
+// agg
+#include "agg_basics.h"
+#include "agg_rendering_buffer.h"
+#include "agg_pixfmt_rgba.h"
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_scanline_u.h"
+
+namespace mapnik {
+
+template <typename T>
+void agg_renderer<T>::process(glyph_symbolizer const& sym,
+                              Feature const& feature,
+                              proj_transform const& prj_trans)
+{
+    face_set_ptr faces = font_manager_.get_face_set(sym.get_face_name());
+    stroker_ptr strk = font_manager_.get_stroker();
+    if (faces->size() > 0 && strk)
+    {
+        // Get x and y from geometry and translate to pixmap coords.
+        double x, y, z=0.0;
+        feature.get_geometry(0).label_position(&x, &y);
+        prj_trans.backward(x,y,z);
+        t_.forward(&x, &y);
+
+        text_renderer<T> ren(pixmap_, faces, *strk);
+
+        // set fill and halo colors
+        color fill = sym.eval_color(feature);
+        ren.set_fill(fill);
+        if (fill != color("transparent")) {
+            ren.set_halo_fill(sym.get_halo_fill());
+            ren.set_halo_radius(sym.get_halo_radius() * scale_factor_);
+        }
+
+        // set font size
+        unsigned size = sym.eval_size(feature);
+        ren.set_pixel_size(size * scale_factor_);
+        faces->set_pixel_sizes(size * scale_factor_);
+
+        // Get and render text path
+        //
+        text_path_ptr path = sym.get_text_path(faces, feature);
+        // apply displacement
+        position pos = sym.get_displacement();
+        double dx = boost::get<0>(pos);
+        double dy = boost::get<1>(pos);
+        path->starting_x = x = x+dx;
+        path->starting_y = y = y+dy;
+
+        // Prepare glyphs to set internal state and calculate the marker's
+        // final box so we can check for a valid placement
+        box2d<double> dim = ren.prepare_glyphs(path.get());
+        box2d<double> ext(x-dim.width()/2, y-dim.height()/2, x+dim.width()/2, y+dim.height()/2);
+        if ((sym.get_allow_overlap() || detector_.has_placement(ext)) &&
+            (!sym.get_avoid_edges() || detector_.extent().contains(ext)))
+        {    
+            // Placement is valid, render glyph and update detector.
+            ren.render(x, y);
+            detector_.insert(ext);
+            metawriter_with_properties writer = sym.get_metawriter();
+            if (writer.first) writer.first->add_box(ext, feature, t_, writer.second);
+        }
+    }
+    else
+    {
+        throw config_error(
+            "Unable to find specified font face in GlyphSymbolizer"
+            );
+    }
+}
+template void agg_renderer<image_32>::process(glyph_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+}
diff --git a/src/agg/process_line_pattern_symbolizer.cpp b/src/agg/process_line_pattern_symbolizer.cpp
new file mode 100644
index 0000000..99559f1
--- /dev/null
+++ b/src/agg/process_line_pattern_symbolizer.cpp
@@ -0,0 +1,95 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/agg_renderer.hpp>
+#include <mapnik/agg_rasterizer.hpp>
+#include <mapnik/agg_pattern_source.hpp>
+#include <mapnik/expression_evaluator.hpp>
+#include <mapnik/marker_cache.hpp>
+
+// agg
+#include "agg_basics.h"
+#include "agg_rendering_buffer.h"
+#include "agg_pixfmt_rgba.h"
+#include "agg_rasterizer_outline.h"
+#include "agg_rasterizer_outline_aa.h"
+#include "agg_scanline_u.h"
+//
+#include "agg_renderer_scanline.h"
+#include "agg_pattern_filters_rgba.h"
+#include "agg_span_allocator.h"
+#include "agg_span_pattern_rgba.h"
+#include "agg_renderer_outline_image.h"
+
+namespace mapnik {
+
+template <typename T>
+void  agg_renderer<T>::process(line_pattern_symbolizer const& sym,
+                               Feature const& feature,
+                               proj_transform const& prj_trans)
+{
+    typedef  coord_transform2<CoordTransform,geometry_type> path_type;
+    typedef agg::line_image_pattern<agg::pattern_filter_bilinear_rgba8> pattern_type;
+    typedef agg::renderer_base<agg::pixfmt_rgba32_plain> renderer_base;
+    typedef agg::renderer_outline_image<renderer_base, pattern_type> renderer_type;
+    typedef agg::rasterizer_outline_aa<renderer_type> rasterizer_type;
+
+    agg::rendering_buffer buf(pixmap_.raw_data(),width_,height_, width_ * 4);
+    agg::pixfmt_rgba32_plain pixf(buf);
+    
+    std::string filename = path_processor_type::evaluate( *sym.get_filename(), feature);
+
+    boost::optional<marker_ptr> mark = marker_cache::instance()->find(filename,true);
+    if (!mark || !(*mark)->is_bitmap()) return;
+
+    boost::optional<image_ptr> pat = (*mark)->get_bitmap_data();
+
+    if (!pat) return;
+      
+    renderer_base ren_base(pixf);
+    agg::pattern_filter_bilinear_rgba8 filter;
+    pattern_source source(*(*pat));
+    pattern_type pattern (filter,source);
+    renderer_type ren(ren_base, pattern);
+    // TODO - should be sensitive to buffer size
+    ren.clip_box(0,0,width_,height_);
+    rasterizer_type ras(ren);
+    metawriter_with_properties writer = sym.get_metawriter();
+    for (unsigned i=0;i<feature.num_geometries();++i)
+    {
+        geometry_type const& geom = feature.get_geometry(i);
+        if (geom.num_points() > 1)
+        {
+            path_type path(t_,geom,prj_trans);
+            ras.add_path(path);
+            if (writer.first) writer.first->add_line(path, feature, t_, writer.second);
+        }
+    }
+}
+
+template void agg_renderer<image_32>::process(line_pattern_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+
+}
diff --git a/src/agg/process_line_symbolizer.cpp b/src/agg/process_line_symbolizer.cpp
new file mode 100644
index 0000000..a4de58d
--- /dev/null
+++ b/src/agg/process_line_symbolizer.cpp
@@ -0,0 +1,186 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/agg_renderer.hpp>
+#include <mapnik/agg_rasterizer.hpp>
+
+// agg
+#include "agg_basics.h"
+#include "agg_rendering_buffer.h"
+#include "agg_pixfmt_rgba.h"
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_scanline_u.h"
+#include "agg_renderer_scanline.h"
+#include "agg_scanline_p.h"
+#include "agg_conv_stroke.h"
+#include "agg_conv_dash.h"
+#include "agg_renderer_outline_aa.h"
+#include "agg_rasterizer_outline_aa.h"
+
+
+// stl
+#include <string>
+
+namespace mapnik {
+
+template <typename T>
+void agg_renderer<T>::process(line_symbolizer const& sym,
+                              Feature const& feature,
+                              proj_transform const& prj_trans)
+{
+    typedef agg::renderer_base<agg::pixfmt_rgba32_plain> ren_base;
+    typedef coord_transform2<CoordTransform,geometry_type> path_type;
+
+    stroke const& stroke_ = sym.get_stroke();
+    color const& col = stroke_.get_color();
+    unsigned r=col.red();
+    unsigned g=col.green();
+    unsigned b=col.blue();
+    unsigned a=col.alpha();
+    
+    agg::rendering_buffer buf(pixmap_.raw_data(),width_,height_, width_ * 4);
+    agg::pixfmt_rgba32_plain pixf(buf);
+    
+    if (sym.get_rasterizer() == RASTERIZER_FAST)
+    {
+        typedef agg::renderer_outline_aa<ren_base> renderer_type;
+        typedef agg::rasterizer_outline_aa<renderer_type> rasterizer_type;
+
+        agg::line_profile_aa profile;
+        //agg::line_profile_aa profile(stroke_.get_width() * scale_factor_, agg::gamma_none());
+        profile.width(stroke_.get_width() * scale_factor_);
+        ren_base base_ren(pixf);
+        renderer_type ren(base_ren, profile);
+        ren.color(agg::rgba8(r, g, b, int(a*stroke_.get_opacity())));
+        //ren.clip_box(0,0,width_,height_);
+        rasterizer_type ras(ren);
+        ras.line_join(agg::outline_miter_accurate_join);
+        ras.round_cap(true);
+   
+        for (unsigned i=0;i<feature.num_geometries();++i)
+        {
+            geometry_type const& geom = feature.get_geometry(i);
+            if (geom.num_points() > 1)
+            {
+                path_type path(t_,geom,prj_trans);
+                ras.add_path(path);
+            }
+        }
+    }
+    else
+    {
+        typedef agg::renderer_scanline_aa_solid<ren_base> renderer;
+
+        agg::scanline_p8 sl;
+    
+        ren_base renb(pixf);
+        renderer ren(renb);
+        ras_ptr->reset();
+        ras_ptr->gamma(agg::gamma_linear(0.0, stroke_.get_gamma()));
+        
+        metawriter_with_properties writer = sym.get_metawriter();
+        for (unsigned i=0;i<feature.num_geometries();++i)
+        {
+            geometry_type const& geom = feature.get_geometry(i);
+            if (geom.num_points() > 1)
+            {
+                path_type path(t_,geom,prj_trans);
+    
+                if (stroke_.has_dash())
+                {
+                    agg::conv_dash<path_type> dash(path);
+                    dash_array const& d = stroke_.get_dash_array();
+                    dash_array::const_iterator itr = d.begin();
+                    dash_array::const_iterator end = d.end();
+                    for (;itr != end;++itr)
+                    {
+                        dash.add_dash(itr->first * scale_factor_, 
+                                      itr->second * scale_factor_);
+                    }
+    
+                    agg::conv_stroke<agg::conv_dash<path_type > > stroke(dash);
+    
+                    line_join_e join=stroke_.get_line_join();
+                    if ( join == MITER_JOIN)
+                        stroke.generator().line_join(agg::miter_join);
+                    else if( join == MITER_REVERT_JOIN)
+                        stroke.generator().line_join(agg::miter_join);
+                    else if( join == ROUND_JOIN)
+                        stroke.generator().line_join(agg::round_join);
+                    else
+                        stroke.generator().line_join(agg::bevel_join);
+    
+                    line_cap_e cap=stroke_.get_line_cap();
+                    if (cap == BUTT_CAP)
+                        stroke.generator().line_cap(agg::butt_cap);
+                    else if (cap == SQUARE_CAP)
+                        stroke.generator().line_cap(agg::square_cap);
+                    else
+                        stroke.generator().line_cap(agg::round_cap);
+    
+                    stroke.generator().miter_limit(4.0);
+                    stroke.generator().width(stroke_.get_width() * scale_factor_);
+                    ras_ptr->add_path(stroke);
+    
+                }
+                else
+                {
+                    agg::conv_stroke<path_type>  stroke(path);
+                    line_join_e join=stroke_.get_line_join();
+                    if ( join == MITER_JOIN)
+                        stroke.generator().line_join(agg::miter_join);
+                    else if( join == MITER_REVERT_JOIN)
+                        stroke.generator().line_join(agg::miter_join);
+                    else if( join == ROUND_JOIN)
+                        stroke.generator().line_join(agg::round_join);
+                    else
+                        stroke.generator().line_join(agg::bevel_join);
+    
+                    line_cap_e cap=stroke_.get_line_cap();
+                    if (cap == BUTT_CAP)
+                        stroke.generator().line_cap(agg::butt_cap);
+                    else if (cap == SQUARE_CAP)
+                        stroke.generator().line_cap(agg::square_cap);
+                    else
+                        stroke.generator().line_cap(agg::round_cap);
+    
+                    stroke.generator().miter_limit(4.0);
+                    stroke.generator().width(stroke_.get_width() * scale_factor_);
+                    ras_ptr->add_path(stroke);
+                    if (writer.first) writer.first->add_line(path, feature, t_, writer.second);
+                }
+            }
+        }
+        ren.color(agg::rgba8(r, g, b, int(a*stroke_.get_opacity())));
+        agg::render_scanlines(*ras_ptr, sl, ren);    
+    }
+}
+
+
+template void agg_renderer<image_32>::process(line_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+
+}
+ 
diff --git a/src/agg/process_markers_symbolizer.cpp b/src/agg/process_markers_symbolizer.cpp
new file mode 100644
index 0000000..d40b02e
--- /dev/null
+++ b/src/agg/process_markers_symbolizer.cpp
@@ -0,0 +1,289 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#include <mapnik/agg_renderer.hpp>
+#include <mapnik/agg_rasterizer.hpp>
+#include <mapnik/expression_evaluator.hpp>
+#include <mapnik/image_util.hpp>
+#include <mapnik/marker_cache.hpp>
+#include <mapnik/svg/svg_renderer.hpp>
+#include <mapnik/svg/svg_path_adapter.hpp>
+#include <mapnik/markers_placement.hpp>
+#include <mapnik/arrow.hpp>
+
+#include "agg_basics.h"
+#include "agg_rendering_buffer.h"
+#include "agg_pixfmt_rgba.h"
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_scanline_u.h"
+#include "agg_scanline_p.h"
+#include "agg_path_storage.h"
+#include "agg_ellipse.h"
+#include "agg_conv_stroke.h"
+
+
+namespace mapnik {
+
+template <typename T>
+void agg_renderer<T>::process(markers_symbolizer const& sym,
+                              Feature const& feature,
+                              proj_transform const& prj_trans)
+{
+    typedef coord_transform2<CoordTransform,geometry_type> path_type;
+    typedef agg::pixfmt_rgba32_plain pixfmt;
+    typedef agg::renderer_base<pixfmt> renderer_base;
+    typedef agg::renderer_scanline_aa_solid<renderer_base> renderer_solid;
+    
+    ras_ptr->reset();
+    ras_ptr->gamma(agg::gamma_linear());
+    agg::scanline_u8 sl;
+    agg::scanline_p8 sl_line;
+    agg::rendering_buffer buf(pixmap_.raw_data(), width_, height_, width_ * 4);
+    pixfmt pixf(buf);
+    renderer_base renb(pixf);
+    renderer_solid ren(renb);
+    agg::trans_affine tr;
+    boost::array<double,6> const& m = sym.get_transform();
+    tr.load_from(&m[0]);
+    tr = agg::trans_affine_scaling(scale_factor_) * tr;
+    std::string filename = path_processor_type::evaluate(*sym.get_filename(), feature);
+    marker_placement_e placement_method = sym.get_marker_placement();
+    marker_type_e marker_type = sym.get_marker_type();
+    metawriter_with_properties writer = sym.get_metawriter();
+    
+    if (!filename.empty())
+    {
+        boost::optional<marker_ptr> mark = mapnik::marker_cache::instance()->find(filename, true);
+        if (mark && *mark)
+        {
+            if (!(*mark)->is_vector()) {
+                std::clog << "### Warning only svg markers are supported in the markers_symbolizer\n";
+                return;
+            }
+            boost::optional<path_ptr> marker = (*mark)->get_vector_data();
+            box2d<double> const& bbox = (*marker)->bounding_box();
+            double x1 = bbox.minx();
+            double y1 = bbox.miny();
+            double x2 = bbox.maxx();
+            double y2 = bbox.maxy();
+            
+            agg::trans_affine recenter = agg::trans_affine_translation(-0.5*(x1+x2),-0.5*(y1+y2));
+            tr.transform(&x1,&y1);
+            tr.transform(&x2,&y2);
+            box2d<double> extent(x1,y1,x2,y2);
+            using namespace mapnik::svg;
+            vertex_stl_adapter<svg_path_storage> stl_storage((*marker)->source());
+            svg_path_adapter svg_path(stl_storage);
+            svg_renderer<svg_path_adapter, 
+                         agg::pod_bvector<path_attributes>,
+                         renderer_solid,
+                         agg::pixfmt_rgba32_plain > svg_renderer(svg_path,(*marker)->attributes());
+
+            for (unsigned i=0; i<feature.num_geometries(); ++i)
+            {
+                geometry_type const& geom = feature.get_geometry(i);
+                if (geom.num_points() <= 1)
+                {
+                    std::clog << "### Warning svg markers not supported yet for points within markers_symbolizer\n";
+                    continue;
+                } 
+                
+                path_type path(t_,geom,prj_trans);
+                markers_placement<path_type, label_collision_detector4> placement(path, extent, detector_, 
+                                                                                  sym.get_spacing() * scale_factor_, 
+                                                                                  sym.get_max_error(), 
+                                                                                  sym.get_allow_overlap());        
+                double x, y, angle;
+            
+                while (placement.get_point(&x, &y, &angle))
+                {
+                    agg::trans_affine matrix = recenter * tr *agg::trans_affine_rotation(angle) * agg::trans_affine_translation(x, y);
+                    svg_renderer.render(*ras_ptr, sl, renb, matrix, sym.get_opacity(),bbox);
+                    if (writer.first)
+                        //writer.first->add_box(label_ext, feature, t_, writer.second);
+                        std::clog << "### Warning metawriter not yet supported for LINE placement\n";
+                }
+            }
+        }
+    }
+    else // FIXME: should default marker be stored in marker_cache ???
+    {
+        color const& fill_ = sym.get_fill();
+        unsigned r = fill_.red();
+        unsigned g = fill_.green();
+        unsigned b = fill_.blue();
+        unsigned a = fill_.alpha();
+        stroke const& stroke_ = sym.get_stroke();
+        color const& col = stroke_.get_color();
+        double strk_width = stroke_.get_width();
+        unsigned s_r=col.red();
+        unsigned s_g=col.green();
+        unsigned s_b=col.blue();
+        unsigned s_a=col.alpha();
+        double w = sym.get_width();
+        double h = sym.get_height();
+    
+        arrow arrow_;
+        box2d<double> extent;
+
+        double dx = w + (2*strk_width);
+        double dy = h + (2*strk_width);
+
+        if (marker_type == ARROW)
+        {
+            extent = arrow_.extent();
+            double x1 = extent.minx();
+            double y1 = extent.miny();
+            double x2 = extent.maxx();
+            double y2 = extent.maxy();
+            tr.transform(&x1,&y1);
+            tr.transform(&x2,&y2);
+            extent.init(x1,y1,x2,y2);
+            //std::clog << x1 << " " << y1 << " " << x2 << " " << y2 << "\n"; 
+        }
+        else
+        {
+            double x1 = -1 *(dx);
+            double y1 = -1 *(dy);
+            double x2 = dx;
+            double y2 = dy;
+            tr.transform(&x1,&y1);
+            tr.transform(&x2,&y2);
+            extent.init(x1,y1,x2,y2);
+            //std::clog << x1 << " " << y1 << " " << x2 << " " << y2 << "\n"; 
+        }
+
+    
+        double x;
+        double y;
+        double z=0;
+
+        agg::path_storage marker;
+
+        for (unsigned i=0; i<feature.num_geometries(); ++i)
+        {
+            geometry_type const& geom = feature.get_geometry(i);
+            //if (geom.num_points() <= 1) continue;
+            if (placement_method == MARKER_POINT_PLACEMENT || geom.num_points() <= 1)
+            {
+                geom.label_position(&x,&y);
+                prj_trans.backward(x,y,z);
+                t_.forward(&x,&y);
+                int px = int(floor(x - 0.5 * dx));
+                int py = int(floor(y - 0.5 * dy));
+                box2d<double> label_ext (px, py, px + dx +1, py + dy +1);
+
+                if (sym.get_allow_overlap() ||
+                    detector_.has_placement(label_ext))
+                {
+                    agg::ellipse c(x, y, w, h);
+                    marker.concat_path(c);
+                    ras_ptr->add_path(marker);
+                    ren.color(agg::rgba8(r, g, b, int(a*sym.get_opacity())));
+                    // TODO - fill with packed scanlines? agg::scanline_p8
+                    // and agg::renderer_outline_aa
+                    agg::render_scanlines(*ras_ptr, sl, ren);
+                    
+                    // outline
+                    if (strk_width)
+                    {
+                        ras_ptr->reset();
+                        agg::conv_stroke<agg::path_storage>  outline(marker);
+                        outline.generator().width(strk_width * scale_factor_);
+                        ras_ptr->add_path(outline);
+    
+                        ren.color(agg::rgba8(s_r, s_g, s_b, int(s_a*stroke_.get_opacity())));
+                        agg::render_scanlines(*ras_ptr, sl_line, ren);
+                    }
+                    detector_.insert(label_ext);
+                    if (writer.first) writer.first->add_box(label_ext, feature, t_, writer.second);
+                }
+            }
+            else
+            {
+                
+                if (marker_type == ARROW)
+                    marker.concat_path(arrow_);
+
+                path_type path(t_,geom,prj_trans);
+                markers_placement<path_type, label_collision_detector4> placement(path, extent, detector_, 
+                                                                                  sym.get_spacing() * scale_factor_, 
+                                                                                  sym.get_max_error(), 
+                                                                                  sym.get_allow_overlap());        
+                double x_t, y_t, angle;
+            
+                while (placement.get_point(&x_t, &y_t, &angle))
+                {
+                    agg::trans_affine matrix;
+
+                    if (marker_type == ELLIPSE)
+                    {
+                        // todo proper bbox - this is buggy
+                        agg::ellipse c(x_t, y_t, w, h);
+                        marker.concat_path(c);
+                        agg::trans_affine matrix;
+                        matrix *= agg::trans_affine_translation(-x_t,-y_t);
+                        matrix *= agg::trans_affine_rotation(angle);
+                        matrix *= agg::trans_affine_translation(x_t,y_t);
+                        marker.transform(matrix);
+
+                    }
+                    else
+                    {
+                        matrix = tr * agg::trans_affine_rotation(angle) * agg::trans_affine_translation(x_t, y_t);
+                    }
+
+
+                    // TODO 
+                    if (writer.first)
+                        //writer.first->add_box(label_ext, feature, t_, writer.second);
+                        std::clog << "### Warning metawriter not yet supported for LINE placement\n";
+
+                    agg::conv_transform<agg::path_storage, agg::trans_affine> trans(marker, matrix);
+                    ras_ptr->add_path(trans);
+
+                    // fill
+                    ren.color(agg::rgba8(r, g, b, int(a*sym.get_opacity())));
+                    agg::render_scanlines(*ras_ptr, sl, ren);
+
+                    // outline
+                    if (strk_width)
+                    {
+                        ras_ptr->reset();
+                        agg::conv_stroke<agg::conv_transform<agg::path_storage, agg::trans_affine> >  outline(trans);
+                        outline.generator().width(strk_width * scale_factor_);
+                        ras_ptr->add_path(outline);
+                        ren.color(agg::rgba8(s_r, s_g, s_b, int(s_a*stroke_.get_opacity())));
+                        agg::render_scanlines(*ras_ptr, sl_line, ren);
+                    }
+                }
+            }
+
+        }
+    }
+}
+
+template void agg_renderer<image_32>::process(markers_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+}
diff --git a/src/agg/process_point_symbolizer.cpp b/src/agg/process_point_symbolizer.cpp
new file mode 100644
index 0000000..fd57ec1
--- /dev/null
+++ b/src/agg/process_point_symbolizer.cpp
@@ -0,0 +1,122 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/agg_renderer.hpp>
+#include <mapnik/agg_rasterizer.hpp>
+#include <mapnik/image_util.hpp>
+#include <mapnik/metawriter.hpp>
+#include <mapnik/marker_cache.hpp>
+#include <mapnik/expression_evaluator.hpp>
+
+#include "agg_basics.h"
+#include "agg_rendering_buffer.h"
+#include "agg_pixfmt_rgba.h"
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_scanline_u.h"
+
+// stl
+#include <string>
+
+// boost
+#include <boost/make_shared.hpp>
+
+namespace mapnik {
+
+template <typename T>
+void agg_renderer<T>::process(point_symbolizer const& sym,
+                              Feature const& feature,
+                              proj_transform const& prj_trans)
+{
+    std::string filename = path_processor_type::evaluate(*sym.get_filename(), feature);
+    
+    boost::optional<mapnik::marker_ptr> marker;
+    if ( !filename.empty() )
+    {
+        marker = marker_cache::instance()->find(filename, true);
+    }
+    else
+    {
+        marker.reset(boost::make_shared<mapnik::marker>());
+    }
+
+    if (marker)
+    {
+        int w = (*marker)->width();
+        int h = (*marker)->height();    
+        agg::trans_affine tr;
+        boost::array<double,6> const& m = sym.get_transform();
+        tr.load_from(&m[0]);
+        double px0 = - 0.5 * w;
+        double py0 = - 0.5 * h;
+        double px1 = 0.5 * w;
+        double py1 = 0.5 * h;
+        double px2 = px1;
+        double py2 = py0;
+        double px3 = px0;
+        double py3 = py1;
+        tr.transform(&px0,&py0);
+        tr.transform(&px1,&py1);
+        tr.transform(&px2,&py2);
+        tr.transform(&px3,&py3);
+        box2d<double> label_ext (px0, py0, px1, py1);
+        label_ext.expand_to_include(px2, py2);
+        label_ext.expand_to_include(px3, py3);
+        
+        for (unsigned i=0; i<feature.num_geometries(); ++i)
+        {
+            geometry_type const& geom = feature.get_geometry(i);
+            double x;
+            double y;
+            double z=0;
+            if (sym.get_point_placement() == CENTROID_POINT_PLACEMENT)
+                geom.label_position(&x, &y);
+            else
+                geom.label_interior_position(&x, &y);
+
+            prj_trans.backward(x,y,z);
+            t_.forward(&x,&y);
+            label_ext.re_center(x,y);
+            
+            if (sym.get_allow_overlap() ||
+                detector_.has_placement(label_ext))
+            {
+                
+                render_marker(floor(x - 0.5 * w),floor(y - 0.5 * h) ,**marker,tr, sym.get_opacity());
+
+                if (!sym.get_ignore_placement())
+                    detector_.insert(label_ext);
+                metawriter_with_properties writer = sym.get_metawriter();
+                if (writer.first) writer.first->add_box(label_ext, feature, t_, writer.second);
+            }
+        }
+    }
+
+}
+
+template void agg_renderer<image_32>::process(point_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+
+}
+ 
diff --git a/src/agg/process_polygon_pattern_symbolizer.cpp b/src/agg/process_polygon_pattern_symbolizer.cpp
new file mode 100644
index 0000000..23ea900
--- /dev/null
+++ b/src/agg/process_polygon_pattern_symbolizer.cpp
@@ -0,0 +1,142 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/agg_renderer.hpp>
+#include <mapnik/agg_rasterizer.hpp>
+#include <mapnik/marker_cache.hpp>
+#include <mapnik/expression_evaluator.hpp>
+
+// agg
+#include "agg_basics.h"
+#include "agg_rendering_buffer.h"
+#include "agg_pixfmt_rgba.h"
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_scanline_u.h"
+// for polygon_pattern_symbolizer
+#include "agg_renderer_scanline.h"
+#include "agg_span_allocator.h"
+#include "agg_span_pattern_rgba.h"
+#include "agg_image_accessors.h"
+
+
+
+namespace mapnik {
+
+template <typename T>
+void agg_renderer<T>::process(polygon_pattern_symbolizer const& sym,
+                              Feature const& feature,
+                              proj_transform const& prj_trans)
+{
+    typedef coord_transform2<CoordTransform,geometry_type> path_type;
+    typedef agg::renderer_base<agg::pixfmt_rgba32_plain> ren_base;
+    typedef agg::wrap_mode_repeat wrap_x_type;
+    typedef agg::wrap_mode_repeat wrap_y_type;
+    typedef agg::pixfmt_alpha_blend_rgba<agg::blender_rgba32_plain,
+        agg::row_accessor<agg::int8u>, agg::pixel32_type> rendering_buffer;
+    typedef agg::image_accessor_wrap<rendering_buffer,
+        wrap_x_type,
+        wrap_y_type> img_source_type;
+
+    typedef agg::span_pattern_rgba<img_source_type> span_gen_type;
+
+    typedef agg::renderer_scanline_aa<ren_base,
+        agg::span_allocator<agg::rgba8>,
+        span_gen_type> renderer_type;
+
+
+    agg::rendering_buffer buf(pixmap_.raw_data(),width_,height_, width_ * 4);
+    agg::pixfmt_rgba32_plain pixf(buf);
+    ren_base renb(pixf);
+    
+    agg::scanline_u8 sl;
+    ras_ptr->reset();
+    ras_ptr->gamma(agg::gamma_linear(0.0, sym.get_gamma()));
+
+    std::string filename = path_processor_type::evaluate( *sym.get_filename(), feature);
+    boost::optional<mapnik::marker_ptr> marker;
+    if ( !filename.empty() )
+    {
+        marker = marker_cache::instance()->find(filename, true);
+    }
+    else
+    {
+        std::clog << "### Warning: file not found: " << filename << "\n";
+    }
+
+    if (!marker || !(*marker)->is_bitmap()) return;
+    
+
+    boost::optional<image_ptr> pat = (*marker)->get_bitmap_data();
+
+    if (!pat) return;
+    
+    unsigned w=(*pat)->width();
+    unsigned h=(*pat)->height();
+    agg::row_accessor<agg::int8u> pattern_rbuf((agg::int8u*)(*pat)->getBytes(),w,h,w*4);
+    agg::span_allocator<agg::rgba8> sa;
+    agg::pixfmt_alpha_blend_rgba<agg::blender_rgba32_plain,
+        agg::row_accessor<agg::int8u>, agg::pixel32_type> pixf_pattern(pattern_rbuf);
+    img_source_type img_src(pixf_pattern);
+    
+    unsigned num_geometries = feature.num_geometries();
+
+    pattern_alignment_e align = sym.get_alignment();
+    unsigned offset_x=0;
+    unsigned offset_y=0;
+    
+    if (align == LOCAL_ALIGNMENT)
+    {
+        double x0=0,y0=0;
+        if (num_geometries>0)
+        {
+            path_type path(t_,feature.get_geometry(0),prj_trans);
+            path.vertex(&x0,&y0);
+        }
+        offset_x = unsigned(width_-x0);
+        offset_y = unsigned(height_-y0);    
+    }
+    
+    span_gen_type sg(img_src, offset_x, offset_y);
+    renderer_type rp(renb,sa, sg);
+    metawriter_with_properties writer = sym.get_metawriter();
+    for (unsigned i=0;i<num_geometries;++i)
+    {
+        geometry_type const& geom = feature.get_geometry(i);
+        if (geom.num_points() > 2)
+        {
+            path_type path(t_,geom,prj_trans);
+            ras_ptr->add_path(path);
+            if (writer.first) writer.first->add_polygon(path, feature, t_, writer.second);
+        }
+    }
+    agg::render_scanlines(*ras_ptr, sl, rp);
+}
+
+
+template void agg_renderer<image_32>::process(polygon_pattern_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+
+}
+ 
diff --git a/src/agg/process_polygon_symbolizer.cpp b/src/agg/process_polygon_symbolizer.cpp
new file mode 100644
index 0000000..e284a5c
--- /dev/null
+++ b/src/agg/process_polygon_symbolizer.cpp
@@ -0,0 +1,87 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/agg_renderer.hpp>
+#include <mapnik/agg_rasterizer.hpp>
+
+// agg
+#include "agg_basics.h"
+#include "agg_rendering_buffer.h"
+#include "agg_pixfmt_rgba.h"
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_scanline_u.h"
+// for polygon_symbolizer
+#include "agg_renderer_scanline.h"
+
+// stl
+#include <string>
+
+namespace mapnik {
+
+template <typename T>
+void agg_renderer<T>::process(polygon_symbolizer const& sym,
+                              Feature const& feature,
+                              proj_transform const& prj_trans)
+{
+    typedef coord_transform2<CoordTransform,geometry_type> path_type;
+    typedef agg::renderer_base<agg::pixfmt_rgba32_plain> ren_base;
+    typedef agg::renderer_scanline_aa_solid<ren_base> renderer;
+
+    color const& fill_ = sym.get_fill();
+    agg::scanline_u8 sl;
+
+    agg::rendering_buffer buf(pixmap_.raw_data(),width_,height_, width_ * 4);
+    agg::pixfmt_rgba32_plain pixf(buf);
+
+    ren_base renb(pixf);
+    unsigned r=fill_.red();
+    unsigned g=fill_.green();
+    unsigned b=fill_.blue();
+    unsigned a=fill_.alpha();
+    renderer ren(renb);
+
+    ras_ptr->reset();
+    ras_ptr->gamma(agg::gamma_linear(0.0, sym.get_gamma()));
+    metawriter_with_properties writer = sym.get_metawriter();
+    for (unsigned i=0;i<feature.num_geometries();++i)
+    {
+        geometry_type const& geom=feature.get_geometry(i);
+        if (geom.num_points() > 2)
+        {
+            path_type path(t_,geom,prj_trans);
+            ras_ptr->add_path(path);
+            if (writer.first) writer.first->add_polygon(path, feature, t_, writer.second);
+        }
+    }
+    ren.color(agg::rgba8(r, g, b, int(a * sym.get_opacity())));
+    agg::render_scanlines(*ras_ptr, sl, ren);
+}
+
+
+template void agg_renderer<image_32>::process(polygon_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+
+}
+ 
diff --git a/src/agg/process_raster_symbolizer.cpp b/src/agg/process_raster_symbolizer.cpp
new file mode 100644
index 0000000..af1329b
--- /dev/null
+++ b/src/agg/process_raster_symbolizer.cpp
@@ -0,0 +1,117 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/agg_renderer.hpp>
+#include <mapnik/agg_rasterizer.hpp>
+#include <mapnik/image_data.hpp>
+#include <mapnik/image_util.hpp>
+#include <mapnik/raster.hpp>
+#include <mapnik/box2d.hpp>
+#include <mapnik/warp.hpp>
+#include <mapnik/config.hpp>
+
+// stl
+#include <cmath>
+
+
+namespace mapnik {
+
+
+template <typename T>
+void agg_renderer<T>::process(raster_symbolizer const& sym,
+                              Feature const& feature,
+                              proj_transform const& prj_trans)
+{
+    raster_ptr const& source=feature.get_raster();
+    if (source)
+    {
+        // If there's a colorizer defined, use it to color the raster in-place
+        raster_colorizer_ptr colorizer = sym.get_colorizer();
+        if (colorizer)
+            colorizer->colorize(source,feature.props());
+
+        box2d<double> target_ext = box2d<double>(source->ext_);
+        prj_trans.backward(target_ext, PROJ_ENVELOPE_POINTS);
+
+        box2d<double> ext=t_.forward(target_ext);
+        int start_x = (int)ext.minx();
+        int start_y = (int)ext.miny();
+        int end_x = (int)ceil(ext.maxx());
+        int end_y = (int)ceil(ext.maxy());
+        int raster_width = end_x - start_x;
+        int raster_height = end_y - start_y;
+        double err_offs_x = ext.minx() - start_x;
+        double err_offs_y = ext.miny() - start_y;
+        
+        if (raster_width > 0 && raster_height > 0)
+        {
+            double scale_factor = ext.width() / source->data_.width();
+            image_data_32 target_data(raster_width,raster_height);
+            raster target(target_ext, target_data);
+
+            reproject_raster(target, *source, prj_trans, err_offs_x, err_offs_y,
+                             sym.get_mesh_size(),
+                             sym.calculate_filter_factor(),
+                             scale_factor,
+                             sym.get_scaling());
+            
+            if (sym.get_mode() == "normal"){
+                if (sym.get_opacity() == 1.0) {
+                    pixmap_.set_rectangle_alpha(start_x,start_y,target.data_);
+                } else {
+                    pixmap_.set_rectangle_alpha2(target.data_,start_x,start_y, sym.get_opacity());
+                }
+            } else if (sym.get_mode() == "grain_merge"){
+                pixmap_.template merge_rectangle<MergeGrain> (target.data_,start_x,start_y, sym.get_opacity());
+            } else if (sym.get_mode() == "grain_merge2"){
+                pixmap_.template merge_rectangle<MergeGrain2> (target.data_,start_x,start_y, sym.get_opacity());
+            } else if (sym.get_mode() == "multiply"){
+                pixmap_.template merge_rectangle<Multiply> (target.data_,start_x,start_y, sym.get_opacity());
+            } else if (sym.get_mode() == "multiply2"){
+                pixmap_.template merge_rectangle<Multiply2> (target.data_,start_x,start_y, sym.get_opacity());
+            } else if (sym.get_mode() == "divide"){
+                pixmap_.template merge_rectangle<Divide> (target.data_,start_x,start_y, sym.get_opacity());
+            } else if (sym.get_mode() == "divide2"){
+                pixmap_.template merge_rectangle<Divide2> (target.data_,start_x,start_y, sym.get_opacity());
+            } else if (sym.get_mode() == "screen"){
+                pixmap_.template merge_rectangle<Screen> (target.data_,start_x,start_y, sym.get_opacity());
+            } else if (sym.get_mode() == "hard_light"){
+                pixmap_.template merge_rectangle<HardLight> (target.data_,start_x,start_y, sym.get_opacity());
+            } else {
+                if (sym.get_opacity() == 1.0){
+                    pixmap_.set_rectangle(start_x,start_y,target.data_);
+                } else {
+                    pixmap_.set_rectangle_alpha2(target.data_,start_x,start_y, sym.get_opacity());
+                }
+            }
+            // TODO: other modes? (add,diff,sub,...)
+        }
+    }
+}
+
+template void agg_renderer<image_32>::process(raster_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+
+}
diff --git a/src/agg/process_shield_symbolizer.cpp b/src/agg/process_shield_symbolizer.cpp
new file mode 100644
index 0000000..cb3591a
--- /dev/null
+++ b/src/agg/process_shield_symbolizer.cpp
@@ -0,0 +1,269 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#include <mapnik/agg_renderer.hpp>
+#include <mapnik/agg_rasterizer.hpp>
+#include <mapnik/expression_evaluator.hpp>
+#include <mapnik/image_util.hpp>
+#include <mapnik/marker_cache.hpp>
+#include <mapnik/svg/svg_converter.hpp>
+#include <mapnik/svg/svg_renderer.hpp>
+#include <mapnik/svg/svg_path_adapter.hpp>
+#include <mapnik/expression_evaluator.hpp>
+
+#include "agg_basics.h"
+#include "agg_rendering_buffer.h"
+#include "agg_scanline_u.h"
+
+// boost
+#include <boost/make_shared.hpp>
+
+namespace mapnik {
+
+template <typename T>
+void  agg_renderer<T>::process(shield_symbolizer const& sym,
+                               Feature const& feature,
+                               proj_transform const& prj_trans)
+{
+    typedef  coord_transform2<CoordTransform,geometry_type> path_type;
+
+
+    text_placement_info_ptr placement_options = sym.get_placement_options()->get_placement_info();
+    placement_options->next();
+    placement_options->next_position_only();
+
+    UnicodeString text;
+    if( sym.get_no_text() )
+        text = UnicodeString( " " );  // TODO: fix->use 'space' as the text to render
+    else
+    {
+        expression_ptr name_expr = sym.get_name();
+        if (!name_expr) return;
+        value_type result = boost::apply_visitor(evaluate<Feature,value_type>(feature),*name_expr);
+        text = result.to_unicode();
+    }
+    
+    if ( sym.get_text_transform() == UPPERCASE)
+    {
+        text = text.toUpper();
+    }
+    else if ( sym.get_text_transform() == LOWERCASE)
+    {
+        text = text.toLower();
+    }
+    else if ( sym.get_text_transform() == CAPITALIZE)
+    {
+        text = text.toTitle(NULL);
+    }
+    
+    agg::trans_affine tr;
+    boost::array<double,6> const& m = sym.get_transform();
+    tr.load_from(&m[0]);
+    
+    std::string filename = path_processor_type::evaluate( *sym.get_filename(), feature);
+    boost::optional<mapnik::marker_ptr> marker;
+    if ( !filename.empty() )
+    {
+        marker = marker_cache::instance()->find(filename, true);
+    }
+    else
+    {
+        marker.reset(boost::make_shared<mapnik::marker>());
+    }
+    
+    
+    if (text.length() > 0 && marker)
+    {
+        int w = (*marker)->width();
+        int h = (*marker)->height();
+        
+        double px0 = - 0.5 * w;
+        double py0 = - 0.5 * h;
+        double px1 = 0.5 * w;
+        double py1 = 0.5 * h;
+        double px2 = px1;
+        double py2 = py0;
+        double px3 = px0;
+        double py3 = py1;
+        tr.transform(&px0,&py0);
+        tr.transform(&px1,&py1);
+        tr.transform(&px2,&py2);
+        tr.transform(&px3,&py3);
+        box2d<double> label_ext (px0, py0, px1, py1);
+        label_ext.expand_to_include(px2, py2);
+        label_ext.expand_to_include(px3, py3);
+        
+        face_set_ptr faces;
+
+        if (sym.get_fontset().size() > 0)
+        {
+            faces = font_manager_.get_face_set(sym.get_fontset());
+        }
+        else
+        {
+            faces = font_manager_.get_face_set(sym.get_face_name());
+        }
+
+        stroker_ptr strk = font_manager_.get_stroker();
+        if (strk && faces->size() > 0)
+        {
+            text_renderer<T> ren(pixmap_, faces, *strk);
+
+            ren.set_pixel_size(sym.get_text_size() * scale_factor_);
+            ren.set_fill(sym.get_fill());
+            ren.set_halo_fill(sym.get_halo_fill());
+            ren.set_halo_radius(sym.get_halo_radius() * scale_factor_);
+            ren.set_opacity(sym.get_text_opacity());
+
+            placement_finder<label_collision_detector4> finder(detector_);
+
+            string_info info(text);
+
+            faces->get_string_info(info);
+
+            metawriter_with_properties writer = sym.get_metawriter();
+
+            for (unsigned i = 0; i < feature.num_geometries(); ++i)
+            {
+                geometry_type const& geom = feature.get_geometry(i);
+                if (geom.num_points() > 0 )
+                {
+                    path_type path(t_,geom,prj_trans);
+
+                    label_placement_enum how_placed = sym.get_label_placement();
+                    if (how_placed == POINT_PLACEMENT || how_placed == VERTEX_PLACEMENT || how_placed == INTERIOR_PLACEMENT)
+                    {
+                        // for every vertex, try and place a shield/text
+                        geom.rewind(0);
+                        placement text_placement(info, sym, scale_factor_, w, h, false);
+                        text_placement.avoid_edges = sym.get_avoid_edges();
+                        text_placement.allow_overlap = sym.get_allow_overlap();
+                        if (writer.first)
+                            text_placement.collect_extents =true; // needed for inmem metawriter
+                        position const& pos = sym.get_displacement();
+                        position const& shield_pos = sym.get_shield_displacement();
+                        for( unsigned jj = 0; jj < geom.num_points(); jj++ )
+                        {
+                            double label_x;
+                            double label_y;
+                            double z=0.0;
+
+                            if( how_placed == VERTEX_PLACEMENT )
+                                geom.vertex(&label_x,&label_y);  // by vertex
+                            else if( how_placed == INTERIOR_PLACEMENT )
+                                geom.label_interior_position(&label_x,&label_y);
+                            else
+                                geom.label_position(&label_x, &label_y);  // by middle of line or by point
+                            prj_trans.backward(label_x,label_y, z);
+                            t_.forward(&label_x,&label_y);
+
+                            label_x += boost::get<0>(shield_pos);
+                            label_y += boost::get<1>(shield_pos);
+
+                            finder.find_point_placement( text_placement, placement_options,
+                                                         label_x, label_y, 0.0,
+                                                         sym.get_line_spacing(),
+                                                         sym.get_character_spacing());
+
+                            // check to see if image overlaps anything too, there is only ever 1 placement found for points and verticies
+                            if( text_placement.placements.size() > 0)
+                            {
+                                double x = floor(text_placement.placements[0].starting_x);
+                                double y = floor(text_placement.placements[0].starting_y);
+                                int px;
+                                int py;
+                                
+                                if( !sym.get_unlock_image() )
+                                {
+                                    // center image at text center position
+                                    // remove displacement from image label
+                                    double lx = x - boost::get<0>(pos);
+                                    double ly = y - boost::get<1>(pos);
+                                    px=int(floor(lx - (0.5 * w))) + 1;
+                                    py=int(floor(ly - (0.5 * h))) + 1;
+                                    label_ext.re_center(lx,ly);
+                                }
+                                else
+                                {  // center image at reference location
+                                    px=int(floor(label_x - 0.5 * w));
+                                    py=int(floor(label_y - 0.5 * h));
+                                    label_ext.re_center(label_x,label_y);
+                                }
+                                
+                                if ( sym.get_allow_overlap() || detector_.has_placement(label_ext) )
+                                {
+                                    render_marker(px,py,**marker,tr,sym.get_opacity());
+
+                                    box2d<double> dim = ren.prepare_glyphs(&text_placement.placements[0]);
+                                    ren.render(x,y);
+                                    detector_.insert(label_ext);
+                                    finder.update_detector(text_placement);
+                                    if (writer.first) {
+                                        writer.first->add_box(label_ext, feature, t_, writer.second);
+                                        writer.first->add_text(text_placement, faces, feature, t_, writer.second);
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                    else if (geom.num_points() > 1 && how_placed == LINE_PLACEMENT)
+                    {
+                        placement text_placement(info, sym, scale_factor_, label_ext.width(), label_ext.height(), true);
+                        
+                        text_placement.avoid_edges = sym.get_avoid_edges();
+                        finder.find_point_placements<path_type>(text_placement, placement_options, path);
+
+                        position const&  pos = sym.get_displacement();
+                        for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ ii)
+                        {
+                            double x = floor(text_placement.placements[ii].starting_x);
+                            double y = floor(text_placement.placements[ii].starting_y);
+
+                            double lx = x - boost::get<0>(pos);
+                            double ly = y - boost::get<1>(pos);
+                            int px=int(floor(lx - (0.5*w))) + 1;
+                            int py=int(floor(ly - (0.5*h))) + 1;
+
+                            render_marker(px,py,**marker,tr,sym.get_opacity());
+
+                            if (writer.first) writer.first->add_box(label_ext, feature, t_, writer.second);
+
+                            box2d<double> dim = ren.prepare_glyphs(&text_placement.placements[ii]);
+                            ren.render(x,y);
+                        }
+                        finder.update_detector(text_placement);
+                        if (writer.first) writer.first->add_text(text_placement, faces, feature, t_, writer.second);
+                    }
+                }
+            }
+        }
+    }
+}
+
+
+template void agg_renderer<image_32>::process(shield_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+
+}
diff --git a/src/agg/process_text_symbolizer.cpp b/src/agg/process_text_symbolizer.cpp
new file mode 100644
index 0000000..58b00a4
--- /dev/null
+++ b/src/agg/process_text_symbolizer.cpp
@@ -0,0 +1,184 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/agg_renderer.hpp>
+#include <mapnik/agg_rasterizer.hpp>
+#include <mapnik/expression_evaluator.hpp>
+
+namespace mapnik {
+
+template <typename T>
+void agg_renderer<T>::process(text_symbolizer const& sym,
+                              Feature const& feature,
+                              proj_transform const& prj_trans)
+{
+
+
+    std::vector<geometry_type*> geometries_to_process;
+    unsigned num_geom = feature.num_geometries();
+    for (unsigned i=0; i<num_geom; ++i)
+    {
+        geometry_type const& geom = feature.get_geometry(i);
+        
+        if (geom.num_points() == 0) continue; // don't bother with empty geometries
+        
+        if ((geom.type() == Polygon || geom.type() == MultiPolygon) && sym.get_minimum_path_length() > 0)
+        {
+            // TODO - find less costly method than fetching full envelope
+            box2d<double> gbox = t_.forward(geom.envelope(),prj_trans);
+            if (gbox.width() < sym.get_minimum_path_length())
+            {
+                continue;
+            }
+        }
+        // TODO - calculate length here as well
+        geometries_to_process.push_back(const_cast<geometry_type*>(&geom));
+    }
+    
+    if (!geometries_to_process.size() > 0)
+        return; // early return to avoid significant overhead of rendering setup
+
+    typedef  coord_transform2<CoordTransform,geometry_type> path_type;
+
+    bool placement_found = false;
+    text_placement_info_ptr placement_options = sym.get_placement_options()->get_placement_info();
+    while (!placement_found && placement_options->next())
+    {
+        expression_ptr name_expr = sym.get_name();
+        if (!name_expr) return;
+        value_type result = boost::apply_visitor(evaluate<Feature,value_type>(feature),*name_expr);
+        UnicodeString text = result.to_unicode();
+
+        if ( sym.get_text_transform() == UPPERCASE)
+        {
+            text = text.toUpper();
+        }
+        else if ( sym.get_text_transform() == LOWERCASE)
+        {
+            text = text.toLower();
+        }
+        else if ( sym.get_text_transform() == CAPITALIZE)
+        {
+            text = text.toTitle(NULL);
+        }
+
+        if ( text.length() <= 0 ) continue;
+        color const& fill = sym.get_fill();
+
+        face_set_ptr faces;
+
+        if (sym.get_fontset().size() > 0)
+        {
+            faces = font_manager_.get_face_set(sym.get_fontset());
+        }
+        else
+        {
+            faces = font_manager_.get_face_set(sym.get_face_name());
+        }
+
+        stroker_ptr strk = font_manager_.get_stroker();
+        if (!(faces->size() > 0 && strk))
+        {
+            throw config_error("Unable to find specified font face '" + sym.get_face_name() + "'");
+        }
+        text_renderer<T> ren(pixmap_, faces, *strk);
+        ren.set_pixel_size(placement_options->text_size * scale_factor_);
+        ren.set_fill(fill);
+        ren.set_halo_fill(sym.get_halo_fill());
+        ren.set_halo_radius(sym.get_halo_radius() * scale_factor_);
+        ren.set_opacity(sym.get_text_opacity());
+
+        box2d<double> dims(0,0,width_,height_);
+        placement_finder<label_collision_detector4> finder(detector_,dims);
+
+        string_info info(text);
+
+        faces->get_string_info(info);
+        metawriter_with_properties writer = sym.get_metawriter();
+
+        BOOST_FOREACH( geometry_type * geom, geometries_to_process )
+        {
+            while (!placement_found && placement_options->next_position_only())
+            {
+                placement text_placement(info, sym, scale_factor_);
+                text_placement.avoid_edges = sym.get_avoid_edges();
+                if (writer.first)
+                    text_placement.collect_extents =true; // needed for inmem metawriter
+
+                if (sym.get_label_placement() == POINT_PLACEMENT ||
+                        sym.get_label_placement() == INTERIOR_PLACEMENT)
+                {
+                    double label_x=0.0;
+                    double label_y=0.0;
+                    double z=0.0;
+                    if (sym.get_label_placement() == POINT_PLACEMENT)
+                        geom->label_position(&label_x, &label_y);
+                    else
+                        geom->label_interior_position(&label_x, &label_y);
+                    prj_trans.backward(label_x,label_y, z);
+                    t_.forward(&label_x,&label_y);
+
+                    double angle = 0.0;
+                    expression_ptr angle_expr = sym.get_orientation();
+                    if (angle_expr)
+                    {
+                        // apply rotation
+                        value_type result = boost::apply_visitor(evaluate<Feature,value_type>(feature),*angle_expr);
+                        angle = result.to_double();
+                    }
+
+                    finder.find_point_placement(text_placement, placement_options, label_x,label_y,
+                                                angle, sym.get_line_spacing(),
+                                                sym.get_character_spacing());
+                    finder.update_detector(text_placement);
+                }
+                else if ( geom->num_points() > 1 && sym.get_label_placement() == LINE_PLACEMENT)
+                {
+                    path_type path(t_,*geom,prj_trans);
+                    finder.find_line_placements<path_type>(text_placement, placement_options, path);
+                }
+
+                if (!text_placement.placements.size()) continue;
+                placement_found = true;
+
+                for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ii)
+                {
+                    double x = text_placement.placements[ii].starting_x;
+                    double y = text_placement.placements[ii].starting_y;
+                    ren.prepare_glyphs(&text_placement.placements[ii]);
+                    ren.render(x,y);
+                }
+
+                if (writer.first) writer.first->add_text(text_placement, faces, feature, t_, writer.second);
+            }
+        }
+    }
+}
+
+template void agg_renderer<image_32>::process(text_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+
+}
+ 
diff --git a/src/agg_renderer.cpp b/src/agg_renderer.cpp
deleted file mode 100644
index cda4b6f..0000000
--- a/src/agg_renderer.cpp
+++ /dev/null
@@ -1,905 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-//$Id$
-
-// mapnik
-#include <mapnik/agg_renderer.hpp>
-#include <mapnik/image_util.hpp>
-#include <mapnik/unicode.hpp>
-#include <mapnik/placement_finder.hpp>
-#include <mapnik/markers_converter.hpp>
-#include <mapnik/arrow.hpp>
-#include <mapnik/config_error.hpp>
-#include <mapnik/font_set.hpp>
-
-// agg
-#define AGG_RENDERING_BUFFER row_ptr_cache<int8u>
-#include "agg_rendering_buffer.h"
-#include "agg_pixfmt_rgba.h"
-#include "agg_rasterizer_scanline_aa.h"
-#include "agg_basics.h"
-#include "agg_scanline_p.h"
-#include "agg_scanline_u.h"
-#include "agg_renderer_scanline.h"
-#include "agg_path_storage.h"
-#include "agg_span_allocator.h"
-#include "agg_span_pattern_rgba.h"
-#include "agg_image_accessors.h"
-#include "agg_conv_stroke.h"
-#include "agg_conv_dash.h"
-#include "agg_conv_contour.h"
-#include "agg_conv_clip_polyline.h"
-#include "agg_vcgen_stroke.h"
-#include "agg_conv_adaptor_vcgen.h"
-#include "agg_conv_smooth_poly1.h"
-#include "agg_conv_marker.h"
-#include "agg_vcgen_markers_term.h"
-#include "agg_renderer_outline_aa.h"
-#include "agg_rasterizer_outline_aa.h"
-#include "agg_rasterizer_outline.h"
-#include "agg_renderer_outline_image.h"
-#include "agg_span_allocator.h"
-#include "agg_span_pattern_rgba.h"
-#include "agg_renderer_scanline.h"
-#include "agg_pattern_filters_rgba.h"
-#include "agg_renderer_outline_image.h"
-#include "agg_vpgen_clip_polyline.h"
-#include "agg_arrowhead.h"
-
-// boost
-#include <boost/utility.hpp>
-#include <boost/tuple/tuple.hpp>
-
-// stl
-#ifdef MAPNIK_DEBUG
-#include <iostream>
-#endif
-
-#include <cmath>
-
-namespace mapnik
-{
-   class pattern_source : private boost::noncopyable
-   {
-      public:
-         pattern_source(ImageData32 const& pattern)
-            : pattern_(pattern) {}
-
-         unsigned int width() const
-         {
-            return pattern_.width();
-         }
-         unsigned int height() const
-         {
-            return pattern_.height();
-         }
-         agg::rgba8 pixel(int x, int y) const
-         {
-            unsigned c = pattern_(x,y);
-            return agg::rgba8(c & 0xff,
-                              (c >> 8) & 0xff,
-                              (c >> 16) & 0xff,
-                              (c >> 24) & 0xff);
-         }
-      private:
-         ImageData32 const& pattern_;
-   };
-
-   struct rasterizer :  agg::rasterizer_scanline_aa<>, boost::noncopyable {};
-
-   template <typename T>
-   agg_renderer<T>::agg_renderer(Map const& m, T & pixmap, unsigned offset_x, unsigned offset_y)
-      : feature_style_processor<agg_renderer>(m),
-        pixmap_(pixmap),
-        width_(pixmap_.width()),
-        height_(pixmap_.height()),
-        t_(m.getWidth(),m.getHeight(),m.getCurrentExtent(),offset_x,offset_y),
-        font_engine_(),
-        font_manager_(font_engine_),
-        detector_(Envelope<double>(-m.buffer_size(), -m.buffer_size(), m.getWidth() + m.buffer_size() ,m.getHeight() + m.buffer_size())),
-        ras_ptr(new rasterizer)
-   {
-      boost::optional<color> bg = m.background();
-      if (bg) pixmap_.setBackground(*bg);
-#ifdef MAPNIK_DEBUG
-      std::clog << "scale=" << m.scale() << "\n";
-#endif
-   }
-
-   template <typename T>
-   agg_renderer<T>::~agg_renderer() {}
-
-   template <typename T>
-   void agg_renderer<T>::start_map_processing(Map const& map)
-   {
-#ifdef MAPNIK_DEBUG
-      std::clog << "start map processing bbox="
-                << map.getCurrentExtent() << "\n";
-#endif
-      ras_ptr->clip_box(0,0,width_,height_);
-   }
-
-   template <typename T>
-   void agg_renderer<T>::end_map_processing(Map const& )
-   {
-#ifdef MAPNIK_DEBUG
-      std::clog << "end map processing\n";
-#endif
-   }
-
-   template <typename T>
-   void agg_renderer<T>::start_layer_processing(Layer const& lay)
-   {
-#ifdef MAPNIK_DEBUG
-      std::clog << "start layer processing : " << lay.name()  << "\n";
-      std::clog << "datasource = " << lay.datasource().get() << "\n";
-#endif
-      if (lay.clear_label_cache())
-      {
-         detector_.clear();
-      }
-   }
-
-   template <typename T>
-   void agg_renderer<T>::end_layer_processing(Layer const&)
-   {
-#ifdef MAPNIK_DEBUG
-      std::clog << "end layer processing\n";
-#endif
-   }
-
-   template <typename T>
-   void agg_renderer<T>::process(polygon_symbolizer const& sym,
-                                 Feature const& feature,
-                                 proj_transform const& prj_trans)
-   {
-      typedef  coord_transform2<CoordTransform,geometry2d> path_type;
-      typedef agg::renderer_base<agg::pixfmt_rgba32_plain> ren_base;
-      typedef agg::renderer_scanline_aa_solid<ren_base> renderer;
-
-      color const& fill_ = sym.get_fill();
-      agg::scanline_u8 sl;
-
-      agg::rendering_buffer buf(pixmap_.raw_data(),width_,height_, width_ * 4);
-      agg::pixfmt_rgba32_plain pixf(buf);
-
-      ren_base renb(pixf);
-      unsigned r=fill_.red();
-      unsigned g=fill_.green();
-      unsigned b=fill_.blue();
-      unsigned a=fill_.alpha();
-      renderer ren(renb);
-
-      ras_ptr->reset();
-      ras_ptr->gamma(agg::gamma_linear(0.0, sym.get_gamma()));
-
-      for (unsigned i=0;i<feature.num_geometries();++i)
-      {
-         geometry2d const& geom=feature.get_geometry(i);
-         if (geom.num_points() > 2)
-         {
-            path_type path(t_,geom,prj_trans);
-            ras_ptr->add_path(path);
-         }
-      }
-      ren.color(agg::rgba8(r, g, b, int(a * sym.get_opacity())));
-      agg::render_scanlines(*ras_ptr, sl, ren);
-   }
-
-   typedef boost::tuple<double,double,double,double> segment_t;
-   bool y_order(segment_t const& first,segment_t const& second)
-   {
-      double miny0 = std::min(first.get<1>(),first.get<3>());
-      double miny1 = std::min(second.get<1>(),second.get<3>());
-      return  miny0 > miny1;
-   }
-
-   template <typename T>
-   void agg_renderer<T>::process(building_symbolizer const& sym,
-                                 Feature const& feature,
-                                 proj_transform const& prj_trans)
-   {
-      typedef  coord_transform2<CoordTransform,geometry2d> path_type;
-      typedef  coord_transform3<CoordTransform,geometry2d> path_type_roof;
-      typedef agg::renderer_base<agg::pixfmt_rgba32_plain> ren_base;
-      typedef agg::renderer_scanline_aa_solid<ren_base> renderer;
-
-      agg::rendering_buffer buf(pixmap_.raw_data(),width_,height_, width_ * 4);
-      agg::pixfmt_rgba32_plain pixf(buf);
-      ren_base renb(pixf);
-
-      color const& fill_  = sym.get_fill();
-      unsigned r=fill_.red();
-      unsigned g=fill_.green();
-      unsigned b=fill_.blue();
-      unsigned a=fill_.alpha();
-      renderer ren(renb);
-      agg::scanline_u8 sl;
-
-      ras_ptr->reset();      
-      ras_ptr->gamma(agg::gamma_linear());
-      
-      double height = 0.7071 * sym.height(); // height in meters
-
-      for (unsigned i=0;i<feature.num_geometries();++i)
-      {
-         geometry2d const& geom = feature.get_geometry(i);
-         if (geom.num_points() > 2)
-         {
-            boost::scoped_ptr<geometry2d> frame(new line_string_impl);
-            boost::scoped_ptr<geometry2d> roof(new polygon_impl);
-            std::deque<segment_t> face_segments;
-            double x0(0);
-            double y0(0);
-            unsigned cm = geom.vertex(&x0,&y0);
-            for (unsigned j=1;j<geom.num_points();++j)
-            {
-               double x,y;
-               cm = geom.vertex(&x,&y);
-               if (cm == SEG_MOVETO)
-               {
-                  frame->move_to(x,y);
-               }
-               else if (cm == SEG_LINETO)
-               {
-                  frame->line_to(x,y);
-               }
-               if (j!=0)
-               {
-                  face_segments.push_back(segment_t(x0,y0,x,y));
-               }
-               x0 = x;
-               y0 = y;
-            }
-            std::sort(face_segments.begin(),face_segments.end(), y_order);
-            std::deque<segment_t>::const_iterator itr=face_segments.begin();
-            for (;itr!=face_segments.end();++itr)
-            {
-               boost::scoped_ptr<geometry2d> faces(new polygon_impl);
-               faces->move_to(itr->get<0>(),itr->get<1>());
-               faces->line_to(itr->get<2>(),itr->get<3>());
-               faces->line_to(itr->get<2>(),itr->get<3>() + height);
-               faces->line_to(itr->get<0>(),itr->get<1>() + height);
-
-               path_type faces_path (t_,*faces,prj_trans);
-               ras_ptr->add_path(faces_path);
-               ren.color(agg::rgba8(int(r*0.8), int(g*0.8), int(b*0.8), int(a * sym.get_opacity())));
-               agg::render_scanlines(*ras_ptr, sl, ren);
-               ras_ptr->reset();
-
-               frame->move_to(itr->get<0>(),itr->get<1>());
-               frame->line_to(itr->get<0>(),itr->get<1>()+height);
-            }
-
-            geom.rewind(0);
-            for (unsigned j=0;j<geom.num_points();++j)
-            {
-               double x,y;
-               unsigned cm = geom.vertex(&x,&y);
-               if (cm == SEG_MOVETO)
-               {
-                  frame->move_to(x,y+height);
-                  roof->move_to(x,y+height);
-               }
-               else if (cm == SEG_LINETO)
-               {
-                  frame->line_to(x,y+height);
-                  roof->line_to(x,y+height);
-               }
-            }
-            path_type path(t_,*frame,prj_trans);
-            agg::conv_stroke<path_type>  stroke(path);
-            ras_ptr->add_path(stroke);
-            ren.color(agg::rgba8(128, 128, 128, int(255 * sym.get_opacity())));
-            agg::render_scanlines(*ras_ptr, sl, ren);
-            ras_ptr->reset();
-
-            path_type roof_path (t_,*roof,prj_trans);
-            ras_ptr->add_path(roof_path);
-            ren.color(agg::rgba8(r, g, b, int(a * sym.get_opacity())));
-            agg::render_scanlines(*ras_ptr, sl, ren);
-         }
-      }
-   }
-
-   template <typename T>
-   void agg_renderer<T>::process(line_symbolizer const& sym,
-                              Feature const& feature,
-                              proj_transform const& prj_trans)
-   {
-      typedef agg::renderer_base<agg::pixfmt_rgba32_plain> ren_base;
-      typedef coord_transform2<CoordTransform,geometry2d> path_type;
-      typedef agg::renderer_outline_aa<ren_base> renderer_oaa;
-      typedef agg::rasterizer_outline_aa<renderer_oaa> rasterizer_outline_aa;
-      typedef agg::renderer_scanline_aa_solid<ren_base> renderer;
-
-      agg::rendering_buffer buf(pixmap_.raw_data(),width_,height_, width_ * 4);
-      agg::pixfmt_rgba32_plain pixf(buf);
-
-      ren_base renb(pixf);
-      mapnik::stroke const&  stroke_ = sym.get_stroke();
-      color const& col = stroke_.get_color();
-      unsigned r=col.red();
-      unsigned g=col.green();
-      unsigned b=col.blue();
-      unsigned a=col.alpha();
-      renderer ren(renb);
-      ras_ptr->reset();
-      ras_ptr->gamma(agg::gamma_linear());
-      agg::scanline_p8 sl;
-
-      for (unsigned i=0;i<feature.num_geometries();++i)
-      {
-         geometry2d const& geom = feature.get_geometry(i);
-         if (geom.num_points() > 1)
-         {
-            path_type path(t_,geom,prj_trans);
-
-            if (stroke_.has_dash())
-            {
-               agg::conv_dash<path_type> dash(path);
-               dash_array const& d = stroke_.get_dash_array();
-               dash_array::const_iterator itr = d.begin();
-               dash_array::const_iterator end = d.end();
-               for (;itr != end;++itr)
-               {
-                  dash.add_dash(itr->first, itr->second);
-               }
-
-               agg::conv_stroke<agg::conv_dash<path_type > > stroke(dash);
-
-               line_join_e join=stroke_.get_line_join();
-               if ( join == MITER_JOIN)
-                  stroke.generator().line_join(agg::miter_join);
-               else if( join == MITER_REVERT_JOIN)
-                  stroke.generator().line_join(agg::miter_join);
-               else if( join == ROUND_JOIN)
-                  stroke.generator().line_join(agg::round_join);
-               else
-                  stroke.generator().line_join(agg::bevel_join);
-
-               line_cap_e cap=stroke_.get_line_cap();
-               if (cap == BUTT_CAP)
-                  stroke.generator().line_cap(agg::butt_cap);
-               else if (cap == SQUARE_CAP)
-                  stroke.generator().line_cap(agg::square_cap);
-               else
-                  stroke.generator().line_cap(agg::round_cap);
-
-               stroke.generator().miter_limit(4.0);
-               stroke.generator().width(stroke_.get_width());
-
-               ras_ptr->add_path(stroke);
-
-            }
-            else
-            {
-               agg::conv_stroke<path_type>  stroke(path);
-               line_join_e join=stroke_.get_line_join();
-               if ( join == MITER_JOIN)
-                  stroke.generator().line_join(agg::miter_join);
-               else if( join == MITER_REVERT_JOIN)
-                  stroke.generator().line_join(agg::miter_join);
-               else if( join == ROUND_JOIN)
-                  stroke.generator().line_join(agg::round_join);
-               else
-                  stroke.generator().line_join(agg::bevel_join);
-
-               line_cap_e cap=stroke_.get_line_cap();
-               if (cap == BUTT_CAP)
-                  stroke.generator().line_cap(agg::butt_cap);
-               else if (cap == SQUARE_CAP)
-                  stroke.generator().line_cap(agg::square_cap);
-               else
-                  stroke.generator().line_cap(agg::round_cap);
-
-               stroke.generator().miter_limit(4.0);
-               stroke.generator().width(stroke_.get_width());
-               ras_ptr->add_path(stroke);
-            }
-         }
-      }
-      ren.color(agg::rgba8(r, g, b, int(a*stroke_.get_opacity())));
-      agg::render_scanlines(*ras_ptr, sl, ren);
-   }
-
-   template <typename T>
-   void agg_renderer<T>::process(point_symbolizer const& sym,
-                              Feature const& feature,
-                              proj_transform const& prj_trans)
-   {
-      double x;
-      double y;
-      double z=0;
-      boost::shared_ptr<ImageData32> const& data = sym.get_image();
-      if ( data )
-      {
-         for (unsigned i=0;i<feature.num_geometries();++i)
-         {
-            geometry2d const& geom = feature.get_geometry(i);
-
-            geom.label_position(&x,&y);
-            prj_trans.backward(x,y,z);
-            t_.forward(&x,&y);
-            int w = data->width();
-            int h = data->height();
-            int px=int(floor(x - 0.5 * w));
-            int py=int(floor(y - 0.5 * h));
-            Envelope<double> label_ext (floor(x - 0.5 * w),
-                                        floor(y - 0.5 * h),
-                                        ceil (x + 0.5 * w),
-                                        ceil (y + 0.5 * h));
-            if (sym.get_allow_overlap() ||
-                detector_.has_placement(label_ext))
-            {
-               pixmap_.set_rectangle_alpha2(*data,px,py,sym.get_opacity());
-               detector_.insert(label_ext);
-            }
-         }
-      }
-   }
-
-   template <typename T>
-   void  agg_renderer<T>::process(shield_symbolizer const& sym,
-                                  Feature const& feature,
-                                  proj_transform const& prj_trans)
-   {
-      typedef  coord_transform2<CoordTransform,geometry2d> path_type;
-
-      UnicodeString text;
-      if( sym.get_no_text() )
-            text = UnicodeString( " " );  // use 'space' as the text to render
-      else
-            text = feature[sym.get_name()].to_unicode();  // use text from feature to render
-
-      if ( sym.get_text_convert() == TOUPPER)
-      {
-         text = text.toUpper();
-      }
-      else if ( sym.get_text_convert() == TOLOWER)
-      {
-         text = text.toLower();
-      }
-      boost::shared_ptr<ImageData32> const& data = sym.get_image();
-      if (text.length() > 0 && data)
-      {
-         face_set_ptr faces;
-
-         if (sym.get_fontset().size() > 0)
-         {
-            faces = font_manager_.get_face_set(sym.get_fontset());
-         }
-         else
-         {
-            faces = font_manager_.get_face_set(sym.get_face_name());
-         }
-
-         if (faces->size() > 0)
-         {
-            text_renderer<T> ren(pixmap_, faces);
-
-            ren.set_pixel_size(sym.get_text_size());
-            ren.set_fill(sym.get_fill());
-            ren.set_halo_fill(sym.get_halo_fill());
-            ren.set_halo_radius(sym.get_halo_radius());
-
-            placement_finder<label_collision_detector4> finder(detector_);
-
-            string_info info(text);
-
-            faces->get_string_info(info);
-
-
-            int w = data->width();
-            int h = data->height();
-
-            unsigned num_geom = feature.num_geometries();
-            for (unsigned i=0;i<num_geom;++i)
-            {
-               geometry2d const& geom = feature.get_geometry(i);
-               if (geom.num_points() > 0 )
-               {
-                  path_type path(t_,geom,prj_trans);
-
-                  label_placement_enum how_placed = sym.get_label_placement();
-                  if (how_placed == POINT_PLACEMENT || how_placed == VERTEX_PLACEMENT)
-                  {
-                     // for every vertex, try and place a shield/text
-                     geom.rewind(0);
-                     for( unsigned jj = 0; jj < geom.num_points(); jj++ )
-                     {
-                        double label_x;
-                        double label_y;
-                        double z=0.0;
-                        placement text_placement(info, sym, false);
-                        text_placement.avoid_edges = sym.get_avoid_edges();
-                        text_placement.allow_overlap = sym.get_allow_overlap();
-                        if( how_placed == VERTEX_PLACEMENT )
-                            geom.vertex(&label_x,&label_y);  // by vertex
-                        else
-                            geom.label_position(&label_x, &label_y);  // by middle of line or by point
-                        prj_trans.backward(label_x,label_y, z);
-                        t_.forward(&label_x,&label_y);
-
-                        finder.find_point_placement( text_placement,label_x,label_y,sym.get_vertical_alignment(),sym.get_line_spacing(),
-                                                    sym.get_character_spacing(),sym.get_horizontal_alignment(),sym.get_justify_alignment() );
-
-                        // check to see if image overlaps anything too, there is only ever 1 placement found for points and verticies
-                        if( text_placement.placements.size() > 0)
-                        {
-                            double x = text_placement.placements[0].starting_x;
-                            double y = text_placement.placements[0].starting_y;
-                            int px;
-                            int py;
-                            Envelope<double> label_ext;
-
-                            if( !sym.get_unlock_image() )
-                            {  // center image at text center position
-                                // remove displacement from image label
-                                position pos = sym.get_displacement();
-                                double lx = x - boost::get<0>(pos);
-                                double ly = y - boost::get<1>(pos);
-                                px=int(floor(lx - (0.5 * w))) ;
-                                py=int(floor(ly - (0.5 * h))) ;
-                                label_ext.init( floor(lx - 0.5 * w), floor(ly - 0.5 * h), ceil (lx + 0.5 * w), ceil (ly + 0.5 * h) );
-                            }
-                            else
-                            {  // center image at reference location
-                                px=int(floor(label_x - 0.5 * w));
-                                py=int(floor(label_y - 0.5 * h));
-                                label_ext.init( floor(label_x - 0.5 * w), floor(label_y - 0.5 * h), ceil (label_x + 0.5 * w), ceil (label_y + 0.5 * h));
-                            }
-
-                            if ( sym.get_allow_overlap() || detector_.has_placement(label_ext) )
-                            {
-                                //pixmap_.set_rectangle_alpha(px,py,*data);
-                                pixmap_.set_rectangle_alpha2(*data,px,py,float(sym.get_opacity()));
-                                Envelope<double> dim = ren.prepare_glyphs(&text_placement.placements[0]);
-                                ren.render(x,y);
-                                detector_.insert(label_ext);
-                                finder.update_detector(text_placement);
-                            }
-                        }
-                     }
-                  }
-
-                  else if (geom.num_points() > 1 && sym.get_label_placement() == LINE_PLACEMENT)
-                  {
-                     placement text_placement(info, sym, true);
-                     text_placement.avoid_edges = sym.get_avoid_edges();
-                     finder.find_point_placements<path_type>(text_placement,path);
-
-                     for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ ii)
-                     {
-                        int w = data->width();
-                        int h = data->height();
-                        double x = text_placement.placements[ii].starting_x;
-                        double y = text_placement.placements[ii].starting_y;
-
-                        int px=int(x - (w/2));
-                        int py=int(y - (h/2));
-
-                        pixmap_.set_rectangle_alpha(px,py,*data);
-
-                        Envelope<double> dim = ren.prepare_glyphs(&text_placement.placements[ii]);
-                        ren.render(x,y);
-                     }
-                     finder.update_detector(text_placement);
-                  }
-               }
-            }
-         }
-      }
-   }
-
-   template <typename T>
-   void  agg_renderer<T>::process(line_pattern_symbolizer const& sym,
-                               Feature const& feature,
-                               proj_transform const& prj_trans)
-   {
-      typedef  coord_transform2<CoordTransform,geometry2d> path_type;
-      typedef agg::line_image_pattern<agg::pattern_filter_bilinear_rgba8> pattern_type;
-      typedef agg::renderer_base<agg::pixfmt_rgba32_plain> renderer_base;
-      typedef agg::renderer_outline_image<renderer_base, pattern_type> renderer_type;
-      typedef agg::rasterizer_outline_aa<renderer_type> rasterizer_type;
-
-      agg::rendering_buffer buf(pixmap_.raw_data(),width_,height_, width_ * 4);
-      agg::pixfmt_rgba32_plain pixf(buf);
-
-      ImageData32 pat =  * sym.get_image();
-      renderer_base ren_base(pixf);
-      agg::pattern_filter_bilinear_rgba8 filter;
-      pattern_source source(pat);
-      pattern_type pattern (filter,source);
-      renderer_type ren(ren_base, pattern);
-      ren.clip_box(0,0,width_,height_);
-      rasterizer_type ras(ren);
-
-      for (unsigned i=0;i<feature.num_geometries();++i)
-      {
-         geometry2d const& geom = feature.get_geometry(i);
-         if (geom.num_points() > 1)
-         {
-            path_type path(t_,geom,prj_trans);
-            ras.add_path(path);
-         }
-      }
-   }
-
-   template <typename T>
-   void agg_renderer<T>::process(polygon_pattern_symbolizer const& sym,
-                                 Feature const& feature,
-                                 proj_transform const& prj_trans)
-   {
-      typedef coord_transform2<CoordTransform,geometry2d> path_type;
-      typedef agg::renderer_base<agg::pixfmt_rgba32_plain> ren_base;
-      typedef agg::wrap_mode_repeat wrap_x_type;
-      typedef agg::wrap_mode_repeat wrap_y_type;
-      typedef agg::pixfmt_alpha_blend_rgba<agg::blender_rgba32,
-         agg::row_accessor<agg::int8u>, agg::pixel32_type> rendering_buffer;
-      typedef agg::image_accessor_wrap<rendering_buffer,
-         wrap_x_type,
-         wrap_y_type> img_source_type;
-
-      typedef agg::span_pattern_rgba<img_source_type> span_gen_type;
-
-      typedef agg::renderer_scanline_aa<ren_base,
-         agg::span_allocator<agg::rgba8>,
-         span_gen_type> renderer_type;
-
-
-      agg::rendering_buffer buf(pixmap_.raw_data(),width_,height_, width_ * 4);
-      agg::pixfmt_rgba32_plain pixf(buf);
-      ren_base renb(pixf);
-
-      agg::scanline_u8 sl;
-      ras_ptr->reset();
-      ras_ptr->gamma(agg::gamma_linear());
-
-      ImageData32 const& pattern =  * sym.get_image();
-      unsigned w=pattern.width();
-      unsigned h=pattern.height();
-      agg::row_accessor<agg::int8u> pattern_rbuf((agg::int8u*)pattern.getBytes(),w,h,w*4);
-      agg::span_allocator<agg::rgba8> sa;
-      agg::pixfmt_alpha_blend_rgba<agg::blender_rgba32,
-         agg::row_accessor<agg::int8u>, agg::pixel32_type> pixf_pattern(pattern_rbuf);
-      img_source_type img_src(pixf_pattern);
-
-      double x0=0,y0=0;
-      unsigned num_geometries = feature.num_geometries();
-      if (num_geometries>0)
-      {
-         path_type path(t_,feature.get_geometry(0),prj_trans);
-         path.vertex(&x0,&y0);
-      }
-      unsigned offset_x = unsigned(width_-x0);
-      unsigned offset_y = unsigned(height_-y0);
-      span_gen_type sg(img_src, offset_x, offset_y);
-      renderer_type rp(renb,sa, sg);
-      for (unsigned i=0;i<num_geometries;++i)
-      {
-         geometry2d const& geom = feature.get_geometry(i);
-         if (geom.num_points() > 2)
-         {
-            path_type path(t_,geom,prj_trans);
-            ras_ptr->add_path(path);
-         }
-      }
-      agg::render_scanlines(*ras_ptr, sl, rp);
-   }
-
-   template <typename T>
-   void agg_renderer<T>::process(raster_symbolizer const& sym,
-                                 Feature const& feature,
-                                 proj_transform const& prj_trans)
-   {
-      raster_ptr const& raster=feature.get_raster();
-      if (raster)
-      {
-         Envelope<double> ext=t_.forward(raster->ext_);
-         int start_x = rint(ext.minx());
-         int start_y = rint(ext.miny());
-         int raster_width = rint(ext.width());
-         int raster_height = rint(ext.height());
-         int end_x = start_x + raster_width;
-         int end_y = start_y + raster_height;
-         double err_offs_x = (ext.minx()-start_x + ext.maxx()-end_x)/2;
-         double err_offs_y = (ext.miny()-start_y + ext.maxy()-end_y)/2;
-         
-         if (raster_width > 0 && raster_height > 0)
-         {
-            ImageData32 target(raster_width,raster_height);
-
-            if (sym.get_scaling() == "fast") {
-               scale_image<ImageData32>(target,raster->data_);
-            } else if (sym.get_scaling() == "bilinear"){
-               scale_image_bilinear<ImageData32>(target,raster->data_, err_offs_x, err_offs_y);
-            } else if (sym.get_scaling() == "bilinear8"){
-               scale_image_bilinear8<ImageData32>(target,raster->data_, err_offs_x, err_offs_y);
-            } else {
-               scale_image<ImageData32>(target,raster->data_);
-            }
-
-            if (sym.get_mode() == "normal"){
-                if (sym.get_opacity() == 1.0) {
-                   pixmap_.set_rectangle(start_x,start_y,target);
-                } else {
-                   pixmap_.set_rectangle_alpha2(target,start_x,start_y, sym.get_opacity());
-                }
-            } else if (sym.get_mode() == "grain_merge"){
-               pixmap_.template merge_rectangle<MergeGrain> (target,start_x,start_y, sym.get_opacity());
-            } else if (sym.get_mode() == "grain_merge2"){
-               pixmap_.template merge_rectangle<MergeGrain2> (target,start_x,start_y, sym.get_opacity());
-            } else if (sym.get_mode() == "multiply"){
-               pixmap_.template merge_rectangle<Multiply> (target,start_x,start_y, sym.get_opacity());
-            } else if (sym.get_mode() == "multiply2"){
-               pixmap_.template merge_rectangle<Multiply2> (target,start_x,start_y, sym.get_opacity());
-            } else if (sym.get_mode() == "divide"){
-               pixmap_.template merge_rectangle<Divide> (target,start_x,start_y, sym.get_opacity());
-            } else if (sym.get_mode() == "divide2"){
-               pixmap_.template merge_rectangle<Divide2> (target,start_x,start_y, sym.get_opacity());
-            } else if (sym.get_mode() == "screen"){
-               pixmap_.template merge_rectangle<Screen> (target,start_x,start_y, sym.get_opacity());
-            } else if (sym.get_mode() == "hard_light"){
-               pixmap_.template merge_rectangle<HardLight> (target,start_x,start_y, sym.get_opacity());
-            } else {
-                if (sym.get_opacity() == 1.0){
-                    pixmap_.set_rectangle(start_x,start_y,target);
-                } else {
-                   pixmap_.set_rectangle_alpha2(target,start_x,start_y, sym.get_opacity());
-                }
-            }
-            // TODO: other modes? (add,diff,sub,...)
-         }
-      }
-   }
-
-   template <typename T>
-   void agg_renderer<T>::process(markers_symbolizer const& sym,
-                                 Feature const& feature,
-                                 proj_transform const& prj_trans)
-   {
-      typedef  coord_transform2<CoordTransform,geometry2d> path_type;
-      typedef agg::renderer_base<agg::pixfmt_rgba32_plain> ren_base;
-      typedef agg::renderer_scanline_aa_solid<ren_base> renderer;
-      arrow arrow_;
-      ras_ptr->reset();
-      ras_ptr->gamma(agg::gamma_linear());
-
-      agg::scanline_u8 sl;
-      agg::rendering_buffer buf(pixmap_.raw_data(),width_,height_, width_ * 4);
-      agg::pixfmt_rgba32_plain pixf(buf);
-      ren_base renb(pixf);
-
-      unsigned r = 0;// fill_.red();
-      unsigned g = 0; //fill_.green();
-      unsigned b = 255; //fill_.blue();
-      unsigned a = 255; //fill_.alpha();
-      renderer ren(renb);
-      for (unsigned i=0;i<feature.num_geometries();++i)
-      {
-         geometry2d const& geom=feature.get_geometry(i);
-         if (geom.num_points() > 1)
-         {
-            path_type path(t_,geom,prj_trans);
-
-            agg::conv_dash <path_type> dash(path);
-            dash.add_dash(20.0,200.0);
-            markers_converter<agg::conv_dash<path_type>,
-               arrow,
-               label_collision_detector4>
-               marker(dash, arrow_, detector_);
-            ras_ptr->add_path(marker);
-         }
-      }
-      ren.color(agg::rgba8(r, g, b, a));
-      agg::render_scanlines(*ras_ptr, sl, ren);
-   }
-
-   template <typename T>
-   void agg_renderer<T>::process(text_symbolizer const& sym,
-                                 Feature const& feature,
-                                 proj_transform const& prj_trans)
-   {
-      typedef  coord_transform2<CoordTransform,geometry2d> path_type;
-
-      UnicodeString text = feature[sym.get_name()].to_unicode();
-      if ( sym.get_text_convert() == TOUPPER)
-      {
-         text = text.toUpper();
-      }
-      else if ( sym.get_text_convert() == TOLOWER)
-      {
-         text = text.toLower();
-      }
-
-      if ( text.length() > 0 )
-      {
-         color const& fill = sym.get_fill();
-
-         face_set_ptr faces;
-
-         if (sym.get_fontset().size() > 0)
-         {
-            faces = font_manager_.get_face_set(sym.get_fontset());
-         }
-         else
-         {
-            faces = font_manager_.get_face_set(sym.get_face_name());
-         }
-
-         if (faces->size() > 0)
-         {
-            text_renderer<T> ren(pixmap_, faces);
-            ren.set_pixel_size(sym.get_text_size());
-            ren.set_fill(fill);
-            ren.set_halo_fill(sym.get_halo_fill());
-            ren.set_halo_radius(sym.get_halo_radius());
-            ren.set_opacity(sym.get_opacity());
-
-            placement_finder<label_collision_detector4> finder(detector_);
-
-            string_info info(text);
-
-            faces->get_string_info(info);
-            unsigned num_geom = feature.num_geometries();
-            for (unsigned i=0;i<num_geom;++i)
-            {
-               geometry2d const& geom = feature.get_geometry(i);
-               if (geom.num_points() > 0) // don't bother with empty geometries
-               {
-                  path_type path(t_,geom,prj_trans);
-                  placement text_placement(info,sym);
-                  text_placement.avoid_edges = sym.get_avoid_edges();
-                  if (sym.get_label_placement() == POINT_PLACEMENT)
-                  {
-                     double label_x, label_y, z=0.0;
-                     geom.label_position(&label_x, &label_y);
-                     prj_trans.backward(label_x,label_y, z);
-                     t_.forward(&label_x,&label_y);
-                     finder.find_point_placement(text_placement,label_x,label_y,sym.get_vertical_alignment(),sym.get_line_spacing(),
-                                                 sym.get_character_spacing(),sym.get_horizontal_alignment(),sym.get_justify_alignment());
-                     finder.update_detector(text_placement);
-                  }
-                  else if ( geom.num_points() > 1 && sym.get_label_placement() == LINE_PLACEMENT)
-                  {
-                     finder.find_line_placements<path_type>(text_placement,path);
-                  }
-
-                  for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ii)
-                  {
-                     double x = text_placement.placements[ii].starting_x;
-                     double y = text_placement.placements[ii].starting_y;
-                     Envelope<double> dim = ren.prepare_glyphs(&text_placement.placements[ii]);
-                     ren.render(x,y);
-                  }
-               }
-            }
-         }
-         else
-         {
-            throw config_error("Unable to find specified font face '" + sym.get_face_name() + "'");
-         }
-      }
-   }
-   template class agg_renderer<Image32>;
-}
diff --git a/src/arrow.cpp b/src/arrow.cpp
index 613fb93..bf577da 100644
--- a/src/arrow.cpp
+++ b/src/arrow.cpp
@@ -28,39 +28,39 @@
 
 namespace mapnik {
 
-   arrow::arrow() 
-      : pos_(0) 
-   {
-      x_[0] = -7.0; y_[0] = 1.0; cmd_[0] = agg::path_cmd_move_to;
-      x_[1] =  1.0; y_[1] = 1.0; cmd_[1] = agg::path_cmd_line_to;
-      x_[2] =  1.0; y_[2] = 3.0; cmd_[2] = agg::path_cmd_line_to;
-      x_[3] =  7.0; y_[3] = 0.0; cmd_[3] = agg::path_cmd_line_to;
-      x_[4] =  1.0; y_[4] =-3.0; cmd_[4] = agg::path_cmd_line_to;
-      x_[5] =  1.0; y_[5] =-1.0; cmd_[5] = agg::path_cmd_line_to;
-      x_[6] = -7.0; y_[6] =-1.0; cmd_[6] = agg::path_cmd_line_to;
-      cmd_[7] = agg::path_cmd_end_poly | agg::path_flags_close | agg::path_flags_ccw;
-      cmd_[8] = agg::path_cmd_stop;
-   }
+arrow::arrow() 
+    : pos_(0) 
+{
+    x_[0] = -7.0; y_[0] = 1.0; cmd_[0] = agg::path_cmd_move_to;
+    x_[1] =  1.0; y_[1] = 1.0; cmd_[1] = agg::path_cmd_line_to;
+    x_[2] =  1.0; y_[2] = 3.0; cmd_[2] = agg::path_cmd_line_to;
+    x_[3] =  7.0; y_[3] = 0.0; cmd_[3] = agg::path_cmd_line_to;
+    x_[4] =  1.0; y_[4] =-3.0; cmd_[4] = agg::path_cmd_line_to;
+    x_[5] =  1.0; y_[5] =-1.0; cmd_[5] = agg::path_cmd_line_to;
+    x_[6] = -7.0; y_[6] =-1.0; cmd_[6] = agg::path_cmd_line_to;
+    cmd_[7] = agg::path_cmd_end_poly | agg::path_flags_close | agg::path_flags_ccw;
+    cmd_[8] = agg::path_cmd_stop;
+}
 
-   void arrow::rewind(unsigned )
-   {
-      pos_ = 0;
-   }
+void arrow::rewind(unsigned )
+{
+    pos_ = 0;
+}
     
-   unsigned arrow::vertex(double* x, double* y)
-   {
-      if(pos_ < 7 )
-      {
-         *x = x_[pos_];
-         *y = y_[pos_];
-         return cmd_[pos_++];
-      }
-      return agg::path_cmd_stop;
-   }
+unsigned arrow::vertex(double* x, double* y)
+{
+    if(pos_ < 7 )
+    {
+        *x = x_[pos_];
+        *y = y_[pos_];
+        return cmd_[pos_++];
+    }
+    return agg::path_cmd_stop;
+}
    
-   Envelope<double> arrow::extent() const
-   {
-      return Envelope<double>(-7,-3,7,3);
-   }
+box2d<double> arrow::extent() const
+{
+    return box2d<double>(-7,-3,7,3);
+}
 }
 
diff --git a/src/box2d.cpp b/src/box2d.cpp
new file mode 100644
index 0000000..b4a0690
--- /dev/null
+++ b/src/box2d.cpp
@@ -0,0 +1,450 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id: envelope.cpp 17 2005-03-08 23:58:43Z pavlenko $
+
+#include <mapnik/box2d.hpp>
+
+// stl
+#include <stdexcept>
+
+// boost
+#include <boost/tokenizer.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/algorithm/string.hpp>
+
+namespace mapnik
+{
+template <typename T>
+box2d<T>::box2d()
+    :minx_(0),miny_(0),maxx_(-1),maxy_(-1) {}
+
+template <typename T>
+box2d<T>::box2d(T minx_,T miny_,T maxx_,T maxy_)
+{
+    init(minx_,miny_,maxx_,maxy_);
+}
+
+template <typename T>
+box2d<T>::box2d(const coord<T,2> &c0,const coord<T,2> &c1)
+{
+    init(c0.x,c0.y,c1.x,c1.y);
+}
+
+template <typename T>
+box2d<T>::box2d(const box2d &rhs)
+    : minx_(rhs.minx_),
+      miny_(rhs.miny_),
+      maxx_(rhs.maxx_),
+      maxy_(rhs.maxy_) {}
+// copy rather than init so dfl ctor (0,0,-1,-1) is not modified
+// http://trac.mapnik.org/ticket/749
+/*{
+    init(rhs.minx_,rhs.miny_,rhs.maxx_,rhs.maxy_);
+}*/
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+bool box2d<T>::operator==(const box2d<T>& other) const
+{
+    return minx_==other.minx_ &&
+        miny_==other.miny_ &&
+        maxx_==other.maxx_ &&
+        maxy_==other.maxy_;
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+T box2d<T>::minx() const
+{
+    return minx_;
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+T box2d<T>::maxx() const
+{
+    return maxx_;
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+T box2d<T>::miny() const
+{
+    return miny_;
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+T box2d<T>::maxy() const
+{
+    return maxy_;
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+T box2d<T>::width() const
+{
+    return maxx_-minx_;
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+T box2d<T>::height() const
+{
+    return maxy_-miny_;
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+void box2d<T>::width(T w)
+{
+    T cx=center().x;
+    minx_=static_cast<T>(cx-w*0.5);
+    maxx_=static_cast<T>(cx+w*0.5);
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+void box2d<T>::height(T h)
+{
+    T cy=center().y;
+    miny_=static_cast<T>(cy-h*0.5);
+    maxy_=static_cast<T>(cy+h*0.5);
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+coord<T,2> box2d<T>::center() const
+{
+    return coord<T,2>(static_cast<T>(0.5*(minx_+maxx_)),
+                      static_cast<T>(0.5*(miny_+maxy_)));
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+void box2d<T>::expand_to_include(const coord<T,2>& c)
+{
+    expand_to_include(c.x,c.y);
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+void box2d<T>::expand_to_include(T x,T y)
+{
+    if (x<minx_) minx_=x;
+    if (x>maxx_) maxx_=x;
+    if (y<miny_) miny_=y;
+    if (y>maxy_) maxy_=y;
+}
+
+template <typename T>
+void box2d<T>::expand_to_include(const box2d<T> &other)
+{
+    if (other.minx_<minx_) minx_=other.minx_;
+    if (other.maxx_>maxx_) maxx_=other.maxx_;
+    if (other.miny_<miny_) miny_=other.miny_;
+    if (other.maxy_>maxy_) maxy_=other.maxy_;
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+bool box2d<T>::contains(const coord<T,2> &c) const
+{
+    return contains(c.x,c.y);
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+bool box2d<T>::contains(T x,T y) const
+{
+    return x>=minx_ && x<=maxx_ && y>=miny_ && y<=maxy_;
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+bool box2d<T>::contains(const box2d<T> &other) const
+{
+    return other.minx_>=minx_ &&
+        other.maxx_<=maxx_ &&
+        other.miny_>=miny_ &&
+        other.maxy_<=maxy_;
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+bool box2d<T>::intersects(const coord<T,2> &c) const
+{
+    return intersects(c.x,c.y);
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+bool box2d<T>::intersects(T x,T y) const
+{
+    return !(x>maxx_ || x<minx_ || y>maxy_ || y<miny_);
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+bool box2d<T>::intersects(const box2d<T> &other) const
+{
+    return !(other.minx_>maxx_ || other.maxx_<minx_ ||
+             other.miny_>maxy_ || other.maxy_<miny_);
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+box2d<T> box2d<T>::intersect(const box2d_type& other) const
+{
+    if (intersects(other)) {
+        T x0=std::max(minx_,other.minx_);
+        T y0=std::max(miny_,other.miny_);
+
+        T x1=std::min(maxx_,other.maxx_);
+        T y1=std::min(maxy_,other.maxy_);
+
+        return box2d<T>(x0,y0,x1,y1);
+    } else {
+        return box2d<T>();
+    }
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+void box2d<T>::re_center(T cx,T cy)
+{
+    T dx=cx-center().x;
+    T dy=cy-center().y;
+    minx_+=dx;
+    miny_+=dy;
+    maxx_+=dx;
+    maxy_+=dy;
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+void box2d<T>::re_center(const coord<T,2> &c)
+{
+    re_center(c.x,c.y);
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+void box2d<T>::init(T x0,T y0,T x1,T y1)
+{
+    if (x0<x1)
+    {
+        minx_=x0;maxx_=x1;
+    }
+    else
+    {
+        minx_=x1;maxx_=x0;
+    }
+    if (y0<y1)
+    {
+        miny_=y0;maxy_=y1;
+    }
+    else
+    {
+        miny_=y1;maxy_=y0;
+    }
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+void box2d<T>::clip(const box2d_type& other)
+{
+        minx_ = std::max(minx_,other.minx());
+        miny_ = std::max(miny_,other.miny());
+        maxx_ = std::min(maxx_,other.maxx());
+        maxy_ = std::min(maxy_,other.maxy());
+}
+
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+bool box2d<T>::from_string(const std::string& s)
+{
+    bool success = false;
+
+    boost::char_separator<char> sep(", ");
+    boost::tokenizer<boost::char_separator<char> > tok(s, sep);
+
+    unsigned i = 0;
+    double d[4];
+    for (boost::tokenizer<boost::char_separator<char> >::iterator beg = tok.begin(); 
+         beg != tok.end(); ++beg)
+    {
+        try 
+        {
+            d[i] = boost::lexical_cast<double>(boost::trim_copy(*beg));
+        }
+        catch (boost::bad_lexical_cast & ex)
+        {
+            break;
+        }
+        
+        if (i == 3) 
+        {
+            success = true;
+            break;
+        }
+        
+        ++i;
+    }
+
+    if (success)
+    {
+        init(d[0], d[1], d[2], d[3]);
+    }
+    
+    return success;
+}
+
+template <typename T>
+#if !defined(__SUNPRO_CC)
+inline
+#endif
+bool box2d<T>::valid() const
+{
+    return (minx_ <= maxx_ && miny_ <= maxy_) ;
+}
+
+template <typename T>
+box2d<T>&  box2d<T>::operator+=(box2d<T> const& other)
+{
+    expand_to_include(other);
+    return *this;
+}
+
+/*
+template <typename T>    
+box2d<T>& box2d<T>::operator-=(box2d<T> const& other)
+{
+    // not sure what to do here. intersect?
+    return *this;
+}
+*/
+    
+template <typename T>    
+box2d<T>& box2d<T>::operator*=(T t)
+{
+    coord<T,2> c = center();
+    T sx = static_cast<T>(0.5 * width()  * t);
+    T sy = static_cast<T>(0.5 * height() * t);
+    minx_ = c.x - sx;
+    maxx_ = c.x + sx;
+    miny_ = c.y - sy;
+    maxy_ = c.y + sy;
+    return *this;
+}
+   
+template <typename T>    
+box2d<T>& box2d<T>::operator/=(T t)
+{
+    coord<T,2> c = center();
+    T sx = static_cast<T>(0.5 * width() / t);
+    T sy = static_cast<T>(0.5 * height() / t);
+    minx_ = c.x - sx;
+    maxx_ = c.x + sx;
+    miny_ = c.y - sy;
+    maxy_ = c.y + sy;
+    return *this;
+}
+
+template <typename T>    
+T box2d<T>::operator[] (int index) const
+{
+    switch(index)
+    {
+    case 0:
+        return minx_;
+    case 1:
+        return miny_;
+    case 2:
+        return maxx_;
+    case 3:
+        return maxy_;
+    case -4:
+        return minx_;
+    case -3:
+        return miny_;
+    case -2:
+        return maxx_;
+    case -1:
+        return maxy_;
+    default:
+        throw std::out_of_range("index out of range, max value is 3, min value is -4 ");
+    }
+}
+    
+template class box2d<int>;
+template class box2d<double>;
+}
diff --git a/src/build.py b/src/build.py
new file mode 100644
index 0000000..c3227be
--- /dev/null
+++ b/src/build.py
@@ -0,0 +1,374 @@
+#
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+
+import os
+import sys
+import glob
+from copy import copy
+from subprocess import Popen, PIPE
+
+Import('env')
+
+lib_env = env.Clone()
+
+def call(cmd, silent=True):
+    stdin, stderr = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE).communicate()
+    if not stderr:
+        return stdin.strip()
+    elif not silent:
+        print stderr
+
+def ldconfig(*args,**kwargs):
+    call('ldconfig')
+
+if env['LINKING'] == 'static':
+    lib_env.Append(CXXFLAGS="-fPIC")
+
+mapnik_lib_link_flag = ''
+
+# note: .data gets the actual list to allow a true copy
+# and avoids unintended pollution of other environments
+libmapnik_cxxflags = copy(lib_env['CXXFLAGS'].data)
+
+ABI_VERSION = env['ABI_VERSION']
+
+filesystem = 'boost_filesystem%s' % env['BOOST_APPEND']
+regex = 'boost_regex%s' % env['BOOST_APPEND']
+
+# clear out and re-set libs for this env
+lib_env['LIBS'] = ['freetype','ltdl','png','tiff','z','jpeg','proj',env['ICU_LIB_NAME'],filesystem,regex]
+
+if len(env['EXTRA_FREETYPE_LIBS']):
+    lib_env['LIBS'].extend(copy(env['EXTRA_FREETYPE_LIBS']))
+
+if env['XMLPARSER'] == 'libxml2':
+    lib_env['LIBS'].append('xml2')
+
+if env['THREADING'] == 'multi':
+    lib_env['LIBS'].append('boost_thread%s' % env['BOOST_APPEND'])
+        
+if env['HAS_BOOST_SYSTEM']:
+    lib_env['LIBS'].append('boost_system%s' % env['BOOST_APPEND'])
+    
+
+if not env['RUNTIME_LINK'] == 'static':
+    if env['INTERNAL_LIBAGG']:
+          lib_env['LIBS'].insert(0, 'agg')
+    else:
+        lib_env['LIBS'].append([lib for lib in env['LIBS'] if lib.startswith('agg')])
+    
+
+if env['PLATFORM'] == 'Darwin':
+    mapnik_libname = 'libmapnik2.dylib'
+else:
+    mapnik_libname = 'libmapnik2.so.' + ("%d.%d" % (ABI_VERSION[0],ABI_VERSION[1])) 
+
+if env['PLATFORM'] == 'Darwin':
+    if env['FULL_LIB_PATH']:
+        lib_path = '%s/%s' % (env['MAPNIK_LIB_BASE'],mapnik_libname)
+    else:
+        lib_path = mapnik_libname
+    mapnik_lib_link_flag += ' -Wl,-install_name,%s' % lib_path
+    _d = {'version':env['MAPNIK_VERSION_STRING']}
+    mapnik_lib_link_flag += ' -current_version %(version)s -compatibility_version %(version)s' % _d
+elif env['PLATFORM'] == 'SunOS':
+    if env['CXX'].startswith('CC'):
+        mapnik_lib_link_flag += ' -R. -h %s' % mapnik_libname
+    else:
+        mapnik_lib_link_flag += ' -Wl,-h,%s' %  mapnik_libname
+else: # Linux and others
+    mapnik_lib_link_flag += ' -Wl,-rpath-link,. -Wl,-soname,%s' % mapnik_libname
+
+source = Split(
+    """
+    color.cpp
+    box2d.cpp
+    expression_string.cpp
+    filter_factory.cpp
+    feature_type_style.cpp
+    font_engine_freetype.cpp
+    font_set.cpp
+    gradient.cpp
+    graphics.cpp
+    image_reader.cpp
+    image_util.cpp
+    layer.cpp
+    line_symbolizer.cpp
+    line_pattern_symbolizer.cpp
+    map.cpp
+    load_map.cpp
+    memory.cpp
+    parse_path.cpp
+    palette.cpp
+    placement_finder.cpp
+    plugin.cpp
+    png_reader.cpp
+    point_symbolizer.cpp
+    polygon_pattern_symbolizer.cpp
+    save_map.cpp
+    shield_symbolizer.cpp
+    text_symbolizer.cpp
+    tiff_reader.cpp
+    wkb.cpp
+    projection.cpp
+    proj_transform.cpp
+    distance.cpp
+    scale_denominator.cpp
+    memory_datasource.cpp
+    stroke.cpp
+    symbolizer.cpp
+    arrow.cpp
+    unicode.cpp
+    glyph_symbolizer.cpp
+    markers_symbolizer.cpp
+    metawriter.cpp
+    raster_colorizer.cpp
+    text_placements.cpp
+    wkt/wkt_factory.cpp
+    metawriter_inmem.cpp
+    metawriter_factory.cpp
+    mapped_memory_cache.cpp
+    marker_cache.cpp
+    svg_parser.cpp
+    svg_path_parser.cpp
+    svg_points_parser.cpp 
+    svg_transform_parser.cpp
+    warp.cpp
+    """   
+    )
+
+if env['HAS_CAIRO']:
+    lib_env.PrependUnique(LIBPATH=env['CAIROMM_LIBPATHS'])
+    lib_env.Append(LIBS=env['CAIROMM_LINKFLAGS'])
+    lib_env.Append(CXXFLAGS = '-DHAVE_CAIRO')
+    libmapnik_cxxflags.append('-DHAVE_CAIRO')
+    lib_env.PrependUnique(CPPPATH=copy(env['CAIROMM_CPPPATHS']))
+    source.insert(0,'cairo_renderer.cpp')
+    #cairo_env.PrependUnique(CPPPATH=env['CAIROMM_CPPPATHS'])
+    # not safe, to much depends on graphics.hpp
+    #cairo_env = lib_env.Clone()
+    #cairo_env.Append(CXXFLAGS = '-DHAVE_CAIRO')
+    #fixup = ['feature_type_style.cpp','load_map.cpp','cairo_renderer.cpp','graphics.cpp','image_util.cpp']
+    #for cpp in fixup:
+    #    if cpp in source:
+    #        source.remove(cpp)
+    #    if env['LINKING'] == 'static':
+    #        source.insert(0,cairo_env.StaticObject(cpp))
+    #    else:
+    #        source.insert(0,cairo_env.SharedObject(cpp))
+
+
+processor_cpp = 'feature_style_processor.cpp'
+
+if env['RENDERING_STATS']:
+    env3 = lib_env.Clone()
+    env3.Append(CXXFLAGS='-DRENDERING_STATS')
+    if env['LINKING'] == 'static':
+        source.insert(0,env3.StaticObject(processor_cpp))
+    else:
+        source.insert(0,env3.SharedObject(processor_cpp))
+else:
+    source.insert(0,processor_cpp);
+
+    
+# add the datasource_cache.cpp with custom LIBTOOL flag if needed
+if env['LIBTOOL_SUPPORTS_ADVISE']:
+    env3 = lib_env.Clone()
+    env3.Append(CXXFLAGS='-DLIBTOOL_SUPPORTS_ADVISE')
+    libmapnik_cxxflags.append('-DLIBTOOL_SUPPORTS_ADVISE')
+    cpp = 'datasource_cache.cpp'
+    if env['LINKING'] == 'static':
+        source.insert(0,env3.StaticObject(cpp))
+    else:
+        source.insert(0,env3.SharedObject(cpp))
+else:
+    source.insert(0,'datasource_cache.cpp')
+
+if env['JPEG']:
+    source += Split(
+        """
+        jpeg_reader.cpp
+        """)
+        
+# agg backend
+source += Split(
+    """
+    agg/agg_renderer.cpp
+    agg/process_building_symbolizer.cpp
+    agg/process_glyph_symbolizer.cpp
+    agg/process_line_symbolizer.cpp
+    agg/process_line_pattern_symbolizer.cpp
+    agg/process_text_symbolizer.cpp
+    agg/process_point_symbolizer.cpp
+    agg/process_polygon_symbolizer.cpp
+    agg/process_polygon_pattern_symbolizer.cpp
+    agg/process_raster_symbolizer.cpp
+    agg/process_shield_symbolizer.cpp
+    agg/process_markers_symbolizer.cpp
+    """ 
+    )
+
+if env['RUNTIME_LINK'] == "static":
+    source += glob.glob('../agg/src/' + '*.cpp')
+
+# grid backend
+source += Split(
+    """
+    grid/grid_renderer.cpp
+    grid/process_building_symbolizer.cpp
+    grid/process_glyph_symbolizer.cpp
+    grid/process_line_pattern_symbolizer.cpp
+    grid/process_line_symbolizer.cpp
+    grid/process_markers_symbolizer.cpp
+    grid/process_point_symbolizer.cpp
+    grid/process_polygon_pattern_symbolizer.cpp
+    grid/process_polygon_symbolizer.cpp
+    grid/process_raster_symbolizer.cpp
+    grid/process_shield_symbolizer.cpp
+    grid/process_text_symbolizer.cpp	
+    """)
+
+if env['SVG_RENDERER']: # svg backend
+    source += Split(
+              """
+      	svg/svg_renderer.cpp
+      	svg/svg_generator.cpp	
+      	svg/svg_output_attributes.cpp
+      	svg/process_symbolizers.cpp
+      	svg/process_building_symbolizer.cpp
+      	svg/process_glyph_symbolizer.cpp
+      	svg/process_line_pattern_symbolizer.cpp
+      	svg/process_line_symbolizer.cpp
+      	svg/process_markers_symbolizer.cpp
+      	svg/process_point_symbolizer.cpp
+      	svg/process_polygon_pattern_symbolizer.cpp
+      	svg/process_polygon_symbolizer.cpp
+      	svg/process_raster_symbolizer.cpp
+      	svg/process_shield_symbolizer.cpp
+      	svg/process_text_symbolizer.cpp	
+      	""")
+    lib_env.Append(CXXFLAGS = '-DSVG_RENDERER')
+    libmapnik_cxxflags.append('-DSVG_RENDERER')
+
+if env['XMLPARSER'] == 'tinyxml':
+    source += Split(
+        """
+        ../tinyxml/tinystr.cpp
+        ../tinyxml/tinyxml.cpp
+        ../tinyxml/tinyxmlerror.cpp
+        ../tinyxml/tinyxmlparser.cpp
+        """)
+elif env['XMLPARSER'] == 'libxml2' and env['HAS_LIBXML2']:
+    source += Split(
+        """
+        libxml2_loader.cpp
+        """)
+    env2 = lib_env.Clone()
+    env2.Append(CXXFLAGS = '-DHAVE_LIBXML2')
+    libmapnik_cxxflags.append('-DHAVE_LIBXML2')
+    fixup = ['load_map.cpp','libxml2_loader.cpp']
+    for cpp in fixup:
+        if cpp in source:
+            source.remove(cpp)
+        if env['LINKING'] == 'static':
+            source.insert(0,env2.StaticObject(cpp))
+        else:
+            source.insert(0,env2.SharedObject(cpp))
+
+if env['CUSTOM_LDFLAGS']:
+    linkflags = '%s %s' % (env['CUSTOM_LDFLAGS'], mapnik_lib_link_flag)
+else:
+    linkflags = mapnik_lib_link_flag
+
+if env['LINKING'] == 'static':
+    mapnik = lib_env.StaticLibrary('mapnik2', source, LINKFLAGS=linkflags)
+else:
+    mapnik = lib_env.SharedLibrary('mapnik2', source, LINKFLAGS=linkflags)
+
+# cache library values for other builds to use
+env['LIBMAPNIK_LIBS'] = copy(lib_env['LIBS'])
+env['LIBMAPNIK_CXXFLAGS'] = libmapnik_cxxflags
+
+if env['PLATFORM'] != 'Darwin':
+    # Symlink command, only works if both files are in same directory
+    def symlink(env, target, source):
+        trgt = str(target[0])
+        src = str(source[0])
+
+        if os.path.islink(trgt) or os.path.exists(trgt):
+            os.remove(trgt)
+        os.symlink(os.path.basename(src), trgt)
+
+    major, minor, micro = ABI_VERSION
+    
+    soFile = "%s.%d.%d.%d" % (os.path.basename(str(mapnik[0])), major, minor, micro)
+    target = os.path.join(env['MAPNIK_LIB_BASE_DEST'], soFile)
+    
+    if 'uninstall' not in COMMAND_LINE_TARGETS:
+      result = env.InstallAs(target=target, source=mapnik)
+      env.Alias(target='install', source=result)
+      if result:
+            env.AddPostAction(result, ldconfig)
+
+    
+    # Install symlinks
+    target1 = os.path.join(env['MAPNIK_LIB_BASE_DEST'], "%s.%d.%d" % (os.path.basename(str(mapnik[0])),major, minor))
+    target2 = os.path.join(env['MAPNIK_LIB_BASE_DEST'], os.path.basename(str(mapnik[0])))
+    if 'uninstall' not in COMMAND_LINE_TARGETS:
+        if 'install' in COMMAND_LINE_TARGETS:
+            link1 = env.Command(target1, target, symlink)
+            env.Alias(target='install', source=link1)
+            link2 = env.Command(target2, target1, symlink)
+            env.Alias(target='install', source=link2)
+    # delete in reverse order..
+    env['create_uninstall_target'](env, target2)
+    env['create_uninstall_target'](env, target1)
+    env['create_uninstall_target'](env, target)
+
+else:
+    target_path = env['MAPNIK_LIB_BASE_DEST']
+    if 'uninstall' not in COMMAND_LINE_TARGETS:
+        result = env.Install(target_path, mapnik)
+        env.Alias(target='install', source=result)
+
+    env['create_uninstall_target'](env, os.path.join(target_path,mapnik_libname))
+
+includes = glob.glob('../include/mapnik/*.hpp')
+svg_includes = glob.glob('../include/mapnik/svg/*.hpp')
+wkt_includes = glob.glob('../include/mapnik/wkt/*.hpp')
+grid_includes = glob.glob('../include/mapnik/grid/*.hpp')
+
+inc_target = os.path.normpath(env['INSTALL_PREFIX']+'/include/mapnik')
+svg_inc_target = os.path.normpath(env['INSTALL_PREFIX']+'/include/mapnik/svg')
+wkt_inc_target = os.path.normpath(env['INSTALL_PREFIX']+'/include/mapnik/wkt')
+grid_inc_target = os.path.normpath(env['INSTALL_PREFIX']+'/include/mapnik/grid')
+
+if 'uninstall' not in COMMAND_LINE_TARGETS:
+    env.Alias(target='install', source=env.Install(inc_target, includes))
+    env.Alias(target='install', source=env.Install(svg_inc_target, svg_includes))
+    env.Alias(target='install', source=env.Install(wkt_inc_target, wkt_includes))
+    env.Alias(target='install', source=env.Install(grid_inc_target, grid_includes))
+
+env['create_uninstall_target'](env, inc_target)
+env['create_uninstall_target'](env, svg_inc_target)
+env['create_uninstall_target'](env, wkt_inc_target)
+env['create_uninstall_target'](env, grid_inc_target)
diff --git a/src/cairo_renderer.cpp b/src/cairo_renderer.cpp
index 533a056..3f69f38 100644
--- a/src/cairo_renderer.cpp
+++ b/src/cairo_renderer.cpp
@@ -28,9 +28,17 @@
 #include <mapnik/image_util.hpp>
 #include <mapnik/unicode.hpp>
 #include <mapnik/placement_finder.hpp>
-#include <mapnik/markers_converter.hpp>
+#include <mapnik/markers_placement.hpp>
 #include <mapnik/arrow.hpp>
 #include <mapnik/config_error.hpp>
+#include <mapnik/parse_path.hpp>
+#include <mapnik/marker_cache.hpp>
+#include <mapnik/svg/svg_path_adapter.hpp>
+#include <mapnik/svg/svg_path_attributes.hpp>
+#include <mapnik/segment.hpp>
+#include <mapnik/expression_evaluator.hpp>
+#include <mapnik/warp.hpp>
+#include <mapnik/config.hpp>
 
 // cairo
 #include <cairomm/context.h>
@@ -39,7 +47,7 @@
 
 // boost
 #include <boost/utility.hpp>
-#include <boost/tuple/tuple.hpp>
+#include <boost/make_shared.hpp>
 
 // stl
 #ifdef MAPNIK_DEBUG
@@ -48,565 +56,739 @@
 
 namespace mapnik
 {
-   class cairo_pattern : private boost::noncopyable
-   {
-      public:
-         cairo_pattern(ImageData32 const& data)
-         {
-            int pixels = data.width() * data.height();
-            const unsigned int *in_ptr = data.getData();
-            const unsigned int *in_end = in_ptr + pixels;
-            unsigned int *out_ptr;
-
-            out_ptr = data_ = new unsigned int[pixels];
-
-            while (in_ptr < in_end)
-            {
-               unsigned int in = *in_ptr++;
-               unsigned int r = (in >> 0) & 0xff;
-               unsigned int g = (in >> 8) & 0xff;
-               unsigned int b = (in >> 16) & 0xff;
-               unsigned int a = (in >> 24) & 0xff;
-
-               r = r * a / 255;
-               g = g * a / 255;
-               b = b * a / 255;
-
-               *out_ptr++ = (a << 24) | (r << 16) | (g << 8) | b;
-            }
-
-            surface_ = Cairo::ImageSurface::create(reinterpret_cast<unsigned char *>(data_), Cairo::FORMAT_ARGB32, data.width(), data.height(), data.width() * 4);
-            pattern_ = Cairo::SurfacePattern::create(surface_);
-         }
+class cairo_pattern : private boost::noncopyable
+{
+public:
+    cairo_pattern(image_data_32 const& data)
+    {
+        int pixels = data.width() * data.height();
+        const unsigned int *in_ptr = data.getData();
+        const unsigned int *in_end = in_ptr + pixels;
+        unsigned int *out_ptr;
+
+        surface_ = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, data.width(), data.height());
+
+        out_ptr = reinterpret_cast<unsigned int *>(surface_->get_data());
+
+        while (in_ptr < in_end)
+        {
+            unsigned int in = *in_ptr++;
+            unsigned int r = (in >> 0) & 0xff;
+            unsigned int g = (in >> 8) & 0xff;
+            unsigned int b = (in >> 16) & 0xff;
+            unsigned int a = (in >> 24) & 0xff;
+
+            r = r * a / 255;
+            g = g * a / 255;
+            b = b * a / 255;
+
+            *out_ptr++ = (a << 24) | (r << 16) | (g << 8) | b;
+        }
+        // mark the surface as dirty as we've modified it behind cairo's back
+        surface_->mark_dirty();
+        pattern_ = Cairo::SurfacePattern::create(surface_);
+    }
 
-         ~cairo_pattern(void)
-         {
-            delete [] data_;
-         }
+    ~cairo_pattern(void)
+    {
+    }
          
-         void set_matrix(Cairo::Matrix const& matrix)
-         {
-            pattern_->set_matrix(matrix);
-         }
-
-         void set_origin(double x, double y)
-         {
-            Cairo::Matrix matrix;
+    void set_matrix(Cairo::Matrix const& matrix)
+    {
+        pattern_->set_matrix(matrix);
+    }
+
+    void set_origin(double x, double y)
+    {
+        Cairo::Matrix matrix;
             
-            pattern_->get_matrix(matrix);
+        pattern_->get_matrix(matrix);
      
-            matrix.x0 = -x;
-            matrix.y0 = -y;
+        matrix.x0 = -x;
+        matrix.y0 = -y;
             
-            pattern_->set_matrix(matrix);
-         }
+        pattern_->set_matrix(matrix);
+    }
          
-         void set_extend(Cairo::Extend extend)
-         {
-            pattern_->set_extend(extend);
-         }
-
-         void set_filter(Cairo::Filter filter)
-         {
-            pattern_->set_filter(filter);
-         }
-
-         Cairo::RefPtr<Cairo::SurfacePattern> const& pattern(void) const
-         {
-            return pattern_;
-         }
-
-      private:
-         unsigned int *data_;
-         Cairo::RefPtr<Cairo::ImageSurface> surface_;
-         Cairo::RefPtr<Cairo::SurfacePattern> pattern_;
-   };
-
-   class cairo_face : private boost::noncopyable
-   {
-      public:
-         cairo_face(boost::shared_ptr<freetype_engine> const& engine, face_ptr const& face)
-            : face_(face)
-         {
-            static cairo_user_data_key_t key;
-            cairo_font_face_t *c_face;
-
-            c_face = cairo_ft_font_face_create_for_ft_face(face->get_face(), FT_LOAD_NO_HINTING);
-            cairo_font_face_set_user_data(c_face, &key, new handle(engine, face), destroy);
-
-            cairo_face_ = Cairo::RefPtr<Cairo::FontFace>(new Cairo::FontFace(c_face));
-         }
-
-         Cairo::RefPtr<Cairo::FontFace> const& face(void) const
-         {
-            return cairo_face_;
-         }
-
-      private:
-         class handle
-         {
-            public:
-               handle(boost::shared_ptr<freetype_engine> const& engine, face_ptr const& face)
-                  : engine_(engine), face_(face) {}
-
-            private:
-               boost::shared_ptr<freetype_engine> engine_;
-               face_ptr face_;
-         };
-
-         static void destroy(void *data)
-         {
-            handle *h = static_cast<handle *>(data);
-
-            delete h;
-         }
-
-      private:
-         face_ptr face_;
-         Cairo::RefPtr<Cairo::FontFace> cairo_face_;
-   };
-
-   cairo_face_manager::cairo_face_manager(boost::shared_ptr<freetype_engine> engine,
-                                          face_manager<freetype_engine> & manager)
-      : font_engine_(engine),
-        font_manager_(manager)
-   {
-   }
-
-   cairo_face_ptr cairo_face_manager::get_face(face_ptr face)
-   {
-      cairo_face_cache::iterator itr = cache_.find(face);
-      cairo_face_ptr entry;
-
-      if (itr != cache_.end())
-      {
-         entry = itr->second;
-      }
-      else
-      {
-         entry = cairo_face_ptr(new cairo_face(font_engine_, face));
-
-         cache_.insert(std::make_pair(face, entry));
-      }
-
-      return entry;
-   }
-
-   class cairo_context : private boost::noncopyable
-   {
-      public:
-         cairo_context(Cairo::RefPtr<Cairo::Context> const& context)
-            : context_(context)
-         {
-            context_->save();
-         }
-
-         ~cairo_context(void)
-         {
-            context_->restore();
-         }
-
-         void set_color(color const &color, double opacity = 1.0)
-         {
-            set_color(color.red(), color.green(), color.blue(), color.alpha() * opacity / 255.0);
-         }
-
-         void set_color(int r, int g, int b, double opacity = 1.0)
-         {
-            context_->set_source_rgba(r / 255.0, g / 255.0, b / 255.0, opacity);
-         }
-
-         void set_line_join(line_join_e join)
-         {
-            if (join == MITER_JOIN)
-               context_->set_line_join(Cairo::LINE_JOIN_MITER);
-            else if (join == MITER_REVERT_JOIN)
-               context_->set_line_join(Cairo::LINE_JOIN_MITER);
-            else if (join == ROUND_JOIN)
-               context_->set_line_join(Cairo::LINE_JOIN_ROUND);
-            else
-               context_->set_line_join(Cairo::LINE_JOIN_BEVEL);
-         }
-
-         void set_line_cap(line_cap_e cap)
-         {
-            if (cap == BUTT_CAP)
-               context_->set_line_cap(Cairo::LINE_CAP_BUTT);
-            else if (cap == SQUARE_CAP)
-               context_->set_line_cap(Cairo::LINE_CAP_SQUARE);
-            else
-               context_->set_line_cap(Cairo::LINE_CAP_ROUND);
-         }
-
-         void set_miter_limit(double limit)
-         {
-            context_->set_miter_limit(limit);
-         }
-
-         void set_line_width(double width)
-         {
-            context_->set_line_width(width);
-         }
-
-         void set_dash(dash_array const &dashes)
-         {
-            std::valarray<double> d(dashes.size() * 2);
-            dash_array::const_iterator itr = dashes.begin();
-            dash_array::const_iterator end = dashes.end();
-            int index = 0;
-
-            for (; itr != end; ++itr)
-            {
-               d[index++] = itr->first;
-               d[index++] = itr->second;
-            }
+    void set_extend(Cairo::Extend extend)
+    {
+        pattern_->set_extend(extend);
+    }
+
+    void set_filter(Cairo::Filter filter)
+    {
+        pattern_->set_filter(filter);
+    }
+
+    Cairo::RefPtr<Cairo::SurfacePattern> const& pattern(void) const
+    {
+        return pattern_;
+    }
+
+private:
+    Cairo::RefPtr<Cairo::ImageSurface> surface_;
+    Cairo::RefPtr<Cairo::SurfacePattern> pattern_;
+};
+
+class cairo_gradient : private boost::noncopyable
+{
+public:
+    cairo_gradient(const mapnik::gradient &grad, double opacity=1.0)
+    {
+        double x1,x2,y1,y2,r;
+        grad.get_control_points(x1,y1,x2,y2,r);
+        if (grad.get_gradient_type() == LINEAR)
+        {
+            pattern_ = Cairo::LinearGradient::create(x1, y1, x2, y2);
+        }
+        else if (grad.get_gradient_type() == RADIAL)
+        {
+            pattern_ = Cairo::RadialGradient::create(x1, y1, 0, x2, y2, r);
+        }
+
+        units_ = grad.get_units();
+
+        BOOST_FOREACH ( mapnik::stop_pair const& st, grad.get_stop_array() )
+        {
+            mapnik::color const& stop_color = st.second;
+            double r= static_cast<double> (stop_color.red())/255.0;
+            double g= static_cast<double> (stop_color.green())/255.0;
+            double b= static_cast<double> (stop_color.blue())/255.0;
+            double a= static_cast<double> (stop_color.alpha())/255.0;
+            pattern_->add_color_stop_rgba(st.first, r, g, b, a*opacity);
+        }
+
+        double m[6];
+        agg::trans_affine tr = grad.get_transform();
+        tr.invert();
+        tr.store_to(m);
+        pattern_->set_matrix(Cairo::Matrix(m[0],m[1],m[2],m[3],m[4],m[5]));
+    }
+
+    ~cairo_gradient(void)
+    {
+    }
+
+
+    Cairo::RefPtr<Cairo::Gradient> const& gradient(void) const
+    {
+        return pattern_;
+    }
+
+    gradient_unit_e units() const
+    {
+        return units_;
+    }
+
+private:
+    Cairo::RefPtr<Cairo::Gradient> pattern_;
+    gradient_unit_e units_;
+
+};
 
-            context_->set_dash(d, 0.0);
-         }
+class cairo_face : private boost::noncopyable
+{
+public:
+    cairo_face(boost::shared_ptr<freetype_engine> const& engine, face_ptr const& face)
+        : face_(face)
+    {
+        static cairo_user_data_key_t key;
+        cairo_font_face_t *c_face;
+
+        c_face = cairo_ft_font_face_create_for_ft_face(face->get_face(), FT_LOAD_NO_HINTING);
+        cairo_font_face_set_user_data(c_face, &key, new handle(engine, face), destroy);
+
+        cairo_face_ = Cairo::RefPtr<Cairo::FontFace>(new Cairo::FontFace(c_face));
+    }
+
+    Cairo::RefPtr<Cairo::FontFace> const& face(void) const
+    {
+        return cairo_face_;
+    }
+
+private:
+    class handle
+    {
+    public:
+        handle(boost::shared_ptr<freetype_engine> const& engine, face_ptr const& face)
+            : engine_(engine), face_(face) {}
+
+    private:
+        boost::shared_ptr<freetype_engine> engine_;
+        face_ptr face_;
+    };
+
+    static void destroy(void *data)
+    {
+        handle *h = static_cast<handle *>(data);
+
+        delete h;
+    }
+
+private:
+    face_ptr face_;
+    Cairo::RefPtr<Cairo::FontFace> cairo_face_;
+};
+
+cairo_face_manager::cairo_face_manager(boost::shared_ptr<freetype_engine> engine,
+                                       face_manager<freetype_engine> & manager)
+    : font_engine_(engine),
+      font_manager_(manager)
+{
+}
+
+cairo_face_ptr cairo_face_manager::get_face(face_ptr face)
+{
+    cairo_face_cache::iterator itr = cache_.find(face);
+    cairo_face_ptr entry;
 
-         void move_to(double x, double y)
-         {
+    if (itr != cache_.end())
+    {
+        entry = itr->second;
+    }
+    else
+    {
+        entry = cairo_face_ptr(new cairo_face(font_engine_, face));
+
+        cache_.insert(std::make_pair(face, entry));
+    }
+
+    return entry;
+}
+
+class cairo_context : private boost::noncopyable
+{
+public:
+    cairo_context(Cairo::RefPtr<Cairo::Context> const& context)
+        : context_(context)
+    {
+        context_->save();
+    }
+
+    ~cairo_context(void)
+    {
+        context_->restore();
+    }
+
+    void set_color(color const &color, double opacity = 1.0)
+    {
+        set_color(color.red(), color.green(), color.blue(), color.alpha() * opacity / 255.0);
+    }
+
+    void set_color(int r, int g, int b, double opacity = 1.0)
+    {
+        context_->set_source_rgba(r / 255.0, g / 255.0, b / 255.0, opacity);
+    }
+
+    void set_line_join(line_join_e join)
+    {
+        if (join == MITER_JOIN)
+            context_->set_line_join(Cairo::LINE_JOIN_MITER);
+        else if (join == MITER_REVERT_JOIN)
+            context_->set_line_join(Cairo::LINE_JOIN_MITER);
+        else if (join == ROUND_JOIN)
+            context_->set_line_join(Cairo::LINE_JOIN_ROUND);
+        else
+            context_->set_line_join(Cairo::LINE_JOIN_BEVEL);
+    }
+
+    void set_line_cap(line_cap_e cap)
+    {
+        if (cap == BUTT_CAP)
+            context_->set_line_cap(Cairo::LINE_CAP_BUTT);
+        else if (cap == SQUARE_CAP)
+            context_->set_line_cap(Cairo::LINE_CAP_SQUARE);
+        else
+            context_->set_line_cap(Cairo::LINE_CAP_ROUND);
+    }
+
+    void set_miter_limit(double limit)
+    {
+        context_->set_miter_limit(limit);
+    }
+
+    void set_line_width(double width)
+    {
+        context_->set_line_width(width);
+    }
+
+    void set_dash(dash_array const &dashes)
+    {
+        std::valarray<double> d(dashes.size() * 2);
+        dash_array::const_iterator itr = dashes.begin();
+        dash_array::const_iterator end = dashes.end();
+        int index = 0;
+
+        for (; itr != end; ++itr)
+        {
+            d[index++] = itr->first;
+            d[index++] = itr->second;
+        }
+
+        context_->set_dash(d, 0.0);
+    }
+
+    void set_fill_rule(Cairo::FillRule fill_rule)
+    {
+        context_->set_fill_rule(fill_rule);
+    }
+
+    void move_to(double x, double y)
+    {
 #if CAIRO_VERSION < CAIRO_VERSION_ENCODE(1, 6, 0)
-            if (x < -32767.0) x = -32767.0;
-            else if (x > 32767.0) x = 32767.0;
-            if (y < -32767.0) y = -32767.0;
-            else if (y > 32767.0) y = 32767.0;
+        if (x < -32767.0) x = -32767.0;
+        else if (x > 32767.0) x = 32767.0;
+        if (y < -32767.0) y = -32767.0;
+        else if (y > 32767.0) y = 32767.0;
 #endif
 
-            context_->move_to(x, y);
-         }
+        context_->move_to(x, y);
+    }
+
+    void curve_to(double ct1_x, double ct1_y, double ct2_x, double ct2_y, double end_x, double end_y)
+    {
+        context_->curve_to(ct1_x,ct1_y,ct2_x,ct2_y,end_x,end_y);
+    }
 
+    void close_path()
+    {
+        context_->close_path();
+    }
 
-         void line_to(double x, double y)
-         {
+    void line_to(double x, double y)
+    {
 #if CAIRO_VERSION < CAIRO_VERSION_ENCODE(1, 6, 0)
-            if (x < -32767.0) x = -32767.0;
-            else if (x > 32767.0) x = 32767.0;
-            if (y < -32767.0) y = -32767.0;
-            else if (y > 32767.0) y = 32767.0;
+        if (x < -32767.0) x = -32767.0;
+        else if (x > 32767.0) x = 32767.0;
+        if (y < -32767.0) y = -32767.0;
+        else if (y > 32767.0) y = 32767.0;
 #endif
 
-            context_->line_to(x, y);
-         }
+        context_->line_to(x, y);
+    }
 
-         template <typename T>
-         void add_path(T path)
-         {
-            double x, y;
+    template <typename T>
+    void add_path(T& path, unsigned start_index = 0)
+    {
+        double x, y;
 
-            path.rewind(0);
+        path.rewind(start_index);
 
-            for (unsigned cm = path.vertex(&x, &y); cm != SEG_END; cm = path.vertex(&x, &y))
+        for (unsigned cm = path.vertex(&x, &y); cm != SEG_END; cm = path.vertex(&x, &y))
+        {
+            if (cm == SEG_MOVETO)
+            {
+                move_to(x, y);
+            }
+            else if (cm == SEG_LINETO)
             {
-               if (cm == SEG_MOVETO)
-               {
-                  move_to(x, y);
-               }
-               else if (cm == SEG_LINETO)
-               {
-                  line_to(x, y);
-               }
+                line_to(x, y);
             }
-         }
+        }
+    }
 
-         void rectangle(double x, double y, double w, double h)
-         {
-            context_->rectangle(x, y, w, h);
-         }
+    template <typename T>
+    void add_agg_path(T& path, unsigned start_index = 0)
+    {
+        double x=0;
+        double y=0;
 
-         void stroke(void)
-         {
-            context_->stroke();
-         }
+        path.rewind(start_index);
 
-         void fill(void)
-         {
-            context_->fill();
-         }
+        for (unsigned cm = path.vertex(&x, &y); !agg::is_stop(cm); cm = path.vertex(&x, &y))
+        {
+            if (agg::is_move_to(cm))
+            {
+                move_to(x, y);
+            }
+            else if (agg::is_drawing(cm))
+            {
+                if (agg::is_curve3(cm))
+                {
+                    double end_x=0;
+                    double end_y=0;
+                    std::cerr << "Curve 3 not implemented" << std::endl;
+                    path.vertex(&end_x, &end_y);
+
+                    curve_to(x,y,x,y,end_x,end_y);
+                }
+                else if (agg::is_curve4(cm))
+                {
+                    double ct2_x=0;
+                    double ct2_y=0;
+                    double end_x=0;
+                    double end_y=0;
+
+                    path.vertex(&ct2_x, &ct2_y);
+                    path.vertex(&end_x, &end_y);
+
+                    curve_to(x,y,ct2_x,ct2_y,end_x,end_y);
+                }
+                else if (agg::is_line_to(cm))
+                {
+                    line_to(x, y);
+                }
+                else
+                {
+                    std::cerr << "Unimplemented drawing command: " << cm << std::endl;
+                    move_to(x, y);
+                }
+            }
+            else if (agg::is_close(cm))
+            {
+                close_path();
+            }
+            else
+            {
+                std::cerr << "Unimplemented path command: " << cm << std::endl;
+            }
+        }
+    }
 
-         void paint(void)
-         {
-            context_->paint();
-         }
+    void rectangle(double x, double y, double w, double h)
+    {
+        context_->rectangle(x, y, w, h);
+    }
+
+    void stroke(void)
+    {
+        context_->stroke();
+    }
+
+    void fill(void)
+    {
+        context_->fill();
+    }
+
+    void paint(void)
+    {
+        context_->paint();
+    }
+
+    void set_pattern(cairo_pattern const& pattern)
+    {
+        context_->set_source(pattern.pattern());
+    }
+
+    void set_gradient(cairo_gradient const& pattern, const box2d<double> &bbox)
+    {
+        Cairo::RefPtr<Cairo::Gradient> p = pattern.gradient();
+
+        double bx1=bbox.minx();
+        double by1=bbox.miny();
+        double bx2=bbox.maxx();
+        double by2=bbox.maxy();
+        if (pattern.units() != USER_SPACE_ON_USE)
+        {
+            if (pattern.units() == OBJECT_BOUNDING_BOX)
+            {
+                context_->get_path_extents (bx1, by1, bx2, by2);
+            }
+            Cairo::Matrix m = p->get_matrix();
+            m.scale(1.0/(bx2-bx1),1.0/(by2-by1));
+            m.translate(-bx1,-by1);
+            p->set_matrix(m);
+        }
+
+        context_->set_source(p);
+    }
+
+    void add_image(double x, double y, image_data_32 & data, double opacity = 1.0)
+    {
+        cairo_pattern pattern(data);
+
+        pattern.set_origin(x, y);
 
-         void set_pattern(cairo_pattern const& pattern)
-         {
-            context_->set_source(pattern.pattern());
-         }
+        context_->save();
+        context_->set_source(pattern.pattern());
+        context_->paint_with_alpha(opacity);
+        context_->restore();
+    }
+
+    void set_font_face(cairo_face_manager & manager, face_ptr face)
+    {
+        context_->set_font_face(manager.get_face(face)->face());
+    }
+
+    void set_font_matrix(Cairo::Matrix const& matrix)
+    {
+        context_->set_font_matrix(matrix);
+    }
 
-         void add_image(double x, double y, ImageData32 & data, double opacity = 1.0)
-         {
-            cairo_pattern pattern(data);
+    void set_matrix(Cairo::Matrix const& matrix)
+    {
+        context_->set_matrix(matrix);
+    }
 
-            pattern.set_origin(x, y);
+    void transform(Cairo::Matrix const& matrix)
+    {
+        context_->transform(matrix);
+    }
 
-            context_->save();
-            context_->set_source(pattern.pattern());
-            context_->paint_with_alpha(opacity);
-            context_->restore();
-         }
+    void translate(double x, double y)
+    {
+        context_->translate(x,y);
+    }
 
-         void set_font_face(cairo_face_manager & manager, face_ptr face)
-         {
-            context_->set_font_face(manager.get_face(face)->face());
-         }
+    void save()
+    {
+        context_->save();
+    }
 
-         void set_font_matrix(Cairo::Matrix const& matrix)
-         {
-            context_->set_font_matrix(matrix);
-         }
+    void restore()
+    {
+        context_->restore();
+    }
 
-         void show_glyph(unsigned long index, double x, double y)
-         {
-            Cairo::Glyph glyph;
+    void show_glyph(unsigned long index, double x, double y)
+    {
+        Cairo::Glyph glyph;
 
-            glyph.index = index;
-            glyph.x = x;
-            glyph.y = y;
+        glyph.index = index;
+        glyph.x = x;
+        glyph.y = y;
 
-            std::vector<Cairo::Glyph> glyphs;
+        std::vector<Cairo::Glyph> glyphs;
 
-            glyphs.push_back(glyph);
+        glyphs.push_back(glyph);
 
-            context_->show_glyphs(glyphs);
-         }
+        context_->show_glyphs(glyphs);
+    }
 
-         void glyph_path(unsigned long index, double x, double y)
-         {
-            Cairo::Glyph glyph;
+    void glyph_path(unsigned long index, double x, double y)
+    {
+        Cairo::Glyph glyph;
 
-            glyph.index = index;
-            glyph.x = x;
-            glyph.y = y;
+        glyph.index = index;
+        glyph.x = x;
+        glyph.y = y;
 
-            std::vector<Cairo::Glyph> glyphs;
+        std::vector<Cairo::Glyph> glyphs;
 
-            glyphs.push_back(glyph);
+        glyphs.push_back(glyph);
 
-            context_->glyph_path(glyphs);
-         }
+        context_->glyph_path(glyphs);
+    }
 
-         void add_text(text_symbolizer const& sym, text_path & path,
-                       cairo_face_manager & manager,
-                       face_set_ptr const& faces)
-         {
-            unsigned text_size = sym.get_text_size();
-            double sx = path.starting_x;
-            double sy = path.starting_y;
+    void add_text(text_path & path,
+                  cairo_face_manager & manager,
+                  face_set_ptr const& faces,
+                  unsigned text_size,
+                  color const& fill,
+                  unsigned halo_radius,
+                  color const& halo_fill)
+    {
+        double sx = path.starting_x;
+        double sy = path.starting_y;
 
-            path.rewind();
+        path.rewind();
 
-            for (int iii = 0; iii < path.num_nodes(); iii++)
-            {
-               int c;
-               double x, y, angle;
+        for (int iii = 0; iii < path.num_nodes(); iii++)
+        {
+            int c;
+            double x, y, angle;
 
-               path.vertex(&c, &x, &y, &angle);
+            path.vertex(&c, &x, &y, &angle);
 
-               glyph_ptr glyph = faces->get_glyph(c);
+            glyph_ptr glyph = faces->get_glyph(c);
  
-               if (glyph)
-               {
-                  Cairo::Matrix matrix;
+            if (glyph)
+            {
+                Cairo::Matrix matrix;
 
-                  matrix.xx = text_size * cos(angle);
-                  matrix.xy = text_size * sin(angle);
-                  matrix.yx = text_size * -sin(angle);
-                  matrix.yy = text_size * cos(angle);
-                  matrix.x0 = 0;
-                  matrix.y0 = 0;
+                matrix.xx = text_size * cos(angle);
+                matrix.xy = text_size * sin(angle);
+                matrix.yx = text_size * -sin(angle);
+                matrix.yy = text_size * cos(angle);
+                matrix.x0 = 0;
+                matrix.y0 = 0;
 
-                  set_font_matrix(matrix);
+                set_font_matrix(matrix);
 
-                  set_font_face(manager, glyph->get_face());
+                set_font_face(manager, glyph->get_face());
 
-                  glyph_path(glyph->get_index(), sx + x, sy - y);
-               }
+                glyph_path(glyph->get_index(), sx + x, sy - y);
             }
+        }
 
-            set_line_width(sym.get_halo_radius());
-            set_line_join(ROUND_JOIN);
-            set_color(sym.get_halo_fill());
-            stroke();
+        set_line_width(halo_radius);
+        set_line_join(ROUND_JOIN);
+        set_color(halo_fill);
+        stroke();
 
-            set_color(sym.get_fill());
+        set_color(fill);
 
-            path.rewind();
+        path.rewind();
 
-            for (int iii = 0; iii < path.num_nodes(); iii++)
-            {
-               int c;
-               double x, y, angle;
+        for (int iii = 0; iii < path.num_nodes(); iii++)
+        {
+            int c;
+            double x, y, angle;
 
-               path.vertex(&c, &x, &y, &angle);
+            path.vertex(&c, &x, &y, &angle);
 
-               glyph_ptr glyph = faces->get_glyph(c);
+            glyph_ptr glyph = faces->get_glyph(c);
  
-               if (glyph)
-               {
-                  Cairo::Matrix matrix;
+            if (glyph)
+            {
+                Cairo::Matrix matrix;
 
-                  matrix.xx = text_size * cos(angle);
-                  matrix.xy = text_size * sin(angle);
-                  matrix.yx = text_size * -sin(angle);
-                  matrix.yy = text_size * cos(angle);
-                  matrix.x0 = 0;
-                  matrix.y0 = 0;
+                matrix.xx = text_size * cos(angle);
+                matrix.xy = text_size * sin(angle);
+                matrix.yx = text_size * -sin(angle);
+                matrix.yy = text_size * cos(angle);
+                matrix.x0 = 0;
+                matrix.y0 = 0;
 
-                  set_font_matrix(matrix);
+                set_font_matrix(matrix);
 
-                  set_font_face(manager, glyph->get_face());
+                set_font_face(manager, glyph->get_face());
 
-                  show_glyph(glyph->get_index(), sx + x, sy - y);
-               }
+                show_glyph(glyph->get_index(), sx + x, sy - y);
             }
-         }
-
-
-      private:
-         Cairo::RefPtr<Cairo::Context> context_;
-   };
-
-   cairo_renderer_base::cairo_renderer_base(Map const& m, Cairo::RefPtr<Cairo::Context> const& context, unsigned offset_x, unsigned offset_y)
-      : m_(m),
-        context_(context),
-        t_(m.getWidth(),m.getHeight(),m.getCurrentExtent(),offset_x,offset_y),
-        font_engine_(new freetype_engine()),
-        font_manager_(*font_engine_),
-        face_manager_(font_engine_,font_manager_),
-        detector_(Envelope<double>(-m.buffer_size() ,-m.buffer_size() , m.getWidth() + m.buffer_size() ,m.getHeight() + m.buffer_size()))
-   {
+        }
+    }
+
+
+private:
+    Cairo::RefPtr<Cairo::Context> context_;
+};
+
+cairo_renderer_base::cairo_renderer_base(Map const& m, Cairo::RefPtr<Cairo::Context> const& context, unsigned offset_x, unsigned offset_y)
+    : m_(m),
+      context_(context),
+      t_(m.width(),m.height(),m.get_current_extent(),offset_x,offset_y),
+      font_engine_(new freetype_engine()),
+      font_manager_(*font_engine_),
+      face_manager_(font_engine_,font_manager_),
+      detector_(box2d<double>(-m.buffer_size() ,-m.buffer_size() , m.width() + m.buffer_size() ,m.height() + m.buffer_size()))
+{
 #ifdef MAPNIK_DEBUG
-      std::clog << "scale=" << m.scale() << "\n";
+    std::clog << "scale=" << m.scale() << "\n";
 #endif
-   }
-
-   template <>
-   cairo_renderer<Cairo::Context>::cairo_renderer(Map const& m, Cairo::RefPtr<Cairo::Context> const& context, unsigned offset_x, unsigned offset_y)
-      : feature_style_processor<cairo_renderer>(m),
-        cairo_renderer_base(m,context,offset_x,offset_y)
-   {
-   }
-
-   template <>
-   cairo_renderer<Cairo::Surface>::cairo_renderer(Map const& m, Cairo::RefPtr<Cairo::Surface> const& surface, unsigned offset_x, unsigned offset_y)
-      : feature_style_processor<cairo_renderer>(m),
-        cairo_renderer_base(m,Cairo::Context::create(surface),offset_x,offset_y)
-   {
-   }
-
-   cairo_renderer_base::~cairo_renderer_base() {}
-
-   void cairo_renderer_base::start_map_processing(Map const& map)
-   {
+}
+
+template <>
+cairo_renderer<Cairo::Context>::cairo_renderer(Map const& m, Cairo::RefPtr<Cairo::Context> const& context, unsigned offset_x, unsigned offset_y)
+    : feature_style_processor<cairo_renderer>(m),
+      cairo_renderer_base(m,context,offset_x,offset_y)
+{
+}
+
+template <>
+cairo_renderer<Cairo::Surface>::cairo_renderer(Map const& m, Cairo::RefPtr<Cairo::Surface> const& surface, unsigned offset_x, unsigned offset_y)
+    : feature_style_processor<cairo_renderer>(m),
+      cairo_renderer_base(m,Cairo::Context::create(surface),offset_x,offset_y)
+{
+}
+
+cairo_renderer_base::~cairo_renderer_base() {}
+
 #ifdef MAPNIK_DEBUG
-      std::clog << "start map processing bbox="
-                << map.getCurrentExtent() << "\n";
+void cairo_renderer_base::start_map_processing(Map const& map)
+{
+    std::clog << "start map processing bbox="
+              << map.get_current_extent() << "\n";
+#else
+void cairo_renderer_base::start_map_processing(Map const& /*map*/)
+{
 #endif
 
 #if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 6, 0)
-      Envelope<double> bounds = t_.forward(t_.extent());
-      context_->rectangle(bounds.minx(), bounds.miny(), bounds.maxx(), bounds.maxy());
-      context_->clip();
+    box2d<double> bounds = t_.forward(t_.extent());
+    context_->rectangle(bounds.minx(), bounds.miny(), bounds.maxx(), bounds.maxy());
+    context_->clip();
 #endif
 
-      boost::optional<color> bg = m_.background();
-      if (bg)
-      {
-         cairo_context context(context_);
-         context.set_color(*bg);
-         context.paint();
-      }
-   }
-
-   template <>
-   void cairo_renderer<Cairo::Context>::end_map_processing(Map const& )
-   {
+    boost::optional<color> bg = m_.background();
+    if (bg)
+    {
+        cairo_context context(context_);
+        context.set_color(*bg);
+        context.paint();
+    }
+}
+
+template <>
+void cairo_renderer<Cairo::Context>::end_map_processing(Map const& )
+{
 #ifdef MAPNIK_DEBUG
-      std::clog << "end map processing\n";
+    std::clog << "end map processing\n";
 #endif
-   }
+}
 
-   template <>
-   void cairo_renderer<Cairo::Surface>::end_map_processing(Map const& )
-   {
+template <>
+void cairo_renderer<Cairo::Surface>::end_map_processing(Map const& )
+{
 #ifdef MAPNIK_DEBUG
-      std::clog << "end map processing\n";
+    std::clog << "end map processing\n";
 #endif
-      context_->show_page();
-   }
+    context_->show_page();
+}
 
-   void cairo_renderer_base::start_layer_processing(Layer const& lay)
-   {
+void cairo_renderer_base::start_layer_processing(layer const& lay)
+{
 #ifdef MAPNIK_DEBUG
-      std::clog << "start layer processing : " << lay.name()  << "\n";
-      std::clog << "datasource = " << lay.datasource().get() << "\n";
+    std::clog << "start layer processing : " << lay.name()  << "\n";
+    std::clog << "datasource = " << lay.datasource().get() << "\n";
 #endif
-      if (lay.clear_label_cache())
-      {
-         detector_.clear();
-      }
-   }
-
-   void cairo_renderer_base::end_layer_processing(Layer const&)
-   {
+    if (lay.clear_label_cache())
+    {
+        detector_.clear();
+    }
+}
+
+void cairo_renderer_base::end_layer_processing(layer const&)
+{
 #ifdef MAPNIK_DEBUG
-      std::clog << "end layer processing\n";
+    std::clog << "end layer processing\n";
 #endif
-   }
+}
 
-   void cairo_renderer_base::process(polygon_symbolizer const& sym,
-                                     Feature const& feature,
-                                     proj_transform const& prj_trans)
-   {
-      typedef coord_transform2<CoordTransform,geometry2d> path_type;
+void cairo_renderer_base::process(polygon_symbolizer const& sym,
+                                  Feature const& feature,
+                                  proj_transform const& prj_trans)
+{
+    typedef coord_transform2<CoordTransform,geometry_type> path_type;
 
-      cairo_context context(context_);
+    cairo_context context(context_);
 
-      context.set_color(sym.get_fill(), sym.get_opacity());
+    context.set_color(sym.get_fill(), sym.get_opacity());
 
-      for (unsigned i = 0; i < feature.num_geometries(); ++i)
-      {
-         geometry2d const& geom = feature.get_geometry(i);
+    for (unsigned i = 0; i < feature.num_geometries(); ++i)
+    {
+        geometry_type const& geom = feature.get_geometry(i);
 
-         if (geom.num_points() > 2)
-         {
+        if (geom.num_points() > 2)
+        {
             path_type path(t_, geom, prj_trans);
 
             context.add_path(path);
             context.fill();
-         }
-      }
-   }
-
-   typedef boost::tuple<double,double,double,double> segment_t;
-   bool cairo_y_order(segment_t const& first,segment_t const& second)
-   {
-      double miny0 = std::min(first.get<1>(), first.get<3>());
-      double miny1 = std::min(second.get<1>(), second.get<3>());
-      return miny0 > miny1;
-   }
-
-   void cairo_renderer_base::process(building_symbolizer const& sym,
-                                     Feature const& feature,
-                                     proj_transform const& prj_trans)
-   {
-      typedef coord_transform2<CoordTransform,geometry2d> path_type;
-      typedef coord_transform3<CoordTransform,geometry2d> path_type_roof;
-
-      cairo_context context(context_);
-
-      color const& fill = sym.get_fill();
-      double height = 0.7071 * sym.height(); // height in meters
-
-      for (unsigned i = 0; i < feature.num_geometries(); ++i)
-      {
-         geometry2d const& geom = feature.get_geometry(i);
-
-         if (geom.num_points() > 2)
-         {
-            boost::scoped_ptr<geometry2d> frame(new line_string_impl);
-            boost::scoped_ptr<geometry2d> roof(new polygon_impl);
+        }
+    }
+}
+
+void cairo_renderer_base::process(building_symbolizer const& sym,
+                                  Feature const& feature,
+                                  proj_transform const& prj_trans)
+{
+    typedef coord_transform2<CoordTransform,geometry_type> path_type;
+    typedef coord_transform3<CoordTransform,geometry_type> path_type_roof;
+
+    cairo_context context(context_);
+
+    color const& fill = sym.get_fill();
+    double height = 0.7071 * sym.height(); // height in meters
+
+    for (unsigned i = 0; i < feature.num_geometries(); ++i)
+    {
+        geometry_type const& geom = feature.get_geometry(i);
+
+        if (geom.num_points() > 2)
+        {
+            boost::scoped_ptr<geometry_type> frame(new geometry_type(LineString));
+            boost::scoped_ptr<geometry_type> roof(new geometry_type(Polygon));
             std::deque<segment_t> face_segments;
             double x0(0);
             double y0(0);
@@ -614,47 +796,48 @@ namespace mapnik
 
             for (unsigned j = 1; j < geom.num_points(); ++j)
             {
-               double x,y;
-
-               cm = geom.vertex(&x,&y);
-
-               if (cm == SEG_MOVETO)
-               {
-                  frame->move_to(x,y);
-               }
-               else if (cm == SEG_LINETO)
-               {
-                  frame->line_to(x,y);
-               }
-
-               if (j != 0)
-               {
-                  face_segments.push_back(segment_t(x0, y0, x, y));
-               }
-
-               x0 = x;
-               y0 = y;
+                double x=0;
+                double y=0;
+
+                cm = geom.vertex(&x,&y);
+
+                if (cm == SEG_MOVETO)
+                {
+                    frame->move_to(x,y);
+                }
+                else if (cm == SEG_LINETO)
+                {
+                    frame->line_to(x,y);
+                }
+
+                if (j != 0)
+                {
+                    face_segments.push_back(segment_t(x0, y0, x, y));
+                }
+
+                x0 = x;
+                y0 = y;
             }
 
-            std::sort(face_segments.begin(), face_segments.end(), cairo_y_order);
+            std::sort(face_segments.begin(), face_segments.end(), y_order);
             std::deque<segment_t>::const_iterator itr = face_segments.begin();
             for (; itr != face_segments.end(); ++itr)
             {
-               boost::scoped_ptr<geometry2d> faces(new polygon_impl);
+                boost::scoped_ptr<geometry_type> faces(new geometry_type(Polygon));
 
-               faces->move_to(itr->get<0>(), itr->get<1>());
-               faces->line_to(itr->get<2>(), itr->get<3>());
-               faces->line_to(itr->get<2>(), itr->get<3>() + height);
-               faces->line_to(itr->get<0>(), itr->get<1>() + height);
+                faces->move_to(itr->get<0>(), itr->get<1>());
+                faces->line_to(itr->get<2>(), itr->get<3>());
+                faces->line_to(itr->get<2>(), itr->get<3>() + height);
+                faces->line_to(itr->get<0>(), itr->get<1>() + height);
 
-               path_type faces_path(t_, *faces, prj_trans);
-               context.set_color(int(fill.red() * 0.8), int(fill.green() * 0.8),
-                                 int(fill.blue() * 0.8), fill.alpha() * sym.get_opacity() / 255.0);
-               context.add_path(faces_path);
-               context.fill();
+                path_type faces_path(t_, *faces, prj_trans);
+                context.set_color(int(fill.red() * 0.8), int(fill.green() * 0.8),
+                                  int(fill.blue() * 0.8), fill.alpha() * sym.get_opacity() / 255.0);
+                context.add_path(faces_path);
+                context.fill();
 
-               frame->move_to(itr->get<0>(), itr->get<1>());
-               frame->line_to(itr->get<0>(), itr->get<1>() + height);
+                frame->move_to(itr->get<0>(), itr->get<1>());
+                frame->line_to(itr->get<0>(), itr->get<1>() + height);
 
             }
 
@@ -662,19 +845,19 @@ namespace mapnik
 
             for (unsigned j = 0; j < geom.num_points(); ++j)
             {
-               double x, y;
-               unsigned cm = geom.vertex(&x, &y);
-
-               if (cm == SEG_MOVETO)
-               {
-                  frame->move_to(x, y + height);
-                  roof->move_to(x, y + height);
-               }
-               else if (cm == SEG_LINETO)
-               {
-                  frame->line_to(x, y + height);
-                  roof->line_to(x, y + height);
-               }
+                double x, y;
+                unsigned cm = geom.vertex(&x, &y);
+
+                if (cm == SEG_MOVETO)
+                {
+                    frame->move_to(x, y + height);
+                    roof->move_to(x, y + height);
+                }
+                else if (cm == SEG_LINETO)
+                {
+                    frame->line_to(x, y + height);
+                    roof->line_to(x, y + height);
+                }
             }
 
             path_type path(t_, *frame, prj_trans);
@@ -686,33 +869,33 @@ namespace mapnik
             context.set_color(sym.get_fill(), sym.get_opacity());
             context.add_path(roof_path);
             context.fill();
-         }
-      }
+        }
     }
+}
 
-   void cairo_renderer_base::process(line_symbolizer const& sym,
-                                     Feature const& feature,
-                                     proj_transform const& prj_trans)
-   {
-      typedef coord_transform2<CoordTransform,geometry2d> path_type;
+void cairo_renderer_base::process(line_symbolizer const& sym,
+                                  Feature const& feature,
+                                  proj_transform const& prj_trans)
+{
+    typedef coord_transform2<CoordTransform,geometry_type> path_type;
 
-      cairo_context context(context_);
-      mapnik::stroke const& stroke_ = sym.get_stroke();
+    cairo_context context(context_);
+    mapnik::stroke const& stroke_ = sym.get_stroke();
 
-      context.set_color(stroke_.get_color(), stroke_.get_opacity());
+    context.set_color(stroke_.get_color(), stroke_.get_opacity());
 
-      for (unsigned i = 0; i < feature.num_geometries(); ++i)
-      {
-         geometry2d const& geom = feature.get_geometry(i);
+    for (unsigned i = 0; i < feature.num_geometries(); ++i)
+    {
+        geometry_type const& geom = feature.get_geometry(i);
 
-         if (geom.num_points() > 1)
-         {
+        if (geom.num_points() > 1)
+        {
             cairo_context context(context_);
             path_type path(t_, geom, prj_trans);
 
             if (stroke_.has_dash())
             {
-               context.set_dash(stroke_.get_dash_array());
+                context.set_dash(stroke_.get_dash_array());
             }
 
             context.set_line_join(stroke_.get_line_join());
@@ -721,179 +904,403 @@ namespace mapnik
             context.set_line_width(stroke_.get_width());
             context.add_path(path);
             context.stroke();
-         }
-      }
-   }
-
-   void cairo_renderer_base::process(point_symbolizer const& sym,
-                                     Feature const& feature,
-                                     proj_transform const& prj_trans)
-   {
-      boost::shared_ptr<ImageData32> const& data = sym.get_image();
-
-      if ( data )
-      {
-         for (unsigned i = 0; i < feature.num_geometries(); ++i)
-         {
-            geometry2d const& geom = feature.get_geometry(i);
+        }
+    }
+}
+
+void cairo_renderer_base::render_marker(const int x, const int y, marker &marker, const agg::trans_affine & tr, double opacity)
+
+{
+    cairo_context context(context_);
+    if (marker.is_vector())
+    {
+        box2d<double> bbox;
+        bbox = (*marker.get_vector_data())->bounding_box();
+
+        coord<double,2> c = bbox.center();
+        // center the svg marker on '0,0'
+        agg::trans_affine mtx = agg::trans_affine_translation(-c.x,-c.y);
+        // apply symbol transformation to get to map space
+        mtx *= tr;
+        // render the marker at the center of the marker box
+        mtx.translate(x+0.5 * marker.width(), y+0.5 * marker.height());
+
+        typedef coord_transform2<CoordTransform,geometry_type> path_type;
+        mapnik::path_ptr vmarker = *marker.get_vector_data();
+
+        agg::pod_bvector<path_attributes> const & attributes_ = vmarker->attributes();
+        for(unsigned i = 0; i < attributes_.size(); ++i)
+        {
+            mapnik::svg::path_attributes const& attr = attributes_[i];
+            if (!attr.visibility_flag)
+                continue;
+
+            context.save();
+
+            agg::trans_affine transform = attr.transform;
+            transform *= mtx;
+
+            if (transform.is_valid() && !transform.is_identity())
+            {
+                double m[6];
+                transform.store_to(m);
+                context.transform(Cairo::Matrix(m[0],m[1],m[2],m[3],m[4],m[5]));
+            }
+
+            vertex_stl_adapter<svg_path_storage> stl_storage(vmarker->source());
+            svg_path_adapter svg_path(stl_storage);
+
+            if (attr.fill_flag || attr.fill_gradient.get_gradient_type() != NO_GRADIENT)
+            {
+                context.add_agg_path(svg_path,attr.index);
+                if (attr.even_odd_flag)
+                {
+                    context.set_fill_rule(Cairo::FILL_RULE_EVEN_ODD);
+                }
+                else
+                {
+                    context.set_fill_rule(Cairo::FILL_RULE_WINDING);
+                }
+                if(attr.fill_gradient.get_gradient_type() != NO_GRADIENT)
+                {
+                    cairo_gradient g(attr.fill_gradient,attr.opacity*opacity);
+
+                    context.set_gradient(g,bbox);
+                    context.fill();
+                }
+                else if(attr.fill_flag)
+                {
+                    context.set_color(attr.fill_color.r,attr.fill_color.g,attr.fill_color.b,attr.opacity*opacity);
+                    context.fill();
+                }
+            }
+
+
+            if(attr.stroke_gradient.get_gradient_type() != NO_GRADIENT || attr.stroke_flag)
+            {
+                context.add_agg_path(svg_path,attr.index);
+                if(attr.stroke_gradient.get_gradient_type() != NO_GRADIENT)
+                {
+                    context.set_line_width(attr.stroke_width);
+                    context.set_line_cap(line_cap_enum(attr.line_cap));
+                    context.set_line_join(line_join_enum(attr.line_join));
+                    context.set_miter_limit(attr.miter_limit);
+                    cairo_gradient g(attr.stroke_gradient,attr.opacity*opacity);
+                    context.set_gradient(g,bbox);
+                    context.stroke();
+                }
+                else if(attr.stroke_flag)
+                {
+                    context.set_color(attr.stroke_color.r,attr.stroke_color.g,attr.stroke_color.b,attr.opacity*opacity);
+                    context.set_line_width(attr.stroke_width);
+                    context.set_line_cap(line_cap_enum(attr.line_cap));
+                    context.set_line_join(line_join_enum(attr.line_join));
+                    context.set_miter_limit(attr.miter_limit);
+                    context.stroke();
+                }
+            }
+
+            context.restore();
+        }
+    }
+    else if (marker.is_bitmap())
+    {
+        context.add_image(x, y, **marker.get_bitmap_data(), opacity);
+    }
+}
+
+void cairo_renderer_base::process(point_symbolizer const& sym,
+                                  Feature const& feature,
+                                  proj_transform const& prj_trans)
+{   
+    std::string filename = path_processor_type::evaluate( *sym.get_filename(), feature);
+
+    boost::optional<marker_ptr> marker;
+    if ( !filename.empty() )
+    {
+        marker = marker_cache::instance()->find(filename, true);
+    }
+    else
+    {
+        marker.reset(boost::make_shared<mapnik::marker>());
+    }
+
+    if (marker)
+    {
+        for (unsigned i = 0; i < feature.num_geometries(); ++i)
+        {
+            geometry_type const& geom = feature.get_geometry(i);
             double x;
             double y;
             double z = 0;
 
-            geom.label_position(&x, &y);
+            if (sym.get_point_placement() == CENTROID_POINT_PLACEMENT)
+                geom.label_position(&x, &y);
+            else
+                geom.label_interior_position(&x, &y);
+
             prj_trans.backward(x, y, z);
             t_.forward(&x, &y);
 
-            int w = data->width();
-            int h = data->height();
-
-            Envelope<double> label_ext (floor(x - 0.5 * w),
-                                        floor(y - 0.5 * h),
-                                        ceil (x + 0.5 * w),
-                                        ceil (y + 0.5 * h));
+            int w = (*marker)->width();
+            int h = (*marker)->height();
 
+            int px = int(floor(x - 0.5 * w));
+            int py = int(floor(y - 0.5 * h));
+            box2d<double> label_ext (px, py, px + w, py + h);
             if (sym.get_allow_overlap() ||
-                detector_.has_placement(label_ext))
+                    detector_.has_placement(label_ext))
             {
-               cairo_context context(context_);
-               int px = int(floor(x - 0.5 * w));
-               int py = int(floor(y - 0.5 * h));
-
-               context.add_image(px, py, *data, sym.get_opacity());
-               detector_.insert(label_ext);
+                agg::trans_affine mtx;
+                boost::array<double,6> const& m = sym.get_transform();
+                mtx.load_from(&m[0]);
+
+                render_marker(px,py,**marker, mtx, sym.get_opacity());
+
+                if (!sym.get_ignore_placement())
+                    detector_.insert(label_ext);
+                metawriter_with_properties writer = sym.get_metawriter();
+                if (writer.first)
+                {
+                    writer.first->add_box(label_ext, feature, t_, writer.second);
+                }
             }
-         }
-      }
-   }
+        }
+    }
+}
 
-   void cairo_renderer_base::process(shield_symbolizer const& sym,
-                                     Feature const& feature,
-                                     proj_transform const& prj_trans)
-   {
-      typedef coord_transform2<CoordTransform,geometry2d> path_type;
+void cairo_renderer_base::process(shield_symbolizer const& sym,
+                                  Feature const& feature,
+                                  proj_transform const& prj_trans)
+{
+    typedef coord_transform2<CoordTransform,geometry_type> path_type;
+
+    text_placement_info_ptr placement_options = sym.get_placement_options()->get_placement_info();
+    placement_options->next();
+    placement_options->next_position_only();
+
+    UnicodeString text;
+    if( sym.get_no_text() )
+        text = UnicodeString( " " );  // TODO: fix->use 'space' as the text to render
+    else
+    {
+        expression_ptr name_expr = sym.get_name();
+        if (!name_expr) return;
+        value_type result = boost::apply_visitor(evaluate<Feature,value_type>(feature),*name_expr);
+        text = result.to_unicode();
+    }
 
-      UnicodeString text = feature[sym.get_name()].to_unicode();
-      boost::shared_ptr<ImageData32> const& data = sym.get_image();
+    if ( sym.get_text_transform() == UPPERCASE)
+    {
+        text = text.toUpper();
+    }
+    else if ( sym.get_text_transform() == LOWERCASE)
+    {
+        text = text.toLower();
+    }
+    else if ( sym.get_text_transform() == CAPITALIZE)
+    {
+        text = text.toTitle(NULL);
+    }
+    
+    agg::trans_affine tr;
+    boost::array<double,6> const& m = sym.get_transform();
+    tr.load_from(&m[0]);
+
+    std::string filename = path_processor_type::evaluate( *sym.get_filename(), feature);
+    boost::optional<marker_ptr> marker;
+    if ( !filename.empty() )
+    {
+        marker = marker_cache::instance()->find(filename, true);
+    }
+    else
+    {
+        marker.reset(boost::shared_ptr<mapnik::marker> (new mapnik::marker()));
+    }
 
-      if (text.length() > 0 && data)
-      {
-         face_set_ptr faces;
+    if (text.length() > 0 && marker)
+    {
+        face_set_ptr faces;
 
-         if (sym.get_fontset().size() > 0)
-         {
+        if (sym.get_fontset().size() > 0)
+        {
             faces = font_manager_.get_face_set(sym.get_fontset());
-         }
-         else 
-         {
+        }
+        else 
+        {
             faces = font_manager_.get_face_set(sym.get_face_name());
-         }
+        }
 
-         if (faces->size() > 0)
-         {
+        if (faces->size() > 0)
+        {
             cairo_context context(context_);
             string_info info(text);
 
-            faces->set_pixel_sizes(sym.get_text_size());
+            placement_finder<label_collision_detector4> finder(detector_);
+
+            faces->set_pixel_sizes(placement_options->text_size);
             faces->get_string_info(info);
 
-            placement_finder<label_collision_detector4> finder(detector_);
+            int w = (*marker)->width();
+            int h = (*marker)->height();
 
-            int w = data->width();
-            int h = data->height();
+            metawriter_with_properties writer = sym.get_metawriter();
 
             for (unsigned i = 0; i < feature.num_geometries(); ++i)
             {
-               geometry2d const& geom = feature.get_geometry(i);
-
-               if (geom.num_points() > 0) // don't bother with empty geometries
-               {
-                  path_type path(t_, geom, prj_trans);
-
-                  if (sym.get_label_placement() == POINT_PLACEMENT) 
-                  {
-                     double label_x;
-                     double label_y;
-                     double z = 0.0;
-                     placement text_placement(info, sym, false);
-
-                     text_placement.avoid_edges = sym.get_avoid_edges();
-                     geom.label_position(&label_x, &label_y);
-                     prj_trans.backward(label_x, label_y, z);
-                     t_.forward(&label_x, &label_y);
-                     finder.find_point_placement(text_placement, label_x, label_y);
-
-                     for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ ii)
-                     { 
-                        double x = text_placement.placements[ii].starting_x;
-                        double y = text_placement.placements[ii].starting_y;
-                        // remove displacement from image label
-                        position pos = sym.get_displacement();
-                        double lx = x - boost::get<0>(pos);
-                        double ly = y - boost::get<1>(pos);
-                        int px = int(lx - (0.5 * w)) ;
-                        int py = int(ly - (0.5 * h)) ;
-                        Envelope<double> label_ext (floor(lx - 0.5 * w), floor(ly - 0.5 * h), ceil (lx + 0.5 * w), ceil (ly + 0.5 * h));
-
-                        if (detector_.has_placement(label_ext))
-                        {    
-                           context.add_image(px, py, *data);
-                           context.add_text(sym, text_placement.placements[ii], face_manager_, faces);
-
-                           detector_.insert(label_ext);
+                geometry_type const& geom = feature.get_geometry(i);
+                if (geom.num_points() > 0) // don't bother with empty geometries
+                {
+                    path_type path(t_, geom, prj_trans);
+
+                    label_placement_enum how_placed = sym.get_label_placement();
+                    if (how_placed == POINT_PLACEMENT || how_placed == VERTEX_PLACEMENT || how_placed == INTERIOR_PLACEMENT)
+                    {
+                        // for every vertex, try and place a shield/text
+                        geom.rewind(0);
+                        placement text_placement(info, sym, 1.0, w, h, false);
+                        text_placement.avoid_edges = sym.get_avoid_edges();
+                        text_placement.allow_overlap = sym.get_allow_overlap();
+                        if (writer.first)
+                            text_placement.collect_extents = true; // needed for inmem metawriter
+                        position const& pos = sym.get_displacement();
+                        position const& shield_pos = sym.get_shield_displacement();
+                        for( unsigned jj = 0; jj < geom.num_points(); jj++ )
+                        {
+                            double label_x;
+                            double label_y;
+                            double z=0.0;
+
+                            if( how_placed == VERTEX_PLACEMENT )
+                                geom.vertex(&label_x,&label_y);  // by vertex
+                            else if( how_placed == INTERIOR_PLACEMENT )
+                                geom.label_interior_position(&label_x,&label_y);
+                            else
+                                geom.label_position(&label_x, &label_y);  // by middle of line or by point
+                            prj_trans.backward(label_x,label_y, z);
+                            t_.forward(&label_x,&label_y);
+
+                            label_x += boost::get<0>(shield_pos);
+                            label_y += boost::get<1>(shield_pos);
+
+                            finder.find_point_placement(text_placement, placement_options,
+                                                        label_x, label_y, 0.0,
+                                                        sym.get_line_spacing(),
+                                                        sym.get_character_spacing());
+
+                            for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ ii)
+                            {
+                                double x = text_placement.placements[ii].starting_x;
+                                double y = text_placement.placements[ii].starting_y;
+
+                                int px;
+                                int py;
+                                box2d<double> label_ext;
+
+                                if( !sym.get_unlock_image() )
+                                {
+                                    // center image at text center position
+                                    // remove displacement from image label
+                                    double lx = x - boost::get<0>(pos);
+                                    double ly = y - boost::get<1>(pos);
+                                    px=int(floor(lx - (0.5 * w)));
+                                    py=int(floor(ly - (0.5 * h)));
+                                    label_ext.init( floor(lx - 0.5 * w), floor(ly - 0.5 * h), ceil (lx + 0.5 * w), ceil (ly + 0.5 * h) );
+                                }
+                                else
+                                {  // center image at reference location
+                                    px=int(floor(label_x - 0.5 * w));
+                                    py=int(floor(label_y - 0.5 * h));
+                                    label_ext.init( floor(label_x - 0.5 * w), floor(label_y - 0.5 * h), ceil (label_x + 0.5 * w), ceil (label_y + 0.5 * h));
+                                }
+
+                                if ( sym.get_allow_overlap() || detector_.has_placement(label_ext) )
+                                {
+                                    render_marker(px,py,**marker, tr, sym.get_opacity());
+
+                                    context.add_text(text_placement.placements[ii],
+                                                     face_manager_,
+                                                     faces,
+                                                     placement_options->text_size,
+                                                     sym.get_fill(),
+                                                     sym.get_halo_radius(),
+                                                     sym.get_halo_fill()
+                                        );
+                                    if (writer.first) {
+                                        writer.first->add_box(box2d<double>(px,py,px+w,py+h), feature, t_, writer.second);
+                                        writer.first->add_text(text_placement, faces, feature, t_, writer.second); //Only 1 placement
+                                    }
+                                    detector_.insert(label_ext);
+                                }
+                            }
+
+                            finder.update_detector(text_placement);
                         }
-                     }
-
-                     finder.update_detector(text_placement);
-                  }
-                  else if (geom.num_points() > 1 && sym.get_label_placement() == LINE_PLACEMENT) 
-                  {
-                     placement text_placement(info, sym, true);
-
-                     text_placement.avoid_edges = sym.get_avoid_edges();
-                     finder.find_point_placements<path_type>(text_placement, path);
-
-                     for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ ii)
-                     {
-                        double x = text_placement.placements[ii].starting_x;
-                        double y = text_placement.placements[ii].starting_y;
-                        int px = int(x - (w/2));
-                        int py = int(y - (h/2));
-
-                        context.add_image(px, py, *data);
-                        context.add_text(sym, text_placement.placements[ii], face_manager_, faces);
-                     }
-
-                     finder.update_detector(text_placement);
-                  }
-               }
+                    }
+                    else if (geom.num_points() > 1 && how_placed == LINE_PLACEMENT)
+                    {
+                        placement text_placement(info, sym, 1.0, w, h, true);
+
+                        text_placement.avoid_edges = sym.get_avoid_edges();
+                        finder.find_point_placements<path_type>(text_placement, placement_options, path);
+
+                        position const&  pos = sym.get_displacement();
+                        for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ ii)
+                        {
+                            double x = text_placement.placements[ii].starting_x;
+                            double y = text_placement.placements[ii].starting_y;
+                            double lx = x - boost::get<0>(pos);
+                            double ly = y - boost::get<1>(pos);
+                            int px=int(floor(lx - (0.5*w)));
+                            int py=int(floor(ly - (0.5*h)));
+
+                            render_marker(px,py,**marker, tr, sym.get_opacity());
+
+                            context.add_text(text_placement.placements[ii],
+                                             face_manager_,
+                                             faces,
+                                             placement_options->text_size,
+                                             sym.get_fill(),
+                                             sym.get_halo_radius(),
+                                             sym.get_halo_fill()
+                                );
+                            if (writer.first) writer.first->add_box(box2d<double>(px,py,px+w,py+h), feature, t_, writer.second);
+                        }
+                        finder.update_detector(text_placement);
+                        if (writer.first) writer.first->add_text(text_placement, faces, feature, t_, writer.second); //More than one placement
+                    }
+                }
             }
-         }
-      }
-   }
-
-   void cairo_renderer_base::process(line_pattern_symbolizer const& sym,
-                                     Feature const& feature,
-                                     proj_transform const& prj_trans)
-   {
-      typedef coord_transform2<CoordTransform,geometry2d> path_type;
-
-      boost::shared_ptr<ImageData32> const& image = sym.get_image();
-      unsigned width(image->width());
-      unsigned height(image->height());
-
-      cairo_context context(context_);
-      cairo_pattern pattern(*image);
-
-      pattern.set_extend(Cairo::EXTEND_REPEAT);
-      pattern.set_filter(Cairo::FILTER_BILINEAR);
-      context.set_line_width(height);
-
-      for (unsigned i = 0; i < feature.num_geometries(); ++i)
-      {
-         geometry2d const& geom = feature.get_geometry(i);
+        }
+    }
+}
 
-         if (geom.num_points() > 1)
-         {
+void cairo_renderer_base::process(line_pattern_symbolizer const& sym,
+                                  Feature const& feature,
+                                  proj_transform const& prj_trans)
+{
+    typedef coord_transform2<CoordTransform,geometry_type> path_type;
+    
+    std::string filename = path_processor_type::evaluate( *sym.get_filename(), feature);
+    boost::optional<mapnik::marker_ptr> marker = mapnik::marker_cache::instance()->find(filename,true);
+    if (!marker && !(*marker)->is_bitmap()) return;
+    
+    unsigned width((*marker)->width());
+    unsigned height((*marker)->height());
+
+    cairo_context context(context_);
+    cairo_pattern pattern(**((*marker)->get_bitmap_data()));
+
+    pattern.set_extend(Cairo::EXTEND_REPEAT);
+    pattern.set_filter(Cairo::FILTER_BILINEAR);
+    context.set_line_width(height);
+
+    for (unsigned i = 0; i < feature.num_geometries(); ++i)
+    {
+        geometry_type const& geom = feature.get_geometry(i);
+
+        if (geom.num_points() > 1)
+        {
             path_type path(t_, geom, prj_trans);
             double length(0);
             double x0(0), y0(0);
@@ -901,195 +1308,335 @@ namespace mapnik
 
             for (unsigned cm = path.vertex(&x, &y); cm != SEG_END; cm = path.vertex(&x, &y))
             {
-               if (cm == SEG_MOVETO)
-               {
-                  length = 0.0;
-               }
-               else if (cm == SEG_LINETO)
-               {
-                  double dx = x - x0;
-                  double dy = y - y0;
-                  double angle = atan2(dy, dx);
-                  double offset = fmod(length, width);
-                  
-                  Cairo::Matrix matrix;
-                  cairo_matrix_init_identity(&matrix);
-                  cairo_matrix_translate(&matrix,x0,y0);
-                  cairo_matrix_rotate(&matrix,angle);
-                  cairo_matrix_translate(&matrix,-offset,0.5*height);
-                  cairo_matrix_invert(&matrix);
-
-                  pattern.set_matrix(matrix);
+                if (cm == SEG_MOVETO)
+                {
+                    length = 0.0;
+                }
+                else if (cm == SEG_LINETO)
+                {
+                    double dx = x - x0;
+                    double dy = y - y0;
+                    double angle = atan2(dy, dx);
+                    double offset = fmod(length, width);
+
+                    Cairo::Matrix matrix;
+                    cairo_matrix_init_identity(&matrix);
+                    cairo_matrix_translate(&matrix,x0,y0);
+                    cairo_matrix_rotate(&matrix,angle);
+                    cairo_matrix_translate(&matrix,-offset,0.5*height);
+                    cairo_matrix_invert(&matrix);
+
+                    pattern.set_matrix(matrix);
      
-                  context.set_pattern(pattern);
+                    context.set_pattern(pattern);
                   
-                  context.move_to(x0, y0);
-                  context.line_to(x, y);
-                  context.stroke();
+                    context.move_to(x0, y0);
+                    context.line_to(x, y);
+                    context.stroke();
 
-                  length = length + hypot(x - x0, y - y0);
-               }
+                    length = length + hypot(x - x0, y - y0);
+                }
 
-               x0 = x;
-               y0 = y;
+                x0 = x;
+                y0 = y;
             }
-         }
-      }
-   }
+        }
+    }
+}
+
+void cairo_renderer_base::process(polygon_pattern_symbolizer const& sym,
+                                  Feature const& feature,
+                                  proj_transform const& prj_trans)
+{
+    typedef coord_transform2<CoordTransform,geometry_type> path_type;
 
-   void cairo_renderer_base::process(polygon_pattern_symbolizer const& sym,
-                                     Feature const& feature,
-                                     proj_transform const& prj_trans)
-   {
-      typedef coord_transform2<CoordTransform,geometry2d> path_type;
+    cairo_context context(context_);
+    std::string filename = path_processor_type::evaluate( *sym.get_filename(), feature);
+    boost::optional<mapnik::marker_ptr> marker = mapnik::marker_cache::instance()->find(filename,true);
+    if (!marker && !(*marker)->is_bitmap()) return;
 
-      cairo_context context(context_);
-      cairo_pattern pattern(*sym.get_image());
-      pattern.set_extend(Cairo::EXTEND_REPEAT);
+    cairo_pattern pattern(**((*marker)->get_bitmap_data()));
 
-      context.set_pattern(pattern);
+    pattern.set_extend(Cairo::EXTEND_REPEAT);
 
-      for (unsigned i = 0; i < feature.num_geometries(); ++i)
-      {
-         geometry2d const& geom = feature.get_geometry(i);
+    context.set_pattern(pattern);
 
-         if (geom.num_points() > 2)
-         {
+    for (unsigned i = 0; i < feature.num_geometries(); ++i)
+    {
+        geometry_type const& geom = feature.get_geometry(i);
+
+        if (geom.num_points() > 2)
+        {
             path_type path(t_, geom, prj_trans);
 
             context.add_path(path);
             context.fill();
-         }
-      }
-   }
-
-   void cairo_renderer_base::process(raster_symbolizer const& sym,
-                                     Feature const& feature,
-                                     proj_transform const& prj_trans)
-   {
-      // TODO -- at the moment raster_symbolizer is an empty class
-      // used for type dispatching, but we can have some fancy raster
-      // processing in a future (filters??). Just copy raster into pixmap for now.
-      raster_ptr const& raster = feature.get_raster();
-      if (raster)
-      {
-         Envelope<double> ext = t_.forward(raster->ext_);
-         int start_x = int(round(ext.minx()));
-         int start_y = int(round(ext.miny()));
-         int raster_width = int(round(ext.width()));
-         int raster_height = int(round(ext.height()));
-         int end_x = start_x + raster_width;
-         int end_y = start_y + raster_height;
-         double err_offs_x = (ext.minx()-start_x + ext.maxx()-end_x)/2;
-         double err_offs_y = (ext.miny()-start_y + ext.maxy()-end_y)/2;
-
-         if (raster_width > 0 && raster_height > 0)
-         {
-            ImageData32 target(raster_width, raster_height);
-            //TODO -- use cairo matrix transformation for scaling
-            if (sym.get_scaling() == "fast"){
-            scale_image<ImageData32>(target, raster->data_);
-            } else if (sym.get_scaling() == "bilinear"){
-               scale_image_bilinear<ImageData32>(target,raster->data_, err_offs_x, err_offs_y);
-            } else if (sym.get_scaling() == "bilinear8"){
-               scale_image_bilinear8<ImageData32>(target,raster->data_, err_offs_x, err_offs_y);
-            } else {
-               scale_image<ImageData32>(target,raster->data_);
+        }
+    }
+}
+
+void cairo_renderer_base::process(raster_symbolizer const& sym,
+                                  Feature const& feature,
+                                  proj_transform const& prj_trans)
+{
+    raster_ptr const& source = feature.get_raster();
+    if (source)
+    {
+        // If there's a colorizer defined, use it to color the raster in-place
+        raster_colorizer_ptr colorizer = sym.get_colorizer();
+        if (colorizer)
+            colorizer->colorize(source,feature.props());
+
+        box2d<double> target_ext = box2d<double>(source->ext_);
+        prj_trans.backward(target_ext, PROJ_ENVELOPE_POINTS);
+
+        box2d<double> ext=t_.forward(target_ext);
+        int start_x = (int)ext.minx();
+        int start_y = (int)ext.miny();
+        int end_x = (int)ceil(ext.maxx());
+        int end_y = (int)ceil(ext.maxy());
+        int raster_width = end_x - start_x;
+        int raster_height = end_y - start_y;
+        double err_offs_x = ext.minx() - start_x;
+        double err_offs_y = ext.miny() - start_y;
+
+        if (raster_width > 0 && raster_height > 0)
+        {
+            double scale_factor = ext.width() / source->data_.width();
+            image_data_32 target_data(raster_width,raster_height);
+            raster target(target_ext, target_data);
+
+            reproject_raster(target, *source, prj_trans, err_offs_x, err_offs_y,
+                             sym.get_mesh_size(),
+                             sym.calculate_filter_factor(),
+                             scale_factor,
+                             sym.get_scaling());
+            
+            cairo_context context(context_);
+            //TODO -- support for advanced image merging
+            context.add_image(start_x, start_y, target.data_, sym.get_opacity());
+        }
+    }
+}
+
+void cairo_renderer_base::process(markers_symbolizer const& sym,
+                                  Feature const& feature,
+                                  proj_transform const& prj_trans)
+{
+    typedef coord_transform2<CoordTransform,geometry_type> path_type;
+    arrow arrow_;
+    cairo_context context(context_);
+
+    color const& fill_ = sym.get_fill();
+    context.set_color(fill_.red(), fill_.green(), fill_.blue(), fill_.alpha());
+
+    for (unsigned i = 0; i < feature.num_geometries(); ++i)
+    {
+        geometry_type const& geom = feature.get_geometry(i);
+
+        if (geom.num_points() > 1)
+        {
+            path_type path(t_, geom, prj_trans);
+
+            markers_placement<path_type, label_collision_detector4> placement(path, arrow_.extent(), detector_, sym.get_spacing(), sym.get_max_error(), sym.get_allow_overlap());
+
+            double x, y, angle;
+            while (placement.get_point(&x, &y, &angle)) {
+                Cairo::Matrix matrix = Cairo::rotation_matrix(angle) * Cairo::translation_matrix(x,y) ;
+                context.set_matrix(matrix);
+                context.add_path(arrow_);
             }
+        }
+        context.fill();
+    }
+}
 
+void cairo_renderer_base::process(glyph_symbolizer const& sym,
+                                  Feature const& feature,
+                                  proj_transform const& prj_trans)
+{
+    face_set_ptr faces = font_manager_.get_face_set(sym.get_face_name());
+    if (faces->size() > 0)
+    {
+        // Get x and y from geometry and translate to pixmap coords.
+        double x, y, z=0.0;
+        feature.get_geometry(0).label_position(&x, &y);
+        prj_trans.backward(x,y,z);
+        t_.forward(&x, &y);
+
+        // set font size
+        unsigned size = sym.eval_size(feature);
+        faces->set_pixel_sizes(size);
+
+        // Get and render text path
+        //
+        text_path_ptr path = sym.get_text_path(faces, feature);
+        // apply displacement
+        position pos = sym.get_displacement();
+        double dx = boost::get<0>(pos);
+        double dy = boost::get<1>(pos);
+        path->starting_x = x = x+dx;
+        path->starting_y = y = y+dy;
+
+        // get fill and halo params
+        color fill = sym.eval_color(feature);
+        color halo_fill = sym.get_halo_fill();
+        double halo_radius = sym.get_halo_radius();
+        if (fill==color("transparent"))
+            halo_radius = 0;
+
+        double bsize = size/2 + 1;
+        box2d<double> glyph_ext(
+            floor(x-bsize), floor(y-bsize), ceil(x+bsize), ceil(y+bsize)
+            );
+        if ((sym.get_allow_overlap() || detector_.has_placement(glyph_ext)) &&
+            (!sym.get_avoid_edges() || detector_.extent().contains(glyph_ext)))
+        {    
+            // Placement is valid, render glyph and update detector.
             cairo_context context(context_);
+            context.add_text(*path,
+                             face_manager_,
+                             faces,
+                             size,
+                             fill,
+                             halo_radius,
+                             halo_fill
+                );
+            detector_.insert(glyph_ext);
+            metawriter_with_properties writer = sym.get_metawriter();
+            if (writer.first) writer.first->add_box(glyph_ext, feature, t_, writer.second);
+        }
+    }
+    else
+    {
+        throw config_error(
+            "Unable to find specified font face in GlyphSymbolizer"
+            );
+    }
+}
 
-            //TODO -- support for advanced image merging
-            context.add_image(start_x, start_y, target, sym.get_opacity());
-         }
-      }
-   }
-
-   void cairo_renderer_base::process(markers_symbolizer const& sym,
-                                     Feature const& feature,
-                                     proj_transform const& prj_trans)
-   {
-   }
-
-   void cairo_renderer_base::process(text_symbolizer const& sym,
-                                     Feature const& feature,
-                                     proj_transform const& prj_trans)
-   {
-      typedef coord_transform2<CoordTransform,geometry2d> path_type;
-
-      UnicodeString text = feature[sym.get_name()].to_unicode();
-      if ( sym.get_text_convert() == TOUPPER)
-      {
-         text = text.toUpper();
-      }
-      else if ( sym.get_text_convert() == TOLOWER)
-      {
-         text = text.toLower();
-      }
-
-      if (text.length() > 0)
-      {
-         face_set_ptr faces;
-
-         if (sym.get_fontset().size() > 0)
-         {
+void cairo_renderer_base::process(text_symbolizer const& sym,
+                                  Feature const& feature,
+                                  proj_transform const& prj_trans)
+{
+    typedef coord_transform2<CoordTransform,geometry_type> path_type;
+
+    bool placement_found = false;
+    text_placement_info_ptr placement_options = sym.get_placement_options()->get_placement_info();
+    while (!placement_found && placement_options->next())
+    {
+        expression_ptr name_expr = sym.get_name();
+        if (!name_expr) return;
+        value_type result = boost::apply_visitor(evaluate<Feature,value_type>(feature),*name_expr);
+        UnicodeString text = result.to_unicode();
+
+        if ( sym.get_text_transform() == UPPERCASE)
+        {
+            text = text.toUpper();
+        }
+        else if ( sym.get_text_transform() == LOWERCASE)
+        {
+            text = text.toLower();
+        }
+        else if ( sym.get_text_transform() == CAPITALIZE)
+        {
+            text = text.toTitle(NULL);
+        }
+
+        if (text.length() <= 0) continue;
+
+        face_set_ptr faces;
+
+        if (sym.get_fontset().size() > 0)
+        {
             faces = font_manager_.get_face_set(sym.get_fontset());
-         }
-         else 
-         {
+        }
+        else
+        {
             faces = font_manager_.get_face_set(sym.get_face_name());
-         }
+        }
 
-         if (faces->size() > 0)
-         {
-            cairo_context context(context_);
-            string_info info(text);
+        if (faces->size() == 0)
+        {
+            throw config_error("Unable to find specified font face '" + sym.get_face_name() + "'");
+        }
+        cairo_context context(context_);
+        string_info info(text);
 
-            faces->set_pixel_sizes(sym.get_text_size());
-            faces->get_string_info(info);
+        faces->set_pixel_sizes(placement_options->text_size);
+        faces->get_string_info(info);
 
-            placement_finder<label_collision_detector4> finder(detector_);
+        placement_finder<label_collision_detector4> finder(detector_);
 
-            for (unsigned i = 0; i < feature.num_geometries(); ++i)
+        metawriter_with_properties writer = sym.get_metawriter();
+
+        unsigned num_geom = feature.num_geometries();
+        for (unsigned i=0; i<num_geom; ++i)
+        {
+            geometry_type const& geom = feature.get_geometry(i);
+            if (geom.num_points() == 0) continue;// don't bother with empty geometries
+            while (!placement_found && placement_options->next_position_only())
             {
-               geometry2d const& geom = feature.get_geometry(i);
-
-               if (geom.num_points() > 0) // don't bother with empty geometries
-               {
-                  path_type path(t_, geom, prj_trans);
-                  placement text_placement(info, sym);
-
-                  if (sym.get_label_placement() == POINT_PLACEMENT)
-                  {
-                     double label_x, label_y, z = 0.0;
-
-                     geom.label_position(&label_x, &label_y);
-                     prj_trans.backward(label_x, label_y, z);
-                     t_.forward(&label_x, &label_y);
-                     finder.find_point_placement(text_placement, label_x, label_y);
-                     finder.update_detector(text_placement);
-                  }
-                  else //LINE_PLACEMENT
-                  {
-                     finder.find_line_placements<path_type>(text_placement, path);
-                  }
-
-                  for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ii)
-                  {
-                     context.add_text(sym, text_placement.placements[ii], face_manager_, faces);
-                  }
-               }
+                placement text_placement(info, sym, 1.0);
+                text_placement.avoid_edges = sym.get_avoid_edges();
+                if (writer.first)
+                    text_placement.collect_extents = true; // needed for inmem metawriter
+
+                if (sym.get_label_placement() == POINT_PLACEMENT ||
+                        sym.get_label_placement() == INTERIOR_PLACEMENT)
+                {
+                    double label_x, label_y, z=0.0;
+                    if (sym.get_label_placement() == POINT_PLACEMENT)
+                        geom.label_position(&label_x, &label_y);
+                    else
+                        geom.label_interior_position(&label_x, &label_y);
+                    prj_trans.backward(label_x,label_y, z);
+                    t_.forward(&label_x,&label_y);
+
+                    double angle = 0.0;
+                    expression_ptr angle_expr = sym.get_orientation();
+                    if (angle_expr)
+                    {
+                        // apply rotation
+                        value_type result = boost::apply_visitor(evaluate<Feature,value_type>(feature),*angle_expr);
+                        angle = result.to_double();
+                    }
+
+                    finder.find_point_placement(text_placement, placement_options,
+                                                label_x, label_y,
+                                                angle, sym.get_line_spacing(),
+                                                sym.get_character_spacing());
+                    finder.update_detector(text_placement);
+                }
+                else if ( geom.num_points() > 1 && sym.get_label_placement() == LINE_PLACEMENT)
+                {
+                    path_type path(t_, geom, prj_trans);
+                    finder.find_line_placements<path_type>(text_placement, placement_options, path);
+                }
+
+                if (!text_placement.placements.size()) continue;
+                placement_found = true;
+
+                for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ii)
+                {
+                    context.add_text(text_placement.placements[ii],
+                                     face_manager_,
+                                     faces,
+                                     placement_options->text_size,
+                                     sym.get_fill(),
+                                     sym.get_halo_radius(),
+                                     sym.get_halo_fill()
+                                     );
+                }
+
+                if (writer.first) writer.first->add_text(text_placement, faces, feature, t_, writer.second);
             }
-         }
-         else
-         {
-            throw config_error("Unable to find specified font face '" + sym.get_face_name() + "'");
-         }
-      }
-   }
+        }
+    }
+}
 
-   template class cairo_renderer<Cairo::Surface>;
-   template class cairo_renderer<Cairo::Context>;
+template class cairo_renderer<Cairo::Surface>;
+template class cairo_renderer<Cairo::Context>;
 }
 
 #endif
diff --git a/src/color.cpp b/src/color.cpp
index 32980fd..368d50d 100644
--- a/src/color.cpp
+++ b/src/color.cpp
@@ -32,35 +32,54 @@
 
 namespace mapnik {
 
-   color::color( std::string const& css_string)
-   {
-      color_factory::init_from_string(*this,css_string.c_str());   
-   }
+color::color( std::string const& css_string)
+    : red_(0),
+      green_(0),
+      blue_(0),
+      alpha_(0xff)
+{
+    color_factory::init_from_string(*this,css_string);   
+}
 
-   std::string color::to_string() const
-   {
-       std::stringstream ss;
-       if (alpha() == 255) {
-           ss << "rgb("
+std::string color::to_string() const
+{
+    std::stringstream ss;
+    if (alpha_ == 255) 
+    {
+        ss << "rgb("
            << red()   << ","
            << green() << ","
            << blue()  << ")";
-       } else {
-           ss << "rgba("
+    } 
+    else 
+    {
+        ss << "rgba("
            << red()   << ","
            << green() << ","
            << blue()  << ","
            << alpha()/255.0 << ")";
-       }
-       return ss.str();
-   }
-   
-   std::string color::to_hex_string() const
-   {
-      return (boost::format("#%1$02x%2$02x%3$02x") 
-              % red() 
-              % green() 
-              % blue() ).str();
-   }
+    }
+    return ss.str();
+}
+
+std::string color::to_hex_string() const
+{
+    if (alpha_ == 255 )
+    {
+        return (boost::format("#%1$02x%2$02x%3$02x") 
+                % red() 
+                % green() 
+                % blue() ).str();
+    }
+    else
+    {
+        return (boost::format("#%1$02x%2$02x%3$02x%4$02x") 
+                % red() 
+                % green() 
+                % blue()
+                % alpha()).str();
+    }
+}
+
 }
 
diff --git a/src/datasource_cache.cpp b/src/datasource_cache.cpp
index a7b834d..5c0b862 100644
--- a/src/datasource_cache.cpp
+++ b/src/datasource_cache.cpp
@@ -28,6 +28,7 @@
 
 // boost
 #include <boost/version.hpp>
+#include <boost/make_shared.hpp>
 #include <boost/filesystem/operations.hpp>
 #include <boost/algorithm/string.hpp>
 
@@ -36,140 +37,207 @@
 
 // stl
 #include <algorithm>
+#include <iostream>
 #include <stdexcept>
 
 namespace mapnik
 {
-   using namespace std;
-   using namespace boost;
    
-   bool is_input_plugin (std::string const& filename)
-   {
-      return boost::algorithm::ends_with(filename,std::string(".input"));
-   }
+bool is_input_plugin (std::string const& filename)
+{
+    return boost::algorithm::ends_with(filename,std::string(".input"));
+}
    
 
-   datasource_cache::datasource_cache()
-   {
-      if (lt_dlinit()) throw std::runtime_error("lt_dlinit() failed");
-   }
+datasource_cache::datasource_cache()
+{
+    if (lt_dlinit()) throw std::runtime_error("lt_dlinit() failed");
+}
 
-   datasource_cache::~datasource_cache()
-   {
-      lt_dlexit();
-   }
+datasource_cache::~datasource_cache()
+{
+    lt_dlexit();
+}
 
-   std::map<string,boost::shared_ptr<PluginInfo> > datasource_cache::plugins_;
-   bool datasource_cache::registered_=false;
+std::map<std::string,boost::shared_ptr<PluginInfo> > datasource_cache::plugins_;
+bool datasource_cache::registered_=false;
+std::vector<std::string> datasource_cache::plugin_directories_;
     
-   datasource_ptr datasource_cache::create(const parameters& params) 
-   {
-       boost::optional<std::string> type = params.get<std::string>("type");
-       if ( ! type)
-       {
-           throw config_error(string("Could not create datasource. Required ") +
-                   "parameter 'type' is missing");
-       }
-
-       datasource_ptr ds;
-       map<string,boost::shared_ptr<PluginInfo> >::iterator itr=plugins_.find(*type);
-       if ( itr == plugins_.end() )
-       {
-           throw config_error(string("Could not create datasource. No plugin ") +
-                   "found for type '" + * type + "'");
-       }
-       if ( ! itr->second->handle())
-       {
-           throw std::runtime_error(string("Cannot load library: ") + 
-                   lt_dlerror());
-       }
-
-       create_ds* create_datasource = 
-           (create_ds*) lt_dlsym(itr->second->handle(), "create");
-
-       if ( ! create_datasource)
-       {
-           throw std::runtime_error(string("Cannot load symbols: ") + 
-                   lt_dlerror());
-       }
+datasource_ptr datasource_cache::create(const parameters& params, bool bind) 
+{
+    boost::optional<std::string> type = params.get<std::string>("type");
+    if ( ! type)
+    {
+        throw config_error(std::string("Could not create datasource. Required ") +
+                           "parameter 'type' is missing");
+    }
+
+    datasource_ptr ds;
+    std::map<std::string,boost::shared_ptr<PluginInfo> >::iterator itr=plugins_.find(*type);
+    if ( itr == plugins_.end() )
+    {
+        throw config_error(std::string("Could not create datasource. No plugin ") +
+                           "found for type '" + * type + "' (searched in: " + plugin_directories() + ")");
+    }
+    if ( ! itr->second->handle())
+    {
+        throw std::runtime_error(std::string("Cannot load library: ") +
+                                 lt_dlerror());
+    }
+    // http://www.mr-edd.co.uk/blog/supressing_gcc_warnings
+    #ifdef __GNUC__
+    __extension__
+    #endif
+    create_ds* create_datasource = 
+        reinterpret_cast<create_ds*>(lt_dlsym(itr->second->handle(), "create"));
+
+    if ( ! create_datasource)
+    {
+        throw std::runtime_error(std::string("Cannot load symbols: ") +
+                                 lt_dlerror());
+    }
 #ifdef MAPNIK_DEBUG
-       std::clog << "size = " << params.size() << "\n";
-       parameters::const_iterator i = params.begin();
-       for (;i!=params.end();++i)
-       {
-          std::clog << i->first << "=" << i->second << "\n";  
-       }
+    std::clog << "size = " << params.size() << "\n";
+    parameters::const_iterator i = params.begin();
+    for (;i!=params.end();++i)
+    {
+        std::clog << i->first << "=" << i->second << "\n";
+    }
 #endif
-       ds=datasource_ptr(create_datasource(params), datasource_deleter());
+    ds=datasource_ptr(create_datasource(params, bind), datasource_deleter());
 
 #ifdef MAPNIK_DEBUG
-       std::clog<<"datasource="<<ds<<" type="<<type<<std::endl;
+    std::clog<<"datasource="<<ds<<" type="<<type<<std::endl;
 #endif
-       return ds;
-   }
-
-   bool datasource_cache::insert(const std::string& type,const lt_dlhandle module)
-   {
-      return plugins_.insert(make_pair(type,boost::shared_ptr<PluginInfo>
-                                       (new PluginInfo(type,module)))).second;     
-   }
-
-   std::vector<std::string> datasource_cache::plugin_names ()
-   {
-      std::vector<std::string> names;
-      std::map<std::string,boost::shared_ptr<PluginInfo> >::const_iterator itr;
-      for (itr = plugins_.begin();itr!=plugins_.end();++itr)
-      {
-         names.push_back(itr->first);
-      }
-      return names;
-   }
+    return ds;
+}
+
+bool datasource_cache::insert(const std::string& type,const lt_dlhandle module)
+{
+    return plugins_.insert(make_pair(type,boost::make_shared<PluginInfo>
+                                     (type,module))).second;
+}
+
+std::string datasource_cache::plugin_directories()
+{
+    return boost::algorithm::join(plugin_directories_,", ");
+}
+
+std::vector<std::string> datasource_cache::plugin_names ()
+{
+    std::vector<std::string> names;
+    std::map<std::string,boost::shared_ptr<PluginInfo> >::const_iterator itr;
+    for (itr = plugins_.begin();itr!=plugins_.end();++itr)
+    {
+        names.push_back(itr->first);
+    }
+    return names;
+}
    
-   void datasource_cache::register_datasources(const std::string& str)
-   {	
+void datasource_cache::register_datasources(const std::string& str)
+{       
 #ifdef MAPNIK_THREADSAFE
-      mutex::scoped_lock lock(mapnik::singleton<mapnik::datasource_cache, 
-                              mapnik::CreateStatic>::mutex_);
+    mutex::scoped_lock lock(mapnik::singleton<mapnik::datasource_cache,
+                            mapnik::CreateStatic>::mutex_);
 #endif
-      filesystem::path path(str);
-      filesystem::directory_iterator end_itr;
+    boost::filesystem::path path(str);
+    plugin_directories_.push_back(str);
+    boost::filesystem::directory_iterator end_itr;
  
-
-      if (exists(path) && is_directory(path))
-      {
-         for (filesystem::directory_iterator itr(path);itr!=end_itr;++itr )
-         {
+    if (exists(path) && is_directory(path))
+    {
+        for (boost::filesystem::directory_iterator itr(path);itr!=end_itr;++itr )
+        {
 
 #if BOOST_VERSION < 103400 
-            if (!is_directory( *itr )  && is_input_plugin(itr->leaf()))      
+            if (!is_directory( *itr )  && is_input_plugin(itr->leaf()))
 #else
-            if (!is_directory( *itr )  && is_input_plugin(itr->path().leaf()))   
+#if (BOOST_FILESYSTEM_VERSION == 3)      
+            if (!is_directory( *itr )  && is_input_plugin(itr->path().filename().string()))
+#else // v2
+            if (!is_directory( *itr )  && is_input_plugin(itr->path().leaf())) 
+#endif 
 #endif
-
             {
-               try 
-               {
-                  lt_dlhandle module=lt_dlopen(itr->string().c_str());
-                  if (module)
-                  {
-                     datasource_name* ds_name = 
-                        (datasource_name*) lt_dlsym(module, "datasource_name");
-                     if (ds_name && insert(ds_name(),module))
-                     {            
+                try 
+                {
+#ifdef LIBTOOL_SUPPORTS_ADVISE
+                    /* Note: the below was added as a workaround pre http://trac.mapnik.org/ticket/790
+                       It could now be removed, but also is not doing any harm AFAICT.
+                    */
+                    
+                    // with ltdl >=2.2 we can actually pass RTDL_GLOBAL to dlopen via the
+                    // ltdl advise trick which is required on linux unless plugins are directly
+                    // linked to libmapnik (and deps) at build time. The only other approach is to
+                    // set the dlopen flags in the calling process (like in the python bindings)
+
+                    // clear errors
+                    lt_dlerror();
+
+                    lt_dlhandle module = 0;
+                    lt_dladvise advise;
+                    int ret;
+                
+                    ret = lt_dlinit();
+                    if (ret != 0) {
+                        std::clog << "Datasource loader: could not intialize dynamic loading: " << lt_dlerror() << "\n";
+                    }
+                
+                    ret = lt_dladvise_init(&advise);
+                    if (ret != 0) {
+                        std::clog << "Datasource loader: could not intialize dynamic loading: " << lt_dlerror() << "\n";
+                    }
+                
+                    ret = lt_dladvise_global(&advise);
+                    if (ret != 0) {
+                        std::clog << "Datasource loader: could not intialize dynamic loading of global symbols: " << lt_dlerror() << "\n";
+                    }
+#if (BOOST_FILESYSTEM_VERSION == 3)                    
+                    module = lt_dlopenadvise (itr->path().string().c_str(), advise);
+#else // v2
+                    module = lt_dlopenadvise (itr->string().c_str(), advise);
+#endif 
+
+                    lt_dladvise_destroy(&advise);
+#else
+
+#if (BOOST_FILESYSTEM_VERSION == 3)   
+                    lt_dlhandle module = lt_dlopen(itr->path().string().c_str());
+#else // v2
+                    lt_dlhandle module = lt_dlopen(itr->string().c_str());
+#endif
+
+#endif
+                    if (module)
+                    {
+                        // http://www.mr-edd.co.uk/blog/supressing_gcc_warnings
+                        #ifdef __GNUC__
+                        __extension__
+                        #endif
+                        datasource_name* ds_name = 
+                            reinterpret_cast<datasource_name*>(lt_dlsym(module, "datasource_name"));
+                        if (ds_name && insert(ds_name(),module))
+                        {            
 #ifdef MAPNIK_DEBUG
-                        std::clog << "registered datasource : " << ds_name() << std::endl;
+                            std::clog << "Datasource loader: registered: " << ds_name() << std::endl;
 #endif 
-                        registered_=true;
-                     }
-                  }
-                  else
-                  {
-                     std::clog << "Problem loading plugin library: " << itr->string().c_str() << " (libtool error: " << lt_dlerror() << ")" << std::endl;
-                  }
-               }
-               catch (...) {}
+                            registered_=true;
+                        }
+                    }
+                    else
+                    {
+#if (BOOST_FILESYSTEM_VERSION == 3) 
+                        std::clog << "Problem loading plugin library: " << itr->path().string() 
+                                  << " (dlopen failed - plugin likely has an unsatisfied dependency or incompatible ABI)" << std::endl;
+#else // v2
+                        std::clog << "Problem loading plugin library: " << itr->string() 
+                                  << " (dlopen failed - plugin likely has an unsatisfied dependency or incompatible ABI)" << std::endl;    
+#endif
+                    }
+                }
+                catch (...) {}
             }
-         }   
-      }	
-   }
+        }
+    }
+}
 }
diff --git a/src/distance.cpp b/src/distance.cpp
index 5918657..1fff441 100644
--- a/src/distance.cpp
+++ b/src/distance.cpp
@@ -28,31 +28,31 @@
 
 namespace mapnik {
     
-   using std::atan2;
-   using std::cos;
-   using std::pow;
-   using std::sin;
-   using std::sqrt;
+using std::atan2;
+using std::cos;
+using std::pow;
+using std::sin;
+using std::sqrt;
 
-   static const double deg2rad = 0.0174532925199432958;
-   static const double R = 6372795.0; // average great-circle radius of the earth
+static const double deg2rad = 0.0174532925199432958;
+static const double R = 6372795.0; // average great-circle radius of the earth
    
-   double great_circle_distance::operator() (coord2d const& pt0, 
-                                             coord2d const& pt1) const
-   {
-      double lon0 = pt0.x * deg2rad;
-      double lat0 = pt0.y * deg2rad;
-      double lon1 = pt1.x * deg2rad;
-      double lat1 = pt1.y * deg2rad;
+double great_circle_distance::operator() (coord2d const& pt0, 
+                                          coord2d const& pt1) const
+{
+    double lon0 = pt0.x * deg2rad;
+    double lat0 = pt0.y * deg2rad;
+    double lon1 = pt1.x * deg2rad;
+    double lat1 = pt1.y * deg2rad;
       
-      double dlat = lat1 - lat0;
-      double dlon = lon1 - lon0;
+    double dlat = lat1 - lat0;
+    double dlon = lon1 - lon0;
       
-      double sin_dlat = sin(0.5 * dlat);
-      double sin_dlon = sin(0.5 * dlon);
+    double sin_dlat = sin(0.5 * dlat);
+    double sin_dlon = sin(0.5 * dlon);
       
-      double a = pow(sin_dlat,2.0) + cos(lat0)*cos(lat1)*pow(sin_dlon,2.0);
-      double c = 2 * atan2(sqrt(a),sqrt(1 - a));
-      return R * c; 
-   }
+    double a = pow(sin_dlat,2.0) + cos(lat0)*cos(lat1)*pow(sin_dlon,2.0);
+    double c = 2 * atan2(sqrt(a),sqrt(1 - a));
+    return R * c; 
+}
 }
diff --git a/src/envelope.cpp b/src/envelope.cpp
deleted file mode 100644
index 7b43a16..0000000
--- a/src/envelope.cpp
+++ /dev/null
@@ -1,335 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-//$Id: envelope.cpp 17 2005-03-08 23:58:43Z pavlenko $
-
-#include <mapnik/envelope.hpp>
-
-namespace mapnik
-{
-    template <typename T>
-    Envelope<T>::Envelope()
-        :minx_(0),miny_(0),maxx_(-1),maxy_(-1) {}
-
-    template <typename T>
-    Envelope<T>::Envelope(T minx_,T miny_,T maxx_,T maxy_)
-    {
-        init(minx_,miny_,maxx_,maxy_);
-    }
-
-    template <typename T>
-    Envelope<T>::Envelope(const coord<T,2> &c0,const coord<T,2> &c1)
-    {
-        init(c0.x,c0.y,c1.x,c1.y);
-    }
-
-    template <typename T>
-    Envelope<T>::Envelope(const Envelope &rhs)
-    {
-        init(rhs.minx_,rhs.miny_,rhs.maxx_,rhs.maxy_);
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    bool Envelope<T>::operator==(const Envelope<T>& other) const
-    {
-        return minx_==other.minx_ &&
-            miny_==other.miny_ &&
-            maxx_==other.maxx_ &&
-            maxy_==other.maxy_;
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    T Envelope<T>::minx() const
-    {
-        return minx_;
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    T Envelope<T>::maxx() const
-    {
-        return maxx_;
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    T Envelope<T>::miny() const
-    {
-        return miny_;
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    T Envelope<T>::maxy() const
-    {
-        return maxy_;
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    T Envelope<T>::width() const
-    {
-        return maxx_-minx_;
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    T Envelope<T>::height() const
-    {
-        return maxy_-miny_;
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    void Envelope<T>::width(T w)
-    {
-        T cx=center().x;
-        minx_=static_cast<T>(cx-w*0.5);
-        maxx_=static_cast<T>(cx+w*0.5);
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    void Envelope<T>::height(T h)
-    {
-        T cy=center().y;
-        miny_=static_cast<T>(cy-h*0.5);
-        maxy_=static_cast<T>(cy+h*0.5);
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    coord<T,2> Envelope<T>::center() const
-    {
-        return coord<T,2>(static_cast<T>(0.5*(minx_+maxx_)),
-                          static_cast<T>(0.5*(miny_+maxy_)));
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    void Envelope<T>::expand_to_include(const coord<T,2>& c)
-    {
-        expand_to_include(c.x,c.y);
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    void Envelope<T>::expand_to_include(T x,T y)
-    {
-        if (x<minx_) minx_=x;
-        if (x>maxx_) maxx_=x;
-        if (y<miny_) miny_=y;
-        if (y>maxy_) maxy_=y;
-    }
-
-    template <typename T>
-    void Envelope<T>::expand_to_include(const Envelope<T> &other)
-    {
-        if (other.minx_<minx_) minx_=other.minx_;
-        if (other.maxx_>maxx_) maxx_=other.maxx_;
-        if (other.miny_<miny_) miny_=other.miny_;
-        if (other.maxy_>maxy_) maxy_=other.maxy_;
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    bool Envelope<T>::contains(const coord<T,2> &c) const
-    {
-        return contains(c.x,c.y);
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    bool Envelope<T>::contains(T x,T y) const
-    {
-        return x>=minx_ && x<=maxx_ && y>=miny_ && y<=maxy_;
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    bool Envelope<T>::contains(const Envelope<T> &other) const
-    {
-        return other.minx_>=minx_ &&
-            other.maxx_<=maxx_ &&
-            other.miny_>=miny_ &&
-            other.maxy_<=maxy_;
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    bool Envelope<T>::intersects(const coord<T,2> &c) const
-    {
-        return intersects(c.x,c.y);
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    bool Envelope<T>::intersects(T x,T y) const
-    {
-        return !(x>maxx_ || x<minx_ || y>maxy_ || y<miny_);
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    bool Envelope<T>::intersects(const Envelope<T> &other) const
-    {
-        return !(other.minx_>maxx_ || other.maxx_<minx_ ||
-                 other.miny_>maxy_ || other.maxy_<miny_);
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    Envelope<T> Envelope<T>::intersect(const EnvelopeType& other) const
-    {
-        if (intersects(other)) {
-            T x0=std::max(minx_,other.minx_);
-            T y0=std::max(miny_,other.miny_);
-
-            T x1=std::min(maxx_,other.maxx_);
-            T y1=std::min(maxy_,other.maxy_);
-
-            return Envelope<T>(x0,y0,x1,y1);
-        } else {
-            return Envelope<T>();
-        }
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    void Envelope<T>::re_center(T cx,T cy)
-    {
-        T dx=cx-center().x;
-        T dy=cy-center().y;
-        minx_+=dx;
-        miny_+=dy;
-        maxx_+=dx;
-        maxy_+=dy;
-    }
-
-    template <typename T>
-#if !defined(__SUNPRO_CC)
-    inline
-#endif
-    void Envelope<T>::init(T x0,T y0,T x1,T y1)
-    {
-        if (x0<x1)
-        {
-            minx_=x0;maxx_=x1;
-        }
-        else
-        {
-            minx_=x1;maxx_=x0;
-        }
-        if (y0<y1)
-        {
-            miny_=y0;maxy_=y1;
-        }
-        else
-        {
-            miny_=y1;maxy_=y0;
-        }
-    }
-    
-    template <typename T>
-    Envelope<T>&  Envelope<T>::operator+=(Envelope<T> const& other)
-    {
-        expand_to_include(other);
-        return *this;
-    }
-    
-    template <typename T>    
-    Envelope<T>& Envelope<T>::operator-=(Envelope<T> const& other)
-    {
-        // not sure what to do here. intersect?
-        return *this;
-    }
-    
-    template <typename T>    
-    Envelope<T>& Envelope<T>::operator*=(T t)
-    {
-       coord<T,2> c = center();
-       T sx = static_cast<T>(0.5 * width()  * t);
-       T sy = static_cast<T>(0.5 * height() * t);
-       minx_ = c.x - sx;
-       maxx_ = c.x + sx;
-       miny_ = c.y - sy;
-       maxy_ = c.y + sy;
-       return *this;
-    }
-   
-    template <typename T>    
-    Envelope<T>& Envelope<T>::operator/=(T t)
-    {
-       coord<T,2> c = center();
-       T sx = static_cast<T>(0.5 * width() / t);
-       T sy = static_cast<T>(0.5 * height() / t);
-       minx_ = c.x - sx;
-       maxx_ = c.x + sx;
-       miny_ = c.y - sy;
-       maxy_ = c.y + sy;
-       return *this;
-    }
-    
-    template class Envelope<int>;
-    template class Envelope<double>;
-}
diff --git a/src/expression_string.cpp b/src/expression_string.cpp
new file mode 100644
index 0000000..b3d5dcc
--- /dev/null
+++ b/src/expression_string.cpp
@@ -0,0 +1,125 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2009 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+#include <mapnik/expression_string.hpp>
+#include <boost/variant.hpp>
+#include <unicode/uversion.h>
+
+
+
+namespace mapnik
+{
+
+struct expression_string : boost::static_visitor<void>
+{
+    explicit expression_string(std::string & str)
+        : str_(str) {}
+    
+    void operator() (value_type const& x) const
+    { 
+        str_ += x.to_expression_string() ; 
+    }
+    
+    void operator() (attribute const& attr) const
+    {
+        str_ += "[";
+        str_ += attr.name();
+        str_ += "]";
+    }
+    
+    template <typename Tag> 
+    void operator() (binary_node<Tag> const& x) const
+    {
+        if (x.type() != tags::mult::str() && x.type() != tags::div::str())
+        {
+            str_ += "(";
+        }
+        
+        boost::apply_visitor(expression_string(str_),x.left);
+        str_ += x.type();
+        boost::apply_visitor(expression_string(str_),x.right);
+        if (x.type() != tags::mult::str() && x.type() != tags::div::str())
+        {
+            str_ += ")";
+        }
+    }
+
+    template <typename Tag>
+    void operator() (unary_node<Tag> const& x) const
+    {
+        str_ += Tag::str();
+        str_ += "(";
+        boost::apply_visitor(expression_string(str_),x.expr);        
+        str_ += ")";
+    }
+    
+    void operator() (regex_match_node const & x) const
+    {
+        boost::apply_visitor(expression_string(str_),x.expr);
+        str_ +=".match('";
+#if defined(BOOST_REGEX_HAS_ICU)
+        std::string utf8;
+        UnicodeString ustr = UnicodeString::fromUTF32( &x.pattern.str()[0] ,x.pattern.str().length());
+        to_utf8(ustr,utf8);
+        str_ += utf8;
+#else
+        str_ += x.pattern.str();
+#endif
+        str_ +="')";
+    }
+    
+    void operator() (regex_replace_node const & x) const
+    {
+        boost::apply_visitor(expression_string(str_),x.expr);
+        str_ +=".replace(";
+        str_ += "'";
+#if defined(BOOST_REGEX_HAS_ICU)
+        std::string utf8;
+        UnicodeString ustr = UnicodeString::fromUTF32( &x.pattern.str()[0] ,x.pattern.str().length());
+        to_utf8(ustr,utf8);
+        str_ += utf8;
+        str_ +="','";
+        to_utf8(x.format ,utf8);
+        str_ += utf8;
+#else
+        str_ += x.pattern.str();
+        str_ +="','";
+        str_ += x.pattern.str();
+#endif
+        str_ +="')";
+    }
+
+private:
+    std::string & str_;
+};
+
+std::string to_expression_string(expr_node const& node)
+{
+    std::string str;
+    expression_string functor(str);
+    boost::apply_visitor(functor,node);
+    return str;
+}
+
+}
diff --git a/src/feature_style_processor.cpp b/src/feature_style_processor.cpp
new file mode 100644
index 0000000..01fba98
--- /dev/null
+++ b/src/feature_style_processor.cpp
@@ -0,0 +1,555 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//mapnik
+#include <mapnik/feature_style_processor.hpp>
+#include <mapnik/box2d.hpp>
+#include <mapnik/datasource.hpp>
+#include <mapnik/layer.hpp>
+#include <mapnik/map.hpp>
+#include <mapnik/attribute_collector.hpp>
+#include <mapnik/expression_evaluator.hpp>
+#include <mapnik/utils.hpp>
+#include <mapnik/projection.hpp>
+#include <mapnik/scale_denominator.hpp>
+#include <mapnik/memory_datasource.hpp>
+
+#include <mapnik/agg_renderer.hpp>
+#include <mapnik/grid/grid_renderer.hpp>
+
+// boost
+#include <boost/foreach.hpp>
+
+//stl
+#include <vector>
+
+#if defined(HAVE_CAIRO)
+#include <mapnik/cairo_renderer.hpp>
+#endif
+
+#if defined(SVG_RENDERER)
+#include <mapnik/svg_renderer.hpp>
+#endif
+
+#if defined(RENDERING_STATS)
+#include <mapnik/timer.hpp>
+#include <iomanip>
+#include <sstream>
+#endif
+
+namespace mapnik
+{
+
+/** Calls the renderer's process function,
+  * \param output     Renderer
+  * \param f          Feature to process
+  * \param prj_trans  Projection
+  * \param sym        Symbolizer object
+  */
+template <typename Processor>
+struct feature_style_processor<Processor>::symbol_dispatch : public boost::static_visitor<>
+{
+    symbol_dispatch (Processor & output,
+                     Feature const& f,
+                     proj_transform const& prj_trans)
+        : output_(output),
+          f_(f),
+          prj_trans_(prj_trans)  {}
+
+    template <typename T>
+    void operator () (T const& sym) const
+    {
+        output_.process(sym,f_,prj_trans_);
+    }
+
+    Processor & output_;
+    Feature const& f_;
+    proj_transform const& prj_trans_;
+};
+
+template <typename Processor>
+feature_style_processor<Processor>::feature_style_processor(Map const& m, double scale_factor)
+    : m_(m), scale_factor_(scale_factor)
+{
+}
+
+template <typename Processor>
+void feature_style_processor<Processor>::apply()
+{
+
+#if defined(RENDERING_STATS)
+    std::clog << "\n//-- starting rendering timer...\n";
+    mapnik::progress_timer t(std::clog, "total map rendering");
+#endif
+
+    Processor & p = static_cast<Processor&>(*this);
+    p.start_map_processing(m_);
+
+    try
+    {
+        projection proj(m_.srs());
+
+        start_metawriters(m_,proj);
+
+        double scale_denom = mapnik::scale_denominator(m_,proj.is_geographic());
+        scale_denom *= scale_factor_;
+
+        BOOST_FOREACH ( layer const& lyr, m_.layers() )
+        {
+            if (lyr.isVisible(scale_denom))
+            {
+                std::set<std::string> names;
+                apply_to_layer(lyr, p, proj, scale_denom, names);
+            }
+        }
+
+        stop_metawriters(m_);
+    }
+    catch (proj_init_error& ex)
+    {
+        std::clog << "proj_init_error:" << ex.what() << "\n";
+    }
+
+    p.end_map_processing(m_);
+    
+#if defined(RENDERING_STATS)
+    t.stop();
+    std::clog << "//-- rendering timer stopped...\n\n";
+#endif
+
+}
+
+template <typename Processor>
+void feature_style_processor<Processor>::apply(mapnik::layer const& lyr, std::set<std::string>& names)
+{
+    Processor & p = static_cast<Processor&>(*this);
+    p.start_map_processing(m_);
+    try
+    {
+        projection proj(m_.srs());
+        double scale_denom = mapnik::scale_denominator(m_,proj.is_geographic());
+        scale_denom *= scale_factor_;
+
+        if (lyr.isVisible(scale_denom))
+        {
+            apply_to_layer(lyr, p, proj, scale_denom, names);
+        }
+    }
+    catch (proj_init_error& ex)
+    {
+        std::clog << "proj_init_error:" << ex.what() << "\n";
+    }
+    p.end_map_processing(m_);
+}
+
+template <typename Processor>
+void feature_style_processor<Processor>::start_metawriters(Map const& m_, projection const& proj)
+{
+    Map::const_metawriter_iterator metaItr = m_.begin_metawriters();
+    Map::const_metawriter_iterator metaItrEnd = m_.end_metawriters();
+    for (;metaItr!=metaItrEnd; ++metaItr)
+    {
+        metaItr->second->set_size(m_.width(), m_.height());
+        metaItr->second->set_map_srs(proj);
+        metaItr->second->start(m_.metawriter_output_properties);
+    }
+}
+
+template <typename Processor>
+void feature_style_processor<Processor>::stop_metawriters(Map const& m_)
+{
+    Map::const_metawriter_iterator metaItr = m_.begin_metawriters();
+    Map::const_metawriter_iterator metaItrEnd = m_.end_metawriters();
+    for (;metaItr!=metaItrEnd; ++metaItr)
+    {
+        metaItr->second->stop();
+    }
+}
+
+template <typename Processor>
+void feature_style_processor<Processor>::apply_to_layer(layer const& lay, Processor & p,
+                    projection const& proj0,
+                    double scale_denom,
+                    std::set<std::string>& names)
+{
+    std::vector<std::string> const& style_names = lay.styles();
+
+    unsigned int num_styles = style_names.size();
+    if (!num_styles) {
+        std::clog << "WARNING: No style for layer '" << lay.name() << "'\n";
+        return;
+    }
+
+    mapnik::datasource_ptr ds = lay.datasource();
+    if (!ds)
+    {
+        std::clog << "WARNING: No datasource for layer '" << lay.name() << "'\n";
+        return;
+    }
+
+    p.start_layer_processing(lay);
+
+#if defined(RENDERING_STATS)
+    progress_timer layer_timer(std::clog, "rendering total for layer: '" + lay.name() + "'");
+#endif
+
+    projection proj1(lay.srs());
+    proj_transform prj_trans(proj0,proj1);
+
+#if defined(RENDERING_STATS)
+    if (!prj_trans.equal())
+        std::clog << "notice: reprojecting layer: '" << lay.name() << "' from/to:\n\t'" 
+            << lay.srs() << "'\n\t'"
+            << m_.srs() << "'\n";
+#endif
+
+    box2d<double> map_ext = m_.get_buffered_extent();
+
+    // clip buffered extent by maximum extent, if supplied
+    boost::optional<box2d<double> > const& maximum_extent = m_.maximum_extent();
+    if (maximum_extent) {
+        map_ext.clip(*maximum_extent);
+    }
+
+    box2d<double> layer_ext = lay.envelope();
+
+    // first, try intersection of map extent forward projected into layer srs
+    if (prj_trans.forward(map_ext, PROJ_ENVELOPE_POINTS) && map_ext.intersects(layer_ext))
+    {
+        layer_ext.clip(map_ext);
+    } 
+    // if no intersection and projections are also equal, early return
+    else if (prj_trans.equal())
+    {
+        #if defined(RENDERING_STATS)
+        layer_timer.discard();
+        #endif
+        return;
+    }
+    // next try intersection of layer extent back projected into map srs
+    else if (prj_trans.backward(layer_ext, PROJ_ENVELOPE_POINTS) && map_ext.intersects(layer_ext))
+    {
+        layer_ext.clip(map_ext);
+        // forward project layer extent back into native projection
+        if (!prj_trans.forward(layer_ext))
+            std::clog << "WARNING: layer " << lay.name()
+                << " extent " << layer_ext << " in map projection "
+                << " did not reproject properly back to layer projection\n";
+    }
+    else
+    {
+        // if no intersection then nothing to do for layer
+        #if defined(RENDERING_STATS)
+        layer_timer.discard();
+        #endif
+        return;
+    }
+    
+    box2d<double> query_ext = m_.get_current_extent();
+    prj_trans.forward(query_ext, PROJ_ENVELOPE_POINTS);
+    query::resolution_type res(m_.width()/query_ext.width(),
+                               m_.height()/query_ext.height());
+
+    query q(layer_ext,res,scale_denom);
+
+    std::vector<feature_type_style*> active_styles;
+    attribute_collector collector(names);
+    double filt_factor = 1;
+    directive_collector d_collector(&filt_factor);
+
+    // iterate through all named styles collecting active styles and attribute names
+    BOOST_FOREACH(std::string const& style_name, style_names)
+    {
+        boost::optional<feature_type_style const&> style=m_.find_style(style_name);
+        if (!style)
+        {
+            std::clog << "WARNING: style '" << style_name << "' required for layer '"
+                      << lay.name() << "' does not exist.\n";
+            continue;
+        }
+
+        const std::vector<rule>& rules=(*style).get_rules();
+        bool active_rules=false;
+
+        BOOST_FOREACH(rule const& r, rules)
+        {
+            if (r.active(scale_denom))
+            {
+                active_rules = true;
+                if (ds->type() == datasource::Vector)
+                {
+                    collector(r);
+                }
+                // TODO - in the future rasters should be able to be filtered.
+            }
+        }
+        if (active_rules)
+        {
+            active_styles.push_back(const_cast<feature_type_style*>(&(*style)));
+        }
+    }
+
+    // push all property names
+    BOOST_FOREACH(std::string const& name, names)
+    {
+        q.add_property_name(name);
+    }
+
+    memory_datasource cache;
+    bool cache_features = lay.cache_features() && num_styles>1?true:false;
+    bool first = true;
+
+    #if defined(RENDERING_STATS)
+    int style_index = 0;
+    if (!active_styles.size() > 0) {
+        layer_timer.discard();
+    }
+    #endif
+    BOOST_FOREACH (feature_type_style * style, active_styles)
+    {
+        #if defined(RENDERING_STATS)
+        std::string s_name = style_names[style_index];
+        std::ostringstream s1;
+        s1 << "rendering style #" << style_index+1
+          << " for layer: '" << lay.name() << "' and style '" << s_name << "'";
+        mapnik::progress_timer style_timer(std::clog, s1.str());
+        if (!num_styles>1)
+            style_timer.discard();
+        style_index++;
+        #endif
+
+        std::vector<rule*> if_rules;
+        std::vector<rule*> else_rules;
+        std::vector<rule*> also_rules;
+
+        std::vector<rule> const& rules=style->get_rules();
+
+        #if defined(RENDERING_STATS)
+        int feature_count = 0;
+        int feature_processed_count = 0;
+        #endif
+
+        BOOST_FOREACH(rule const& r, rules)
+        {
+            if (r.active(scale_denom))
+            {
+                if (r.has_else_filter())
+                {
+                    else_rules.push_back(const_cast<rule*>(&r));
+                }
+                else if (r.has_also_filter())
+                {
+                    also_rules.push_back(const_cast<rule*>(&r));
+                }
+                else
+                {
+                    if_rules.push_back(const_cast<rule*>(&r));
+                }
+
+                if ( (ds->type() == datasource::Raster) &&
+                        (ds->params().get<double>("filter_factor",0.0) == 0.0) )
+                {
+                    rule::symbolizers const& symbols = r.get_symbolizers();
+                    rule::symbolizers::const_iterator symIter = symbols.begin();
+                    rule::symbolizers::const_iterator symEnd = symbols.end();
+                    while (symIter != symEnd)
+                    {
+                        // if multiple raster symbolizers, last will be respected
+                        // should we warn or throw?
+                        boost::apply_visitor(d_collector,*symIter++);
+                    }
+                    q.set_filter_factor(filt_factor);
+                }
+            }
+        }
+
+        // process features
+        featureset_ptr fs;
+        if (first)
+        {
+            if (cache_features)
+                first = false;
+            fs = ds->features(q);
+        }
+        else
+        {
+            fs = cache.features(q);
+        }
+
+        if (fs)
+        {
+            feature_ptr feature;
+            while ((feature = fs->next()))
+            {
+
+                #if defined(RENDERING_STATS)
+                feature_count++;
+                bool feat_processed = false;
+                #endif
+
+                bool do_else=true;
+                bool do_also=false;
+
+                if (cache_features)
+                {
+                    cache.push(feature);
+                }
+
+                BOOST_FOREACH(rule * r, if_rules )
+                {
+                    expression_ptr const& expr=r->get_filter();
+                    value_type result = boost::apply_visitor(evaluate<Feature,value_type>(*feature),*expr);
+                    if (result.to_bool())
+                    {
+                        #if defined(RENDERING_STATS)
+                        feat_processed = true;
+                        #endif
+                        
+                        p.painted(true);
+
+                        do_else=false;
+                        do_also=true;
+                        rule::symbolizers const& symbols = r->get_symbolizers();
+
+                        // if the underlying renderer is not able to process the complete set of symbolizers,
+                        // process one by one.
+#if defined(SVG_RENDERER)
+                        if(!p.process(symbols,*feature,prj_trans))
+#endif
+                        {
+
+                            BOOST_FOREACH (symbolizer const& sym, symbols)
+                            {
+                                boost::apply_visitor(symbol_dispatch(p,*feature,prj_trans),sym);
+                            }
+                        }
+                        if (style->get_filter_mode() == FILTER_FIRST)
+                        {
+                            // Stop iterating over rules and proceed with next feature.
+                            break;
+                        }
+                    }
+                }
+                if (do_else)
+                {
+                    BOOST_FOREACH( rule * r, else_rules )
+                    {
+                        #if defined(RENDERING_STATS)
+                        feat_processed = true;
+                        #endif
+
+                        p.painted(true);
+ 
+                        rule::symbolizers const& symbols = r->get_symbolizers();
+                        // if the underlying renderer is not able to process the complete set of symbolizers,
+                        // process one by one.
+#if defined(SVG_RENDERER)
+                        if(!p.process(symbols,*feature,prj_trans))
+#endif
+                        {
+                            BOOST_FOREACH (symbolizer const& sym, symbols)
+                            {
+                                boost::apply_visitor(symbol_dispatch(p,*feature,prj_trans),sym);
+                            }
+                        }
+                    }
+                }
+                if (do_also)
+                {
+                    BOOST_FOREACH( rule * r, also_rules )
+                    {
+                        #if defined(RENDERING_STATS)
+                        feat_processed = true;
+                        #endif
+
+                        p.painted(true);
+ 
+                        rule::symbolizers const& symbols = r->get_symbolizers();
+                        // if the underlying renderer is not able to process the complete set of symbolizers,
+                        // process one by one.
+#if defined(SVG_RENDERER)
+                        if(!p.process(symbols,*feature,prj_trans))
+#endif
+                        {
+                            BOOST_FOREACH (symbolizer const& sym, symbols)
+                            {
+                                boost::apply_visitor(symbol_dispatch(p,*feature,prj_trans),sym);
+                            }
+                        }
+                    }
+                }
+                #if defined(RENDERING_STATS)
+                if (feat_processed)
+                    feature_processed_count++;
+                #endif
+            }
+
+            #if defined(RENDERING_STATS)
+            style_timer.stop();
+            
+            // done with style
+            std::ostringstream s;
+            if (feature_count > 0) {
+                double perc_processed = ((double)feature_processed_count/(double)feature_count)*100.0;
+                
+                s << "percent rendered: " << perc_processed << "% - " << feature_processed_count 
+                  << " rendered for " << feature_count << " queried for ";
+                s << std::setw(15 - (int)s.tellp()) << " layer '" << lay.name() << "' and style '" << s_name << "'\n";
+        
+            } else {
+                s << "" << std::setw(15) << "- no features returned from query for layer '" << lay.name() << "' and style '" << s_name << "'\n";
+            }
+            std::clog << s.str();
+            #endif
+
+        }
+        #if defined(RENDERING_STATS)
+        else {
+            style_timer.discard();
+            layer_timer.discard();
+        }
+        #endif
+        cache_features = false;
+    }
+    
+    #if defined(RENDERING_STATS)
+        layer_timer.stop();
+    #endif
+
+
+    p.end_layer_processing(lay);
+}
+
+#if defined(HAVE_CAIRO)
+template class feature_style_processor<cairo_renderer<Cairo::Context> >;
+template class feature_style_processor<cairo_renderer<Cairo::Surface> >;
+#endif
+
+#if defined(SVG_RENDERER)
+template class feature_style_processor<svg_renderer<std::ostream_iterator<char> > >;
+#endif
+
+template class feature_style_processor<grid_renderer<grid> >;
+template class feature_style_processor<agg_renderer<image_32> >;
+
+}
+
diff --git a/src/feature_type_style.cpp b/src/feature_type_style.cpp
new file mode 100644
index 0000000..f9047f5
--- /dev/null
+++ b/src/feature_type_style.cpp
@@ -0,0 +1,76 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#include <mapnik/feature_type_style.hpp>
+
+namespace mapnik
+{
+
+static const char * filter_mode_strings[] = {
+    "all",
+    "first",
+    ""
+};
+
+IMPLEMENT_ENUM( filter_mode_e, filter_mode_strings )
+
+
+feature_type_style::feature_type_style()
+    : filter_mode_(FILTER_ALL) {}
+
+feature_type_style::feature_type_style(feature_type_style const& rhs)
+    : rules_(rhs.rules_),
+      filter_mode_(rhs.filter_mode_) {}
+    
+feature_type_style& feature_type_style::operator=(feature_type_style const& rhs)
+{
+    if (this == &rhs) return *this;
+    rules_=rhs.rules_;
+    return *this;
+}
+    
+void feature_type_style::add_rule(rule const& rule)
+{
+    rules_.push_back(rule);
+} 
+    
+rules const& feature_type_style::get_rules() const
+{
+    return rules_;
+}
+
+rules &feature_type_style::get_rules_nonconst()
+{
+    return rules_;
+}
+    
+void feature_type_style::set_filter_mode(filter_mode_e mode)
+{
+    filter_mode_ = mode;
+}
+
+filter_mode_e feature_type_style::get_filter_mode() const
+{
+    return filter_mode_;
+}
+
+}
diff --git a/src/filter_factory.cpp b/src/filter_factory.cpp
index 8c178c2..97e7e61 100644
--- a/src/filter_factory.cpp
+++ b/src/filter_factory.cpp
@@ -22,17 +22,75 @@
 //$Id$
 
 #include <mapnik/filter_factory.hpp>
+#include <mapnik/expression_grammar.hpp>
+#include <mapnik/config_error.hpp>
+#include <mapnik/unicode.hpp>
+
+// boost
+#include <boost/algorithm/string.hpp>
 
 namespace mapnik
 {
-   filter_ptr create_filter (std::string const& wkt,std::string const& encoding)
-   {
-      transcoder tr(encoding);
-      return filter_factory<Feature>::compile(wkt,tr);
-   }
-   
-   filter_ptr create_filter (std::string const& wkt)
-   {
-      return create_filter(wkt,"utf8");
-   }
+
+class filter_factory
+{
+public:
+    static expression_ptr compile(std::string const& str,transcoder const& tr)
+    {
+        expression_ptr expr(new expr_node(true));
+       
+        std::string::const_iterator itr = str.begin();
+        std::string::const_iterator end = str.end();
+        mapnik::expression_grammar<std::string::const_iterator> g(tr);
+       
+        bool r = boost::spirit::qi::phrase_parse(itr,end,g, boost::spirit::standard_wide::space,*expr);
+        if (r  && itr==end)
+        {
+            return expr;
+        }
+        else
+        {
+            // Backward compatiblity for version pre 2.0.0
+            // To be removed in 2.1.0...
+            if (!boost::algorithm::icontains(str,"'") 
+                && !boost::algorithm::icontains(str,"[")
+                && !boost::algorithm::icontains(str,"]")
+                && !boost::algorithm::icontains(str," ")
+                && !boost::algorithm::icontains(str,"\""))
+            {
+
+                expression_ptr expr1(new expr_node(true));
+                mapnik::expression_grammar<std::string::const_iterator> g1(tr);
+                std::string str1("[" + str + "]");
+                std::string::const_iterator itr1 = str1.begin();
+                std::string::const_iterator end1 = str1.end();
+                bool r1 = boost::spirit::qi::phrase_parse(itr1,end1,g1, boost::spirit::standard_wide::space,*expr1);
+                if (r1  && itr1==end1)
+                {
+                    std::clog << "Deprecation Warning: symbolizer value now an expression, please wrap properly in brackets like \"" + str1 + "\"\n";
+                    return expr1;
+                }
+                else
+                {
+                    throw config_error( "Failed to parse expression: \"" + str + "\"" );
+                }
+            }
+            else
+            {
+                throw config_error( "Failed to parse expression: \"" + str + "\"" );           
+            }
+        }
+    }
+};
+
+expression_ptr parse_expression (std::string const& wkt,std::string const& encoding)
+{
+    transcoder tr(encoding);
+    return filter_factory::compile(wkt,tr);
+}
+
+expression_ptr parse_expression (std::string const& wkt)
+{
+    return parse_expression(wkt,"utf8");
+}
 }
diff --git a/src/font_engine_freetype.cpp b/src/font_engine_freetype.cpp
index 5bf4f96..a1b5861 100644
--- a/src/font_engine_freetype.cpp
+++ b/src/font_engine_freetype.cpp
@@ -21,79 +21,267 @@
  *****************************************************************************/
 //$Id$
 
+// mapnik
 #include <mapnik/font_engine_freetype.hpp>
 
+// boost
+#include <boost/algorithm/string.hpp>
+#include <boost/filesystem.hpp>
+#include <sstream>
+
+// icu
+#include <unicode/ubidi.h>
+#include <unicode/ushape.h>
+#include <unicode/schriter.h>
+#include <unicode/uversion.h> 
+
 namespace mapnik
 {
-   freetype_engine::freetype_engine()
-   {
-      FT_Error error = FT_Init_FreeType( &library_ );
-      if (error)
-      {
-         throw std::runtime_error("can not load FreeType2 library");
-      }
-   }
-   
-   freetype_engine::~freetype_engine()
-   {   
-      FT_Done_FreeType(library_);   
-   }
+freetype_engine::freetype_engine()
+{
+    FT_Error error = FT_Init_FreeType( &library_ );
+    if (error)
+    {
+        throw std::runtime_error("can not load FreeType2 library");
+    }
+}
    
-   bool freetype_engine::register_font(std::string const& file_name)
-   {
+freetype_engine::~freetype_engine()
+{   
+    FT_Done_FreeType(library_);   
+}
+
+bool freetype_engine::is_font_file(std::string const& file_name)
+{
+    /** only accept files that will be matched by freetype2's `figurefiletype()` */
+    std::string const& fn = boost::algorithm::to_lower_copy(file_name);
+    return boost::algorithm::ends_with(fn,std::string(".ttf")) ||
+        boost::algorithm::ends_with(fn,std::string(".otf")) ||
+        boost::algorithm::ends_with(fn,std::string(".ttc")) ||
+        boost::algorithm::ends_with(fn,std::string(".pfa")) ||
+        boost::algorithm::ends_with(fn,std::string(".pfb")) ||
+        boost::algorithm::ends_with(fn,std::string(".ttc")) ||
+        /** Plus OSX custom ext */
+        boost::algorithm::ends_with(fn,std::string(".dfont"));
+}
+
+bool freetype_engine::register_font(std::string const& file_name)
+{
+    if (!boost::filesystem::is_regular_file(file_name) || !is_font_file(file_name)) return false;
 #ifdef MAPNIK_THREADSAFE
-      mutex::scoped_lock lock(mutex_);
+    mutex::scoped_lock lock(mutex_);
 #endif
-      FT_Library library;
-      FT_Error error = FT_Init_FreeType(&library);
-      if (error)
-      {
-         throw std::runtime_error("Failed to initialize FreeType2 library");
-      }
+    FT_Library library;
+    FT_Error error = FT_Init_FreeType(&library);
+    if (error)
+    {
+        throw std::runtime_error("Failed to initialize FreeType2 library");
+    }
       
-      FT_Face face;
-      error = FT_New_Face (library,file_name.c_str(),0,&face);
-      if (error)
-      {
-         FT_Done_FreeType(library);
-         return false;
-      }
-      std::string name = std::string(face->family_name) + " " + std::string(face->style_name);
-      name2file_.insert(std::make_pair(name,file_name));
-      FT_Done_Face(face );   
-      FT_Done_FreeType(library);
-      return true;
-   }
-   
-   std::vector<std::string> freetype_engine::face_names ()
-   {
-      std::vector<std::string> names;
-      std::map<std::string,std::string>::const_iterator itr;
-      for (itr = name2file_.begin();itr!=name2file_.end();++itr)
-      {
-         names.push_back(itr->first);
-      }
-      return names;
-   }
-
-   face_ptr freetype_engine::create_face(std::string const& family_name)
-   {
-      std::map<std::string,std::string>::iterator itr;
-      itr = name2file_.find(family_name);
-      if (itr != name2file_.end())
-      {
-         FT_Face face;
-         FT_Error error = FT_New_Face (library_,itr->second.c_str(),0,&face);
-
-         if (!error)
-         {
+    FT_Face face;
+    error = FT_New_Face (library,file_name.c_str(),0,&face);
+    if (error)
+    {
+        FT_Done_FreeType(library);
+        return false;
+    }
+    // some fonts can lack names, skip them
+    // http://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html#FT_FaceRec
+    if (face->family_name && face->style_name) {
+        std::string name = std::string(face->family_name) + " " + std::string(face->style_name);
+        name2file_.insert(std::make_pair(name,file_name));
+        FT_Done_Face(face);
+        FT_Done_FreeType(library);
+        return true;
+    } else {
+        FT_Done_Face(face);
+        FT_Done_FreeType(library);
+        std::ostringstream s;
+        s << "Error: unable to load invalid font file which lacks identifiable family and style name: '"
+          << file_name << "'";
+        throw std::runtime_error(s.str());
+    }
+    return true;
+}
+
+bool freetype_engine::register_fonts(std::string const& dir, bool recurse)
+{
+    boost::filesystem::path path(dir);
+    
+    if (!boost::filesystem::exists(path))
+        return false;
+
+    if (!boost::filesystem::is_directory(path))
+        return mapnik::freetype_engine::register_font(dir); 
+    
+    boost::filesystem::directory_iterator end_itr;
+    for (boost::filesystem::directory_iterator itr(dir); itr != end_itr; ++itr)
+    {
+        if (boost::filesystem::is_directory(*itr) && recurse)
+        {
+#if (BOOST_FILESYSTEM_VERSION == 3) 
+            if (!register_fonts(itr->path().string(), true)) return false;
+#else // v2
+            if (!register_fonts(itr->string(), true)) return false;
+#endif
+        }
+        else 
+        {
+#if (BOOST_FILESYSTEM_VERSION == 3) 
+            mapnik::freetype_engine::register_font(itr->path().string());
+#else // v2
+            mapnik::freetype_engine::register_font(itr->string());  
+#endif
+        }
+    }
+    return true;
+}
+
+
+std::vector<std::string> freetype_engine::face_names ()
+{
+    std::vector<std::string> names;
+    std::map<std::string,std::string>::const_iterator itr;
+    for (itr = name2file_.begin();itr!=name2file_.end();++itr)
+    {
+        names.push_back(itr->first);
+    }
+    return names;
+}
+
+std::map<std::string,std::string> const& freetype_engine::get_mapping()
+{
+    return name2file_;
+}
+
+
+face_ptr freetype_engine::create_face(std::string const& family_name)
+{
+    std::map<std::string,std::string>::iterator itr;
+    itr = name2file_.find(family_name);
+    if (itr != name2file_.end())
+    {
+        FT_Face face;
+        FT_Error error = FT_New_Face (library_,itr->second.c_str(),0,&face);
+
+        if (!error)
+        {
             return face_ptr (new font_face(face));
-         }
-      }
-      return face_ptr();
-   }
+        }
+    }
+    return face_ptr();
+}
+
+stroker_ptr freetype_engine::create_stroker()
+{
+    FT_Stroker s;
+    FT_Error error = FT_Stroker_New(library_, &s); 
+    if (!error)
+    {
+        return stroker_ptr(new stroker(s));
+    }
+    return stroker_ptr();
+}
+
+font_face_set::dimension_t font_face_set::character_dimensions(const unsigned c)
+{
+    std::map<unsigned, dimension_t>::const_iterator itr;
+    itr = dimension_cache_.find(c);
+    if (itr != dimension_cache_.end()) {
+        return itr->second;
+    }
+
+    FT_Matrix matrix;
+    FT_Vector pen;
+    FT_Error  error;
+
+    pen.x = 0;
+    pen.y = 0;
+
+    FT_BBox glyph_bbox;
+    FT_Glyph image;
+
+    glyph_ptr glyph = get_glyph(c);
+    FT_Face face = glyph->get_face()->get_face();
+
+    matrix.xx = (FT_Fixed)( 1 * 0x10000L );
+    matrix.xy = (FT_Fixed)( 0 * 0x10000L );
+    matrix.yx = (FT_Fixed)( 0 * 0x10000L );
+    matrix.yy = (FT_Fixed)( 1 * 0x10000L );
+
+    FT_Set_Transform(face, &matrix, &pen);
+
+    error = FT_Load_Glyph (face, glyph->get_index(), FT_LOAD_NO_HINTING);
+    if ( error )
+        return dimension_t(0, 0, 0);
+
+    error = FT_Get_Glyph(face->glyph, &image);
+    if ( error )
+        return dimension_t(0, 0, 0);
+
+    FT_Glyph_Get_CBox(image, ft_glyph_bbox_pixels, &glyph_bbox);
+    FT_Done_Glyph(image);
+
+    unsigned tempx = face->glyph->advance.x >> 6;
+
+    //std::clog << "glyph: " << glyph_index << " x: " << tempx << " y: " << tempy << std::endl;
+    dimension_t dim(tempx, glyph_bbox.yMax, glyph_bbox.yMin);
+    //dimension_cache_[c] = dim; would need an default constructor for dimension_t
+    dimension_cache_.insert(std::pair<unsigned, dimension_t>(c, dim));
+    return dim;
+}
+
+void font_face_set::get_string_info(string_info & info)
+{
+    unsigned width = 0;
+    unsigned height = 0;
+    UErrorCode err = U_ZERO_ERROR;
+    UnicodeString reordered;
+    UnicodeString shaped;
+
+    UnicodeString const& ustr = info.get_string();
+    int32_t length = ustr.length();
+
+    UBiDi *bidi = ubidi_openSized(length, 0, &err);
+    ubidi_setPara(bidi, ustr.getBuffer(), length, UBIDI_DEFAULT_LTR, 0, &err);
+
+    ubidi_writeReordered(bidi, reordered.getBuffer(length), 
+                         length, UBIDI_DO_MIRRORING, &err);
+
+    reordered.releaseBuffer(length);
+
+    u_shapeArabic(reordered.getBuffer(), length,
+                  shaped.getBuffer(length), length,
+                  U_SHAPE_LETTERS_SHAPE | U_SHAPE_LENGTH_FIXED_SPACES_NEAR | 
+                  U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, &err);
+
+    shaped.releaseBuffer(length);
+
+    if (U_SUCCESS(err)) {
+        StringCharacterIterator iter(shaped);
+        for (iter.setToStart(); iter.hasNext();) {
+            UChar ch = iter.nextPostInc();
+            dimension_t char_dim = character_dimensions(ch);
+            info.add_info(ch, char_dim.width, char_dim.height);
+            width += char_dim.width;
+            height = (char_dim.height > height) ? char_dim.height : height;
+        }
+    }
+
+
+#if (U_ICU_VERSION_MAJOR_NUM*100 + U_ICU_VERSION_MINOR_NUM >= 406)
+    if (ubidi_getBaseDirection(ustr.getBuffer(), length) == UBIDI_RTL)
+    {
+        info.set_rtl(true);
+    }
+#endif
+
+    ubidi_close(bidi);
+    info.set_dimensions(width, height);
+}
+
 #ifdef MAPNIK_THREADSAFE
-   boost::mutex freetype_engine::mutex_;
+boost::mutex freetype_engine::mutex_;
 #endif
-   std::map<std::string,std::string> freetype_engine::name2file_;
+std::map<std::string,std::string> freetype_engine::name2file_;
 }
diff --git a/src/font_set.cpp b/src/font_set.cpp
index 3a14511..f1a975b 100644
--- a/src/font_set.cpp
+++ b/src/font_set.cpp
@@ -30,45 +30,45 @@
 
 namespace mapnik
 {
-    FontSet::FontSet()
-        : name_("") {}
+font_set::font_set()
+    : name_("") {}
 
-    FontSet::FontSet(std::string const& name)
-        : name_(name) {}
+font_set::font_set(std::string const& name)
+    : name_(name) {}
 
-    FontSet::FontSet(FontSet const& rhs)
-        : name_(rhs.name_),
-          face_names_(rhs.face_names_) {}
+font_set::font_set(font_set const& rhs)
+    : name_(rhs.name_),
+      face_names_(rhs.face_names_) {}
    
-    FontSet& FontSet::operator=(FontSet const& other)
-    {
-        if (this == &other)
-            return *this;
-        name_ = other.name_;
-        face_names_ = other.face_names_;
-
+font_set& font_set::operator=(font_set const& other)
+{
+    if (this == &other)
         return *this;
-    } 
+    name_ = other.name_;
+    face_names_ = other.face_names_;
+
+    return *this;
+} 
 
-    FontSet::~FontSet() {}
+font_set::~font_set() {}
     
-    unsigned FontSet::size() const
-    {
-        return face_names_.size();
-    }
+unsigned font_set::size() const
+{
+    return face_names_.size();
+}
 
-    void FontSet::add_face_name(std::string face_name)
-    {
-        face_names_.push_back(face_name);
-    }
+void font_set::add_face_name(std::string face_name)
+{
+    face_names_.push_back(face_name);
+}
 
-    std::string const& FontSet::get_name() const
-    {
-        return name_;
-    }
+std::string const& font_set::get_name() const
+{
+    return name_;
+}
     
-    std::vector<std::string> const& FontSet::get_face_names() const
-    {
-        return face_names_;
-    }
+std::vector<std::string> const& font_set::get_face_names() const
+{
+    return face_names_;
+}
 }
diff --git a/src/glyph_symbolizer.cpp b/src/glyph_symbolizer.cpp
new file mode 100644
index 0000000..b94bb77
--- /dev/null
+++ b/src/glyph_symbolizer.cpp
@@ -0,0 +1,149 @@
+#include <mapnik/glyph_symbolizer.hpp>
+#include <mapnik/expression_evaluator.hpp>
+
+namespace mapnik
+{
+
+static const char * angle_mode_strings[] = {
+    "azimuth",
+    "trigonometric",
+    ""
+};
+
+IMPLEMENT_ENUM( angle_mode_e, angle_mode_strings )
+
+text_path_ptr glyph_symbolizer::get_text_path(face_set_ptr const& faces,
+                                              Feature const& feature) const
+{
+    // Try to evaulate expressions against feature
+    UnicodeString char_ = eval_char(feature);
+    double angle = eval_angle(feature);
+
+    // calculate displacement so glyph is rotated along center (default pivot is
+    // lowerbottom corner)
+    string_info info(char_);
+    faces->get_string_info(info);
+
+    // XXX: Perhaps this limitation can be overcomed?
+    if (info.num_characters() != 1)
+    {
+        throw config_error("'char' length must be exactly 1");
+    }
+
+    character_info ci = info.at(0);
+    font_face_set::dimension_t cdim = faces->character_dimensions(ci.character);
+    double cwidth = static_cast<double>(cdim.width)/2.0;
+    double cheight = static_cast<double>(cdim.height)/2.0;
+    double xoff = cwidth*cos(angle) - cheight*sin(angle);
+    double yoff = cwidth*sin(angle) + cheight*cos(angle);
+    
+    // Create text path and add character with displacement and angle
+    text_path_ptr path_ptr = text_path_ptr(new text_path());
+    path_ptr->add_node(ci.character, -xoff, -yoff, angle);
+    return path_ptr;
+}
+
+
+
+UnicodeString glyph_symbolizer::eval_char(Feature const& feature) const
+{
+    expression_ptr expr = get_char();
+    if (!expr)
+        throw config_error("No 'char' expression");
+    value_type result = boost::apply_visitor(
+        evaluate<Feature,value_type>(feature),
+        *expr
+        );
+#ifdef MAPNIK_DEBUG
+    std::clog << "char_result=" << result.to_string() << "\n";
+#endif
+    return result.to_unicode();
+}
+
+double glyph_symbolizer::eval_angle(Feature const& feature) const
+{
+    double angle = 0.0;
+    expression_ptr expr = get_angle();
+    if (expr) {
+        value_type result = boost::apply_visitor(
+            evaluate<Feature,value_type>(feature),
+            *expr
+            );
+#ifdef MAPNIK_DEBUG
+        std::clog << "angle_result=" << result.to_string() << "\n";
+#endif
+        angle = result.to_double();
+        // normalize to first rotation in case an expression has made it go past
+        angle = std::fmod(angle, 360);
+        angle *= (M_PI/180); // convert to radians
+        if (get_angle_mode()==AZIMUTH) {
+            // angle is an azimuth, convert into trigonometric angle
+            angle = std::atan2(std::cos(angle), std::sin(angle));
+        }
+        if (angle<0)
+            angle += 2*M_PI;
+    }
+    return angle;
+}
+
+unsigned glyph_symbolizer::eval_size(Feature const& feature) const
+{
+    expression_ptr expr = get_size();
+    if (!expr) throw config_error("No 'size' expression");
+    value_type result = boost::apply_visitor(
+        evaluate<Feature,value_type>(feature),
+        *expr
+        );
+#ifdef MAPNIK_DEBUG
+    std::clog << "size_result=" << result.to_string() << "\n";
+#endif
+    unsigned size = static_cast<unsigned>(result.to_int());
+#ifdef MAPNIK_DEBUG
+    std::clog << "size=" << size << "\n";
+#endif
+    return size;
+}
+
+color glyph_symbolizer::eval_color(Feature const& feature) const
+{
+    raster_colorizer_ptr colorizer = get_colorizer();
+    if (colorizer) 
+    {
+        expression_ptr value_expr = get_value();
+        if (!value_expr) 
+        {
+            throw config_error(
+                "Must define a 'value' expression to use a colorizer"
+                );
+        }
+        value_type value_result = boost::apply_visitor(
+            evaluate<Feature,value_type>(feature),
+            *value_expr
+            );
+#ifdef MAPNIK_DEBUG
+        std::clog << "value_result=" << value_result.to_string() << "\n";
+#endif
+        return colorizer->get_color((float)value_result.to_double());
+    } 
+    else 
+    {
+        expression_ptr color_expr = get_color();
+        if (color_expr) 
+        {
+            value_type color_result = boost::apply_visitor(
+                evaluate<Feature,value_type>(feature),
+                *color_expr
+                );
+#ifdef MAPNIK_DEBUG
+            std::clog << "color_result=" << color_result.to_string() << "\n";
+#endif
+            return color(color_result.to_string());
+        } 
+        else 
+        {
+            return color(0,0,0); // black
+        }
+    }
+}
+
+} // end mapnik namespace
diff --git a/src/gradient.cpp b/src/gradient.cpp
new file mode 100644
index 0000000..35dc2cc
--- /dev/null
+++ b/src/gradient.cpp
@@ -0,0 +1,143 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavelenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#include <mapnik/gradient.hpp>
+#include <iostream>
+
+namespace mapnik
+{
+
+static const char * gradient_strings[] = {
+    "no-gradient",
+    "linear",
+    "radial",
+    ""
+};
+
+IMPLEMENT_ENUM( gradient_e, gradient_strings )
+
+
+gradient::gradient() 
+    : gradient_type_(NO_GRADIENT),
+      stops_(),
+      x1_(0),
+      y1_(0),
+      x2_(0),
+      y2_(0),
+      r_(0),
+      units_(OBJECT_BOUNDING_BOX)
+{
+}
+
+gradient::gradient(gradient const& other)
+    : gradient_type_(other.gradient_type_),
+      stops_(other.stops_),
+      x1_(other.x1_),
+      y1_(other.y1_),
+      x2_(other.x2_),
+      y2_(other.y2_),
+      r_(other.r_),
+      units_(other.units_),
+      transform_(other.transform_)
+{}
+
+gradient & gradient::operator=(const gradient& rhs)
+{
+    gradient tmp(rhs);
+    swap(tmp);
+    return *this;
+}
+
+void gradient::set_gradient_type(gradient_e grad) 
+{
+    gradient_type_=grad;
+}
+
+gradient_e gradient::get_gradient_type() const 
+{
+    return gradient_type_;
+}
+
+void gradient::set_transform(agg::trans_affine transform)
+{
+    transform_ = transform;
+}
+agg::trans_affine gradient::get_transform() const
+{
+    return transform_;
+}
+
+void gradient::set_units(gradient_unit_e units)
+{
+    units_ = units;
+}
+gradient_unit_e gradient::get_units() const
+{
+    return units_;
+}
+
+void gradient::add_stop(double offset,mapnik::color const& c)
+{
+    stops_.push_back(mapnik::stop_pair(offset,c));
+}
+
+bool gradient::has_stop() const 
+{
+    return ! stops_.empty();
+}
+
+stop_array const& gradient::get_stop_array() const
+{
+    return stops_;
+}
+
+void gradient::swap(const gradient& other) throw()
+{
+    gradient_type_=other.gradient_type_;
+    stops_=other.stops_;
+    units_=other.units_;
+    transform_=other.transform_;
+    other.get_control_points(x1_,y1_,x2_,y2_,r_);
+}
+
+void gradient::set_control_points(double x1, double y1, double x2, double y2, double r)
+{
+    x1_ = x1;
+    y1_ = y1;
+    x2_ = x2;
+    y2_ = y2;
+    r_ = r;
+}
+void gradient::get_control_points(double &x1, double &y1, double &x2, double &y2, double &r) const
+{
+    get_control_points(x1,y1,x2,y2);
+    r=r_;
+}
+void gradient::get_control_points(double &x1, double &y1, double &x2, double &y2) const
+{
+    x1 = x1_;
+    y1 = y1_;
+    x2 = x2_;
+    y2 = y2_;
+}
+
+}
diff --git a/src/graphics.cpp b/src/graphics.cpp
index 60768c5..46f30d3 100644
--- a/src/graphics.cpp
+++ b/src/graphics.cpp
@@ -24,85 +24,153 @@
 // mapnik
 #include <mapnik/graphics.hpp>
 #include <mapnik/image_util.hpp>
+#include <mapnik/global.hpp>
 
 // cairo
 #ifdef HAVE_CAIRO
 #include <cairomm/surface.h>
 #endif
 
+#include <boost/scoped_array.hpp>
+
 #include <iostream>
 
 namespace mapnik
 {
-    Image32::Image32(int width,int height)
-        :width_(width),
-         height_(height),
-         data_(width,height) {}
-
-    Image32::Image32(const Image32& rhs)
-        :width_(rhs.width_),
-         height_(rhs.height_),
-         data_(rhs.data_)  {}
+image_32::image_32(int width,int height)
+    :width_(width),
+     height_(height),
+     data_(width,height),
+     painted_(false) {}
+
+image_32::image_32(const image_32& rhs)
+    :width_(rhs.width_),
+     height_(rhs.height_),
+     data_(rhs.data_),
+     painted_(rhs.painted_)  {}
 
 #ifdef HAVE_CAIRO
-    Image32::Image32(Cairo::RefPtr<Cairo::ImageSurface> rhs)
-        :width_(rhs->get_width()),
-         height_(rhs->get_height()),
-         data_(rhs->get_width(),rhs->get_height())
+image_32::image_32(Cairo::RefPtr<Cairo::ImageSurface> rhs)
+    :width_(rhs->get_width()),
+     height_(rhs->get_height()),
+     data_(rhs->get_width(),rhs->get_height())
+{
+    painted_ = true;
+    if (rhs->get_format() != Cairo::FORMAT_ARGB32)
+    {
+        std::cerr << "Unable to convert this Cairo format\n";
+        return; // throw exception ??
+    }
+
+    int stride = rhs->get_stride() / 4;
+
+    boost::scoped_array<unsigned int> out_row(new unsigned int[width_]);
+    const unsigned int *in_row = (const unsigned int *)rhs->get_data();
+
+    for (unsigned int row = 0; row < height_; row++, in_row += stride)
+    {
+        for (unsigned int column = 0; column < width_; column++)
         {
-            if (rhs->get_format() != Cairo::FORMAT_ARGB32)
-            {
-                    std::cerr << "Unable to convert this Cairo format\n";
-                    return; // throw exception ??
-            }
-
-            int stride = rhs->get_stride() / 4;
-
-            unsigned int out_row[width_];
-            const unsigned int *in_row = (const unsigned int *)rhs->get_data();
-
-            for (unsigned int row = 0; row < height_; row++, in_row += stride)
-            {
-                for (unsigned int column = 0; column < width_; column++)
-                {
-                   unsigned int in = in_row[column];
-                   unsigned int a = (in >> 24) & 0xff;
-                   unsigned int r = (in >> 16) & 0xff;
-                   unsigned int g = (in >> 8) & 0xff;
-                   unsigned int b = (in >> 0) & 0xff;
-
-#define DE_ALPHA(x) do {                      \
-                       if (a == 0) x = 0;     \
-                       else x = x * 255 / a;  \
-                       if (x > 255) x = 255;  \
-                   } while(0)
-
-                   DE_ALPHA(r);
-                   DE_ALPHA(g);
-                   DE_ALPHA(b);
-
-                   out_row[column] = color(r, g, b, a).rgba();
-                }
-                data_.setRow(row, out_row, width_);
-            }
+            unsigned int in = in_row[column];
+            unsigned int a = (in >> 24) & 0xff;
+            unsigned int r = (in >> 16) & 0xff;
+            unsigned int g = (in >> 8) & 0xff;
+            unsigned int b = (in >> 0) & 0xff;
+
+#define DE_ALPHA(x) do {                        \
+                if (a == 0) x = 0;              \
+                else x = x * 255 / a;           \
+                if (x > 255) x = 255;           \
+            } while(0)
+                   
+            DE_ALPHA(r);
+            DE_ALPHA(g);
+            DE_ALPHA(b);
+
+            out_row[column] = color(r, g, b, a).rgba();
         }
+        data_.setRow(row, out_row.get(), width_);
+    }
+}
 #endif
 
-    Image32::~Image32() {}
+image_32::~image_32() {}
 
-    const ImageData32& Image32::data() const
+void image_32::set_grayscale_to_alpha()
+{
+    for (unsigned int y = 0; y < height_; ++y)
     {
-        return data_;
+        unsigned int* row_from = data_.getRow(y);
+        for (unsigned int x = 0; x < width_; ++x)
+        {
+            unsigned rgba = row_from[x];
+            // TODO - big endian support
+            unsigned r = rgba & 0xff;
+            unsigned g = (rgba >> 8 ) & 0xff;
+            unsigned b = (rgba >> 16) & 0xff;
+            
+            // magic numbers for grayscale
+            unsigned a = (int)((r * .3) + (g * .59) + (b * .11));
+
+            row_from[x] = (a << 24)| (255 << 16) |  (255 << 8) | (255) ;
+        }
     }
+}
 
-    void Image32::setBackground(const color& background)
-    {
-        background_=background;
-        data_.set(background_.rgba());
-    }
+void image_32::set_color_to_alpha(const color& /*c*/)
+{
+    // TODO - function to set all pixels to a % alpha based on distance to a given color
+}
 
-    const color& Image32::getBackground() const
+void image_32::set_alpha(float opacity)
+{
+{
+    for (unsigned int y = 0; y < height_; ++y)
     {
-        return background_;
+        unsigned int* row_to =  data_.getRow(y);
+        for (unsigned int x = 0; x < width_; ++x)
+        {
+            unsigned rgba = row_to[x];
+
+#ifdef MAPNIK_BIG_ENDIAN
+            unsigned a0 = (rgba & 0xff);
+            unsigned a1 = int( (rgba & 0xff) * opacity );
+
+            if (a0 == a1) continue;
+
+            unsigned r = (rgba >> 24) & 0xff;
+            unsigned g = (rgba >> 16 ) & 0xff;
+            unsigned b = (rgba >> 8) & 0xff;
+            
+            row_to[x] = (a1) | (b << 8) |  (g << 16) | (r << 24) ;
+
+#else
+            unsigned a0 = (rgba >> 24) & 0xff;
+            unsigned a1 = int( ((rgba >> 24) & 0xff) * opacity );
+            //unsigned a1 = opacity;
+            if (a0 == a1) continue;
+
+            unsigned r = rgba & 0xff;
+            unsigned g = (rgba >> 8 ) & 0xff;
+            unsigned b = (rgba >> 16) & 0xff;
+
+            row_to[x] = (a1 << 24)| (b << 16) |  (g << 8) | (r) ;
+#endif
+        }
     }
 }
+
+}
+
+void image_32::set_background(const color& c)
+{
+    background_=c;
+    data_.set(background_->rgba());
+}
+
+boost::optional<color> const& image_32::get_background() const
+{
+    return background_;
+}
+
+}
diff --git a/src/grid/grid_renderer.cpp b/src/grid/grid_renderer.cpp
new file mode 100644
index 0000000..6b91cc3
--- /dev/null
+++ b/src/grid/grid_renderer.cpp
@@ -0,0 +1,177 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/grid/grid_rasterizer.hpp>
+#include <mapnik/grid/grid_renderer.hpp>
+#include <mapnik/grid/grid_pixfmt.hpp>
+#include <mapnik/grid/grid_pixel.hpp>
+#include <mapnik/grid/grid.hpp>
+
+#include <mapnik/marker_cache.hpp>
+#include <mapnik/unicode.hpp>
+#include <mapnik/placement_finder.hpp>
+#include <mapnik/config_error.hpp>
+#include <mapnik/font_set.hpp>
+#include <mapnik/parse_path.hpp>
+#include <mapnik/text_path.hpp>
+#include <mapnik/svg/svg_converter.hpp>
+#include <mapnik/svg/svg_renderer.hpp>
+#include <mapnik/svg/svg_path_adapter.hpp>
+
+// boost
+#include <boost/utility.hpp>
+
+// agg
+#include "agg_trans_affine.h"
+
+// stl
+#ifdef MAPNIK_DEBUG
+#include <iostream>
+#endif
+
+//#include <cmath>
+
+namespace mapnik
+{
+
+template <typename T>
+grid_renderer<T>::grid_renderer(Map const& m, T & pixmap, double scale_factor, unsigned offset_x, unsigned offset_y)
+    : feature_style_processor<grid_renderer>(m, scale_factor),
+      pixmap_(pixmap),
+      width_(pixmap_.width()),
+      height_(pixmap_.height()),
+      scale_factor_(scale_factor),
+      t_(pixmap_.width(),pixmap_.height(),m.get_current_extent(),offset_x,offset_y),
+      font_engine_(),
+      font_manager_(font_engine_),
+      detector_(box2d<double>(-m.buffer_size(), -m.buffer_size(), pixmap_.width() + m.buffer_size(), pixmap_.height() + m.buffer_size())),
+      ras_ptr(new grid_rasterizer)
+{
+#ifdef MAPNIK_DEBUG
+    std::clog << "scale=" << m.scale() << "\n";
+#endif
+}
+
+template <typename T>
+grid_renderer<T>::~grid_renderer() {}
+
+template <typename T>
+void grid_renderer<T>::start_map_processing(Map const& map)
+{
+#ifdef MAPNIK_DEBUG
+    std::clog << "start map processing bbox="
+              << map.get_current_extent() << "\n";
+#endif
+    ras_ptr->clip_box(0,0,width_,height_);
+}
+
+template <typename T>
+void grid_renderer<T>::end_map_processing(Map const& )
+{
+#ifdef MAPNIK_DEBUG
+    std::clog << "end map processing\n";
+#endif
+}
+
+template <typename T>
+void grid_renderer<T>::start_layer_processing(layer const& lay)
+{
+#ifdef MAPNIK_DEBUG
+    std::clog << "start layer processing : " << lay.name()  << "\n";
+    std::clog << "datasource = " << lay.datasource().get() << "\n";
+#endif
+    if (lay.clear_label_cache())
+    {
+        detector_.clear();
+    }
+}
+
+template <typename T>
+void grid_renderer<T>::end_layer_processing(layer const&)
+{
+#ifdef MAPNIK_DEBUG
+    std::clog << "end layer processing\n";
+#endif
+}
+
+template <typename T>
+void grid_renderer<T>::render_marker(Feature const& feature, unsigned int step, const int x, const int y, marker &marker, const agg::trans_affine & tr, double opacity)
+{
+    if (marker.is_vector())
+    {
+        typedef coord_transform2<CoordTransform,geometry_type> path_type;
+        typedef agg::renderer_base<mapnik::pixfmt_gray16> ren_base;
+        typedef agg::renderer_scanline_bin_solid<ren_base> renderer;
+        agg::scanline_bin sl;
+    
+        grid_rendering_buffer buf(pixmap_.raw_data(), width_, height_, width_);
+        mapnik::pixfmt_gray16 pixf(buf);
+    
+        ren_base renb(pixf);
+        renderer ren(renb);
+    
+        ras_ptr->reset();
+
+        box2d<double> const& bbox = (*marker.get_vector_data())->bounding_box();
+        coord<double,2> c = bbox.center();
+        // center the svg marker on '0,0'
+        agg::trans_affine mtx = agg::trans_affine_translation(-c.x,-c.y);
+        // apply symbol transformation to get to map space
+        mtx *= tr;
+        mtx *= agg::trans_affine_scaling(scale_factor_*(1.0/step));
+        // render the marker at the center of the marker box
+        mtx.translate(x+0.5 * marker.width(), y+0.5 * marker.height());
+
+        vertex_stl_adapter<svg_path_storage> stl_storage((*marker.get_vector_data())->source());
+        svg_path_adapter svg_path(stl_storage);
+        svg_renderer<svg_path_adapter,
+                     agg::pod_bvector<path_attributes>,
+                     renderer,
+                     mapnik::pixfmt_gray16> svg_renderer(svg_path,
+                             (*marker.get_vector_data())->attributes());
+
+        svg_renderer.render_id(*ras_ptr, sl, renb, feature.id(), mtx, opacity, bbox);
+        
+    }
+    else
+    {
+        image_data_32 const& data = **marker.get_bitmap_data();
+        if (step == 1 && scale_factor_ == 1.0)
+        {
+            pixmap_.set_rectangle(feature.id(), data, x, y);    
+        }
+        else
+        {
+            double ratio = (1.0/step);
+            image_data_32 target(ratio * data.width(), ratio * data.height());
+            mapnik::scale_image_agg<image_data_32>(target,data, SCALING_NEAR,
+                scale_factor_, 0.0, 0.0, 1.0, ratio);
+            pixmap_.set_rectangle(feature.id(), target, x, y);
+        }
+    }
+    pixmap_.add_feature(feature);
+}
+
+template class grid_renderer<grid>;
+}
diff --git a/src/grid/process_building_symbolizer.cpp b/src/grid/process_building_symbolizer.cpp
new file mode 100644
index 0000000..27c156a
--- /dev/null
+++ b/src/grid/process_building_symbolizer.cpp
@@ -0,0 +1,149 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/grid/grid_rasterizer.hpp>
+#include <mapnik/grid/grid_renderer.hpp>
+#include <mapnik/grid/grid_pixfmt.hpp>
+#include <mapnik/grid/grid_pixel.hpp>
+#include <mapnik/grid/grid.hpp>
+#include <mapnik/segment.hpp>
+
+// boost
+#include <boost/scoped_ptr.hpp>
+
+// agg
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_renderer_scanline.h"
+#include "agg_scanline_bin.h"
+#include "agg_conv_stroke.h"
+
+namespace mapnik 
+{
+
+template <typename T>
+void grid_renderer<T>::process(building_symbolizer const& sym,
+                              Feature const& feature,
+                              proj_transform const& prj_trans)
+{
+    typedef coord_transform2<CoordTransform,geometry_type> path_type;
+    typedef agg::renderer_base<mapnik::pixfmt_gray16> ren_base;
+    typedef agg::renderer_scanline_bin_solid<ren_base> renderer;
+    agg::scanline_bin sl;
+
+    grid_rendering_buffer buf(pixmap_.raw_data(), width_, height_, width_);
+    mapnik::pixfmt_gray16 pixf(buf);
+
+    ren_base renb(pixf);
+    renderer ren(renb);
+
+    ras_ptr->reset();
+
+    double height = sym.height() * scale_factor_;
+    
+    for (unsigned i=0;i<feature.num_geometries();++i)
+    {
+        geometry_type const& geom = feature.get_geometry(i);
+        if (geom.num_points() > 2)
+        {
+            boost::scoped_ptr<geometry_type> frame(new geometry_type(LineString));
+            boost::scoped_ptr<geometry_type> roof(new geometry_type(Polygon));
+            std::deque<segment_t> face_segments;
+            double x0(0);
+            double y0(0);
+            unsigned cm = geom.vertex(&x0,&y0);
+            for (unsigned j=1;j<geom.num_points();++j)
+            {
+                double x(0);
+                double y(0);
+                cm = geom.vertex(&x,&y);
+                if (cm == SEG_MOVETO)
+                {
+                    frame->move_to(x,y);
+                }
+                else if (cm == SEG_LINETO)
+                {
+                    frame->line_to(x,y);
+                    face_segments.push_back(segment_t(x0,y0,x,y));
+                }
+                
+                x0 = x;
+                y0 = y;
+            }
+            std::sort(face_segments.begin(),face_segments.end(), y_order);
+            std::deque<segment_t>::const_iterator itr=face_segments.begin();
+            for (;itr!=face_segments.end();++itr)
+            {
+                boost::scoped_ptr<geometry_type> faces(new geometry_type(Polygon));
+                faces->move_to(itr->get<0>(),itr->get<1>());
+                faces->line_to(itr->get<2>(),itr->get<3>());
+                faces->line_to(itr->get<2>(),itr->get<3>() + height);
+                faces->line_to(itr->get<0>(),itr->get<1>() + height);
+
+                path_type faces_path (t_,*faces,prj_trans);
+                ras_ptr->add_path(faces_path);
+                ren.color(mapnik::gray16(feature.id()));
+                agg::render_scanlines(*ras_ptr, sl, ren);
+                ras_ptr->reset();
+
+                frame->move_to(itr->get<0>(),itr->get<1>());
+                frame->line_to(itr->get<0>(),itr->get<1>()+height);
+            }
+
+            geom.rewind(0);
+            for (unsigned j=0;j<geom.num_points();++j)
+            {
+                double x,y;
+                unsigned cm = geom.vertex(&x,&y);
+                if (cm == SEG_MOVETO)
+                {
+                    frame->move_to(x,y+height);
+                    roof->move_to(x,y+height);
+                }
+                else if (cm == SEG_LINETO)
+                {
+                    frame->line_to(x,y+height);
+                    roof->line_to(x,y+height);
+                }
+            }
+            path_type path(t_,*frame,prj_trans);
+            agg::conv_stroke<path_type> stroke(path);
+            ras_ptr->add_path(stroke);
+            ren.color(mapnik::gray16(feature.id()));
+            agg::render_scanlines(*ras_ptr, sl, ren);
+            ras_ptr->reset();
+
+            path_type roof_path (t_,*roof,prj_trans);
+            ras_ptr->add_path(roof_path);
+            ren.color(mapnik::gray16(feature.id()));
+            agg::render_scanlines(*ras_ptr, sl, ren);
+        }
+    }
+    pixmap_.add_feature(feature);
+}
+
+template void grid_renderer<grid>::process(building_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+
+}
diff --git a/src/grid/process_glyph_symbolizer.cpp b/src/grid/process_glyph_symbolizer.cpp
new file mode 100644
index 0000000..b21453a
--- /dev/null
+++ b/src/grid/process_glyph_symbolizer.cpp
@@ -0,0 +1,41 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/grid/grid_renderer.hpp>
+#include <iostream>
+
+namespace mapnik {
+
+template <typename T>
+void grid_renderer<T>::process(glyph_symbolizer const& sym,
+                              Feature const& feature,
+                              proj_transform const& prj_trans)
+{
+    std::clog << "grid_renderer does not yet support glyph_symbolizer\n";
+}
+
+template void grid_renderer<grid>::process(glyph_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+}
diff --git a/src/grid/process_line_pattern_symbolizer.cpp b/src/grid/process_line_pattern_symbolizer.cpp
new file mode 100644
index 0000000..f7510e3
--- /dev/null
+++ b/src/grid/process_line_pattern_symbolizer.cpp
@@ -0,0 +1,92 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/grid/grid_rasterizer.hpp>
+#include <mapnik/grid/grid_renderer.hpp>
+#include <mapnik/grid/grid_pixfmt.hpp>
+#include <mapnik/grid/grid_pixel.hpp>
+#include <mapnik/grid/grid.hpp>
+
+// agg
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_renderer_scanline.h"
+#include "agg_scanline_bin.h"
+#include "agg_conv_stroke.h"
+#include "agg_conv_dash.h"
+
+// stl
+#include <string>
+
+namespace mapnik {
+
+template <typename T>
+void grid_renderer<T>::process(line_pattern_symbolizer const& sym,
+                              Feature const& feature,
+                              proj_transform const& prj_trans)
+{
+    typedef coord_transform2<CoordTransform,geometry_type> path_type;
+    typedef agg::renderer_base<mapnik::pixfmt_gray16> ren_base;
+    typedef agg::renderer_scanline_bin_solid<ren_base> renderer;
+    agg::scanline_bin sl;
+
+    grid_rendering_buffer buf(pixmap_.raw_data(), width_, height_, width_);
+    mapnik::pixfmt_gray16 pixf(buf);
+
+    ren_base renb(pixf);
+    renderer ren(renb);
+
+    ras_ptr->reset();
+
+    // TODO - actually handle image dimensions
+    int stroke_width = 2;
+
+    for (unsigned i=0;i<feature.num_geometries();++i)
+    {
+        geometry_type const& geom = feature.get_geometry(i);
+        if (geom.num_points() > 1)
+        {
+            path_type path(t_,geom,prj_trans);
+            agg::conv_stroke<path_type> stroke(path);
+            stroke.generator().miter_limit(4.0);
+            stroke.generator().width(stroke_width * scale_factor_);
+            ras_ptr->add_path(stroke);
+        }
+    }
+
+    // render id
+    ren.color(mapnik::gray16(feature.id()));
+    agg::render_scanlines(*ras_ptr, sl, ren);
+
+    // add feature properties to grid cache
+    pixmap_.add_feature(feature);
+
+}
+
+
+template void grid_renderer<grid>::process(line_pattern_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+
+}
+ 
diff --git a/src/grid/process_line_symbolizer.cpp b/src/grid/process_line_symbolizer.cpp
new file mode 100644
index 0000000..b04999b
--- /dev/null
+++ b/src/grid/process_line_symbolizer.cpp
@@ -0,0 +1,151 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/grid/grid_rasterizer.hpp>
+#include <mapnik/grid/grid_renderer.hpp>
+#include <mapnik/grid/grid_pixfmt.hpp>
+#include <mapnik/grid/grid_pixel.hpp>
+#include <mapnik/grid/grid.hpp>
+
+// agg
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_renderer_scanline.h"
+#include "agg_scanline_bin.h"
+#include "agg_conv_stroke.h"
+#include "agg_conv_dash.h"
+
+// stl
+#include <string>
+
+namespace mapnik {
+
+template <typename T>
+void grid_renderer<T>::process(line_symbolizer const& sym,
+                              Feature const& feature,
+                              proj_transform const& prj_trans)
+{
+    typedef coord_transform2<CoordTransform,geometry_type> path_type;
+    typedef agg::renderer_base<mapnik::pixfmt_gray16> ren_base;
+    typedef agg::renderer_scanline_bin_solid<ren_base> renderer;
+    agg::scanline_bin sl;
+
+    grid_rendering_buffer buf(pixmap_.raw_data(), width_, height_, width_);
+    mapnik::pixfmt_gray16 pixf(buf);
+
+    ren_base renb(pixf);
+    renderer ren(renb);
+
+    ras_ptr->reset();
+
+    stroke const&  stroke_ = sym.get_stroke();
+
+    for (unsigned i=0;i<feature.num_geometries();++i)
+    {
+        geometry_type const& geom = feature.get_geometry(i);
+        if (geom.num_points() > 1)
+        {
+            path_type path(t_,geom,prj_trans);
+
+            if (stroke_.has_dash())
+            {
+                agg::conv_dash<path_type> dash(path);
+                dash_array const& d = stroke_.get_dash_array();
+                dash_array::const_iterator itr = d.begin();
+                dash_array::const_iterator end = d.end();
+                for (;itr != end;++itr)
+                {
+                    dash.add_dash(itr->first * scale_factor_, 
+                                  itr->second * scale_factor_);
+                }
+
+                agg::conv_stroke<agg::conv_dash<path_type > > stroke(dash);
+
+                line_join_e join=stroke_.get_line_join();
+                if ( join == MITER_JOIN)
+                    stroke.generator().line_join(agg::miter_join);
+                else if( join == MITER_REVERT_JOIN)
+                    stroke.generator().line_join(agg::miter_join);
+                else if( join == ROUND_JOIN)
+                    stroke.generator().line_join(agg::round_join);
+                else
+                    stroke.generator().line_join(agg::bevel_join);
+
+                line_cap_e cap=stroke_.get_line_cap();
+                if (cap == BUTT_CAP)
+                    stroke.generator().line_cap(agg::butt_cap);
+                else if (cap == SQUARE_CAP)
+                    stroke.generator().line_cap(agg::square_cap);
+                else
+                    stroke.generator().line_cap(agg::round_cap);
+
+                stroke.generator().miter_limit(4.0);
+                stroke.generator().width(stroke_.get_width() * scale_factor_);
+                
+                ras_ptr->add_path(stroke);
+
+            }
+            else
+            {
+                agg::conv_stroke<path_type>  stroke(path);
+                line_join_e join=stroke_.get_line_join();
+                if ( join == MITER_JOIN)
+                    stroke.generator().line_join(agg::miter_join);
+                else if( join == MITER_REVERT_JOIN)
+                    stroke.generator().line_join(agg::miter_join);
+                else if( join == ROUND_JOIN)
+                    stroke.generator().line_join(agg::round_join);
+                else
+                    stroke.generator().line_join(agg::bevel_join);
+
+                line_cap_e cap=stroke_.get_line_cap();
+                if (cap == BUTT_CAP)
+                    stroke.generator().line_cap(agg::butt_cap);
+                else if (cap == SQUARE_CAP)
+                    stroke.generator().line_cap(agg::square_cap);
+                else
+                    stroke.generator().line_cap(agg::round_cap);
+
+                stroke.generator().miter_limit(4.0);
+                stroke.generator().width(stroke_.get_width() * scale_factor_);
+                ras_ptr->add_path(stroke);
+            }
+        }
+    }
+
+    // render id
+    ren.color(mapnik::gray16(feature.id()));
+    agg::render_scanlines(*ras_ptr, sl, ren);
+
+    // add feature properties to grid cache
+    pixmap_.add_feature(feature);
+
+}
+
+
+template void grid_renderer<grid>::process(line_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+
+}
+ 
diff --git a/src/grid/process_markers_symbolizer.cpp b/src/grid/process_markers_symbolizer.cpp
new file mode 100644
index 0000000..84b2da6
--- /dev/null
+++ b/src/grid/process_markers_symbolizer.cpp
@@ -0,0 +1,271 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/grid/grid_rasterizer.hpp>
+#include <mapnik/grid/grid_renderer.hpp>
+#include <mapnik/grid/grid_pixfmt.hpp>
+#include <mapnik/grid/grid_pixel.hpp>
+#include <mapnik/grid/grid.hpp>
+
+#include <mapnik/expression_evaluator.hpp>
+#include <mapnik/marker_cache.hpp>
+#include <mapnik/svg/svg_renderer.hpp>
+#include <mapnik/svg/svg_path_adapter.hpp>
+#include <mapnik/markers_placement.hpp>
+#include <mapnik/arrow.hpp>
+
+// agg
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_renderer_scanline.h"
+#include "agg_scanline_bin.h"
+#include "agg_path_storage.h"
+#include "agg_ellipse.h"
+#include "agg_conv_stroke.h"
+
+// stl
+#include <algorithm>
+
+
+
+namespace mapnik {
+
+template <typename T>
+void grid_renderer<T>::process(markers_symbolizer const& sym,
+                              Feature const& feature,
+                              proj_transform const& prj_trans)
+{
+    typedef coord_transform2<CoordTransform,geometry_type> path_type;
+    typedef agg::renderer_base<mapnik::pixfmt_gray16> ren_base;
+    typedef agg::renderer_scanline_bin_solid<ren_base> renderer;
+    agg::scanline_bin sl;
+
+    grid_rendering_buffer buf(pixmap_.raw_data(), width_, height_, width_);
+    mapnik::pixfmt_gray16 pixf(buf);
+
+    ren_base renb(pixf);
+    renderer ren(renb);
+
+    ras_ptr->reset();
+
+    agg::trans_affine tr;
+    boost::array<double,6> const& m = sym.get_transform();
+    tr.load_from(&m[0]);
+    tr = agg::trans_affine_scaling(scale_factor_*(1.0/pixmap_.get_resolution())) * tr;
+    std::string filename = path_processor_type::evaluate(*sym.get_filename(), feature);
+    marker_placement_e placement_method = sym.get_marker_placement();
+    marker_type_e marker_type = sym.get_marker_type();
+
+    if (!filename.empty())
+    {
+        boost::optional<marker_ptr> mark = mapnik::marker_cache::instance()->find(filename, true);
+        if (mark && *mark && (*mark)->is_vector())
+        {
+            boost::optional<path_ptr> marker = (*mark)->get_vector_data();
+            box2d<double> const& bbox = (*marker)->bounding_box();
+            double x1 = bbox.minx();
+            double y1 = bbox.miny();
+            double x2 = bbox.maxx();
+            double y2 = bbox.maxy();
+            
+            agg::trans_affine recenter = agg::trans_affine_translation(-0.5*(x1+x2),-0.5*(y1+y2));
+            tr.transform(&x1,&y1);
+            tr.transform(&x2,&y2);
+            box2d<double> extent(x1,y1,x2,y2);
+            using namespace mapnik::svg;
+            vertex_stl_adapter<svg_path_storage> stl_storage((*marker)->source());
+            svg_path_adapter svg_path(stl_storage);
+            svg_renderer<svg_path_adapter, 
+                         agg::pod_bvector<path_attributes>,
+                         renderer,
+                         mapnik::pixfmt_gray16 > svg_renderer(svg_path,(*marker)->attributes());
+
+            bool placed = false;
+            for (unsigned i=0; i<feature.num_geometries(); ++i)
+            {
+                geometry_type const& geom = feature.get_geometry(i);
+                if (geom.num_points() <= 1)
+                {
+                    std::clog << "### Warning svg markers not supported yet for points within markers_symbolizer\n";
+                    continue;
+                } 
+                
+                path_type path(t_,geom,prj_trans);
+                markers_placement<path_type, label_collision_detector4> placement(path, extent, detector_, 
+                                                                                  sym.get_spacing() * scale_factor_, 
+                                                                                  sym.get_max_error(), 
+                                                                                  sym.get_allow_overlap());        
+                double x, y, angle;
+            
+                while (placement.get_point(&x, &y, &angle))
+                {
+                    placed = true;
+                    agg::trans_affine matrix = recenter * tr *agg::trans_affine_rotation(angle) * agg::trans_affine_translation(x, y);
+                    svg_renderer.render_id(*ras_ptr, sl, renb, feature.id(), matrix, sym.get_opacity(),bbox);
+                }
+            }
+            if (placed)
+                pixmap_.add_feature(feature);
+        }
+    }
+    else
+    {
+        stroke const& stroke_ = sym.get_stroke();
+        double strk_width = stroke_.get_width();
+        
+        double w;
+        double h;
+        unsigned int res = pixmap_.get_resolution();
+        if (res != 1) {
+            // clamp to at least 4 px otherwise interactive pixels can be too small
+            double min = static_cast<double>(4/pixmap_.get_resolution());
+            w = std::max(sym.get_width()/res,min);
+            h = std::max(sym.get_height()/res,min);
+        } else {
+            w = sym.get_width()/res;
+            h = sym.get_height()/res;
+        }
+    
+        arrow arrow_;
+        box2d<double> extent;
+
+        double dx = w + (2*strk_width);
+        double dy = h + (2*strk_width);
+
+        if (marker_type == ARROW)
+        {
+            extent = arrow_.extent();
+            double x1 = extent.minx();
+            double y1 = extent.miny();
+            double x2 = extent.maxx();
+            double y2 = extent.maxy();
+            tr.transform(&x1,&y1);
+            tr.transform(&x2,&y2);
+            extent.init(x1,y1,x2,y2);
+        }
+        else
+        {
+            double x1 = -1 *(dx);
+            double y1 = -1 *(dy);
+            double x2 = dx;
+            double y2 = dy;
+            tr.transform(&x1,&y1);
+            tr.transform(&x2,&y2);
+            extent.init(x1,y1,x2,y2);
+        }
+    
+        double x;
+        double y;
+        double z=0;
+
+        for (unsigned i=0; i<feature.num_geometries(); ++i)
+        {
+            geometry_type const& geom = feature.get_geometry(i);
+            if (placement_method == MARKER_POINT_PLACEMENT || geom.num_points() <= 1)
+            {
+                geom.label_position(&x,&y);
+                prj_trans.backward(x,y,z);
+                t_.forward(&x,&y);
+                int px = int(floor(x - 0.5 * dx));
+                int py = int(floor(y - 0.5 * dy));
+                box2d<double> label_ext (px, py, px + dx +1, py + dy +1);
+
+                if (sym.get_allow_overlap() ||
+                    detector_.has_placement(label_ext))
+                {
+                    agg::ellipse c(x, y, w, h);
+                    agg::path_storage marker;
+                    marker.concat_path(c);
+                    ras_ptr->add_path(marker);
+                    
+                    // outline
+                    if (strk_width)
+                    {
+                        agg::conv_stroke<agg::path_storage>  outline(marker);
+                        outline.generator().width(strk_width * scale_factor_);
+                        ras_ptr->add_path(outline);
+                    }
+
+                    detector_.insert(label_ext);
+                }
+            }
+            else
+            {
+                
+                agg::path_storage marker;
+                if (marker_type == ARROW)
+                    marker.concat_path(arrow_);
+
+                path_type path(t_,geom,prj_trans);
+                markers_placement<path_type, label_collision_detector4> placement(path, extent, detector_, 
+                                                                                  sym.get_spacing() * scale_factor_, 
+                                                                                  sym.get_max_error(), 
+                                                                                  sym.get_allow_overlap());        
+                double x_t, y_t, angle;
+            
+                while (placement.get_point(&x_t, &y_t, &angle))
+                {
+                    agg::trans_affine matrix;
+
+                    if (marker_type == ELLIPSE)
+                    {
+                        // todo proper bbox - this is buggy
+                        agg::ellipse c(x_t, y_t, w, h);
+                        marker.concat_path(c);
+                        agg::trans_affine matrix;
+                        matrix *= agg::trans_affine_translation(-x_t,-y_t);
+                        matrix *= agg::trans_affine_rotation(angle);
+                        matrix *= agg::trans_affine_translation(x_t,y_t);
+                        marker.transform(matrix);
+                    }
+                    else
+                    {
+                        matrix = tr * agg::trans_affine_rotation(angle) * agg::trans_affine_translation(x_t, y_t);
+                    }
+
+                    agg::conv_transform<agg::path_storage, agg::trans_affine> trans(marker, matrix);
+
+                    // fill
+                    ras_ptr->add_path(trans);
+
+                    // outline
+                    if (strk_width)
+                    {
+                        agg::conv_stroke<agg::conv_transform<agg::path_storage, agg::trans_affine> >  outline(trans);
+                        outline.generator().width(strk_width * scale_factor_);
+                        ras_ptr->add_path(outline);
+                    }
+                }
+            }
+
+        }
+        ren.color(mapnik::gray16(feature.id()));
+        agg::render_scanlines(*ras_ptr, sl, ren);
+        pixmap_.add_feature(feature);
+    }
+}
+
+template void grid_renderer<grid>::process(markers_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+}
diff --git a/src/grid/process_point_symbolizer.cpp b/src/grid/process_point_symbolizer.cpp
new file mode 100644
index 0000000..4012a44
--- /dev/null
+++ b/src/grid/process_point_symbolizer.cpp
@@ -0,0 +1,100 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/grid/grid_rasterizer.hpp>
+#include <mapnik/grid/grid_renderer.hpp>
+#include <mapnik/grid/grid_pixfmt.hpp>
+#include <mapnik/grid/grid_pixel.hpp>
+#include <mapnik/grid/grid.hpp>
+#include <mapnik/expression_evaluator.hpp>
+
+#include <mapnik/marker_cache.hpp>
+
+// stl
+#include <string>
+
+namespace mapnik {
+
+template <typename T>
+void grid_renderer<T>::process(point_symbolizer const& sym,
+                              Feature const& feature,
+                              proj_transform const& prj_trans)
+{
+    std::string filename = path_processor_type::evaluate(*sym.get_filename(), feature);
+    
+    boost::optional<mapnik::marker_ptr> marker;
+    if ( !filename.empty() )
+    {
+        marker = marker_cache::instance()->find(filename, true);
+    }
+    else
+    {
+        marker.reset(boost::shared_ptr<mapnik::marker> (new mapnik::marker()));
+    }
+
+    if (marker)
+    {
+        for (unsigned i=0; i<feature.num_geometries(); ++i)
+        {
+            geometry_type const& geom = feature.get_geometry(i);
+            double x;
+            double y;
+            double z=0;
+            if (sym.get_point_placement() == CENTROID_POINT_PLACEMENT)
+                geom.label_position(&x, &y);
+            else
+                geom.label_interior_position(&x, &y);
+
+            prj_trans.backward(x,y,z);
+            t_.forward(&x,&y);
+
+            int w = (*marker)->width() * (1.0/pixmap_.get_resolution());
+            int h = (*marker)->height() * (1.0/pixmap_.get_resolution());
+
+            int px = int(floor(x - 0.5 * w));
+            int py = int(floor(y - 0.5 * h));
+            box2d<double> label_ext (px, py, px + w, py + h);
+            if (sym.get_allow_overlap() ||
+                detector_.has_placement(label_ext))
+            {
+                agg::trans_affine tr;
+                boost::array<double,6> const& m = sym.get_transform();
+                tr.load_from(&m[0]);
+
+                render_marker(feature,pixmap_.get_resolution(),px,py,**marker,tr, sym.get_opacity());
+
+                if (!sym.get_ignore_placement())
+                    detector_.insert(label_ext);
+            }
+        }
+    }
+
+}
+
+template void grid_renderer<grid>::process(point_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+
+}
+ 
diff --git a/src/grid/process_polygon_pattern_symbolizer.cpp b/src/grid/process_polygon_pattern_symbolizer.cpp
new file mode 100644
index 0000000..0f3b63f
--- /dev/null
+++ b/src/grid/process_polygon_pattern_symbolizer.cpp
@@ -0,0 +1,84 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/grid/grid_rasterizer.hpp>
+#include <mapnik/grid/grid_renderer.hpp>
+#include <mapnik/grid/grid_pixfmt.hpp>
+#include <mapnik/grid/grid_pixel.hpp>
+#include <mapnik/grid/grid.hpp>
+
+// agg
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_renderer_scanline.h"
+#include "agg_scanline_bin.h"
+
+// stl
+#include <string>
+#include <map>
+
+namespace mapnik {
+
+template <typename T>
+void grid_renderer<T>::process(polygon_pattern_symbolizer const& sym,
+                              Feature const& feature,
+                              proj_transform const& prj_trans)
+{
+    typedef coord_transform2<CoordTransform,geometry_type> path_type;
+    typedef agg::renderer_base<mapnik::pixfmt_gray16> ren_base;
+    typedef agg::renderer_scanline_bin_solid<ren_base> renderer;
+    agg::scanline_bin sl;
+
+    grid_rendering_buffer buf(pixmap_.raw_data(), width_, height_, width_);
+    mapnik::pixfmt_gray16 pixf(buf);
+
+    ren_base renb(pixf);
+    renderer ren(renb);
+
+    ras_ptr->reset();
+
+    for (unsigned i=0;i<feature.num_geometries();++i)
+    {
+        geometry_type const& geom = feature.get_geometry(i);
+        if (geom.num_points() > 2)
+        {
+            path_type path(t_,geom,prj_trans);
+            ras_ptr->add_path(path);
+        }
+    }
+       
+    // render id
+    ren.color(mapnik::gray16(feature.id()));
+    agg::render_scanlines(*ras_ptr, sl, ren);
+
+    // add feature properties to grid cache
+    pixmap_.add_feature(feature);
+}
+
+
+template void grid_renderer<grid>::process(polygon_pattern_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+
+}
+ 
diff --git a/src/grid/process_polygon_symbolizer.cpp b/src/grid/process_polygon_symbolizer.cpp
new file mode 100644
index 0000000..6b410a4
--- /dev/null
+++ b/src/grid/process_polygon_symbolizer.cpp
@@ -0,0 +1,83 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/grid/grid_rasterizer.hpp>
+#include <mapnik/grid/grid_renderer.hpp>
+#include <mapnik/grid/grid_pixfmt.hpp>
+#include <mapnik/grid/grid_pixel.hpp>
+#include <mapnik/grid/grid.hpp>
+
+// agg
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_renderer_scanline.h"
+#include "agg_scanline_bin.h"
+
+// stl
+#include <string>
+#include <map>
+
+namespace mapnik {
+
+template <typename T>
+void grid_renderer<T>::process(polygon_symbolizer const& sym,
+                              Feature const& feature,
+                              proj_transform const& prj_trans)
+{
+    typedef coord_transform2<CoordTransform,geometry_type> path_type;
+    typedef agg::renderer_base<mapnik::pixfmt_gray16> ren_base;
+    typedef agg::renderer_scanline_bin_solid<ren_base> renderer;
+    agg::scanline_bin sl;
+
+    grid_rendering_buffer buf(pixmap_.raw_data(), width_, height_, width_);
+    mapnik::pixfmt_gray16 pixf(buf);
+
+    ren_base renb(pixf);
+    renderer ren(renb);
+
+    ras_ptr->reset();
+    for (unsigned i=0;i<feature.num_geometries();++i)
+    {
+        geometry_type const& geom = feature.get_geometry(i);
+        if (geom.num_points() > 2)
+        {
+            path_type path(t_,geom,prj_trans);
+            ras_ptr->add_path(path);
+        }
+    }
+       
+    // render id
+    ren.color(mapnik::gray16(feature.id()));
+    agg::render_scanlines(*ras_ptr, sl, ren);
+
+    // add feature properties to grid cache
+    pixmap_.add_feature(feature);
+}
+
+
+template void grid_renderer<grid>::process(polygon_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+
+}
+ 
diff --git a/src/grid/process_raster_symbolizer.cpp b/src/grid/process_raster_symbolizer.cpp
new file mode 100644
index 0000000..23a0110
--- /dev/null
+++ b/src/grid/process_raster_symbolizer.cpp
@@ -0,0 +1,42 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/grid/grid_renderer.hpp>
+
+namespace mapnik {
+
+
+template <typename T>
+void grid_renderer<T>::process(raster_symbolizer const& sym,
+                              Feature const& feature,
+                              proj_transform const& prj_trans)
+{
+    std::clog << "grid_renderer does not yet support raster_symbolizer\n";
+}
+
+template void grid_renderer<grid>::process(raster_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+
+}
diff --git a/src/grid/process_shield_symbolizer.cpp b/src/grid/process_shield_symbolizer.cpp
new file mode 100644
index 0000000..1b2c37b
--- /dev/null
+++ b/src/grid/process_shield_symbolizer.cpp
@@ -0,0 +1,247 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/grid/grid_rasterizer.hpp>
+#include <mapnik/grid/grid_renderer.hpp>
+#include <mapnik/grid/grid_pixfmt.hpp>
+#include <mapnik/grid/grid_pixel.hpp>
+#include <mapnik/grid/grid.hpp>
+
+#include <mapnik/expression_evaluator.hpp>
+#include <mapnik/marker_cache.hpp>
+#include <mapnik/svg/svg_converter.hpp>
+#include <mapnik/svg/svg_renderer.hpp>
+#include <mapnik/svg/svg_path_adapter.hpp>
+
+// agg
+#include "agg_trans_affine.h"
+
+namespace mapnik {
+
+template <typename T>
+void  grid_renderer<T>::process(shield_symbolizer const& sym,
+                               Feature const& feature,
+                               proj_transform const& prj_trans)
+{
+    typedef  coord_transform2<CoordTransform,geometry_type> path_type;
+
+    bool placement_found = false;
+
+    text_placement_info_ptr placement_options = sym.get_placement_options()->get_placement_info();
+    placement_options->next();
+    placement_options->next_position_only();
+
+    UnicodeString text;
+    if( sym.get_no_text() )
+        text = UnicodeString( " " );  // TODO: fix->use 'space' as the text to render
+    else
+    {
+        expression_ptr name_expr = sym.get_name();
+        if (!name_expr) return;
+        value_type result = boost::apply_visitor(evaluate<Feature,value_type>(feature),*name_expr);
+        text = result.to_unicode();
+    }
+    
+    if ( sym.get_text_transform() == UPPERCASE)
+    {
+        text = text.toUpper();
+    }
+    else if ( sym.get_text_transform() == LOWERCASE)
+    {
+        text = text.toLower();
+    }
+    else if ( sym.get_text_transform() == CAPITALIZE)
+    {
+        text = text.toTitle(NULL);
+    }
+    
+    agg::trans_affine tr;
+    boost::array<double,6> const& m = sym.get_transform();
+    tr.load_from(&m[0]);
+    tr = agg::trans_affine_scaling(scale_factor_) * tr;
+    
+    std::string filename = path_processor_type::evaluate( *sym.get_filename(), feature);
+    boost::optional<mapnik::marker_ptr> marker;
+    if ( !filename.empty() )
+    {
+        marker = marker_cache::instance()->find(filename, true);
+    }
+    else
+    {
+        marker.reset(boost::shared_ptr<mapnik::marker> (new mapnik::marker()));
+    }
+    
+    if (text.length() > 0 && marker)
+    {
+        face_set_ptr faces;
+
+        if (sym.get_fontset().size() > 0)
+        {
+            faces = font_manager_.get_face_set(sym.get_fontset());
+        }
+        else
+        {
+            faces = font_manager_.get_face_set(sym.get_face_name());
+        }
+
+        stroker_ptr strk = font_manager_.get_stroker();
+        if (strk && faces->size() > 0)
+        {
+            text_renderer<T> ren(pixmap_, faces, *strk);
+
+            ren.set_pixel_size(sym.get_text_size() * scale_factor_ * (1.0/pixmap_.get_resolution()));
+            ren.set_fill(sym.get_fill());
+            ren.set_halo_fill(sym.get_halo_fill());
+            ren.set_halo_radius(sym.get_halo_radius() * scale_factor_);
+            ren.set_opacity(sym.get_text_opacity());
+
+            placement_finder<label_collision_detector4> finder(detector_);
+
+            string_info info(text);
+
+            faces->get_string_info(info);
+
+            // TODO- clamp to at least 4 px otherwise interactivity is too small
+            int w = (*marker)->width()/pixmap_.get_resolution();
+            int h = (*marker)->height()/pixmap_.get_resolution();
+
+            for (unsigned i = 0; i < feature.num_geometries(); ++i)
+            {
+                geometry_type const& geom = feature.get_geometry(i);
+                if (geom.num_points() > 0 )
+                {
+                    path_type path(t_,geom,prj_trans);
+
+                    label_placement_enum how_placed = sym.get_label_placement();
+                    if (how_placed == POINT_PLACEMENT || how_placed == VERTEX_PLACEMENT || how_placed == INTERIOR_PLACEMENT)
+                    {
+                        // for every vertex, try and place a shield/text
+                        geom.rewind(0);
+                        placement text_placement(info, sym, scale_factor_, w, h, false);
+                        text_placement.avoid_edges = sym.get_avoid_edges();
+                        text_placement.allow_overlap = sym.get_allow_overlap();
+                        position const& pos = sym.get_displacement();
+                        position const& shield_pos = sym.get_shield_displacement();
+                        for( unsigned jj = 0; jj < geom.num_points(); jj++ )
+                        {
+                            double label_x;
+                            double label_y;
+                            double z=0.0;
+
+                            if( how_placed == VERTEX_PLACEMENT )
+                                geom.vertex(&label_x,&label_y);  // by vertex
+                            else if( how_placed == INTERIOR_PLACEMENT )
+                                geom.label_interior_position(&label_x,&label_y);
+                            else
+                                geom.label_position(&label_x, &label_y);  // by middle of line or by point
+                            prj_trans.backward(label_x,label_y, z);
+                            t_.forward(&label_x,&label_y);
+
+                            label_x += boost::get<0>(shield_pos);
+                            label_y += boost::get<1>(shield_pos);
+
+                            finder.find_point_placement( text_placement, placement_options, label_x, label_y, 0.0,
+                                                         sym.get_line_spacing(),
+                                                         sym.get_character_spacing());
+
+                            // check to see if image overlaps anything too, there is only ever 1 placement found for points and verticies
+                            if( text_placement.placements.size() > 0)
+                            {
+                                placement_found = true;
+                                double x = floor(text_placement.placements[0].starting_x);
+                                double y = floor(text_placement.placements[0].starting_y);
+                                int px;
+                                int py;
+                                box2d<double> label_ext;
+
+                                if( !sym.get_unlock_image() )
+                                {
+                                    // center image at text center position
+                                    // remove displacement from image label
+                                    double lx = x - boost::get<0>(pos);
+                                    double ly = y - boost::get<1>(pos);
+                                    px=int(floor(lx - (0.5 * w)));
+                                    py=int(floor(ly - (0.5 * h)));
+                                    label_ext.init( floor(lx - 0.5 * w), floor(ly - 0.5 * h), ceil (lx + 0.5 * w), ceil (ly + 0.5 * h) );
+                                }
+                                else
+                                {  // center image at reference location
+                                    px=int(floor(label_x - 0.5 * w));
+                                    py=int(floor(label_y - 0.5 * h));
+                                    label_ext.init( floor(label_x - 0.5 * w), floor(label_y - 0.5 * h), ceil (label_x + 0.5 * w), ceil (label_y + 0.5 * h));
+                                }
+
+                                if ( sym.get_allow_overlap() || detector_.has_placement(label_ext) )
+                                {
+                                    render_marker(feature,pixmap_.get_resolution(),px,py,**marker,tr,sym.get_opacity());
+
+                                    box2d<double> dim = ren.prepare_glyphs(&text_placement.placements[0]);
+                                    ren.render_id(feature.id(),x,y,2);
+                                    detector_.insert(label_ext);
+                                    finder.update_detector(text_placement);
+                                }
+                            }
+                        }
+                    }
+
+                    else if (geom.num_points() > 1 && how_placed == LINE_PLACEMENT)
+                    {
+                        placement text_placement(info, sym, scale_factor_, w, h, true);
+
+                        text_placement.avoid_edges = sym.get_avoid_edges();
+                        finder.find_point_placements<path_type>(text_placement, placement_options, path);
+
+                        position const&  pos = sym.get_displacement();
+                        for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ ii)
+                        {
+                            placement_found= true;
+                            double x = floor(text_placement.placements[ii].starting_x);
+                            double y = floor(text_placement.placements[ii].starting_y);
+
+                            double lx = x - boost::get<0>(pos);
+                            double ly = y - boost::get<1>(pos);
+                            int px=int(floor(lx - (0.5*w)));
+                            int py=int(floor(ly - (0.5*h)));
+
+                            render_marker(feature,pixmap_.get_resolution(),px,py,**marker,tr,sym.get_opacity());
+
+                            box2d<double> dim = ren.prepare_glyphs(&text_placement.placements[ii]);
+                            ren.render_id(feature.id(),x,y,2);
+                        }
+                        finder.update_detector(text_placement);
+                    }
+                }
+            }
+        }
+    }
+    if (placement_found)
+        pixmap_.add_feature(feature);
+    
+}
+
+template void grid_renderer<grid>::process(shield_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+
+}
diff --git a/src/grid/process_text_symbolizer.cpp b/src/grid/process_text_symbolizer.cpp
new file mode 100644
index 0000000..6e3c1b5
--- /dev/null
+++ b/src/grid/process_text_symbolizer.cpp
@@ -0,0 +1,157 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/grid/grid_renderer.hpp>
+#include <mapnik/font_engine_freetype.hpp>
+#include <mapnik/expression_evaluator.hpp>
+
+namespace mapnik {
+
+template <typename T>
+void grid_renderer<T>::process(text_symbolizer const& sym,
+                              Feature const& feature,
+                              proj_transform const& prj_trans)
+{
+    typedef  coord_transform2<CoordTransform,geometry_type> path_type;
+
+    bool placement_found = false;
+    text_placement_info_ptr placement_options = sym.get_placement_options()->get_placement_info();
+    while (!placement_found && placement_options->next())
+    {
+        expression_ptr name_expr = sym.get_name();
+        if (!name_expr) return;
+        value_type result = boost::apply_visitor(evaluate<Feature,value_type>(feature),*name_expr);
+        UnicodeString text = result.to_unicode();
+
+        if ( sym.get_text_transform() == UPPERCASE)
+        {
+            text = text.toUpper();
+        }
+        else if ( sym.get_text_transform() == LOWERCASE)
+        {
+            text = text.toLower();
+        }
+        else if ( sym.get_text_transform() == CAPITALIZE)
+        {
+            text = text.toTitle(NULL);
+        }
+
+        if ( text.length() <= 0 ) continue;
+        color const& fill = sym.get_fill();
+
+        face_set_ptr faces;
+
+        if (sym.get_fontset().size() > 0)
+        {
+            faces = font_manager_.get_face_set(sym.get_fontset());
+        }
+        else
+        {
+            faces = font_manager_.get_face_set(sym.get_face_name());
+        }
+
+        stroker_ptr strk = font_manager_.get_stroker();
+        if (!(faces->size() > 0 && strk))
+        {
+            throw config_error("Unable to find specified font face '" + sym.get_face_name() + "'");
+        }
+        text_renderer<T> ren(pixmap_, faces, *strk);
+        ren.set_pixel_size(placement_options->text_size * (scale_factor_ * (1.0/pixmap_.get_resolution())));
+        ren.set_fill(fill);
+        ren.set_halo_fill(sym.get_halo_fill());
+        ren.set_halo_radius(sym.get_halo_radius() * scale_factor_);
+        ren.set_opacity(sym.get_text_opacity());
+
+        // /pixmap_.get_resolution() ?
+        box2d<double> dims(0,0,width_,height_);
+        placement_finder<label_collision_detector4> finder(detector_,dims);
+
+        string_info info(text);
+
+        faces->get_string_info(info);
+        unsigned num_geom = feature.num_geometries();
+        for (unsigned i=0; i<num_geom; ++i)
+        {
+            geometry_type const& geom = feature.get_geometry(i);
+            if (geom.num_points() == 0) continue; // don't bother with empty geometries
+            while (!placement_found && placement_options->next_position_only())
+            {
+                placement text_placement(info, sym, scale_factor_);
+                text_placement.avoid_edges = sym.get_avoid_edges();
+                if (sym.get_label_placement() == POINT_PLACEMENT ||
+                        sym.get_label_placement() == INTERIOR_PLACEMENT)
+                {
+                    double label_x, label_y, z=0.0;
+                    if (sym.get_label_placement() == POINT_PLACEMENT)
+                        geom.label_position(&label_x, &label_y);
+                    else
+                        geom.label_interior_position(&label_x, &label_y);
+                    prj_trans.backward(label_x,label_y, z);
+                    t_.forward(&label_x,&label_y);
+
+                    double angle = 0.0;
+                    expression_ptr angle_expr = sym.get_orientation();
+                    if (angle_expr)
+                    {
+                        // apply rotation
+                        value_type result = boost::apply_visitor(evaluate<Feature,value_type>(feature),*angle_expr);
+                        angle = result.to_double();
+                    }
+
+                    finder.find_point_placement(text_placement, placement_options,
+                                                label_x, label_y,
+                                                angle, sym.get_line_spacing(),
+                                                sym.get_character_spacing());
+
+                    finder.update_detector(text_placement);
+                }
+                else if ( geom.num_points() > 1 && sym.get_label_placement() == LINE_PLACEMENT)
+                {
+                    path_type path(t_,geom,prj_trans);
+                    finder.find_line_placements<path_type>(text_placement, placement_options, path);
+                }
+
+                if (!text_placement.placements.size()) continue;
+                placement_found = true;
+
+                for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ii)
+                {
+                    double x = text_placement.placements[ii].starting_x;
+                    double y = text_placement.placements[ii].starting_y;
+                    ren.prepare_glyphs(&text_placement.placements[ii]);
+                    ren.render_id(feature.id(),x,y,2);
+                }
+            }
+        }
+    }
+    if (placement_found)
+        pixmap_.add_feature(feature);
+}
+
+template void grid_renderer<grid>::process(text_symbolizer const&,
+                                              Feature const&,
+                                              proj_transform const&);
+
+}
+ 
diff --git a/src/image_reader.cpp b/src/image_reader.cpp
index cefb0ec..5045380 100644
--- a/src/image_reader.cpp
+++ b/src/image_reader.cpp
@@ -27,23 +27,28 @@
 
 namespace mapnik
 {  
-    typedef factory<ImageReader,std::string, 
-                    ImageReader* (*)(const std::string&)>  ImageReaderFactory;
+typedef factory<image_reader,std::string, 
+                image_reader* (*)(const std::string&)>  ImageReaderFactory;
     
     
-    bool register_image_reader(const std::string& type,ImageReader* (* fun)(const std::string&))
-    {
-        return ImageReaderFactory::instance()->register_product(type,fun);
-    }
+bool register_image_reader(const std::string& type,image_reader* (* fun)(const std::string&))
+{
+    return ImageReaderFactory::instance()->register_product(type,fun);
+}
     
-    ImageReader* get_image_reader(const std::string& filename,const std::string& type) 
+image_reader* get_image_reader(const std::string& filename,const std::string& type) 
+{
+    return ImageReaderFactory::instance()->create_object(type,filename);
+}
+
+image_reader* get_image_reader(const std::string& filename) 
+{
+    boost::optional<std::string> type = type_from_filename(filename);
+    if (type)
     {
-        return ImageReaderFactory::instance()->create_object(type,filename);
+        return ImageReaderFactory::instance()->create_object(*type,filename);
     }
+    return 0;
+}
 
-   ImageReader* get_image_reader(const std::string& filename) 
-   {
-      std::string type = type_from_filename(filename);
-      return ImageReaderFactory::instance()->create_object(type,filename);
-   }
 }
diff --git a/src/image_util.cpp b/src/image_util.cpp
index 1057b6e..dc1fbbe 100644
--- a/src/image_util.cpp
+++ b/src/image_util.cpp
@@ -30,10 +30,19 @@ extern "C"
 // mapnik
 #include <mapnik/image_util.hpp>
 #include <mapnik/png_io.hpp>
-#include <mapnik/jpeg_io.hpp>
 #include <mapnik/graphics.hpp>
 #include <mapnik/memory.hpp>
 #include <mapnik/image_view.hpp>
+#include <mapnik/palette.hpp>
+#include <mapnik/map.hpp>
+
+// boost
+#include <boost/lexical_cast.hpp>
+
+// jpeg
+#if defined(HAVE_JPEG)
+#include <mapnik/jpeg_io.hpp>
+#endif
 
 #ifdef HAVE_CAIRO
 #include <mapnik/cairo_renderer.hpp>
@@ -48,211 +57,719 @@ extern "C"
 #include <fstream>
 #include <sstream>
 
+// agg
+//#include "agg_conv_transform.h"
+#include "agg_image_accessors.h"
+#include "agg_pixfmt_rgba.h"
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_renderer_scanline.h"
+#include "agg_rendering_buffer.h"
+#include "agg_scanline_u.h"
+//#include "agg_scanline_p.h"
+#include "agg_span_allocator.h"
+#include "agg_span_image_filter_rgba.h"
+#include "agg_span_interpolator_linear.h"
+#include "agg_trans_affine.h"
+#include "agg_image_filters.h"
+
+
 namespace mapnik
 {    
-    template <typename T>
-    std::string save_to_string(T const& image,
-                               std::string const& type)
+
+template <typename T>
+std::string save_to_string(T const& image,
+                           std::string const& type,
+                           rgba_palette const& palette)
+{
+    std::ostringstream ss(std::ios::out|std::ios::binary);
+    save_to_stream(image, ss, type, palette);
+    return ss.str();
+}
+
+template <typename T>
+std::string save_to_string(T const& image,
+                           std::string const& type)
+{
+    std::ostringstream ss(std::ios::out|std::ios::binary);
+    save_to_stream(image, ss, type);
+    return ss.str();
+}
+
+template <typename T>
+void save_to_file(T const& image,
+                  std::string const& filename,
+                  std::string const& type,
+                  rgba_palette const& palette)
+{
+    std::ofstream file (filename.c_str(), std::ios::out| std::ios::trunc|std::ios::binary);
+    if (file)
     {
-        std::ostringstream ss(std::ios::out|std::ios::binary);
-        save_to_stream(image, ss, type);
-        return ss.str();
+        save_to_stream(image, file, type, palette);
     }
+    else throw ImageWriterException("Could not write file to " + filename );
+}
 
-    template <typename T>
-    void save_to_file(T const& image,
-                      std::string const& filename,
-                      std::string const& type)
+template <typename T>
+void save_to_file(T const& image,
+                  std::string const& filename,
+                  std::string const& type)
+{
+    std::ofstream file (filename.c_str(), std::ios::out| std::ios::trunc|std::ios::binary);
+    if (file)
     {
-        std::ofstream file (filename.c_str(), std::ios::out| std::ios::trunc|std::ios::binary);
-        if (file)
-        {
-            save_to_stream(image, file, type);
-        }
-        else throw ImageWriterException("Could not write file to " + filename );
+        save_to_stream(image, file, type);
     }
+    else throw ImageWriterException("Could not write file to " + filename );
+}
 
-    template <typename T>
-    void save_to_stream(T const& image,
-                      std::ostream & stream,
-                      std::string const& type)
+void handle_png_options(std::string const& type,
+                       int * colors,
+                       int * compression,
+                       int * strategy,
+                       int * trans_mode,
+                       double * gamma,
+                       bool * use_octree)
+{
+    if (type == "png" || type == "png24" || type == "png32")
     {
-        if (stream)
+        // Shortcut when the user didn't specify any flags after the colon.
+        // Paletted images specify "png8 or png256".
+        *colors = -1;
+        return;
+    }
+    // TODO - convert to spirit parser
+    if (type.length() > 6){
+        boost::char_separator<char> sep(":");
+        boost::tokenizer< boost::char_separator<char> > tokens(type, sep);
+        BOOST_FOREACH(std::string t, tokens)
         {
-            //all this should go into image_writer factory
-            if (type == "png")  save_as_png(stream, image);
-            else if (boost::algorithm::istarts_with(type, std::string("png256")) ||
-                     boost::algorithm::istarts_with(type, std::string("png8"))
-                     ) 
+            if (t == "png" || t == "png24" || t == "png32")
             {
-                int colors  = 256;
-                int trans_mode = -1;
-                double gamma = -1;
-                bool use_octree = true;
-                if (type.length() > 6){
-                    boost::char_separator<char> sep(":");
-                    boost::tokenizer< boost::char_separator<char> > tokens(type, sep);
-                    BOOST_FOREACH(string t, tokens)
-                    {
-                        if (t == "m=h")
-                        {
-                            use_octree = false;
-                        }
-                        if (t == "m=o")
-                        {
-                            use_octree = true;
-                        }
-                        if (boost::algorithm::istarts_with(t,std::string("c=")))
-                        {
-                            try 
-                            {
-                                colors = boost::lexical_cast<int>(t.substr(2));
-                                if (colors < 0 || colors > 256)
-                                    throw ImageWriterException("invalid color parameter: " + t.substr(2) + " out of bounds");
-                            }
-                            catch(boost::bad_lexical_cast &)
-                            {
-                                throw ImageWriterException("invalid color parameter: " + t.substr(2));
-                            }
-                        }
-                        if (boost::algorithm::istarts_with(t, std::string("t=")))
-                        {
-                            try 
-                            {
-                                trans_mode= boost::lexical_cast<int>(t.substr(2));
-                                if (trans_mode < 0 || trans_mode > 2)
-                                    throw ImageWriterException("invalid trans_mode parameter: " + t.substr(2) + " out of bounds");
-                            }
-                            catch(boost::bad_lexical_cast &)
-                            {
-                                throw ImageWriterException("invalid trans_mode parameter: " + t.substr(2));
-                            }
-                        }
-                        if (boost::algorithm::istarts_with(t, std::string("g=")))
-                        {
-                            try 
-                            {
-                                gamma= boost::lexical_cast<double>(t.substr(2));
-                                if (gamma < 0)
-                                    throw ImageWriterException("invalid gamma parameter: " + t.substr(2) + " out of bounds");
-                            }
-                            catch(boost::bad_lexical_cast &)
-                            {
-                                throw ImageWriterException("invalid gamma parameter: " + t.substr(2));
-                            }
-                        }
-                    }
-
+                *colors = -1;
+            }
+            else if (t == "m=h")
+            {
+                *use_octree = false;
+            }
+            else if (t == "m=o")
+            {
+                *use_octree = true;
+            }
+            else if (boost::algorithm::istarts_with(t,std::string("c=")))
+            {
+                try 
+                {
+                    if (*colors < 0)
+                        throw ImageWriterException("invalid color parameter: unavailable for true color images");
+                    *colors = boost::lexical_cast<int>(t.substr(2));
+                    if (*colors < 0 || *colors > 256)
+                        throw ImageWriterException("invalid color parameter: " + t.substr(2) + " out of bounds");
+                }
+                catch(boost::bad_lexical_cast &)
+                {
+                    throw ImageWriterException("invalid color parameter: " + t.substr(2));
+                }
+            }
+            else if (boost::algorithm::istarts_with(t, std::string("t=")))
+            {
+                try 
+                {
+                    if (*colors < 0)
+                        throw ImageWriterException("invalid trans_mode parameter: unavailable for true color images");
+                    *trans_mode = boost::lexical_cast<int>(t.substr(2));
+                    if (*trans_mode < 0 || *trans_mode > 2)
+                        throw ImageWriterException("invalid trans_mode parameter: " + t.substr(2) + " out of bounds");
+                }
+                catch(boost::bad_lexical_cast &)
+                {
+                    throw ImageWriterException("invalid trans_mode parameter: " + t.substr(2));
                 }
-                if (use_octree)
-                    save_as_png256(stream, image, colors);
-                else
-                    save_as_png256_hex(stream, image, colors, trans_mode, gamma);
             }
-            else if (boost::algorithm::istarts_with(type,std::string("jpeg")))
+            else if (boost::algorithm::istarts_with(t, std::string("g=")))
             {
-                int quality = 85;
                 try 
                 {
-                    if(type.substr(4).length() != 0)
-                    {
-                        quality = boost::lexical_cast<int>(type.substr(4));
-                        if(quality<0 || quality>100)
-                            throw ImageWriterException("invalid jpeg quality: " + type.substr(4) + " out of bounds");
-                    }
-                    save_as_jpeg(stream, quality, image); 
-                } 
+                    if (*colors < 0)
+                        throw ImageWriterException("invalid gamma parameter: unavailable for true color images");
+                    *gamma = boost::lexical_cast<double>(t.substr(2));
+                    if (*gamma < 0)
+                        throw ImageWriterException("invalid gamma parameter: " + t.substr(2) + " out of bounds");
+                }
                 catch(boost::bad_lexical_cast &)
                 {
-                    throw ImageWriterException("invalid jpeg quality: " + type.substr(4) + " not a number");
+                    throw ImageWriterException("invalid gamma parameter: " + t.substr(2));
+                }
+            }
+            else if (boost::algorithm::istarts_with(t,std::string("z=")))
+            {
+                try
+                {
+                    *compression = boost::lexical_cast<int>(t.substr(2));
+                    /*
+                     #define Z_NO_COMPRESSION         0
+                     #define Z_BEST_SPEED             1
+                     #define Z_BEST_COMPRESSION       9
+                     #define Z_DEFAULT_COMPRESSION  (-1)
+                    */
+                     if (*compression < Z_DEFAULT_COMPRESSION || *compression > Z_BEST_COMPRESSION)
+                        throw ImageWriterException("invalid compression parameter: " + t.substr(2) + " out of bounds (only -1 through 9 are valid)");
+                }
+                catch(boost::bad_lexical_cast &)
+                {
+                    throw ImageWriterException("invalid compression parameter: " + t.substr(2));
+                }
+            }
+            else if (boost::algorithm::istarts_with(t,std::string("s=")))
+            {
+                try
+                {
+                    std::string s = boost::lexical_cast<std::string>(t.substr(2));
+                    if (s == "default") *strategy = Z_DEFAULT_STRATEGY;
+                    else if (s == "filtered") *strategy = Z_FILTERED;
+                    else if (s == "huff") *strategy = Z_HUFFMAN_ONLY;
+                    else if (s == "rle") *strategy = Z_RLE;
+                    else
+                        throw ImageWriterException("invalid compression strategy parameter: " + s);
+                }
+                catch(boost::bad_lexical_cast &)
+                {
+                    throw ImageWriterException("invalid compression strategy parameter: " + t.substr(2));
                 }
             }
-            else throw ImageWriterException("unknown file type: " + type);
         }
-        else throw ImageWriterException("Could not write to empty stream" );
     }
+}
 
-	
-    template <typename T>
-    void save_to_file(T const& image,std::string const& filename)
+template <typename T>
+void save_to_stream(T const& image,
+                    std::ostream & stream,
+                    std::string const& type,
+                    rgba_palette const& palette)
+{
+    if (stream)
     {
-        std::string type = type_from_filename(filename);
-        save_to_file<T>(image,filename,type);
+        //all this should go into image_writer factory
+        if (type == "png" || boost::algorithm::istarts_with(type, std::string("png")))
+        {
+            int colors  = 256;
+            int compression = Z_DEFAULT_COMPRESSION;
+            int strategy = Z_DEFAULT_STRATEGY;
+            int trans_mode = -1;
+            double gamma = -1;
+            bool use_octree = true;
+
+            handle_png_options(type,
+                              &colors,
+                              &compression,
+                              &strategy,
+                              &trans_mode,
+                              &gamma,
+                              &use_octree);
+
+            if (palette.valid())
+                save_as_png8_pal(stream, image, palette, compression, strategy);
+            else if (colors < 0)
+                save_as_png(stream, image, compression, strategy);
+            else if (use_octree)
+                save_as_png8_oct(stream, image, colors, compression, strategy);
+            else
+                save_as_png8_hex(stream, image, colors, compression, strategy, trans_mode, gamma);
+        }
+#if defined(HAVE_JPEG)
+        else if (boost::algorithm::istarts_with(type,std::string("jpeg")))
+        {
+            throw ImageWriterException("palettes are not currently supported when writing to jpeg format");
+        }
+#endif
+        else throw ImageWriterException("unknown file type: " + type);
+    } 
+    else throw ImageWriterException("Could not write to empty stream" );
+}
+
+
+template <typename T>
+void save_to_stream(T const& image,
+                    std::ostream & stream,
+                    std::string const& type)
+{
+    if (stream)
+    {
+        //all this should go into image_writer factory
+        if (type == "png" || boost::algorithm::istarts_with(type, std::string("png")))
+        {
+            int colors  = 256;
+            int compression = Z_DEFAULT_COMPRESSION;
+            int strategy = Z_DEFAULT_STRATEGY;
+            int trans_mode = -1;
+            double gamma = -1;
+            bool use_octree = true;
+
+            handle_png_options(type,
+                              &colors,
+                              &compression,
+                              &strategy,
+                              &trans_mode,
+                              &gamma,
+                              &use_octree);
+
+            if (colors < 0)
+                save_as_png(stream, image, compression, strategy);
+            else if (use_octree)
+                save_as_png8_oct(stream, image, colors, compression, strategy);
+            else
+                save_as_png8_hex(stream, image, colors, compression, strategy, trans_mode, gamma);
+        }
+#if defined(HAVE_JPEG)
+        else if (boost::algorithm::istarts_with(type,std::string("jpeg")))
+        {
+            int quality = 85;
+            try 
+            {
+                if(type.substr(4).length() != 0)
+                {
+                    quality = boost::lexical_cast<int>(type.substr(4));
+                    if(quality<0 || quality>100)
+                        throw ImageWriterException("invalid jpeg quality: " + type.substr(4) + " out of bounds");
+                }
+                save_as_jpeg(stream, quality, image); 
+            } 
+            catch(boost::bad_lexical_cast &)
+            {
+                throw ImageWriterException("invalid jpeg quality: " + type.substr(4) + " not a number");
+            }
+        }
+#endif
+        else throw ImageWriterException("unknown file type: " + type);
+    } 
+    else throw ImageWriterException("Could not write to empty stream" );
+}
+
+template <typename T>
+void save_to_file(T const& image, std::string const& filename)
+{
+    boost::optional<std::string> type = type_from_filename(filename);
+    if (type)
+    {
+        save_to_file<T>(image, filename, *type);
     }
+}
 
+template <typename T>
+void save_to_file(T const& image, std::string const& filename, rgba_palette const& palette)
+{
+    boost::optional<std::string> type = type_from_filename(filename);
+    if (type)
+    {
+        save_to_file<T>(image, filename, *type, palette);
+    }
+}
 
 #if defined(HAVE_CAIRO)
-    // TODO - move to separate cairo_io.hpp
-    void save_to_cairo_file(mapnik::Map const& map, std::string const& filename)
+// TODO - move to separate cairo_io.hpp
+void save_to_cairo_file(mapnik::Map const& map, std::string const& filename)
+{
+    boost::optional<std::string> type = type_from_filename(filename);
+    if (type)
     {
-        std::string type = type_from_filename(filename);
-        save_to_cairo_file(map,filename,type);
+        save_to_cairo_file(map,filename,*type);
     }
+}
 
-    void save_to_cairo_file(mapnik::Map const& map,
-                      std::string const& filename,
-                      std::string const& type)
+void save_to_cairo_file(mapnik::Map const& map,
+                        std::string const& filename,
+                        std::string const& type)
+{
+    std::ofstream file (filename.c_str(), std::ios::out|std::ios::trunc|std::ios::binary);
+    if (file)
     {
-        std::ofstream file (filename.c_str(), std::ios::out|std::ios::trunc|std::ios::binary);
-        if (file)
-        {
-          Cairo::RefPtr<Cairo::Surface> surface;
-          unsigned width = map.getWidth();
-          unsigned height = map.getHeight();
-          if (type == "pdf")
-              surface = Cairo::PdfSurface::create(filename,width,height);
-          else if (type == "svg")
-              surface = Cairo::SvgSurface::create(filename,width,height);
-          else if (type == "ps")
-              surface = Cairo::PsSurface::create(filename,width,height);
-          else if (type == "ARGB32")
-              surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32,width,height);
-          else if (type == "RGB24")
-              surface = Cairo::ImageSurface::create(Cairo::FORMAT_RGB24,width,height);
-          else 
-              throw ImageWriterException("unknown file type: " + type);    
-          Cairo::RefPtr<Cairo::Context> context = Cairo::Context::create(surface);
+        Cairo::RefPtr<Cairo::Surface> surface;
+        unsigned width = map.width();
+        unsigned height = map.height();
+        if (type == "pdf")
+            surface = Cairo::PdfSurface::create(filename,width,height);
+        else if (type == "svg")
+            surface = Cairo::SvgSurface::create(filename,width,height);
+        else if (type == "ps")
+            surface = Cairo::PsSurface::create(filename,width,height);
+        else if (type == "ARGB32")
+            surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32,width,height);
+        else if (type == "RGB24")
+            surface = Cairo::ImageSurface::create(Cairo::FORMAT_RGB24,width,height);
+        else 
+            throw ImageWriterException("unknown file type: " + type);    
+        Cairo::RefPtr<Cairo::Context> context = Cairo::Context::create(surface);
     
-          // TODO - expose as user option
-          /*
+        // TODO - expose as user option
+        /*
           if (type == "ARGB32" || type == "RGB24") 
           { 
-              context->set_antialias(Cairo::ANTIALIAS_NONE); 
+          context->set_antialias(Cairo::ANTIALIAS_NONE); 
           }
-          */
+        */
           
     
-          mapnik::cairo_renderer<Cairo::Context> ren(map, context);
-          ren.apply();
+        mapnik::cairo_renderer<Cairo::Context> ren(map, context);
+        ren.apply();
     
-          if (type == "ARGB32" || type == "RGB24") 
-          { 
-              surface->write_to_png(filename);
-          }
-          surface->finish();
+        if (type == "ARGB32" || type == "RGB24") 
+        { 
+            surface->write_to_png(filename);
         }
+        surface->finish();
     }
+}
 
 #endif
 
-    template void save_to_file<ImageData32>(ImageData32 const&,
-                                            std::string const&,
-                                            std::string const&);
-                                            
-    template void save_to_file<ImageData32>(ImageData32 const&,
-                                            std::string const&);
+template void save_to_file<image_data_32>(image_data_32 const&,
+                                          std::string const&,
+                                          std::string const&);
+
+template void save_to_file<image_data_32>(image_data_32 const&,
+                                          std::string const&,
+                                          std::string const&,
+                                          rgba_palette const& palette);
+
+template void save_to_file<image_data_32>(image_data_32 const&,
+                                          std::string const&);
+
+template void save_to_file<image_data_32>(image_data_32 const&,
+                                          std::string const&,
+                                          rgba_palette const& palette);
 
-    template std::string save_to_string<ImageData32>(ImageData32 const&,
-                                                     std::string const&);
+template std::string save_to_string<image_data_32>(image_data_32 const&,
+                                                   std::string const&);
 
-    template void save_to_file<image_view<ImageData32> > (image_view<ImageData32> const&,
-                                                          std::string const&,
-                                                          std::string const&);
+template std::string save_to_string<image_data_32>(image_data_32 const&,
+                                                   std::string const&,
+                                                   rgba_palette const& palette);
+
+template void save_to_file<image_view<image_data_32> > (image_view<image_data_32> const&,
+                                                        std::string const&,
+                                                        std::string const&);
+
+template void save_to_file<image_view<image_data_32> > (image_view<image_data_32> const&,
+                                                        std::string const&,
+                                                        std::string const&,
+                                                        rgba_palette const& palette);
+
+template void save_to_file<image_view<image_data_32> > (image_view<image_data_32> const&,
+                                                        std::string const&);
    
-    template void save_to_file<image_view<ImageData32> > (image_view<ImageData32> const&,
-                                                          std::string const&);
+template void save_to_file<image_view<image_data_32> > (image_view<image_data_32> const&,
+                                                        std::string const&,
+                                                        rgba_palette const& palette);
    
-    template std::string save_to_string<image_view<ImageData32> > (image_view<ImageData32> const&,
-                                                                   std::string const&);
+template std::string save_to_string<image_view<image_data_32> > (image_view<image_data_32> const&,
+                                                                 std::string const&);
+   
+template std::string save_to_string<image_view<image_data_32> > (image_view<image_data_32> const&,
+                                                                 std::string const&,
+                                                                 rgba_palette const& palette);
+
+
+
+// Image scaling functions
+
+scaling_method_e get_scaling_method_by_name (std::string name)
+{
+    // TODO - make into proper ENUMS
+    if (name == "fast" || name == "near")
+        return SCALING_NEAR;
+    else if (name == "bilinear")
+        return SCALING_BILINEAR;
+    else if (name == "cubic" || name == "bicubic")
+        return SCALING_BICUBIC;
+    else if (name == "spline16")
+        return SCALING_SPLINE16;
+    else if (name == "spline36")
+        return SCALING_SPLINE36;
+    else if (name == "hanning")
+        return SCALING_HANNING;
+    else if (name == "hamming")
+        return SCALING_HAMMING;
+    else if (name == "hermite")
+        return SCALING_HERMITE;
+    else if (name == "kaiser")
+        return SCALING_KAISER;
+    else if (name == "quadric")
+        return SCALING_QUADRIC;
+    else if (name == "catrom")
+        return SCALING_CATROM;
+    else if (name == "gaussian")
+        return SCALING_GAUSSIAN;
+    else if (name == "bessel")
+        return SCALING_BESSEL;
+    else if (name == "mitchell")
+        return SCALING_MITCHELL;
+    else if (name == "sinc")
+        return SCALING_SINC;
+    else if (name == "lanczos")
+        return SCALING_LANCZOS;
+    else if (name == "blackman")
+        return SCALING_BLACKMAN;
+    else
+        return SCALING_NEAR;
+}
+
+// this has been replaced by agg impl - see https://trac.mapnik.org/ticket/656
+
+template <typename Image>
+void scale_image_bilinear_old (Image& target,const Image& source, double x_off_f, double y_off_f)
+{
+
+    int source_width=source.width();
+    int source_height=source.height();
+
+    int target_width=target.width();
+    int target_height=target.height();
+
+    if (source_width<1 || source_height<1 ||
+        target_width<1 || target_height<1) return;
+    int x=0,y=0,xs=0,ys=0;
+    int tw2 = target_width/2;
+    int th2 = target_height/2;
+    int offs_x = rint((source_width-target_width-x_off_f*2*source_width)/2);
+    int offs_y = rint((source_height-target_height-y_off_f*2*source_height)/2);
+    unsigned yprt, yprt1, xprt, xprt1;
+
+    //no scaling or subpixel offset
+    if (target_height == source_height && target_width == source_width && offs_x == 0 && offs_y == 0){
+        for (y=0;y<target_height;++y)
+            target.setRow(y,source.getRow(y),target_width);
+        return;
+    }
+
+    for (y=0;y<target_height;++y)
+    {
+        ys = (y*source_height+offs_y)/target_height;
+        int ys1 = ys+1;
+        if (ys1>=source_height)
+            ys1--;
+        if (ys<0)
+            ys=ys1=0;
+        if (source_height/2<target_height)
+            yprt = (y*source_height+offs_y)%target_height;
+        else
+            yprt = th2;
+        yprt1 = target_height-yprt;
+        for (x=0;x<target_width;++x)
+        {
+            xs = (x*source_width+offs_x)/target_width;
+            if (source_width/2<target_width)
+                xprt = (x*source_width+offs_x)%target_width;
+            else
+                xprt = tw2;
+            xprt1 = target_width-xprt;
+            int xs1 = xs+1;
+            if (xs1>=source_width)
+                xs1--;
+            if (xs<0)
+                xs=xs1=0;
+
+            unsigned a = source(xs,ys);
+            unsigned b = source(xs1,ys);
+            unsigned c = source(xs,ys1);
+            unsigned d = source(xs1,ys1);
+            unsigned out=0;
+            unsigned t = 0;
+
+            for(int i=0; i<4; i++){
+                unsigned p,r,s;
+                // X axis
+                p = a&0xff;
+                r = b&0xff;
+                if (p!=r)
+                    r = (r*xprt+p*xprt1+tw2)/target_width;
+                p = c&0xff;
+                s = d&0xff;
+                if (p!=s)
+                    s = (s*xprt+p*xprt1+tw2)/target_width;
+                // Y axis
+                if (r!=s)
+                    r = (s*yprt+r*yprt1+th2)/target_height;
+                // channel up
+                out |= r << t;
+                t += 8;
+                a >>= 8;
+                b >>= 8;
+                c >>= 8;
+                d >>= 8;
+            }
+            target(x,y)=out;
+        }
+    }
+}
+
+
+template <typename Image>
+void scale_image_bilinear8 (Image& target,const Image& source, double x_off_f, double y_off_f)
+{
+
+    int source_width=source.width();
+    int source_height=source.height();
+
+    int target_width=target.width();
+    int target_height=target.height();
+
+    if (source_width<1 || source_height<1 ||
+        target_width<1 || target_height<1) return;
+    int x=0,y=0,xs=0,ys=0;
+    int tw2 = target_width/2;
+    int th2 = target_height/2;
+    int offs_x = rint((source_width-target_width-x_off_f*2*source_width)/2);
+    int offs_y = rint((source_height-target_height-y_off_f*2*source_height)/2);
+    unsigned yprt, yprt1, xprt, xprt1;
+
+    //no scaling or subpixel offset
+    if (target_height == source_height && target_width == source_width && offs_x == 0 && offs_y == 0){
+        for (y=0;y<target_height;++y)
+            target.setRow(y,source.getRow(y),target_width);
+        return;
+    }
+
+    for (y=0;y<target_height;++y)
+    {
+        ys = (y*source_height+offs_y)/target_height;
+        int ys1 = ys+1;
+        if (ys1>=source_height)
+            ys1--;
+        if (ys<0)
+            ys=ys1=0;
+        if (source_height/2<target_height)
+            yprt = (y*source_height+offs_y)%target_height;
+        else
+            yprt = th2;
+        yprt1 = target_height-yprt;
+        for (x=0;x<target_width;++x)
+        {
+            xs = (x*source_width+offs_x)/target_width;
+            if (source_width/2<target_width)
+                xprt = (x*source_width+offs_x)%target_width;
+            else
+                xprt = tw2;
+            xprt1 = target_width-xprt;
+            int xs1 = xs+1;
+            if (xs1>=source_width)
+                xs1--;
+            if (xs<0)
+                xs=xs1=0;
+
+            unsigned a = source(xs,ys);
+            unsigned b = source(xs1,ys);
+            unsigned c = source(xs,ys1);
+            unsigned d = source(xs1,ys1);
+            unsigned p,r,s;
+            // X axis
+            p = a&0xff;
+            r = b&0xff;
+            if (p!=r)
+                r = (r*xprt+p*xprt1+tw2)/target_width;
+            p = c&0xff;
+            s = d&0xff;
+            if (p!=s)
+                s = (s*xprt+p*xprt1+tw2)/target_width;
+            // Y axis
+            if (r!=s)
+                r = (s*yprt+r*yprt1+th2)/target_height;
+            target(x,y)=(0xff<<24) | (r<<16) | (r<<8) | r;
+        }
+    }
+}
+
+template <typename Image>
+void scale_image_agg (Image& target,const Image& source, scaling_method_e scaling_method, double scale_factor, double x_off_f, double y_off_f, double filter_radius, double ratio)
+{
+    typedef agg::pixfmt_rgba32_plain pixfmt;
+    typedef agg::renderer_base<pixfmt> renderer_base;
+    
+    // define some stuff we'll use soon
+    agg::rasterizer_scanline_aa<> ras;
+    agg::scanline_u8 sl;
+    agg::span_allocator<agg::rgba8> sa;
+    agg::image_filter_lut filter;
+    
+    // initialize source AGG buffer
+    agg::rendering_buffer rbuf_src((unsigned char*)source.getBytes(), source.width(), source.height(), source.width() * 4);
+    pixfmt pixf_src(rbuf_src);
+    
+    typedef agg::image_accessor_clone<pixfmt> img_src_type;
+    img_src_type img_src(pixf_src);
+    
+    // initialise destination AGG buffer (with transparency)
+    agg::rendering_buffer rbuf_dst((unsigned char*)target.getBytes(), target.width(), target.height(), target.width() * 4);
+    pixfmt pixf_dst(rbuf_dst);
+    renderer_base rb_dst(pixf_dst);
+    rb_dst.clear(agg::rgba(0, 0, 0, 0));
+    
+    // create a scaling matrix
+    agg::trans_affine img_mtx;
+    img_mtx /= agg::trans_affine_scaling(scale_factor * ratio, scale_factor * ratio);
+
+    // create a linear interpolator for our scaling matrix
+    typedef agg::span_interpolator_linear<> interpolator_type;
+    interpolator_type interpolator(img_mtx);
+    
+    // draw an anticlockwise polygon to render our image into
+    double scaled_width = source.width() * scale_factor;
+    double scaled_height = source.height() * scale_factor;
+    ras.reset();
+    ras.move_to_d(x_off_f,                y_off_f);
+    ras.line_to_d(x_off_f + scaled_width, y_off_f);
+    ras.line_to_d(x_off_f + scaled_width, y_off_f + scaled_height);
+    ras.line_to_d(x_off_f,                y_off_f + scaled_height);
+    
+    switch(scaling_method)
+    {
+        case SCALING_NEAR:
+        {
+            typedef agg::span_image_filter_rgba_nn<img_src_type, interpolator_type> span_gen_type;
+            span_gen_type sg(img_src, interpolator);
+            agg::render_scanlines_aa(ras, sl, rb_dst, sa, sg);
+            return;
+        }
+        case SCALING_BILINEAR:
+            filter.calculate(agg::image_filter_bilinear(), true); break;
+        case SCALING_BICUBIC:
+            filter.calculate(agg::image_filter_bicubic(), true); break;
+        case SCALING_SPLINE16:
+            filter.calculate(agg::image_filter_spline16(), true); break;
+        case SCALING_SPLINE36:
+            filter.calculate(agg::image_filter_spline36(), true); break;
+        case SCALING_HANNING:
+            filter.calculate(agg::image_filter_hanning(), true); break;
+        case SCALING_HAMMING:
+            filter.calculate(agg::image_filter_hamming(), true); break;
+        case SCALING_HERMITE:
+            filter.calculate(agg::image_filter_hermite(), true); break;
+        case SCALING_KAISER:
+            filter.calculate(agg::image_filter_kaiser(), true); break;
+        case SCALING_QUADRIC:
+            filter.calculate(agg::image_filter_quadric(), true); break;
+        case SCALING_CATROM:
+            filter.calculate(agg::image_filter_catrom(), true); break;
+        case SCALING_GAUSSIAN:
+            filter.calculate(agg::image_filter_gaussian(), true); break;
+        case SCALING_BESSEL:
+            filter.calculate(agg::image_filter_bessel(), true); break;
+        case SCALING_MITCHELL:
+            filter.calculate(agg::image_filter_mitchell(), true); break;
+        case SCALING_SINC:
+            filter.calculate(agg::image_filter_sinc(filter_radius), true); break;
+        case SCALING_LANCZOS:
+            filter.calculate(agg::image_filter_lanczos(filter_radius), true); break;
+        case SCALING_BLACKMAN:
+            filter.calculate(agg::image_filter_blackman(filter_radius), true); break;
+    }
+    typedef agg::span_image_resample_rgba_affine<img_src_type> span_gen_type;
+    span_gen_type sg(img_src, interpolator, filter);
+    agg::render_scanlines_aa(ras, sl, rb_dst, sa, sg);
+}
+
+template void scale_image_agg<image_data_32> (image_data_32& target,const image_data_32& source, scaling_method_e scaling_method, double scale_factor, double x_off_f, double y_off_f, double filter_radius, double ratio);
+
+template void scale_image_bilinear_old<image_data_32> (image_data_32& target,const image_data_32& source, double x_off_f, double y_off_f);
+
+template void scale_image_bilinear8<image_data_32> (image_data_32& target,const image_data_32& source, double x_off_f, double y_off_f);
 
 }
diff --git a/src/jpeg_reader.cpp b/src/jpeg_reader.cpp
new file mode 100644
index 0000000..6f665da
--- /dev/null
+++ b/src/jpeg_reader.cpp
@@ -0,0 +1,178 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id: jpeg_reader.cpp 33 2005-04-04 13:01:03Z dane $
+
+// mapnik
+#include <mapnik/image_reader.hpp>
+#include <mapnik/color.hpp>
+
+// jpeg
+extern "C"
+{
+#include <jpeglib.h>
+}
+
+// boost
+#include <boost/scoped_array.hpp>
+#include <boost/utility.hpp>
+
+// stl
+#include <stdio.h>
+
+#ifdef MAPNIK_DEBUG
+#include <iostream>
+#endif
+
+namespace mapnik
+{
+    class JpegReader : public image_reader, boost::noncopyable
+    {
+    private:
+        std::string fileName_;
+        unsigned width_;
+        unsigned height_;
+    public:
+        explicit JpegReader(const std::string& fileName);
+        ~JpegReader();
+        unsigned width() const;
+        unsigned height() const;
+        void read(unsigned x,unsigned y,image_data_32& image);
+    private:
+        void init();
+    };
+  
+    namespace 
+    {
+        image_reader* createJpegReader(const std::string& file)
+        {
+            return new JpegReader(file);
+        }
+        const bool registered = register_image_reader("jpeg",createJpegReader);
+    }
+
+    JpegReader::JpegReader(const std::string& fileName) 
+        : fileName_(fileName),
+          width_(0),
+          height_(0)
+    {
+        init();
+    }
+
+    JpegReader::~JpegReader() {}
+
+    void JpegReader::init()
+    {
+        FILE *fp = fopen(fileName_.c_str(),"rb");
+        if (!fp) throw image_reader_exception("JPEG Reader: cannot open image file " + fileName_);
+
+        struct jpeg_decompress_struct cinfo;
+        struct jpeg_error_mgr jerr;
+                
+        cinfo.err = jpeg_std_error(&jerr);
+
+        jpeg_create_decompress(&cinfo);
+        jpeg_stdio_src(&cinfo, fp);
+        jpeg_read_header(&cinfo, TRUE);
+
+        jpeg_start_decompress(&cinfo);        
+        width_ = cinfo.output_width;
+        height_ = cinfo.output_height;
+        // if enabled: "Application transferred too few scanlines"
+        //jpeg_finish_decompress(&cinfo);
+        jpeg_destroy_decompress(&cinfo);
+        fclose(fp);
+    }
+
+    unsigned JpegReader::width() const 
+    {
+        return width_;
+    }
+
+    unsigned JpegReader::height() const 
+    {
+        return height_;
+    }
+    
+    void JpegReader::read(unsigned x0, unsigned y0, image_data_32& image) 
+    {
+        struct jpeg_decompress_struct cinfo;
+
+        FILE *fp = fopen(fileName_.c_str(),"rb");
+        if (!fp) throw image_reader_exception("JPEG Reader: cannot open image file " + fileName_);
+
+        struct jpeg_error_mgr jerr;
+        cinfo.err = jpeg_std_error(&jerr);
+
+        jpeg_create_decompress(&cinfo);
+        jpeg_stdio_src(&cinfo, fp);
+
+        jpeg_read_header(&cinfo, TRUE);
+        if (cinfo.out_color_space == JCS_UNKNOWN)
+            throw image_reader_exception("JPEG Reader: failed to read unknown color space in " + fileName_);
+        
+        jpeg_start_decompress(&cinfo);
+
+        if (cinfo.output_width == 0) {
+          jpeg_destroy_decompress (&cinfo);
+          fclose(fp);
+          throw image_reader_exception("JPEG Reader: failed to read image size of " + fileName_);
+        }
+
+        JSAMPARRAY buffer;
+        int row_stride;
+        unsigned char a,r,g,b;
+        row_stride = cinfo.output_width * cinfo.output_components;
+        buffer = (*cinfo.mem->alloc_sarray) ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
+
+        unsigned w = std::min(unsigned(image.width()),width_);
+        unsigned h = std::min(unsigned(image.height()),height_);
+        
+        boost::scoped_array<unsigned int> out_row(new unsigned int[w]);
+        // TODO - handle x0
+        for (unsigned i=0;i<h;++i)
+        {
+            jpeg_read_scanlines(&cinfo, buffer, 1);
+            if (i>=y0 && i<h) 
+            {
+                for (unsigned int x=0; x<w; x++)
+                {
+                    a = 255; // alpha not supported in jpg
+                    r = buffer[0][cinfo.output_components * x];
+                    if (cinfo.output_components > 2)
+                    {
+                        g = buffer[0][cinfo.output_components*x+1];
+                        b = buffer[0][cinfo.output_components*x+2];
+                    } else {
+                        g = r;
+                        b = r;
+                    }
+                    out_row[x] = color(r, g, b, a).rgba();
+                }
+                image.setRow(i-y0, out_row.get(), w);
+            } 
+        }
+        jpeg_finish_decompress(&cinfo);
+        jpeg_destroy_decompress(&cinfo);
+        fclose(fp);
+    }
+}
diff --git a/src/layer.cpp b/src/layer.cpp
index 8e955ad..ba40a85 100644
--- a/src/layer.cpp
+++ b/src/layer.cpp
@@ -25,197 +25,207 @@
 // mapnik
 #include <mapnik/layer.hpp>
 
-#include <mapnik/style.hpp>
 #include <mapnik/datasource.hpp>
 #include <mapnik/datasource_cache.hpp>
-// boost
-#include <boost/shared_ptr.hpp>
+
 // stl
 #include <string>
 #include <iostream>
 
-using namespace std;
-using boost::shared_ptr;
 
 namespace mapnik
 {   
-    Layer::Layer(std::string const& name, std::string const& srs)
-        : name_(name),
-          title_(""),
-          abstract_(""),
-          srs_(srs),
-          minZoom_(0),
-          maxZoom_(std::numeric_limits<double>::max()),
-          active_(true),
-          queryable_(false),
-          clear_label_cache_(false),
-          ds_() {}
+layer::layer(std::string const& name, std::string const& srs)
+    : name_(name),
+      title_(""),
+      abstract_(""),
+      srs_(srs),
+      minZoom_(0),
+      maxZoom_(std::numeric_limits<double>::max()),
+      active_(true),
+      queryable_(false),
+      clear_label_cache_(false),
+      cache_features_(false),
+      ds_() {}
     
-    Layer::Layer(const Layer& rhs)
-        : name_(rhs.name_),
-          title_(rhs.title_),
-          abstract_(rhs.abstract_),
-          srs_(rhs.srs_),
-          minZoom_(rhs.minZoom_),
-          maxZoom_(rhs.maxZoom_),
-          active_(rhs.active_),
-          queryable_(rhs.queryable_),
-          clear_label_cache_(rhs.clear_label_cache_),
-          styles_(rhs.styles_),
-          ds_(rhs.ds_) {}
+layer::layer(const layer& rhs)
+    : name_(rhs.name_),
+      title_(rhs.title_),
+      abstract_(rhs.abstract_),
+      srs_(rhs.srs_),
+      minZoom_(rhs.minZoom_),
+      maxZoom_(rhs.maxZoom_),
+      active_(rhs.active_),
+      queryable_(rhs.queryable_),
+      clear_label_cache_(rhs.clear_label_cache_),
+      cache_features_(rhs.cache_features_),
+      styles_(rhs.styles_),
+      ds_(rhs.ds_) {}
     
-    Layer& Layer::operator=(const Layer& rhs)
-    {
-        Layer tmp(rhs);
-        swap(tmp);
-        return *this;
-    }
-
-    bool Layer::operator==(Layer const& other) const
-    {
-        return (this == &other);
-    }
+layer& layer::operator=(const layer& rhs)
+{
+    layer tmp(rhs);
+    swap(tmp);
+    return *this;
+}
+
+bool layer::operator==(layer const& other) const
+{
+    return (this == &other);
+}
     
-    void Layer::swap(const Layer& rhs)
-    {
-        name_=rhs.name_;
-        title_=rhs.title_;
-        abstract_=rhs.abstract_;
-	srs_ = rhs.srs_;
-        minZoom_=rhs.minZoom_;
-        maxZoom_=rhs.maxZoom_;
-        active_=rhs.active_;
-        queryable_=rhs.queryable_;
-	clear_label_cache_ = rhs.clear_label_cache_;
-        styles_=rhs.styles_;
-        ds_=rhs.ds_;
-    }
-
-    Layer::~Layer() {}
+void layer::swap(const layer& rhs)
+{
+    name_=rhs.name_;
+    title_=rhs.title_;
+    abstract_=rhs.abstract_;
+    srs_ = rhs.srs_;
+    minZoom_=rhs.minZoom_;
+    maxZoom_=rhs.maxZoom_;
+    active_=rhs.active_;
+    queryable_=rhs.queryable_;
+    clear_label_cache_ = rhs.clear_label_cache_;
+    cache_features_ = rhs.cache_features_;
+    styles_=rhs.styles_;
+    ds_=rhs.ds_;
+}
+
+layer::~layer() {}
     
-    void Layer::set_name( std::string const& name)
-    {
-        name_ = name;
-    }
+void layer::set_name( std::string const& name)
+{
+    name_ = name;
+}
  
-    string const& Layer::name() const
-    {
-        return name_;
-    }
-
-    void Layer::set_title( std::string const& title)
-    {
-        title_ = title;
-    }
+std::string const& layer::name() const
+{
+    return name_;
+}
+
+void layer::set_title( std::string const& title)
+{
+    title_ = title;
+}
  
-    string const& Layer::title() const
-    {
-        return title_;
-    }
+std::string const& layer::title() const
+{
+    return title_;
+}
     
-    void Layer::set_abstract( std::string const& abstract)
-    {
-        abstract_ = abstract;
-    }
+void layer::set_abstract( std::string const& abstract)
+{
+    abstract_ = abstract;
+}
  
-    string const& Layer::abstract() const
-    {
-        return abstract_;
-    }
-
-    void Layer::set_srs(std::string const& srs)
-    {
-        srs_ = srs;
-    }
+std::string const& layer::abstract() const
+{
+    return abstract_;
+}
+
+void layer::set_srs(std::string const& srs)
+{
+    srs_ = srs;
+}
     
-    std::string const& Layer::srs() const
-    {
-        return srs_;
-    }
+std::string const& layer::srs() const
+{
+    return srs_;
+}
     
-    void Layer::add_style(std::string const& stylename)
-    {
-        styles_.push_back(stylename);
-    }
+void layer::add_style(std::string const& stylename)
+{
+    styles_.push_back(stylename);
+}
     
-    std::vector<std::string> const& Layer::styles() const
-    {
-        return styles_;
-    }
+std::vector<std::string> const& layer::styles() const
+{
+    return styles_;
+}
     
-    std::vector<std::string> & Layer::styles()
-    {
-        return styles_;
-    }
-
-    void Layer::setMinZoom(double minZoom)
-    {
-        minZoom_=minZoom;
-    }
-
-    void Layer::setMaxZoom(double maxZoom)
-    {
-        maxZoom_=maxZoom;
-    }
-
-    double Layer::getMinZoom() const
-    {
-        return minZoom_;
-    }
-
-    double Layer::getMaxZoom() const
-    {
-        return maxZoom_;
-    }
-
-    void Layer::setActive(bool active)
-    {
-        active_=active;
-    }
-
-    bool Layer::isActive() const
-    {
-        return active_;
-    }
-
-    bool Layer::isVisible(double scale) const
-    {
-        return isActive() && scale >= minZoom_ - 1e-6 && scale < maxZoom_ + 1e-6;
-    }
-
-    void Layer::setQueryable(bool queryable)
-    {
-        queryable_=queryable;
-    }
-
-    bool Layer::isQueryable() const
-    {
-        return queryable_;
-    }
-
-    datasource_ptr Layer::datasource() const
-    {
-        return ds_;
-    }
+std::vector<std::string> & layer::styles()
+{
+    return styles_;
+}
+
+void layer::setMinZoom(double minZoom)
+{
+    minZoom_=minZoom;
+}
+
+void layer::setMaxZoom(double maxZoom)
+{
+    maxZoom_=maxZoom;
+}
+
+double layer::getMinZoom() const
+{
+    return minZoom_;
+}
+
+double layer::getMaxZoom() const
+{
+    return maxZoom_;
+}
+
+void layer::setActive(bool active)
+{
+    active_=active;
+}
+
+bool layer::isActive() const
+{
+    return active_;
+}
+
+bool layer::isVisible(double scale) const
+{
+    return isActive() && scale >= minZoom_ - 1e-6 && scale < maxZoom_ + 1e-6;
+}
+
+void layer::setQueryable(bool queryable)
+{
+    queryable_=queryable;
+}
+
+bool layer::isQueryable() const
+{
+    return queryable_;
+}
+
+datasource_ptr layer::datasource() const
+{
+    return ds_;
+}
     
-    void Layer::set_datasource(datasource_ptr const& ds)
-    {
-        ds_ = ds;
-    }
+void layer::set_datasource(datasource_ptr const& ds)
+{
+    ds_ = ds;
+}
     
-    Envelope<double> Layer::envelope() const
-    {
-        if (ds_) return ds_->envelope();
-    	return Envelope<double>();
-    }
+box2d<double> layer::envelope() const
+{
+    if (ds_) return ds_->envelope();
+    return box2d<double>();
+}
     
-   void Layer::set_clear_label_cache(bool clear)
-   {
-      clear_label_cache_ = clear;
-   }
+void layer::set_clear_label_cache(bool clear)
+{
+    clear_label_cache_ = clear;
+}
    
-   bool Layer::clear_label_cache() const
-   {
-      return clear_label_cache_;
-   }
+bool layer::clear_label_cache() const
+{
+    return clear_label_cache_;
+}
+
+void layer::set_cache_features(bool cache_features)
+{
+    cache_features_ = cache_features;
+}
+
+bool layer::cache_features() const
+{
+    return cache_features_;
+}
+
 }
diff --git a/src/libxml2_loader.cpp b/src/libxml2_loader.cpp
index 7a4ec2a..ec9392c 100644
--- a/src/libxml2_loader.cpp
+++ b/src/libxml2_loader.cpp
@@ -20,6 +20,8 @@
  *
  *****************************************************************************/
 
+#ifdef HAVE_LIBXML2
+
 #include <mapnik/libxml2_loader.hpp>
 
 #include <mapnik/config_error.hpp>
@@ -31,6 +33,7 @@
 #include <libxml/parser.h>
 #include <libxml/tree.h>
 #include <libxml/parserInternals.h>
+#include <libxml/xinclude.h>
 
 #include <iostream>
 
@@ -42,183 +45,194 @@ using namespace std;
 
 namespace mapnik 
 {
-    class libxml2_loader : boost::noncopyable
+class libxml2_loader : boost::noncopyable
+{
+public:
+    libxml2_loader(const char *encoding = NULL, int options = DEFAULT_OPTIONS, const char *url = NULL) :
+        ctx_( 0 ),
+        encoding_( encoding ),
+        options_( options ),
+        url_( url )
     {
-        public:
-            libxml2_loader(const char *encoding = NULL, int options = DEFAULT_OPTIONS, const char *url = NULL) :
-                ctx_( 0 ),
-                encoding_( encoding ),
-                options_( options ),
-                url_( url )
-            {
-                LIBXML_TEST_VERSION;
-                ctx_ = xmlNewParserCtxt();
-                if ( ! ctx_ )
-                {
-                    throw std::runtime_error("Failed to create parser context.");
-                }
-            }
+        LIBXML_TEST_VERSION;
+        ctx_ = xmlNewParserCtxt();
+        if ( ! ctx_ )
+        {
+            throw std::runtime_error("Failed to create parser context.");
+        }
+    }
 
-            ~libxml2_loader()
-            {
-                if (ctx_)
-                {
-                    xmlFreeParserCtxt(ctx_);    
-                }    
-            }
+    ~libxml2_loader()
+    {
+        if (ctx_)
+        {
+            xmlFreeParserCtxt(ctx_);    
+        }    
+    }
 
-            void load( const std::string & filename, ptree & pt )
+    void load( const std::string & filename, ptree & pt )
+    {
+        boost::filesystem::path path(filename);
+        if ( !boost::filesystem::exists( path ) ) {
+            throw config_error(string("Could not load map file '") +
+                               filename + "': File does not exist");
+        }
+
+        xmlDocPtr doc = xmlCtxtReadFile(ctx_, filename.c_str(), encoding_, options_);
+
+        if ( !doc )
+        {
+            xmlError * error = xmlCtxtGetLastError( ctx_ );
+            std::ostringstream os;
+            os << "XML document not well formed";
+            if (error)
             {
-                boost::filesystem::path path(filename);
-                if ( !boost::filesystem::exists( path ) ) {
-                    throw config_error(string("Could not load map file '") +
-                            filename + "': File does not exist");
-                }
-
-                xmlDocPtr doc = xmlCtxtReadFile(ctx_, filename.c_str(), encoding_, options_);
-
-                if ( !doc )
-                {
-                    xmlError * error = xmlCtxtGetLastError( ctx_ );
-                    std::ostringstream os;
-                    os << "XML document not well formed";
-                    if (error)
-                    {
-                        os << ": " << std::endl << error->message;
-                        // remove CR 
-                        std::string msg = os.str().substr(0, os.str().size() - 1);
-                        config_error ex( msg );
-
-                        os.str("");
-                        os << "(encountered in file '" << error->file << "' at line "
-                            << error->line << ")";
-
-                        ex.append_context( os.str() );
-
-                        throw ex;
-                    }
-                }
-
-                /*
-                   if ( ! ctx->valid ) 
-                   {
-                   std::clog << "### ERROR: Failed to validate DTD."
-                   << std::endl;
-                   }
-                 */
-                load(doc, pt);
+                os << ": " << std::endl << error->message;
+                // remove CR 
+                std::string msg = os.str().substr(0, os.str().size() - 1);
+                config_error ex( msg );
+
+                os.str("");
+                os << "(encountered in file '" << error->file << "' at line "
+                   << error->line << ")";
+
+                ex.append_context( os.str() );
+
+                throw ex;
             }
+        }
+
+        /*
+          if ( ! ctx->valid ) 
+          {
+          std::clog << "### ERROR: Failed to validate DTD."
+          << std::endl;
+          }
+        */
+        load(doc, pt);
+    }
+
+    void load( const int fd, ptree & pt )
+    {
+        xmlDocPtr doc = xmlCtxtReadFd(ctx_, fd, url_, encoding_, options_);
+        load(doc, pt);
+    }
 
-            void load( const int fd, ptree & pt )
+    void load_string( const std::string & buffer, ptree & pt, std::string const & base_path )
+    {
+        if (!base_path.empty())
+        {
+            boost::filesystem::path path(base_path);
+            if ( ! boost::filesystem::exists( path ) ) {
+                throw config_error(string("Could not locate base_path '") +
+                                   base_path + "': file or directory does not exist");
+            }                    
+        }
+
+        xmlDocPtr doc = xmlCtxtReadMemory(ctx_, buffer.data(), buffer.length(), base_path.c_str(), encoding_, options_);
+
+        load(doc, pt);
+    }
+
+    void load( const xmlDocPtr doc, ptree & pt )
+    {
+        if ( !doc )
+        {
+            xmlError * error = xmlCtxtGetLastError( ctx_ );
+            std::ostringstream os;
+            os << "XML document not well formed";
+            if (error)
             {
-                xmlDocPtr doc = xmlCtxtReadFd(ctx_, fd, url_, encoding_, options_);
-                load(doc, pt);
+                os << ": " << std::endl << error->message;
             }
+            throw config_error(os.str());
+        }
 
-            void load_string( const std::string & buffer, ptree & pt, std::string const & base_url )
+        int iXIncludeReturn = xmlXIncludeProcessFlags( doc, options_ );
+
+        if (iXIncludeReturn < 0)
+        {
+            xmlFreeDoc(doc);
+            throw config_error("XML XInclude error.  One or more files failed to load.");
+        }
+
+        xmlNode * root = xmlDocGetRootElement( doc );
+        if ( ! root ) {
+            xmlFreeDoc(doc);
+            throw config_error("XML document is empty.");
+        }
+
+        populate_tree( root, pt );
+        xmlFreeDoc(doc);
+    }
+
+private:
+    void append_attributes( xmlAttr * attributes, ptree & pt)
+    {
+        if (attributes)
+        {
+            ptree::iterator it = pt.push_back( ptree::value_type( "<xmlattr>", ptree() ));
+            ptree & attr_list = it->second;
+            xmlAttr * cur_attr = attributes;
+            for (; cur_attr; cur_attr = cur_attr->next )
             {
-                if (!base_url.empty())
-                {
-                    boost::filesystem::path path(base_url);
-                    if ( ! boost::filesystem::exists( path ) ) {
-                        throw config_error(string("Could not locate base_url '") +
-                                base_url + "': file or directory does not exist");
-                    }                    
-                }
-
-                xmlDocPtr doc = xmlCtxtReadMemory(ctx_, buffer.data(), buffer.length(), base_url.c_str(), encoding_, options_);
-
-                load(doc, pt);
+                ptree::iterator it = attr_list.push_back(
+                    ptree::value_type( (char*)cur_attr->name, ptree() ));
+                it->second.put_value( (char*) cur_attr->children->content );
             }
+        }
+    }
 
-            void load( const xmlDocPtr doc, ptree & pt )
+    void populate_tree( xmlNode * node, ptree & pt )
+    {
+        xmlNode * cur_node = node;
+
+        for (; cur_node; cur_node = cur_node->next )
+        {
+            switch (cur_node->type) 
+            {
+            case XML_ELEMENT_NODE:
             {
-                if ( !doc )
-                {
-                    xmlError * error = xmlCtxtGetLastError( ctx_ );
-                    std::ostringstream os;
-                    os << "XML document not well formed";
-                    if (error)
-                    {
-                        os << ": " << std::endl << error->message;
-                    }
-                    throw config_error(os.str());
-                }
-
-                xmlNode * root = xmlDocGetRootElement( doc );
-                if ( ! root ) {
-                    throw config_error("XML document is empty.");
-                }
-
-                populate_tree( root, pt );
-                xmlFreeDoc(doc);
+                ptree::iterator it = pt.push_back( ptree::value_type(
+                                                       (char*)cur_node->name, ptree() ));
+                append_attributes( cur_node->properties, it->second);
+                populate_tree( cur_node->children, it->second );
             }
-
-        private:
-            void append_attributes( xmlAttr * attributes, ptree & pt)
+            break;
+            case XML_TEXT_NODE:
+                pt.put_value( (char*) cur_node->content );
+                break;
+            case XML_COMMENT_NODE:
             {
-                if (attributes)
-                {
-                    ptree::iterator it = pt.push_back( ptree::value_type( "<xmlattr>", ptree() ));
-                    ptree & attr_list = it->second;
-                    xmlAttr * cur_attr = attributes;
-                    for (; cur_attr; cur_attr = cur_attr->next )
-                    {
-                        ptree::iterator it = attr_list.push_back(
-                                ptree::value_type( (char*)cur_attr->name, ptree() ));
-                        it->second.put_own( (char*) cur_attr->children->content );
-                    }
-                }
+                ptree::iterator it = pt.push_back(
+                    ptree::value_type( "<xmlcomment>", ptree() ));
+                it->second.put_value( (char*) cur_node->content );
             }
+            break;
+            default:
+                break;
 
-            void populate_tree( xmlNode * node, ptree & pt )
-            {
-                xmlNode * cur_node = node;
-
-                for (; cur_node; cur_node = cur_node->next )
-                {
-                    switch (cur_node->type) 
-                    {
-                        case XML_ELEMENT_NODE:
-                            {
-                                ptree::iterator it = pt.push_back( ptree::value_type(
-                                        (char*)cur_node->name, ptree() ));
-                                append_attributes( cur_node->properties, it->second);
-                                populate_tree( cur_node->children, it->second );
-                            }
-                            break;
-                        case XML_TEXT_NODE:
-                            pt.put_own( (char*) cur_node->content );
-                            break;
-                        case XML_COMMENT_NODE:
-                            {
-                                ptree::iterator it = pt.push_back(
-                                        ptree::value_type( "<xmlcomment>", ptree() ));
-                                it->second.put_own( (char*) cur_node->content );
-                            }
-                            break;
-                        default:
-                            break;
-
-                    }
-                }
             }
+        }
+    }
 
-            xmlParserCtxtPtr ctx_;
-            const char *encoding_;
-            int options_;
-            const char *url_;
-    };
+    xmlParserCtxtPtr ctx_;
+    const char *encoding_;
+    int options_;
+    const char *url_;
+};
 
-    void read_xml2( std::string const & filename, boost::property_tree::ptree & pt)
-    {
-        libxml2_loader loader;
-        loader.load( filename, pt );
-    }
-    void read_xml2_string( std::string const & str, boost::property_tree::ptree & pt, std::string const & base_url)
-    {
-        libxml2_loader loader;
-        loader.load_string( str, pt, base_url );
-    }
+void read_xml2( std::string const & filename, boost::property_tree::ptree & pt)
+{
+    libxml2_loader loader;
+    loader.load( filename, pt );
+}
+void read_xml2_string( std::string const & str, boost::property_tree::ptree & pt, std::string const & base_path)
+{
+    libxml2_loader loader;
+    loader.load_string( str, pt, base_path );
+}
 
 } // end of namespace mapnik
+
+#endif
diff --git a/src/line_pattern_symbolizer.cpp b/src/line_pattern_symbolizer.cpp
index eaea4b6..4703f98 100644
--- a/src/line_pattern_symbolizer.cpp
+++ b/src/line_pattern_symbolizer.cpp
@@ -21,23 +21,17 @@
  *****************************************************************************/
 
 //$Id$
+
 // mapnik
 #include <mapnik/line_pattern_symbolizer.hpp>
 
-#include <mapnik/image_reader.hpp>
-// stl
-#include <iostream>
-
 namespace mapnik
 {
     
-    line_pattern_symbolizer::line_pattern_symbolizer(std::string const& file,
-                                                     std::string const& type,
-                                                     unsigned width,unsigned height) 
-        : symbolizer_with_image( file, type, width, height )
-    { }
+line_pattern_symbolizer::line_pattern_symbolizer(path_expression_ptr file) 
+    : symbolizer_with_image(file), symbolizer_base() {}
 
-    line_pattern_symbolizer::line_pattern_symbolizer(line_pattern_symbolizer const& rhs)
-        : symbolizer_with_image(rhs) {}
+line_pattern_symbolizer::line_pattern_symbolizer(line_pattern_symbolizer const& rhs)
+    : symbolizer_with_image(rhs), symbolizer_base(rhs) {}
 
 }
diff --git a/src/line_symbolizer.cpp b/src/line_symbolizer.cpp
new file mode 100644
index 0000000..d6ae7e0
--- /dev/null
+++ b/src/line_symbolizer.cpp
@@ -0,0 +1,41 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+// mapnik
+#include <mapnik/line_symbolizer.hpp>
+#include <mapnik/enumeration.hpp>
+
+namespace mapnik
+{
+
+static const char * line_rasterizer_strings[] = {
+    "full",
+    "fast",
+    ""
+};
+
+
+IMPLEMENT_ENUM( line_rasterizer_e, line_rasterizer_strings )
+
+}
+
diff --git a/src/load_map.cpp b/src/load_map.cpp
index ea217fe..d891105 100644
--- a/src/load_map.cpp
+++ b/src/load_map.cpp
@@ -2,7 +2,7 @@
  *
  * This file is part of Mapnik (c++ mapping toolkit)
  *
- * Copyright (C) 2006 Artem Pavlenko
+ * Copyright (C) 2010 Artem Pavlenko
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -24,17 +24,30 @@
 
 #include <mapnik/version.hpp>
 #include <mapnik/image_reader.hpp>
-#include <mapnik/image_util.hpp>
 #include <mapnik/color.hpp>
 #include <mapnik/color_factory.hpp>
-#include <mapnik/filter_factory.hpp>
+#include <mapnik/symbolizer.hpp>
+#include <mapnik/feature_type_style.hpp>
+
 #include <mapnik/layer.hpp>
 #include <mapnik/datasource_cache.hpp>
 #include <mapnik/font_engine_freetype.hpp>
 #include <mapnik/font_set.hpp>
 
 #include <mapnik/ptree_helpers.hpp>
+#ifdef HAVE_LIBXML2
 #include <mapnik/libxml2_loader.hpp>
+#endif
+
+#include <mapnik/filter_factory.hpp>
+#include <mapnik/parse_path.hpp>
+#include <mapnik/raster_colorizer.hpp>
+
+#include <mapnik/svg/svg_path_parser.hpp>
+
+#include <mapnik/metawriter_factory.hpp>
+
+#include <mapnik/text_placements_simple.hpp>
 
 // boost
 #include <boost/optional.hpp>
@@ -46,6 +59,9 @@
 #include <boost/static_assert.hpp>
 #include <boost/filesystem/operations.hpp>
 
+// agg
+#include "agg_trans_affine.h"
+
 // stl
 #include <iostream>
 
@@ -64,35 +80,43 @@ using boost::optional;
 class map_parser : boost::noncopyable {
 public:
     map_parser( bool strict, std::string const& filename = "" ) :
-	strict_( strict ),
-	filename_( filename ),
-	relative_to_xml_(true),
-	font_manager_(font_engine_) {}
+        strict_( strict ),
+        filename_( filename ),
+        relative_to_xml_(true),
+        font_manager_(font_engine_) {}
 
-    void parse_map( Map & map, ptree const & sty);
+    void parse_map(Map & map, ptree const & sty, std::string const& base_path="");
 private:
-    void parse_style( Map & map, ptree const & sty);
-    void parse_layer( Map & map, ptree const & lay);
+    void parse_map_include( Map & map, ptree const & include);
+    void parse_style(Map & map, ptree const & sty);
+    void parse_layer(Map & map, ptree const & lay);
+    void parse_metawriter(Map & map, ptree const & lay);
+    void parse_metawriter_in_symbolizer(symbolizer_base &sym, ptree const &pt);
 
     void parse_fontset(Map & map, ptree const & fset);
-    void parse_font(FontSet & fset, ptree const & f);
+    void parse_font(font_set & fset, ptree const & f);
+
+    void parse_rule(feature_type_style & style, ptree const & r);
 
-    void parse_rule( feature_type_style & style, ptree const & r);
+    void parse_point_symbolizer(rule & rule, ptree const & sym);
+    void parse_line_pattern_symbolizer(rule & rule, ptree const & sym);
+    void parse_polygon_pattern_symbolizer(rule & rule, ptree const & sym);
+    void parse_text_symbolizer(rule & rule, ptree const & sym);
+    void parse_shield_symbolizer(rule & rule, ptree const & sym);
+    void parse_line_symbolizer(rule & rule, ptree const & sym);
+    void parse_polygon_symbolizer(rule & rule, ptree const & sym);
+    void parse_building_symbolizer(rule & rule, ptree const & sym );
+    void parse_raster_symbolizer(rule & rule, ptree const & sym );
+    void parse_markers_symbolizer(rule & rule, ptree const & sym );
+    void parse_glyph_symbolizer(rule & rule, ptree const & sym );
 
-    void parse_point_symbolizer( rule_type & rule, ptree const & sym);
-    void parse_line_pattern_symbolizer( rule_type & rule, ptree const & sym);
-    void parse_polygon_pattern_symbolizer( rule_type & rule, ptree const & sym);
-    void parse_text_symbolizer( rule_type & rule, ptree const & sym);
-    void parse_shield_symbolizer( rule_type & rule, ptree const & sym);
-    void parse_line_symbolizer( rule_type & rule, ptree const & sym);
-    void parse_polygon_symbolizer( rule_type & rule, ptree const & sym);
-    void parse_building_symbolizer( rule_type & rule, ptree const & sym );
-    void parse_raster_symbolizer( rule_type & rule, ptree const & sym );
-    void parse_markers_symbolizer( rule_type & rule, ptree const & sym );
+    void parse_raster_colorizer(raster_colorizer_ptr const& rc, ptree const& node );
+    void parse_stroke(stroke & strk, ptree const & sym);
 
     void ensure_font_face( const std::string & face_name );
 
     std::string ensure_relative_to_xml( boost::optional<std::string> opt_path );
+    void ensure_attrs( ptree const& sym, std::string name, std::string attrs);
 
     bool strict_;
     std::string filename_;
@@ -101,7 +125,8 @@ private:
     freetype_engine font_engine_;
     face_manager<freetype_engine> font_manager_;
     std::map<std::string,std::string> file_sources_;
-    std::map<std::string,FontSet> fontsets_;
+    std::map<std::string,font_set> fontsets_;
+
 };
 
 void load_map(Map & map, std::string const& filename, bool strict)
@@ -112,260 +137,386 @@ void load_map(Map & map, std::string const& filename, bool strict)
 #else
     try
     {
-	read_xml(filename, pt);
+        read_xml(filename, pt);
     }
     catch (const boost::property_tree::xml_parser_error & ex)
     {
-	throw config_error( ex.what() );
+        throw config_error( ex.what() );
     }
 #endif
     map_parser parser( strict, filename);
     parser.parse_map(map, pt);
 }
 
-void load_map_string(Map & map, std::string const& str, bool strict, std::string const& base_url)
+void load_map_string(Map & map, std::string const& str, bool strict, std::string const& base_path)
 {
     ptree pt;
 #ifdef HAVE_LIBXML2
-    read_xml2_string(str, pt, base_url);
+    if (!base_path.empty())
+        read_xml2_string(str, pt, base_path); // accept base_path passed into function
+    else
+        read_xml2_string(str, pt, map.base_path()); // default to map base_path
 #else
     try
     {
-	std::istringstream s(str);
-	read_xml(s,pt);
+        std::istringstream s(str);
+        // TODO - support base_path?
+        read_xml(s,pt);
     }
     catch (const boost::property_tree::xml_parser_error & ex)
     {
-	throw config_error( ex.what() ) ;
+        throw config_error( ex.what() ) ;
     }
 #endif
 
-    map_parser parser( strict, base_url);
-    parser.parse_map(map, pt);
+    map_parser parser( strict, base_path);
+    parser.parse_map(map, pt, base_path);
 }
 
-void map_parser::parse_map( Map & map, ptree const & pt )
+void map_parser::parse_map( Map & map, ptree const & pt, std::string const& base_path )
 {
     try
     {
-	ptree const & map_node = pt.get_child("Map");
-
-	try
-	{
-            optional<color> bgcolor = get_opt_attr<color>(map_node, "bgcolor");
-            if (bgcolor) {
-		map.set_background( * bgcolor );
-            }
-
-            map.set_srs( get_attr(map_node, "srs", map.srs() ));
-
-            optional<unsigned> buffer_size = get_opt_attr<unsigned>(map_node,"buffer_size");
-            if (buffer_size)
-            {
-		map.set_buffer_size(*buffer_size);
-            }
+        ptree const & map_node = pt.get_child("Map");
+
+        std::ostringstream s("");
+        s << "background-color,"
+          << "background-image,"
+          << "srs,"
+          << "buffer-size,"
+          << "paths-from-xml,"
+          << "minimum-version,"
+          << "font-directory,"
+          << "maximum-extent,"
+          << "base";
+        ensure_attrs(map_node, "Map", s.str());
+        
+        try
+        {
+            parameters extra_attr;
 
             // Check if relative paths should be interpreted as relative to/from XML location
             // Default is true, and map_parser::ensure_relative_to_xml will be called to modify path
-            optional<boolean> paths_from_xml = get_opt_attr<boolean>(map_node, "paths_from_xml");
+            optional<boolean> paths_from_xml = get_opt_attr<boolean>(map_node, "paths-from-xml");
             if (paths_from_xml)
             {
-		relative_to_xml_ = *paths_from_xml;
+                relative_to_xml_ = *paths_from_xml;
             }
 
-            optional<std::string> min_version_string = get_opt_attr<std::string>(map_node, "minimum_version");
-            if (min_version_string)
+            optional<std::string> base_path_from_xml = get_opt_attr<std::string>(map_node, "base");
+            if (!base_path.empty())
             {
-		boost::char_separator<char> sep(".");
-		boost::tokenizer<boost::char_separator<char> > tokens(*min_version_string,sep);
-		unsigned i = 0;
-		bool success = false;
-		int n[3];
-		for (boost::tokenizer<boost::char_separator<char> >::iterator beg=tokens.begin(); 
-		     beg!=tokens.end();++beg)
-		{
-		    try 
-		    {
-			n[i] = boost::lexical_cast<int>(boost::trim_copy(*beg));
-		    }
-		    catch (boost::bad_lexical_cast & ex)
-		    {
-			std::clog << *beg << " : " << ex.what() << "\n";
-			break;
-		    }
-		    if (i==2) 
-		    {
-			success = true;
-			break;
-		    }
-		    ++i;
-		}
-		if (success)
-		{
-		    int min_version = (n[0] * 100000) + (n[1] * 100) + (n[2]);
-		    if (min_version > MAPNIK_VERSION)
-		    {
-			throw config_error(std::string("This map uses features only present in Mapnik version ") + *min_version_string + " and newer");
-		    }
-		}
-                
+                map.set_base_path( base_path );
             }
-	}
-	catch (const config_error & ex)
-	{
-            ex.append_context("(in node Map)");
-            throw;
-	}
-
-	ptree::const_iterator itr = map_node.begin();
-	ptree::const_iterator end = map_node.end();
-
-	for (; itr != end; ++itr)
-	{
-            ptree::value_type const& v = *itr;
-
-            if (v.first == "Style")
+            else if (base_path_from_xml)
             {
-		parse_style( map, v.second );
+                map.set_base_path( *base_path_from_xml );
             }
-            else if (v.first == "Layer")
+            else
             {
-		parse_layer(map, v.second );
+                boost::filesystem::path xml_path(filename_);
+                // TODO - should we make this absolute?
+                #if (BOOST_FILESYSTEM_VERSION == 3)
+                    std::string base = xml_path.parent_path().string();
+                #else // v2
+                    std::string base = xml_path.branch_path().string();
+                #endif
+
+                map.set_base_path( base ); 
             }
-            else if (v.first == "FontSet")
+
+            optional<color> bgcolor = get_opt_attr<color>(map_node, "background-color");
+            if (bgcolor) 
             {
-		parse_fontset(map, v.second);
+                map.set_background( * bgcolor );
             }
-            else if (v.first == "FileSource")
+            
+            optional<std::string> image_filename = get_opt_attr<std::string>(map_node, "background-image");
+            if (image_filename)
+            {                
+                map.set_background_image(ensure_relative_to_xml(image_filename));
+            }
+            
+            map.set_srs( get_attr(map_node, "srs", map.srs() ));
+
+            optional<unsigned> buffer_size = get_opt_attr<unsigned>(map_node,"buffer-size");
+            if (buffer_size)
             {
-		std::string name = get_attr<string>( v.second, "name");
-		std::string value = get_own<string>( v.second, "");
-		file_sources_[name] = value;
+                map.set_buffer_size(*buffer_size);
             }
-            else if (v.first == "Datasource")
+
+            optional<std::string> maximum_extent = get_opt_attr<std::string>(map_node,"maximum-extent");
+            if (maximum_extent)
             {
-		std::string name = get_attr(v.second, "name", string("Unnamed"));
-		parameters params;
-		ptree::const_iterator paramIter = v.second.begin();
-		ptree::const_iterator endParam = v.second.end();
-		for (; paramIter != endParam; ++paramIter)
-		{
-		    ptree const& param = paramIter->second;
+                box2d<double> box;
+                if (box.from_string(*maximum_extent))
+                {
+                    map.set_maximum_extent(box);
+                }
+                else
+                {
+                    std::ostringstream s;
+                    s << "failed to parse 'maximum-extent'";
+                    if ( strict_ )
+                        throw config_error(s.str());
+                    else
+                        std::clog << "### WARNING: " << s.str() << std::endl;
+                }
+            }
 
-		    if (paramIter->first == "Parameter")
-		    {
-			std::string name = get_attr<string>(param, "name");
-			std::string value = get_own<string>( param,
-							     "datasource parameter");
-			params[name] = value;
-		    }
-		    else if( paramIter->first != "<xmlattr>" &&
-			     paramIter->first != "<xmlcomment>" )
-		    {
-			throw config_error(std::string("Unknown child node in ") +
-					   "'Datasource'. Expected 'Parameter' but got '" +
-					   paramIter->first + "'");
-		    }
-		}
-		datasource_templates_[name] = params;
+            optional<std::string> font_directory = get_opt_attr<std::string>(map_node,"font-directory");
+            if (font_directory)
+            {
+                extra_attr["font-directory"] = *font_directory;
+                freetype_engine::register_fonts( ensure_relative_to_xml(font_directory), false);
             }
-            else if (v.first != "<xmlcomment>" &&
-                     v.first != "<xmlattr>")
+
+            optional<std::string> min_version_string = get_opt_attr<std::string>(map_node, "minimum-version");
+                
+            if (min_version_string)
             {
-		throw config_error(std::string("Unknown child node in 'Map'. ") +
-				   "Expected 'Style' or 'Layer' but got '" + v.first + "'");
+                extra_attr["minimum-version"] = *min_version_string;
+                boost::char_separator<char> sep(".");
+                boost::tokenizer<boost::char_separator<char> > tokens(*min_version_string,sep);
+                unsigned i = 0;
+                bool success = false;
+                int n[3];
+                for (boost::tokenizer<boost::char_separator<char> >::iterator beg=tokens.begin(); 
+                     beg!=tokens.end();++beg)
+                {
+                    try 
+                    {
+                        n[i] = boost::lexical_cast<int>(boost::trim_copy(*beg));
+                    }
+                    catch (boost::bad_lexical_cast & ex)
+                    {
+                        std::clog << *beg << " : " << ex.what() << "\n";
+                        break;
+                    }
+                    if (i==2) 
+                    {
+                        success = true;
+                        break;
+                    }
+                    ++i;
+                }
+                if (success)
+                {
+                    int min_version = (n[0] * 100000) + (n[1] * 100) + (n[2]);
+                    if (min_version > MAPNIK_VERSION)
+                    {
+                        throw config_error(std::string("This map uses features only present in Mapnik version ") + *min_version_string + " and newer");
+                    }
+                       
+                }
+                
             }
-	}
+            map.set_extra_attributes(extra_attr);
+        }
+        catch (const config_error & ex)
+        {
+            ex.append_context("(in node Map)");
+            throw;
+        }
+        
+        parse_map_include( map, map_node );
     }
     catch (const boost::property_tree::ptree_bad_path &)
     {
-	throw config_error("Not a map file. Node 'Map' not found.");
+        throw config_error("Not a map file. Node 'Map' not found.");
+    }
+}
+        
+void map_parser::parse_map_include( Map & map, ptree const & include )
+{
+    ptree::const_iterator itr = include.begin();
+    ptree::const_iterator end = include.end();
+
+    for (; itr != end; ++itr)
+    {
+        ptree::value_type const& v = *itr;
+
+        if (v.first == "Include")
+        {
+            parse_map_include( map, v.second );
+        }
+        else if (v.first == "Style")
+        {
+            parse_style( map, v.second );
+        }
+        else if (v.first == "Layer")
+        {
+            parse_layer(map, v.second );
+        }
+        else if (v.first == "FontSet")
+        {
+            parse_fontset(map, v.second);
+        }
+        else if (v.first == "MetaWriter")
+        {
+            parse_metawriter(map, v.second);
+        }
+        else if (v.first == "FileSource")
+        {
+            std::string name = get_attr<std::string>( v.second, "name");
+            std::string value = get_value<std::string>( v.second, "");
+            file_sources_[name] = value;
+        }
+        else if (v.first == "Datasource")
+        {
+            std::string name = get_attr(v.second, "name", std::string("Unnamed"));
+            parameters params;
+            ptree::const_iterator paramIter = v.second.begin();
+            ptree::const_iterator endParam = v.second.end();
+            for (; paramIter != endParam; ++paramIter)
+            {
+                ptree const& param = paramIter->second;
+
+                if (paramIter->first == "Parameter")
+                {
+                    std::string name = get_attr<std::string>(param, "name");
+                    std::string value = get_value<std::string>( param,
+                                                           "datasource parameter");
+                    params[name] = value;
+                }
+                else if( paramIter->first != "<xmlattr>" &&
+                         paramIter->first != "<xmlcomment>" )
+                {
+                    throw config_error(std::string("Unknown child node in ") +
+                                       "'Datasource'. Expected 'Parameter' but got '" +
+                                       paramIter->first + "'");
+                }
+            }
+            datasource_templates_[name] = params;
+        }
+        else if (v.first != "<xmlcomment>" &&
+                 v.first != "<xmlattr>")
+        {
+            throw config_error(std::string("Unknown child node in 'Map': '") +
+                               v.first + "'");
+        }
     }
+    
+
+    map.init_metawriters();
 }
 
 void map_parser::parse_style( Map & map, ptree const & sty )
 {
-    string name("<missing name>");
+    std::ostringstream s("");
+    s << "name,"
+      << "filter-mode";
+    ensure_attrs(sty, "Style", s.str());
+
+    std::string name("<missing name>");
     try
     {
-	name = get_attr<string>(sty, "name");
-	feature_type_style style;
+        name = get_attr<std::string>(sty, "name");
+        feature_type_style style;
 
-	ptree::const_iterator ruleIter = sty.begin();
-	ptree::const_iterator endRule = sty.end();
+        filter_mode_e filter_mode = get_attr<filter_mode_e>(sty, "filter-mode", FILTER_ALL);
+        style.set_filter_mode(filter_mode);
 
-	for (; ruleIter!=endRule; ++ruleIter)
-	{
+        ptree::const_iterator ruleIter = sty.begin();
+        ptree::const_iterator endRule = sty.end();
+
+        for (; ruleIter!=endRule; ++ruleIter)
+        {
             ptree::value_type const& rule_tag = *ruleIter;
             if (rule_tag.first == "Rule")
             {
-		parse_rule( style, rule_tag.second );
+                parse_rule( style, rule_tag.second );
             }
             else if (rule_tag.first != "<xmlcomment>" &&
                      rule_tag.first != "<xmlattr>" )
             {
-		throw config_error(std::string("Unknown child node in 'Style'. ") +
-				   "Expected 'Rule' but got '" + rule_tag.first + "'");
+                throw config_error(std::string("Unknown child node in 'Style'. ") +
+                                   "Expected 'Rule' but got '" + rule_tag.first + "'");
             }
-	}
+        }
+
+        map.insert_style(name, style);
+
+    } catch (const config_error & ex) {
+        if ( ! name.empty() ) {
+            ex.append_context(std::string("in style '") + name + "'");
+        }
+        ex.append_context(std::string("in map '") + filename_ + "'");
+        throw;
+    }
+}
 
-	map.insert_style(name, style);
+void map_parser::parse_metawriter(Map & map, ptree const & pt)
+{
+    ensure_attrs(pt, "MetaWriter", "name,type,file,default-output,output-empty,pixel-coordinates");
+    std::string name("<missing name>");
+    metawriter_ptr writer;
+    try
+    {
+        name = get_attr<std::string>(pt, "name");
+        writer = metawriter_create(pt);
+        map.insert_metawriter(name, writer);
 
     } catch (const config_error & ex) {
-	if ( ! name.empty() ) {
-            ex.append_context(string("in style '") + name + "'");
-	}
-	throw;
+        if (!name.empty()) {
+            ex.append_context(std::string("in meta writer '") + name + "'");
+        }
+        ex.append_context(std::string("in map '") + filename_ + "'");
+        throw;
     }
 }
 
 void map_parser::parse_fontset( Map & map, ptree const & fset )
 {
-    string name("<missing name>");
+    ensure_attrs(fset, "FontSet", "name,Font");
+    std::string name("<missing name>");
     try
     {
-	name = get_attr<string>(fset, "name");
-	FontSet fontset(name);
+        name = get_attr<std::string>(fset, "name");
+        font_set fontset(name);
 
-	ptree::const_iterator itr = fset.begin();
-	ptree::const_iterator end = fset.end();
+        ptree::const_iterator itr = fset.begin();
+        ptree::const_iterator end = fset.end();
 
-	for (; itr != end; ++itr)
-	{
+        for (; itr != end; ++itr)
+        {
             ptree::value_type const& font_tag = *itr;
 
             if (font_tag.first == "Font")
             {
-		parse_font(fontset, font_tag.second);
+                parse_font(fontset, font_tag.second);
             }
             else if (font_tag.first != "<xmlcomment>" &&
                      font_tag.first != "<xmlattr>" )
             {
-		throw config_error(std::string("Unknown child node in 'FontSet'. ") +
-				   "Expected 'Font' but got '" + font_tag.first + "'");
+                throw config_error(std::string("Unknown child node in 'FontSet'. ") +
+                                   "Expected 'Font' but got '" + font_tag.first + "'");
             }
-	}
-
-	map.insert_fontset(name, fontset);
+        }
 
-	// XXX Hack because map object isn't accessible by text_symbolizer
-	// when it's parsed
-	fontsets_.insert(pair<std::string, FontSet>(name, fontset));
+        map.insert_fontset(name, fontset);
+        
+        // XXX Hack because map object isn't accessible by text_symbolizer
+        // when it's parsed
+        fontsets_.insert(pair<std::string, font_set>(name, fontset));
     } catch (const config_error & ex) {
-	if ( ! name.empty() ) {
-            ex.append_context(string("in FontSet '") + name + "'");
-	}
-	throw;
+        if ( ! name.empty() ) {
+            ex.append_context(std::string("in FontSet '") + name + "'");
+        }
+        ex.append_context(std::string("in map '") + filename_ + "'");
+        throw;
     }
 }
 
-void map_parser::parse_font(FontSet & fset, ptree const & f)
+void map_parser::parse_font(font_set & fset, ptree const & f)
 {
-    std::string face_name = get_attr(f, "face_name", string());
+    ensure_attrs(f, "Font", "face-name");
+
+    std::string face_name = get_attr(f, "face-name", std::string());
 
     if ( strict_ )
     {
-	ensure_font_face( face_name );
+        ensure_font_face( face_name );
     }
 
     fset.add_face_name(face_name);
@@ -374,1205 +525,1626 @@ void map_parser::parse_font(FontSet & fset, ptree const & f)
 void map_parser::parse_layer( Map & map, ptree const & lay )
 {
     std::string name;
+    std::ostringstream s("");
+    s << "name,"
+      << "srs,"
+      << "status,"
+      << "title,"
+      << "abstract,"
+      << "minzoom,"
+      << "maxzoom,"
+      << "queryable,"
+      << "clear-label-cache,"
+      << "cache-features";
+    ensure_attrs(lay, "Layer", s.str());
     try
     {
-	name = get_attr(lay, "name", string("Unnamed"));
+        name = get_attr(lay, "name", std::string("Unnamed"));
 
-	// XXX if no projection is given inherit from map? [DS]
-	std::string srs = get_attr(lay, "srs", map.srs());
+        // XXX if no projection is given inherit from map? [DS]
+        std::string srs = get_attr(lay, "srs", map.srs());
 
-	Layer lyr(name, srs);
+        layer lyr(name, srs);
 
-	optional<boolean> status = get_opt_attr<boolean>(lay, "status");
-	if (status)
-	{
+        optional<boolean> status = get_opt_attr<boolean>(lay, "status");
+        if (status)
+        {
             lyr.setActive( * status );
-	}
+        }
 
-	optional<std::string> title =  get_opt_attr<string>(lay, "title");
-	if (title)
-	{
+        optional<std::string> title =  get_opt_attr<std::string>(lay, "title");
+        if (title)
+        {
             lyr.set_title( * title );
-	}
+        }
 
-	optional<std::string> abstract =  get_opt_attr<string>(lay, "abstract");
-	if (abstract)
-	{
+        optional<std::string> abstract =  get_opt_attr<std::string>(lay, "abstract");
+        if (abstract)
+        {
             lyr.set_abstract( * abstract );
-	}
+        }
 
-	optional<double> minZoom = get_opt_attr<double>(lay, "minzoom");
-	if (minZoom)
-	{
+        optional<double> minZoom = get_opt_attr<double>(lay, "minzoom");
+        if (minZoom)
+        {
             lyr.setMinZoom( * minZoom );
-	}
+        }
 
-	optional<double> maxZoom = get_opt_attr<double>(lay, "maxzoom");
-	if (maxZoom)
-	{
+        optional<double> maxZoom = get_opt_attr<double>(lay, "maxzoom");
+        if (maxZoom)
+        {
             lyr.setMaxZoom( * maxZoom );
-	}
+        }
 
-	optional<boolean> queryable = get_opt_attr<boolean>(lay, "queryable");
-	if (queryable)
-	{
+        optional<boolean> queryable = get_opt_attr<boolean>(lay, "queryable");
+        if (queryable)
+        {
             lyr.setQueryable( * queryable );
-	}
+        }
 
-	optional<boolean> clear_cache =
-            get_opt_attr<boolean>(lay, "clear_label_cache");
-	if (clear_cache)
-	{
+        optional<boolean> clear_cache =
+            get_opt_attr<boolean>(lay, "clear-label-cache");
+        if (clear_cache)
+        {
             lyr.set_clear_label_cache( * clear_cache );
-	}
+        }
+
+        optional<boolean> cache_features =
+            get_opt_attr<boolean>(lay, "cache-features");
+        if (cache_features)
+        {
+            lyr.set_cache_features( * cache_features );
+        }
 
 
-	ptree::const_iterator itr2 = lay.begin();
-	ptree::const_iterator end2 = lay.end();
+        ptree::const_iterator itr2 = lay.begin();
+        ptree::const_iterator end2 = lay.end();
 
-	for(; itr2 != end2; ++itr2)
-	{
+        for(; itr2 != end2; ++itr2)
+        {
             ptree::value_type const& child = *itr2;
 
             if (child.first == "StyleName")
             {
-		// TODO check references [DS]
-		lyr.add_style(child.second.data());
+                ensure_attrs(child.second, "StyleName", "none");
+                std::string style_name = child.second.data();
+                if (style_name.empty())
+                {
+                    std::ostringstream ss;
+                    ss << "StyleName is empty in Layer: '" << lyr.name() << "'";
+                    if (strict_)
+                        throw config_error(ss.str());
+                    else
+                        std::clog << "### WARNING: " << ss.str() << std::endl;
+                }
+                else
+                {
+                    lyr.add_style(style_name);
+                }
             }
             else if (child.first == "Datasource")
             {
-		parameters params;
-		optional<std::string> base = get_opt_attr<std::string>( child.second, "base" );
-		if( base )
-		{
-		    std::map<std::string,parameters>::const_iterator base_itr = datasource_templates_.find(*base);
-		    if (base_itr!=datasource_templates_.end())
-			params = base_itr->second;
-		}
-
-		ptree::const_iterator paramIter = child.second.begin();
-		ptree::const_iterator endParam = child.second.end();
-		for (; paramIter != endParam; ++paramIter)
-		{
-		    ptree const& param = paramIter->second;
-
-		    if (paramIter->first == "Parameter")
-		    {
-			std::string name = get_attr<string>(param, "name");
-			std::string value = get_own<string>( param,
-							     "datasource parameter");
-			params[name] = value;
-		    }
-		    else if( paramIter->first != "<xmlattr>"  &&
-			     paramIter->first != "<xmlcomment>" )
-		    {
-			throw config_error(std::string("Unknown child node in ") +
-					   "'Datasource'. Expected 'Parameter' but got '" +
-					   paramIter->first + "'");
-		    }
-		}
-
-		if ( relative_to_xml_ ) {
-		    boost::optional<std::string> base_param = params.get<std::string>("base");
-		    boost::optional<std::string> file_param = params.get<std::string>("file");
-
-		    if (base_param){
-			params["base"] = ensure_relative_to_xml(base_param);
-		    }
-
-		    else if (file_param){
-			params["file"] = ensure_relative_to_xml(file_param);
-		    }
-		}
-#ifdef MAPNIK_DEBUG
-		else {
-		    std::clog << "\nFound relative paths in xml, leaving unchanged...\n";
-		}
-#endif
-
-		//now we are ready to create datasource
-		try
-		{
-		    boost::shared_ptr<datasource> ds =
-			datasource_cache::instance()->create(params);
-		    lyr.set_datasource(ds);
-		}
-
-		// catch problem at datasource registration
-		catch (const mapnik::config_error & ex )
-		{
-		    throw config_error( ex.what() );
-		}
-
-		// catch problem at the datasource creation
-		catch (const mapnik::datasource_exception & ex )
-		{
-		    throw config_error( ex.what() );
-		}
-
-		catch (...)
-		{
-		    //throw config_error("exception...");
-		}
+                ensure_attrs(child.second, "Datasource", "base");
+                parameters params;
+                optional<std::string> base = get_opt_attr<std::string>( child.second, "base" );
+                if( base )
+                {
+                    std::map<std::string,parameters>::const_iterator base_itr = datasource_templates_.find(*base);
+                    if (base_itr!=datasource_templates_.end())
+                        params = base_itr->second;
+                }
+
+                ptree::const_iterator paramIter = child.second.begin();
+                ptree::const_iterator endParam = child.second.end();
+                for (; paramIter != endParam; ++paramIter)
+                {
+                    ptree const& param = paramIter->second;
+
+                    if (paramIter->first == "Parameter")
+                    {
+                        ensure_attrs(param, "Parameter", "name");
+                        std::string name = get_attr<std::string>(param, "name");
+                        std::string value = get_value<std::string>( param,
+                                                               "datasource parameter");
+                        params[name] = value;
+                    }
+                    else if( paramIter->first != "<xmlattr>"  &&
+                             paramIter->first != "<xmlcomment>" )
+                    {
+                        throw config_error(std::string("Unknown child node in ") +
+                                           "'Datasource'. Expected 'Parameter' but got '" +
+                                           paramIter->first + "'");
+                    }
+                }
+
+                boost::optional<std::string> base_param = params.get<std::string>("base");
+                boost::optional<std::string> file_param = params.get<std::string>("file");
+
+                if (base_param){
+                    params["base"] = ensure_relative_to_xml(base_param);
+                }
+
+                else if (file_param){
+                    params["file"] = ensure_relative_to_xml(file_param);
+                }
+
+                //now we are ready to create datasource
+                try
+                {
+                    boost::shared_ptr<datasource> ds =
+                        datasource_cache::instance()->create(params);
+                    lyr.set_datasource(ds);
+                }
+
+                catch (const std::exception & ex )
+                {
+                    throw config_error( ex.what() );
+                }
+
+                catch (...)
+                {
+                    throw config_error("Unknown exception occured attempting to create datasoure for layer '" + lyr.name() + "'");
+                }
             }
             else if (child.first != "<xmlattr>" &&
                      child.first != "<xmlcomment>")
             {
-		throw config_error(std::string("Unknown child node in 'Layer'. ") +
-				   "Expected 'StyleName' or 'Datasource' but got '" +
-				   child.first + "'");
+                throw config_error(std::string("Unknown child node in 'Layer'. ") +
+                                   "Expected 'StyleName' or 'Datasource' but got '" +
+                                   child.first + "'");
             }
-	}
+        }
 
-	map.addLayer(lyr);
+        map.addLayer(lyr);
 
-    } catch (const config_error & ex) {
-	if ( ! name.empty() ) {
-            ex.append_context(string("(encountered during parsing of layer '") + name + "')");
-	}
-	throw;
+    } 
+    catch (const config_error & ex) 
+    {
+        if ( ! name.empty() ) 
+        {
+            ex.append_context(std::string("(encountered during parsing of layer '") + name + "' in map '" + filename_ + "')");
+        }
+        throw;
     }
 }
 
 void map_parser::parse_rule( feature_type_style & style, ptree const & r )
 {
+    ensure_attrs(r, "Rule", "name,title");
     std::string name;
     try
     {
-	name = get_attr( r, "name", string());
-	std::string title = get_attr( r, "title", string());
-
-	rule_type rule(name,title);
-
-	optional<std::string> filter_expr =
-            get_opt_child<string>( r, "Filter");
-	if (filter_expr)
-	{
-            // can we use encoding defined for XML document for filter expressions?
-            rule.set_filter(create_filter(*filter_expr,"utf8"));
-	}
-
-	optional<std::string> else_filter =
-            get_opt_child<string>(r, "ElseFilter");
-	if (else_filter)
-	{
+        name = get_attr( r, "name", std::string());
+        std::string title = get_attr( r, "title", std::string());
+
+        rule rule(name,title);
+
+        optional<std::string> filter_expr =
+            get_opt_child<std::string>( r, "Filter");
+        if (filter_expr)
+        {
+            // TODO - can we use encoding defined for XML document for filter expressions?
+            rule.set_filter(parse_expression(*filter_expr,"utf8"));
+        }
+
+        optional<std::string> else_filter =
+            get_opt_child<std::string>(r, "ElseFilter");
+        if (else_filter)
+        {
             rule.set_else(true);
-	}
+        }
+
+        optional<std::string> also_filter =
+            get_opt_child<std::string>(r, "AlsoFilter");
+        if (also_filter)
+        {
+            rule.set_also(true);
+        }
 
-	optional<double> min_scale =
+        optional<double> min_scale =
             get_opt_child<double>(r, "MinScaleDenominator");
-	if (min_scale)
-	{
+        if (min_scale)
+        {
             rule.set_min_scale(*min_scale);
-	}
+        }
 
-	optional<double> max_scale =
+        optional<double> max_scale =
             get_opt_child<double>(r, "MaxScaleDenominator");
-	if (max_scale)
-	{
+        if (max_scale)
+        {
             rule.set_max_scale(*max_scale);
-	}
+        }
 
-	ptree::const_iterator symIter = r.begin();
-	ptree::const_iterator endSym = r.end();
+        ptree::const_iterator symIter = r.begin();
+        ptree::const_iterator endSym = r.end();
 
-	for( ;symIter != endSym; ++symIter)
-	{
+        for( ;symIter != endSym; ++symIter)
+        {
             ptree::value_type const& sym = *symIter;
 
             if ( sym.first == "PointSymbolizer")
             {
-		parse_point_symbolizer( rule, sym.second );
+                parse_point_symbolizer( rule, sym.second );
             }
             else if ( sym.first == "LinePatternSymbolizer")
             {
-		parse_line_pattern_symbolizer( rule, sym.second );
+                parse_line_pattern_symbolizer( rule, sym.second );
             }
             else if ( sym.first == "PolygonPatternSymbolizer")
             {
-		parse_polygon_pattern_symbolizer( rule, sym.second );
+                parse_polygon_pattern_symbolizer( rule, sym.second );
             }
             else if ( sym.first == "TextSymbolizer")
             {
-		parse_text_symbolizer( rule, sym.second );
+                parse_text_symbolizer( rule, sym.second );
             }
             else if ( sym.first == "ShieldSymbolizer")
             {
-		parse_shield_symbolizer( rule, sym.second );
+                parse_shield_symbolizer( rule, sym.second );
             }
             else if ( sym.first == "LineSymbolizer")
             {
-		parse_line_symbolizer( rule, sym.second );
+                parse_line_symbolizer( rule, sym.second );
             }
             else if ( sym.first == "PolygonSymbolizer")
             {
-		parse_polygon_symbolizer( rule, sym.second );
+                parse_polygon_symbolizer( rule, sym.second );
             }
             else if ( sym.first == "BuildingSymbolizer")
             {
-		parse_building_symbolizer( rule, sym.second );
+                parse_building_symbolizer( rule, sym.second );
             }
             else if ( sym.first == "RasterSymbolizer")
             {
-		parse_raster_symbolizer( rule, sym.second );
+                parse_raster_symbolizer( rule, sym.second );
             }
             else if ( sym.first == "MarkersSymbolizer")
             {
-		rule.append(markers_symbolizer());
+                parse_markers_symbolizer(rule, sym.second);
+            }
+            else if ( sym.first == "GlyphSymbolizer")
+            {
+                parse_glyph_symbolizer( rule, sym.second );
             }
 
             else if ( sym.first != "MinScaleDenominator" &&
                       sym.first != "MaxScaleDenominator" &&
                       sym.first != "Filter" &&
                       sym.first != "ElseFilter" &&
+                      sym.first != "AlsoFilter" &&
                       sym.first != "<xmlcomment>" &&
                       sym.first != "<xmlattr>" )
             {
-		throw config_error(std::string("Unknown symbolizer '") +
-				   sym.first + "'");
+                throw config_error(std::string("Unknown symbolizer '") +
+                                   sym.first + "'");
             }
-	}
+        }
 
-	style.add_rule(rule);
+        style.add_rule(rule);
 
     }
     catch (const config_error & ex)
     {
-	if ( ! name.empty() )
-	{
-            ex.append_context(string("in rule '") + name + "'");
-	}
-	throw;
+        if ( ! name.empty() )
+        {
+            ex.append_context(std::string("in rule '") + name + "' in map '" + filename_ + "')");
+        }
+        throw;
     }
 }
 
-void map_parser::parse_point_symbolizer( rule_type & rule, ptree const & sym )
+void map_parser::parse_metawriter_in_symbolizer(symbolizer_base &sym, ptree const &pt)
+{
+    optional<std::string> writer =  get_opt_attr<std::string>(pt, "meta-writer");
+    if (!writer) return;
+    optional<std::string> output =  get_opt_attr<std::string>(pt, "meta-output");
+    sym.add_metawriter(*writer, output);
+}
+
+void map_parser::parse_point_symbolizer( rule & rule, ptree const & sym )
 {
     try
     {
-	optional<std::string> file =  get_opt_attr<string>(sym, "file");
-	optional<std::string> base =  get_opt_attr<string>(sym, "base");
-	optional<std::string> type =  get_opt_attr<string>(sym, "type");
-          
-	optional<boolean> allow_overlap =
-            get_opt_attr<boolean>(sym, "allow_overlap");
-	optional<float> opacity =
+        std::stringstream s;
+        s << "file,base,allow-overlap,ignore-placement,opacity,placement,transform,meta-writer,meta-output";
+        
+        optional<std::string> file =  get_opt_attr<std::string>(sym, "file");
+        optional<std::string> base =  get_opt_attr<std::string>(sym, "base");
+        optional<boolean> allow_overlap =
+            get_opt_attr<boolean>(sym, "allow-overlap");
+        optional<boolean> ignore_placement =
+            get_opt_attr<boolean>(sym, "ignore-placement");
+        optional<float> opacity =
             get_opt_attr<float>(sym, "opacity");
-            
-	optional<unsigned> width = get_opt_attr<unsigned>(sym, "width");
-	optional<unsigned> height = get_opt_attr<unsigned>(sym, "height");
-	   
-	if (file)
-	{              
+        
+        optional<std::string> transform_wkt = get_opt_attr<std::string>(sym, "transform");
+
+        if (file)
+        {
+            ensure_attrs(sym, "PointSymbolizer", s.str());
+            try
+            {
+                if( base )
+                {
+                    std::map<std::string,std::string>::const_iterator itr = file_sources_.find(*base);
+                    if (itr!=file_sources_.end())
+                    {
+                        *file = itr->second + "/" + *file;
+                    }
+                }
+
+                *file = ensure_relative_to_xml(file);
+                   
+                point_symbolizer symbol(parse_path(*file));
+
+                if (allow_overlap)
+                {
+                    symbol.set_allow_overlap( * allow_overlap );
+                }
+                if (opacity)
+                {
+                    symbol.set_opacity( * opacity );
+                }
+                if (ignore_placement)
+                {
+                    symbol.set_ignore_placement( * ignore_placement );            
+                }
+                point_placement_e placement =
+                    get_attr<point_placement_e>(sym, "placement", CENTROID_POINT_PLACEMENT);
+                symbol.set_point_placement( placement );
+
+                if (transform_wkt)
+                {
+                    agg::trans_affine tr;
+                    if (!mapnik::svg::parse_transform(*transform_wkt,tr))
+                    {
+                        std::stringstream ss;
+                        ss << "Could not parse transform from '" << transform_wkt 
+                           << "', expected string like: 'matrix(1, 0, 0, 1, 0, 0)'";
+                        if (strict_)
+                            throw config_error(ss.str()); // value_error here?
+                        else
+                            std::clog << "### WARNING: " << ss << endl;         
+                    }
+                    boost::array<double,6> matrix;
+                    tr.store_to(&matrix[0]);
+                    symbol.set_transform(matrix);
+                }
+
+                parse_metawriter_in_symbolizer(symbol, sym);
+                rule.append(symbol);
+            }
+            catch (image_reader_exception const & ex )
+            {
+                std::string msg("Failed to load image file '" + * file +
+                           "': " + ex.what());
+                if (strict_)
+                {
+                    throw config_error(msg);
+                }
+                else
+                {
+                    std::clog << "### WARNING: " << msg << endl;
+                }
+            }
+
+        }
+        else
+        {
+            ensure_attrs(sym, "PointSymbolizer", s.str());
+            point_symbolizer symbol;
+
+            if (allow_overlap)
+            {
+                symbol.set_allow_overlap( * allow_overlap );
+            }
+            if (opacity)
+            {
+                symbol.set_opacity( * opacity );
+            }
+            if (ignore_placement)
+            {
+                symbol.set_ignore_placement( * ignore_placement );            
+            }
+            point_placement_e placement =
+                get_attr<point_placement_e>(sym, "placement", CENTROID_POINT_PLACEMENT);
+            symbol.set_point_placement( placement );
+
+            parse_metawriter_in_symbolizer(symbol, sym);
+            rule.append(symbol);
+        }
+    }
+    catch (const config_error & ex)
+    {
+        ex.append_context("in PointSymbolizer");
+        throw;
+    }
+}
+
+
+void map_parser::parse_markers_symbolizer( rule & rule, ptree const & sym )
+{
+    try
+    {
+        std::string filename("");
+        optional<std::string> file =  get_opt_attr<std::string>(sym, "file");
+        optional<std::string> base =  get_opt_attr<std::string>(sym, "base");
+        optional<std::string> transform_wkt = get_opt_attr<std::string>(sym, "transform");
+
+        std::stringstream s;
+        //s << "file,opacity,spacing,max-error,allow-overlap,placement,";
+        s << "file,base,transform,fill,opacity,"
+          << "spacing,max-error,allow-overlap,"
+          << "width,height,placement,marker-type,"
+          << "stroke,stroke-width,stroke-opacity,stroke-linejoin,"
+          << "stroke-linecap,stroke-dashoffset,stroke-dasharray,"
+          // note: stroke-gamma intentionally left off here as markers do not support them
+          << "meta-writer,meta-output";
+        ensure_attrs(sym, "MarkersSymbolizer", s.str());
+
+        if (file)
+        {
+            //s << "base,transform";
+            //ensure_attrs(sym, "MarkersSymbolizer", s.str());
             try
             {
-		if (!type)
-		{
-		    type = type_from_filename(*file);
-		}       
-		if( base )
-		{
-		    std::map<std::string,std::string>::const_iterator itr = file_sources_.find(*base);
-		    if (itr!=file_sources_.end())
-		    {
-			*file = itr->second + "/" + *file;
-		    }
-		}
-                  
-		if ( relative_to_xml_ )
-		{
-		    *file = ensure_relative_to_xml(file);
-		}
-#ifdef MAPNIK_DEBUG
-		else 
-		{
-		    std::clog << "\nFound relative paths in xml, leaving unchanged...\n";
-		}
-#endif      
-		if (!width || !height)
-		{
-		    std::auto_ptr<ImageReader> reader(get_image_reader(*file,*type));
-		    if (reader.get())
-		    {
-			if (!width) width = reader->width();
-			if (!height) height = reader->height();
-		    } 
-		    if (!width || !height) throw ImageReaderException(" type:" + *type);
-		}
-		point_symbolizer symbol(*file,*type,*width,*height);
-		if (allow_overlap)
-		{
-		    symbol.set_allow_overlap( *allow_overlap );
-		}
-		if (opacity)
-		{
-		    symbol.set_opacity( *opacity );
-		}
-		rule.append(symbol);
-            }
-            catch (ImageReaderException const & ex )
-            {
-		string msg("Failed to load image file '" + * file +
-			   "': " + ex.what());
-		if (strict_)
-		{
-		    throw config_error(msg);
-		}
-		else
-		{
-		    clog << "### WARNING: " << msg << endl;
-		}
-            }
-	}
-	else
-	{
-            rule.append(point_symbolizer());
-	}
+                if (base)
+                {
+                    std::map<std::string,std::string>::const_iterator itr = file_sources_.find(*base);
+                    if (itr!=file_sources_.end())
+                    {
+                        *file = itr->second + "/" + *file;
+                    }
+                }
+
+                filename = ensure_relative_to_xml(file);
+            }
+            catch (...)
+            {
+                std::string msg("Failed to load marker file '" + *file + "'!");
+                if (strict_)
+                {
+                    throw config_error(msg);
+                }
+                else
+                {
+                    std::clog << "### WARNING: " << msg << endl;
+                }
+            }
+        }
+        /*else
+        {
+            //s << "fill,marker-type,width,height";
+            //ensure_attrs(sym, "MarkersSymbolizer", s.str());
+        }*/
+
+        markers_symbolizer symbol(parse_path(filename));
+        optional<float> opacity = get_opt_attr<float>(sym, "opacity");
+        if (opacity) symbol.set_opacity( *opacity );
+        
+        if (transform_wkt)
+        {
+            agg::trans_affine tr;
+            if (!mapnik::svg::parse_transform(*transform_wkt,tr))
+            {
+                std::stringstream ss;
+                ss << "Could not parse transform from '" << transform_wkt
+                   << "', expected string like: 'matrix(1, 0, 0, 1, 0, 0)'";
+                if (strict_)
+                    throw config_error(ss.str()); // value_error here?
+                else
+                    std::clog << "### WARNING: " << ss << endl;         
+            }
+            boost::array<double,6> matrix;
+            tr.store_to(&matrix[0]);
+            symbol.set_transform(matrix);
+        }
+        
+        optional<color> c = get_opt_attr<color>(sym, "fill");
+        if (c) symbol.set_fill(*c);
+        optional<double> spacing = get_opt_attr<double>(sym, "spacing");
+        if (spacing) symbol.set_spacing(*spacing);
+        optional<double> max_error = get_opt_attr<double>(sym, "max-error");
+        if (max_error) symbol.set_max_error(*max_error);
+        optional<boolean> allow_overlap = get_opt_attr<boolean>(sym, "allow-overlap");
+        if (allow_overlap) symbol.set_allow_overlap(*allow_overlap);
+
+        optional<double> w = get_opt_attr<double>(sym, "width");
+        optional<double> h = get_opt_attr<double>(sym, "height");
+        if (w && h)
+        {
+            symbol.set_width(*w);
+            symbol.set_height(*h);
+        }
+        else if (w)
+        {
+            symbol.set_width(*w);
+            symbol.set_height(*w);
+        
+        }
+        else if (h)
+        {
+            symbol.set_width(*h);
+            symbol.set_height(*h);
+        }
+        
+        stroke strk;
+        parse_stroke(strk,sym);
+        symbol.set_stroke(strk);
+
+        marker_placement_e placement = get_attr<marker_placement_e>(sym, "placement", MARKER_LINE_PLACEMENT);
+        symbol.set_marker_placement( placement );
+
+        marker_type_e dfl_marker_type = ARROW;
+
+        if (placement == MARKER_POINT_PLACEMENT)
+            dfl_marker_type = ELLIPSE;
+
+        marker_type_e marker_type = get_attr<marker_type_e>(sym, "marker-type", dfl_marker_type);
+        symbol.set_marker_type( marker_type );
+
+        parse_metawriter_in_symbolizer(symbol, sym);
+        rule.append(symbol);
     }
     catch (const config_error & ex)
     {
-	ex.append_context("in PointSymbolizer");
-	throw;
+        ex.append_context("in MarkersSymbolizer");
+        throw;
     }
 }
 
-void map_parser::parse_line_pattern_symbolizer( rule_type & rule, ptree const & sym )
+void map_parser::parse_line_pattern_symbolizer( rule & rule, ptree const & sym )
 {
+    ensure_attrs(sym, "LinePatternSymbolizer", "file,base,meta-writer,meta-output");
     try
     {
-	std::string file = get_attr<string>(sym, "file");
-	optional<std::string> base = get_opt_attr<string>(sym, "base");
-	optional<std::string> type = get_opt_attr<string>(sym, "type");
-	optional<unsigned> width = get_opt_attr<unsigned>(sym, "width");
-	optional<unsigned> height = get_opt_attr<unsigned>(sym, "height");
-
-	try
-	{
-	    if (!type)
-	    {
-		type = type_from_filename(file);
-	    }     
-	    
+        std::string file = get_attr<std::string>(sym, "file");
+        optional<std::string> base = get_opt_attr<std::string>(sym, "base");
+            
+        try
+        {
             if( base )
             {
-		std::map<std::string,std::string>::const_iterator itr = file_sources_.find(*base);
-		if (itr!=file_sources_.end())
-		{
-		    file = itr->second + "/" + file;
-		}
+                std::map<std::string,std::string>::const_iterator itr = file_sources_.find(*base);
+                if (itr!=file_sources_.end())
+                {
+                    file = itr->second + "/" + file;
+                }
             }
-            if ( relative_to_xml_ )
-            {
-		file = ensure_relative_to_xml(file);
-            }
-#ifdef MAPNIK_DEBUG
-            else {
-		std::clog << "\nFound relative paths in xml, leaving unchanged...\n";
-            }
-#endif
-	    if (!width || !height)
-	    {
-		std::auto_ptr<ImageReader> reader(get_image_reader(file,*type));
-		if (reader.get())
-		{
-		    if (!width) width = reader->width();
-		    if (!height) height = reader->height();
-		}  
-		if (!width || !height) throw ImageReaderException(" type:" + *type);
-	    }
-	    
-            line_pattern_symbolizer symbol(file,*type,*width,*height);
+
+            file = ensure_relative_to_xml(file);
+
+            line_pattern_symbolizer symbol(parse_path(file));
+
+            parse_metawriter_in_symbolizer(symbol, sym);
             rule.append(symbol);
-	}
-	catch (ImageReaderException const & ex )
-	{
-            string msg("Failed to load image file '" + file +
+        }
+        catch (image_reader_exception const & ex )
+        {
+            std::string msg("Failed to load image file '" + file +
                        "': " + ex.what());
             if (strict_)
             {
-		throw config_error(msg);
+                throw config_error(msg);
             }
             else
             {
-		clog << "### WARNING: " << msg << endl;
+                std::clog << "### WARNING: " << msg << endl;
             }
-	}
+        }
     }
     catch (const config_error & ex)
     {
-	ex.append_context("in LinePatternSymbolizer");
-	throw;
+        ex.append_context("in LinePatternSymbolizer");
+        throw;
     }
 }
 
-void map_parser::parse_polygon_pattern_symbolizer( rule_type & rule,
-						   ptree const & sym )
+void map_parser::parse_polygon_pattern_symbolizer( rule & rule,
+                                                   ptree const & sym )
 {
+    ensure_attrs(sym, "PolygonPatternSymbolizer", "file,base,alignment,gamma,meta-writer,meta-output");
     try
     {
-	std::string file = get_attr<string>(sym, "file");
-	optional<std::string> base = get_opt_attr<string>(sym, "base");
-	optional<std::string> type = get_opt_attr<string>(sym, "type");
-	optional<unsigned> width = get_opt_attr<unsigned>(sym, "width");
-	optional<unsigned> height = get_opt_attr<unsigned>(sym, "height");
-          
-	try
-	{
-	    if (!type)
-	    {
-		type = type_from_filename(file);
-	    }
-	    
+        std::string file = get_attr<std::string>(sym, "file");
+        optional<std::string> base = get_opt_attr<std::string>(sym, "base");
+            
+        try
+        {
             if( base )
             {
-		std::map<std::string,std::string>::iterator itr = file_sources_.find(*base);
-		if (itr!=file_sources_.end())
-		{
-		    file = itr->second + "/" + file;
-		}
-            }
-            if ( relative_to_xml_ )
-            {
-		file = ensure_relative_to_xml(file);
-            }
-#ifdef MAPNIK_DEBUG
-            else {
-		std::clog << "\nFound relative paths in xml, leaving unchanged...\n";
+                std::map<std::string,std::string>::iterator itr = file_sources_.find(*base);
+                if (itr!=file_sources_.end())
+                {
+                    file = itr->second + "/" + file;
+                }
             }
-#endif
-	    if (!width || !height)
-	    {
-		std::auto_ptr<ImageReader> reader(get_image_reader(file,*type));
-		if (reader.get())
-		{
-		    if (!width) width = reader->width();
-		    if (!height) height = reader->height();
-		    
-		}   
-		if (!width || !height)  throw ImageReaderException(" type:" + *type);
-	    }
-            polygon_pattern_symbolizer symbol(file,*type,*width,*height);
+
+            file = ensure_relative_to_xml(file);
+
+            polygon_pattern_symbolizer symbol(parse_path(file));
+
+            // pattern alignment
+            pattern_alignment_e p_alignment = get_attr<pattern_alignment_e>(sym, "alignment",LOCAL_ALIGNMENT);
+            symbol.set_alignment(p_alignment);
+
+            // gamma
+            optional<double> gamma = get_opt_attr<double>(sym, "gamma");
+            if (gamma)  symbol.set_gamma(*gamma);
+
+            parse_metawriter_in_symbolizer(symbol, sym);
             rule.append(symbol);
-	}
-	catch (ImageReaderException const & ex )
-	{
-            string msg("Failed to load image file '" + file +
+        }
+        catch (image_reader_exception const & ex )
+        {
+            std::string msg("Failed to load image file '" + file +
                        "': " + ex.what());
             if (strict_)
             {
-		throw config_error(msg);
+                throw config_error(msg);
             }
             else
             {
-		clog << "### WARNING: " << msg << endl;
+                std::clog << "### WARNING: " << msg << endl;
             }
-	}
+        }
     }
     catch (const config_error & ex)
     {
-	ex.append_context("in PolygonPatternSymbolizer");
-	throw;
+        ex.append_context("in PolygonPatternSymbolizer");
+        throw;
     }
 }
 
-void map_parser::parse_text_symbolizer( rule_type & rule, ptree const & sym )
+void map_parser::parse_text_symbolizer( rule & rule, ptree const & sym )
 {
+    std::stringstream s;
+    s << "name,face-name,fontset-name,size,fill,orientation,"
+      << "dx,dy,placement,vertical-alignment,halo-fill,"
+      << "halo-radius,text-ratio,wrap-width,wrap-before,"
+      << "wrap-character,text-transform,line-spacing,"
+      << "label-position-tolerance,character-spacing,"
+      << "spacing,minimum-distance,minimum-padding,minimum-path-length,"
+      << "avoid-edges,allow-overlap,opacity,max-char-angle-delta,"
+      << "horizontal-alignment,justify-alignment,"
+      << "placements,placement-type,"
+      << "meta-writer,meta-output";
+    
+    ensure_attrs(sym, "TextSymbolizer", s.str());
     try
     {
-	std::string name = get_attr<string>(sym, "name");
-
-	optional<std::string> face_name =
-            get_opt_attr<std::string>(sym, "face_name");
-
-	optional<std::string> fontset_name =
-            get_opt_attr<std::string>(sym, "fontset_name");
-
-	unsigned size = get_attr(sym, "size", 10U);
-
-	color c = get_attr(sym, "fill", color(0,0,0));
-
-	text_symbolizer text_symbol = text_symbolizer(name, size, c);
-
-	if (fontset_name && face_name)
-	{
-            throw config_error(std::string("Can't have both face_name and fontset_name"));
-	}
-	else if (fontset_name)
-	{
-            std::map<std::string,FontSet>::const_iterator itr = fontsets_.find(*fontset_name);
+        text_placements_ptr placement_finder;
+        optional<std::string> placement_type = get_opt_attr<std::string>(sym, "placement-type");
+        if (placement_type) {
+            if (*placement_type == "simple") {
+                placement_finder = text_placements_ptr(
+                    new text_placements_simple(
+                        get_attr<std::string>(sym, "placements", "X")));
+            } else if (*placement_type != "dummy" && *placement_type != "") {
+                throw config_error(std::string("Unknown placement type '"+*placement_type+"'"));
+            }
+        }
+        if (!placement_finder) {
+            placement_finder = text_placements_ptr(new text_placements_dummy());
+        }
+
+        std::string name;
+        optional<std::string> old_name = get_opt_attr<std::string>(sym, "name");
+        if (old_name) {
+            std::clog << ": ### WARNING: Using 'name' in TextSymbolizer is deprecated (http://trac.mapnik.org/wiki/TextSymbolizer)\n";
+            name = *old_name;
+        } else {
+            name = get_value<std::string>(sym, "TextSymbolizer");
+            if (name.empty()) throw config_error(std::string("TextSymbolizer needs a non-empty text"));
+        }
+        
+        optional<std::string> face_name =
+            get_opt_attr<std::string>(sym, "face-name");
+
+        optional<std::string> fontset_name =
+            get_opt_attr<std::string>(sym, "fontset-name");
+
+        unsigned size = get_attr(sym, "size", 10U);
+
+        color c = get_attr(sym, "fill", color(0,0,0));
+
+        text_symbolizer text_symbol = text_symbolizer(parse_expression(name, "utf8"), size, c, placement_finder);
+
+        optional<std::string> orientation = get_opt_attr<std::string>(sym, "orientation");
+        if (orientation)
+        {
+            text_symbol.set_orientation(parse_expression(*orientation, "utf8"));
+        }
+        
+        if (fontset_name && face_name)
+        {
+            throw config_error(std::string("Can't have both face-name and fontset-name"));
+        }
+        else if (fontset_name)
+        {
+            std::map<std::string,font_set>::const_iterator itr = fontsets_.find(*fontset_name);
             if (itr != fontsets_.end())
             {
-		text_symbol.set_fontset(itr->second);
+                text_symbol.set_fontset(itr->second);
             }
             else
             {
-		throw config_error("Unable to find any fontset named '" + *fontset_name + "'");
+                throw config_error("Unable to find any fontset named '" + *fontset_name + "'");
             }
-	}
-	else if (face_name)
-	{
+        }
+        else if (face_name)
+        {
             if ( strict_ )
             {
-		ensure_font_face(*face_name);
+                ensure_font_face(*face_name);
             }
             text_symbol.set_face_name(*face_name);
-	}
-	else
-	{
-            throw config_error(std::string("Must have face_name or fontset_name"));
-	}
+        }
+        else
+        {
+            throw config_error(std::string("Must have face-name or fontset-name"));
+        }
 
-	double dx = get_attr(sym, "dx", 0.0);
-	double dy = get_attr(sym, "dy", 0.0);
-	text_symbol.set_displacement(dx,dy);
+        double dx = get_attr(sym, "dx", 0.0);
+        double dy = get_attr(sym, "dy", 0.0);
+        text_symbol.set_displacement(dx,dy);
 
-	label_placement_e placement =
+        label_placement_e placement =
             get_attr<label_placement_e>(sym, "placement", POINT_PLACEMENT);
-	text_symbol.set_label_placement( placement );
-	// vertical alignment
-            
-	vertical_alignment_e default_vertical_alignment = MIDDLE;
-	if (dy > 0.0 )
-	{
-            default_vertical_alignment = BOTTOM;
-	}
-	else if( dy < 0.0 )
-	{
-            default_vertical_alignment = TOP;
-	}
+        text_symbol.set_label_placement( placement );
+
+        // vertical alignment
+        vertical_alignment_e default_vertical_alignment = V_AUTO;
             
-	vertical_alignment_e valign = get_attr<vertical_alignment_e>(sym, "vertical_alignment", default_vertical_alignment);
-	text_symbol.set_vertical_alignment(valign);
+        vertical_alignment_e valign = get_attr<vertical_alignment_e>(sym, "vertical-alignment", default_vertical_alignment);
+        text_symbol.set_vertical_alignment(valign);
 
-	// halo fill and radius
-	optional<color> halo_fill = get_opt_attr<color>(sym, "halo_fill");
-	if (halo_fill)
-	{
+        // halo fill and radius
+        optional<color> halo_fill = get_opt_attr<color>(sym, "halo-fill");
+        if (halo_fill)
+        {
             text_symbol.set_halo_fill( * halo_fill );
-	}
-	optional<unsigned> halo_radius =
-            get_opt_attr<unsigned>(sym, "halo_radius");
-	if (halo_radius)
-	{
+        }
+        optional<double> halo_radius =
+            get_opt_attr<double>(sym, "halo-radius");
+        if (halo_radius)
+        {
             text_symbol.set_halo_radius(*halo_radius);
-	}
-
-	// text ratio and wrap width
-	optional<unsigned> text_ratio =
-            get_opt_attr<unsigned>(sym, "text_ratio");
-	if (text_ratio)
-	{
+        }
+        
+        // text ratio and wrap width
+        optional<unsigned> text_ratio =
+            get_opt_attr<unsigned>(sym, "text-ratio");
+        if (text_ratio)
+        {
             text_symbol.set_text_ratio(*text_ratio);
-	}
+        }
 
-	optional<unsigned> wrap_width =
-            get_opt_attr<unsigned>(sym, "wrap_width");
-	if (wrap_width)
-	{
+        optional<unsigned> wrap_width =
+            get_opt_attr<unsigned>(sym, "wrap-width");
+        if (wrap_width)
+        {
             text_symbol.set_wrap_width(*wrap_width);
-	}
+        }
 
-	optional<boolean> wrap_before =
-            get_opt_attr<boolean>(sym, "wrap_before");
-	if (wrap_before)
-	{
+        optional<boolean> wrap_before =
+            get_opt_attr<boolean>(sym, "wrap-before");
+        if (wrap_before)
+        {
             text_symbol.set_wrap_before(*wrap_before);
-	}
+        }
 
-	// character used to break long strings
-	optional<std::string> wrap_char =
-            get_opt_attr<std::string>(sym, "wrap_character");
-	if (wrap_char && (*wrap_char).size() > 0)
-	{
+        // character used to break long strings
+        optional<std::string> wrap_char =
+            get_opt_attr<std::string>(sym, "wrap-character");
+        if (wrap_char && (*wrap_char).size() > 0)
+        {
             text_symbol.set_wrap_char((*wrap_char)[0]);
-	}
+        }
 
-	// text conversion before rendering
-	text_convert_e tconvert =
-            get_attr<text_convert_e>(sym, "text_convert", NONE);
-	text_symbol.set_text_convert(tconvert);
+        // text conversion before rendering
+        text_transform_e tconvert =
+            get_attr<text_transform_e>(sym, "text-transform", NONE);
+        text_symbol.set_text_transform(tconvert);
 
-	// spacing between text lines
-	optional<unsigned> line_spacing = get_opt_attr<unsigned>(sym, "line_spacing");
-	if (line_spacing)
-	{
+        // spacing between text lines
+        optional<unsigned> line_spacing = get_opt_attr<unsigned>(sym, "line-spacing");
+        if (line_spacing)
+        {
             text_symbol.set_line_spacing(*line_spacing);
-	}
-
-	// spacing between characters in text
-	optional<unsigned> character_spacing = get_opt_attr<unsigned>(sym, "character_spacing");
-	if (character_spacing)
-	{
+        }
+
+        // tolerance between label spacing along line
+        optional<unsigned> label_position_tolerance = get_opt_attr<unsigned>(sym, "label-position-tolerance");
+        if (label_position_tolerance)
+        {
+            text_symbol.set_label_position_tolerance(*label_position_tolerance);
+        }
+
+        // spacing between characters in text
+        optional<unsigned> character_spacing = get_opt_attr<unsigned>(sym, "character-spacing");
+        if (character_spacing)
+        {
             text_symbol.set_character_spacing(*character_spacing);
-	}
+        }
 
-	// spacing between repeated labels on lines
-	optional<unsigned> spacing = get_opt_attr<unsigned>(sym, "spacing");
-	if (spacing)
-	{
+        // spacing between repeated labels on lines
+        optional<unsigned> spacing = get_opt_attr<unsigned>(sym, "spacing");
+        if (spacing)
+        {
             text_symbol.set_label_spacing(*spacing);
-	}
+        }
 
-	// minimum distance between labels
-	optional<unsigned> min_distance =
-            get_opt_attr<unsigned>(sym, "min_distance");
-	if (min_distance)
-	{
+        // minimum distance between labels
+        optional<unsigned> min_distance = get_opt_attr<unsigned>(sym, "minimum-distance");
+        if (min_distance)
+        {
             text_symbol.set_minimum_distance(*min_distance);
-	}
-
-	// do not render labels around edges
-	optional<boolean> avoid_edges =
-            get_opt_attr<boolean>(sym, "avoid_edges");
-	if (avoid_edges)
-	{
+        }
+        
+        // minimum distance from edge of the map
+        optional<unsigned> min_padding = get_opt_attr<unsigned>(sym, "minimum-padding");
+        if (min_padding)
+        {
+            text_symbol.set_minimum_padding(*min_padding);
+        }
+        
+        // minimum path length
+        optional<unsigned> min_path_length = get_opt_attr<unsigned>(sym, "minimum-path-length");
+        if (min_path_length)
+        {
+            text_symbol.set_minimum_path_length(*min_path_length);
+        }
+
+        // do not render labels around edges
+        optional<boolean> avoid_edges =
+            get_opt_attr<boolean>(sym, "avoid-edges");
+        if (avoid_edges)
+        {
             text_symbol.set_avoid_edges( * avoid_edges);
-	}
+        }
 
-	// allow_overlap
-	optional<boolean> allow_overlap =
-            get_opt_attr<boolean>(sym, "allow_overlap");
-	if (allow_overlap)
-	{
+        // allow_overlap
+        optional<boolean> allow_overlap =
+            get_opt_attr<boolean>(sym, "allow-overlap");
+        if (allow_overlap)
+        {
             text_symbol.set_allow_overlap( * allow_overlap );
-	}
+        }
 
-	// opacity
-	optional<double> opacity =
+        // opacity
+        optional<double> opacity =
             get_opt_attr<double>(sym, "opacity");
-	if (opacity)
-	{
-            text_symbol.set_opacity( * opacity );
-	}
-
-	// max_char_angle_delta
-	optional<double> max_char_angle_delta =
-            get_opt_attr<double>(sym, "max_char_angle_delta");
-	if (max_char_angle_delta)
-	{
-            text_symbol.set_max_char_angle_delta( * max_char_angle_delta);
-	}
-
-	// horizontal alignment
-	horizontal_alignment_e halign = get_attr<horizontal_alignment_e>(sym, "horizontal_alignment", H_MIDDLE);
-	text_symbol.set_horizontal_alignment(halign);
-
-	// justify alignment
-	justify_alignment_e jalign = get_attr<justify_alignment_e>(sym, "justify_alignment", J_MIDDLE);
-	text_symbol.set_justify_alignment(jalign);
-
-	rule.append(text_symbol);
+        if (opacity)
+        {
+            text_symbol.set_text_opacity( * opacity );
+        }
+        
+        // max_char_angle_delta
+        optional<double> max_char_angle_delta =
+            get_opt_attr<double>(sym, "max-char-angle-delta");
+        if (max_char_angle_delta)
+        {
+            text_symbol.set_max_char_angle_delta( (*max_char_angle_delta)*(M_PI/180));
+        }
+            
+        // horizontal alignment
+        horizontal_alignment_e halign = get_attr<horizontal_alignment_e>(sym, "horizontal-alignment", H_AUTO);
+        text_symbol.set_horizontal_alignment(halign);
+
+        // justify alignment
+        justify_alignment_e jalign = get_attr<justify_alignment_e>(sym, "justify-alignment", J_MIDDLE);
+        text_symbol.set_justify_alignment(jalign);
+
+        parse_metawriter_in_symbolizer(text_symbol, sym);
+        rule.append(text_symbol);
     }
     catch (const config_error & ex)
     {
-	ex.append_context("in TextSymbolizer");
-	throw;
+        ex.append_context("in TextSymbolizer");
+        throw;
     }
 }
 
-void map_parser::parse_shield_symbolizer( rule_type & rule, ptree const & sym )
+void map_parser::parse_shield_symbolizer( rule & rule, ptree const & sym )
 {
+
+    std::stringstream s;
+    //std::string a[] = {"a","b"};
+    s << "name,face-name,fontset-name,size,fill,"
+      << "dx,dy,placement,vertical-alignment,halo-fill,"
+      << "halo-radius,text-ratio,wrap-width,wrap-before,"
+      << "wrap-character,text-transform,line-spacing,"
+      << "label-position-tolerance,character-spacing,"
+      << "spacing,minimum-distance,minimum-padding,"
+      << "avoid-edges,allow-overlap,opacity,max-char-angle-delta,"
+      << "horizontal-alignment,justify-alignment,"
+      // additional for shield
+      /* transform instead of orientation */ 
+      << "file,base,transform,shield-dx,shield-dy,"
+      << "text-opacity,unlock-image,no-text,"
+      << "meta-writer,meta-output";      
+    
+    ensure_attrs(sym, "ShieldSymbolizer", s.str());
     try
     {
-	std::string name =  get_attr<string>(sym, "name");
-
-	optional<std::string> face_name =
-            get_opt_attr<std::string>(sym, "face_name");
-
-	optional<std::string> fontset_name =
-            get_opt_attr<std::string>(sym, "fontset_name");
-
-	unsigned size = get_attr(sym, "size", 10U);
-	color fill = get_attr(sym, "fill", color(0,0,0));
-
-	std::string image_file = get_attr<string>(sym, "file");
-	optional<std::string> base = get_opt_attr<string>(sym, "base");
-	optional<std::string> type = get_opt_attr<string>(sym, "type");
-	optional<unsigned> width =  get_opt_attr<unsigned>(sym, "width");
-	optional<unsigned> height =  get_opt_attr<unsigned>(sym, "height");
-	
-	try
-	{   
-	    if (!type)
-	    {
-		type = type_from_filename(image_file);
-	    }     
-	    
+        optional<boolean> no_text =
+            get_opt_attr<boolean>(sym, "no-text");
+        std::string name;
+        optional<std::string> old_name = get_opt_attr<std::string>(sym, "name");
+        if (old_name) {
+            std::clog << ": ### WARNING: Using 'name' in ShieldSymbolizer is deprecated (http://trac.mapnik.org/wiki/TextSymbolizer)\n";
+            name = *old_name;
+        } else {
+            name = get_value<std::string>(sym, "ShieldSymbolizer");
+            if (name.empty() && (!no_text || !*no_text) ) throw config_error(std::string("ShieldSymbolizer needs a non-empty text"));
+        }
+
+        optional<std::string> face_name =
+            get_opt_attr<std::string>(sym, "face-name");
+
+        optional<std::string> fontset_name =
+            get_opt_attr<std::string>(sym, "fontset-name");
+
+        unsigned size = get_attr(sym, "size", 10U);
+        color fill = get_attr(sym, "fill", color(0,0,0));
+
+        std::string image_file = get_attr<std::string>(sym, "file");
+        optional<std::string> base = get_opt_attr<std::string>(sym, "base");
+        
+        optional<std::string> transform_wkt = get_opt_attr<std::string>(sym, "transform");
+        try
+        {
             if( base )
             {
-		std::map<std::string,std::string>::const_iterator itr = file_sources_.find(*base);
-		if (itr!=file_sources_.end())
-		{
-		    image_file = itr->second + "/" + image_file;
-		}
+                std::map<std::string,std::string>::const_iterator itr = file_sources_.find(*base);
+                if (itr!=file_sources_.end())
+                {
+                    image_file = itr->second + "/" + image_file;
+                }
             }
 
-            if ( relative_to_xml_ )
-            {
-		image_file = ensure_relative_to_xml(image_file);
-            }
-#ifdef MAPNIK_DEBUG
-            else {
-		std::clog << "\nFound relative paths in xml, leaving unchanged...\n";
-            }
-#endif
-	    if (!width || !height)
-	    {
-		
-		std::auto_ptr<ImageReader> reader(get_image_reader(image_file,*type));
-		if (reader.get())
-		{
-		    if (!width) width = reader->width();
-		    if (!height) height = reader->height();
-		}
-		if (!width || !height) throw  ImageReaderException(" type:" + *type);
-	    }
-	    
-            shield_symbolizer shield_symbol(name,size,fill,
-                                            image_file,*type,*width,*height);
-            
+            image_file = ensure_relative_to_xml(image_file);
+
+            shield_symbolizer shield_symbol(parse_expression(name, "utf8"),size,fill,parse_path(image_file));
+                
             if (fontset_name && face_name)
             {
-		throw config_error(std::string("Can't have both face_name and fontset_name"));
+                throw config_error(std::string("Can't have both face-name and fontset-name"));
             }
             else if (fontset_name)
             {
-		std::map<std::string,FontSet>::const_iterator itr = fontsets_.find(*fontset_name);
-		if (itr != fontsets_.end())
-		{
-		    shield_symbol.set_fontset(itr->second);
-		}
-		else
-		{
-		    throw config_error("Unable to find any fontset named '" + *fontset_name + "'");
-		}
+                std::map<std::string,font_set>::const_iterator itr = fontsets_.find(*fontset_name);
+                if (itr != fontsets_.end())
+                {
+                    shield_symbol.set_fontset(itr->second);
+                }
+                else
+                {
+                    throw config_error("Unable to find any fontset named '" + *fontset_name + "'");
+                }
             }
             else if (face_name)
             {
-		if ( strict_ )
-		{
-		    ensure_font_face(*face_name);
-		}
-		shield_symbol.set_face_name(*face_name);
+                if ( strict_ )
+                {
+                    ensure_font_face(*face_name);
+                }
+                shield_symbol.set_face_name(*face_name);
             }
             else
             {
-		throw config_error(std::string("Must have face_name or fontset_name"));
+                throw config_error(std::string("Must have face-name or fontset-name"));
             }
-            // text displacement
+            // text displacement (relative to shield_displacement)
             double dx = get_attr(sym, "dx", 0.0);
             double dy = get_attr(sym, "dy", 0.0);
             shield_symbol.set_displacement(dx,dy);
-
+            // shield displacement
+            double shield_dx = get_attr(sym, "shield-dx", 0.0);
+            double shield_dy = get_attr(sym, "shield-dy", 0.0);
+            shield_symbol.set_shield_displacement(shield_dx,shield_dy);
+            
             label_placement_e placement =
-		get_attr<label_placement_e>(sym, "placement", POINT_PLACEMENT);
+                get_attr<label_placement_e>(sym, "placement", POINT_PLACEMENT);
             shield_symbol.set_label_placement( placement );
 
             // don't render shields around edges
             optional<boolean> avoid_edges =
-		get_opt_attr<boolean>(sym, "avoid_edges");
+                get_opt_attr<boolean>(sym, "avoid-edges");
             if (avoid_edges)
             {
-		shield_symbol.set_avoid_edges( *avoid_edges);
+                shield_symbol.set_avoid_edges( *avoid_edges);
             }
 
             // halo fill and radius
-            optional<color> halo_fill = get_opt_attr<color>(sym, "halo_fill");
+            optional<color> halo_fill = get_opt_attr<color>(sym, "halo-fill");
             if (halo_fill)
             {
-		shield_symbol.set_halo_fill( * halo_fill );
+                shield_symbol.set_halo_fill( * halo_fill );
             }
-            optional<unsigned> halo_radius =
-		get_opt_attr<unsigned>(sym, "halo_radius");
+            optional<double> halo_radius =
+                get_opt_attr<double>(sym, "halo-radius");
             if (halo_radius)
             {
-		shield_symbol.set_halo_radius(*halo_radius);
+                shield_symbol.set_halo_radius(*halo_radius);
             }
 
             // minimum distance between labels
-            optional<unsigned> min_distance =
-		get_opt_attr<unsigned>(sym, "min_distance");
+            optional<unsigned> min_distance = get_opt_attr<unsigned>(sym, "minimum-distance");
             if (min_distance)
             {
-		shield_symbol.set_minimum_distance(*min_distance);
+                shield_symbol.set_minimum_distance(*min_distance);
             }
 
+            // minimum distance from edge of the map
+            optional<unsigned> min_padding = get_opt_attr<unsigned>(sym, "minimum-padding");
+            if (min_padding)
+            {
+                shield_symbol.set_minimum_padding(*min_padding);
+            }
+            
             // spacing between repeated labels on lines
             optional<unsigned> spacing = get_opt_attr<unsigned>(sym, "spacing");
             if (spacing)
             {
-		shield_symbol.set_label_spacing(*spacing);
+                shield_symbol.set_label_spacing(*spacing);
             }
 
             // allow_overlap
             optional<boolean> allow_overlap =
-		get_opt_attr<boolean>(sym, "allow_overlap");
+                get_opt_attr<boolean>(sym, "allow-overlap");
             if (allow_overlap)
             {
-		shield_symbol.set_allow_overlap( * allow_overlap );
+                shield_symbol.set_allow_overlap( * allow_overlap );
             }
 
             // vertical alignment
-            vertical_alignment_e valign = get_attr<vertical_alignment_e>(sym, "vertical_alignment", MIDDLE);
+            vertical_alignment_e valign = get_attr<vertical_alignment_e>(sym, "vertical-alignment", V_MIDDLE);
             shield_symbol.set_vertical_alignment(valign);
 
             // horizontal alignment
-            horizontal_alignment_e halign = get_attr<horizontal_alignment_e>(sym, "horizontal_alignment", H_MIDDLE);
+            horizontal_alignment_e halign = get_attr<horizontal_alignment_e>(sym, "horizontal-alignment", H_MIDDLE);
             shield_symbol.set_horizontal_alignment(halign);
 
             // justify alignment
-            justify_alignment_e jalign = get_attr<justify_alignment_e>(sym, "justify_alignment", J_MIDDLE);
+            justify_alignment_e jalign = get_attr<justify_alignment_e>(sym, "justify-alignment", J_MIDDLE);
             shield_symbol.set_justify_alignment(jalign);
 
             optional<unsigned> wrap_width =
-		get_opt_attr<unsigned>(sym, "wrap_width");
+                get_opt_attr<unsigned>(sym, "wrap-width");
             if (wrap_width)
             {
-		shield_symbol.set_wrap_width(*wrap_width);
+                shield_symbol.set_wrap_width(*wrap_width);
             }
 
             optional<boolean> wrap_before =
-		get_opt_attr<boolean>(sym, "wrap_before");
+                get_opt_attr<boolean>(sym, "wrap-before");
             if (wrap_before)
             {
-		shield_symbol.set_wrap_before(*wrap_before);
+                shield_symbol.set_wrap_before(*wrap_before);
             }
 
             // character used to break long strings
             optional<std::string> wrap_char =
-		get_opt_attr<std::string>(sym, "wrap_character");
+                get_opt_attr<std::string>(sym, "wrap-character");
             if (wrap_char && (*wrap_char).size() > 0)
             {
-		shield_symbol.set_wrap_char((*wrap_char)[0]);
+                shield_symbol.set_wrap_char((*wrap_char)[0]);
             }
 
             // text conversion before rendering
-            text_convert_e tconvert =
-		get_attr<text_convert_e>(sym, "text_convert", NONE);
-            shield_symbol.set_text_convert(tconvert);
+            text_transform_e tconvert =
+                get_attr<text_transform_e>(sym, "text-transform", NONE);
+            shield_symbol.set_text_transform(tconvert);
 
             // spacing between text lines
-            optional<unsigned> line_spacing = get_opt_attr<unsigned>(sym, "line_spacing");
+            optional<unsigned> line_spacing = get_opt_attr<unsigned>(sym, "line-spacing");
             if (line_spacing)
             {
-		shield_symbol.set_line_spacing(*line_spacing);
+                shield_symbol.set_line_spacing(*line_spacing);
             }
 
             // spacing between characters in text
-            optional<unsigned> character_spacing = get_opt_attr<unsigned>(sym, "character_spacing");
+            optional<unsigned> character_spacing = get_opt_attr<unsigned>(sym, "character-spacing");
             if (character_spacing)
             {
-		shield_symbol.set_character_spacing(*character_spacing);
+                shield_symbol.set_character_spacing(*character_spacing);
             }
 
             // opacity
             optional<double> opacity =
-		get_opt_attr<double>(sym, "opacity");
+                get_opt_attr<double>(sym, "opacity");
             if (opacity)
             {
-		shield_symbol.set_opacity( * opacity );
+                shield_symbol.set_opacity( * opacity );
             }
-
+            
+            // text-opacity
+            optional<double> text_opacity =
+                get_opt_attr<double>(sym, "text-opacity");
+            if (text_opacity)
+            {
+                shield_symbol.set_text_opacity( * text_opacity );
+            }
+
+            if (transform_wkt)
+            {
+                agg::trans_affine tr;
+                if (!mapnik::svg::parse_transform(*transform_wkt,tr))
+                {
+                    std::stringstream ss;
+                    ss << "Could not parse transform from '" << transform_wkt << "', expected string like: 'matrix(1, 0, 0, 1, 0, 0)'";
+                    if (strict_)
+                        throw config_error(ss.str()); // value_error here?
+                    else
+                        std::clog << "### WARNING: " << ss << endl;         
+                }
+                boost::array<double,6> matrix;
+                tr.store_to(&matrix[0]);
+                shield_symbol.set_transform(matrix);
+            }
+            
             // unlock_image
             optional<boolean> unlock_image =
-		get_opt_attr<boolean>(sym, "unlock_image");
+                get_opt_attr<boolean>(sym, "unlock-image");
             if (unlock_image)
             {
-		shield_symbol.set_unlock_image( * unlock_image );
+                shield_symbol.set_unlock_image( * unlock_image );
             }
 
             // no text
-            optional<boolean> no_text =
-		get_opt_attr<boolean>(sym, "no_text");
             if (no_text)
             {
-		shield_symbol.set_no_text( * no_text );
+                shield_symbol.set_no_text( * no_text );
             }
 
+            parse_metawriter_in_symbolizer(shield_symbol, sym);
             rule.append(shield_symbol);
-	}
-	catch (ImageReaderException const & ex )
-	{
-            string msg("Failed to load image file '" + image_file +
+        }
+        catch (image_reader_exception const & ex )
+        {
+            std::string msg("Failed to load image file '" + image_file +
                        "': " + ex.what());
             if (strict_)
             {
-		throw config_error(msg);
+                throw config_error(msg);
             }
             else
             {
-		clog << "### WARNING: " << msg << endl;
+                std::clog << "### WARNING: " << msg << endl;
             }
-	}
+        }
 
     }
     catch (const config_error & ex)
     {
-	ex.append_context("in ShieldSymbolizer");
-	throw;
+        ex.append_context("in ShieldSymbolizer");
+        throw;
     }
 }
 
-void map_parser::parse_line_symbolizer( rule_type & rule, ptree const & sym )
+void map_parser::parse_stroke(stroke & strk, ptree const & sym)
 {
-    try
-    {
-	stroke strk;
-	ptree::const_iterator cssIter = sym.begin();
-	ptree::const_iterator endCss = sym.end();
+    // stroke color
+    optional<color> c = get_opt_attr<color>(sym, "stroke");
+    if (c) strk.set_color(*c);
 
-	for(; cssIter != endCss; ++cssIter)
-	{
-            ptree::value_type const& css_tag = *cssIter;
-            ptree const & css = cssIter->second;
-
-            if (css_tag.first == "CssParameter")
-            {
-		std::string css_name  = get_attr<string>(css, "name");
-		if (css_name == "stroke")
-		{
-		    color c = get_css<color>(css, css_name);
-		    strk.set_color(c);
-		}
-		else if (css_name == "stroke-width")
-		{
-		    float width = get_css<float>(css, css_name);
-		    strk.set_width(width);
-		}
-		else if (css_name == "stroke-opacity")
-		{
-		    float opacity = get_css<float>(css, css_name);
-		    strk.set_opacity(opacity);
-		}
-		else if (css_name == "stroke-linejoin")
-		{
-		    line_join_e line_join = get_css<line_join_e>(css, css_name);
-		    strk.set_line_join( line_join );
-		}
-		else if (css_name == "stroke-linecap")
-		{
-		    line_cap_e line_cap = get_css<line_cap_e>(css, css_name);
-		    strk.set_line_cap( line_cap );
-		}
-		else if (css_name == "stroke-dasharray")
-		{
-		    tokenizer<> tok ( css.data() );
-		    std::vector<float> dash_array;
-		    tokenizer<>::iterator itr = tok.begin();
-		    for (; itr != tok.end(); ++itr)
-		    {
-			try
-			{
-			    float f = boost::lexical_cast<float>(*itr);
-			    dash_array.push_back(f);
-			}
-			catch ( boost::bad_lexical_cast &)
-			{
-			    throw config_error(std::string("Failed to parse CSS ") +
-					       "parameter '" + css_name + "'. Expected a " +
-					       "list of floats but got '" + css.data() + "'");
-			}
-		    }
-		    if (dash_array.size())
-		    {
-			size_t size = dash_array.size();
-			if ( size % 2)
-			{
-			    for (size_t i=0; i < size ;++i)
-			    {
-				dash_array.push_back(dash_array[i]);
-			    }
-			}
-			std::vector<float>::const_iterator pos = dash_array.begin();
-			while (pos != dash_array.end())
-			{
-			    strk.add_dash(*pos,*(pos + 1));
-			    pos +=2;
-			}
-		    }
-		}
-		else
-		{
-		    throw config_error(std::string("Failed to parse unknown CSS ") +
-				       "parameter '" + css_name + "'");
-		}
+    // stroke-width
+    optional<double> width =  get_opt_attr<double>(sym, "stroke-width");
+    if (width) strk.set_width(*width);
+
+    // stroke-opacity
+    optional<double> opacity = get_opt_attr<double>(sym, "stroke-opacity");
+    if (opacity) strk.set_opacity(*opacity);
+
+    // stroke-linejoin
+    optional<line_join_e> line_join = get_opt_attr<line_join_e>(sym, "stroke-linejoin");
+    if (line_join) strk.set_line_join(*line_join);
+
+    // stroke-linecap
+    optional<line_cap_e> line_cap = get_opt_attr<line_cap_e>(sym, "stroke-linecap");
+    if (line_cap) strk.set_line_cap(*line_cap);
+
+    // stroke-gamma
+    optional<double> gamma = get_opt_attr<double>(sym, "stroke-gamma");
+    if (gamma) strk.set_gamma(*gamma);
+
+    // stroke-dashoffset
+    optional<double> dash_offset = get_opt_attr<double>(sym, "stroke-dashoffset");
+    if (dash_offset) strk.set_dash_offset(*dash_offset);
+
+    // stroke-dasharray
+    optional<std::string> str = get_opt_attr<std::string>(sym,"stroke-dasharray");
+    if (str) 
+    {
+        tokenizer<> tok (*str);
+        std::vector<double> dash_array;
+        tokenizer<>::iterator itr = tok.begin();
+        for (; itr != tok.end(); ++itr)
+        {
+            try
+            {
+                double f = boost::lexical_cast<double>(*itr);
+                dash_array.push_back(f);
             }
-            else if (css_tag.first != "<xmlcomment>" &&
-                     css_tag.first != "<xmlattr>" )
+            catch ( boost::bad_lexical_cast &)
+            {
+                throw config_error(std::string("Failed to parse dasharray ") +
+                                   "'. Expected a " +
+                                   "list of floats but got '" + (*str) + "'");
+            }
+        }
+        if (dash_array.size())
+        {
+            size_t size = dash_array.size();
+            if ( size % 2)
             {
-		throw config_error(std::string("Unknown child node. ") +
-				   "Expected 'CssParameter' but got '" + css_tag.first + "'");
+                for (size_t i=0; i < size ;++i)
+                {
+                    dash_array.push_back(dash_array[i]);
+                }
             }
-	}
-	rule.append(line_symbolizer(strk));
+            std::vector<double>::const_iterator pos = dash_array.begin();
+            while (pos != dash_array.end())
+            {
+                strk.add_dash(*pos,*(pos + 1));
+                pos +=2;
+            }
+        }
+    }
+}
+
+void map_parser::parse_line_symbolizer( rule & rule, ptree const & sym )
+{
+    std::stringstream s;
+    s << "stroke,stroke-width,stroke-opacity,stroke-linejoin,"
+      << "stroke-linecap,stroke-gamma,stroke-dash-offset,stroke-dasharray,"
+      << "rasterizer,"
+      << "meta-writer,meta-output";
+
+    ensure_attrs(sym, "LineSymbolizer", s.str());
+    try
+    {
+        stroke strk;
+        parse_stroke(strk,sym);
+        line_symbolizer symbol = line_symbolizer(strk);
+
+        // rasterizer method
+        line_rasterizer_e rasterizer = get_attr<line_rasterizer_e>(sym, "rasterizer", RASTERIZER_FULL);
+        //optional<line_rasterizer_e> rasterizer_method = get_opt_attr<line_rasterizer_e>(sym, "full");
+        symbol.set_rasterizer(rasterizer);
+
+        parse_metawriter_in_symbolizer(symbol, sym);
+        rule.append(symbol);
     }
     catch (const config_error & ex)
     {
-	ex.append_context("in LineSymbolizer");
-	throw;
+        ex.append_context("in LineSymbolizer");
+        throw;
     }
 }
 
-
-void map_parser::parse_polygon_symbolizer( rule_type & rule, ptree const & sym )
+    
+void map_parser::parse_polygon_symbolizer( rule & rule, ptree const & sym )
 {
+    ensure_attrs(sym, "PolygonSymbolizer", "fill,fill-opacity,gamma,meta-writer,meta-output");
     try
     {
-	polygon_symbolizer poly_sym;
-
-	ptree::const_iterator cssIter = sym.begin();
-	ptree::const_iterator endCss = sym.end();
+        polygon_symbolizer poly_sym;
+        // fill
+        optional<color> fill = get_opt_attr<color>(sym, "fill");
+        if (fill) poly_sym.set_fill(*fill);
+        // fill-opacity
+        optional<double> opacity = get_opt_attr<double>(sym, "fill-opacity");
+        if (opacity) poly_sym.set_opacity(*opacity);
+        // gamma
+        optional<double> gamma = get_opt_attr<double>(sym, "gamma");
+        if (gamma)  poly_sym.set_gamma(*gamma);
+
+        parse_metawriter_in_symbolizer(poly_sym, sym);
+        rule.append(poly_sym);
+    }
+    catch (const config_error & ex)
+    {
+        ex.append_context("in PolygonSymbolizer");
+        throw;
+    }
+}
 
-	for(; cssIter != endCss; ++cssIter)
-	{
-            ptree::value_type const& css_tag = *cssIter;
-            ptree const & css = cssIter->second;
-
-            if (css_tag.first == "CssParameter")
-            {
-		std::string css_name  = get_attr<string>(css, "name");
-		if (css_name == "fill")
-		{
-		    color c = get_css<color>(css, css_name);
-		    poly_sym.set_fill(c);
-		}
-		else if (css_name == "fill-opacity")
-		{
-		    float opacity = get_css<float>(css, css_name);
-		    poly_sym.set_opacity(opacity);
-		}
-		else if (css_name == "gamma")
-		{
-		    float gamma = get_css<float>(css, css_name);
-		    poly_sym.set_gamma(gamma);
-		}
-		else
-		{
-		    throw config_error(std::string("Failed to parse unknown CSS ") +
-				       "parameter '" + css_name + "'");
-		}
-            }
-            else if (css_tag.first != "<xmlcomment>" &&
-                     css_tag.first != "<xmlattr>" )
-            {
-		throw config_error(std::string("Unknown child node. ") +
-				   "Expected 'CssParameter' but got '" + css_tag.first + "'");
-            }
-	}
-	rule.append(poly_sym);
 
+void map_parser::parse_building_symbolizer( rule & rule, ptree const & sym )
+{
+    ensure_attrs(sym, "PolygonSymbolizer", "fill,fill-opacity,height,meta-writer,meta-output");
+    try 
+    {
+        building_symbolizer building_sym;
+
+        // fill
+        optional<color> fill = get_opt_attr<color>(sym, "fill");
+        if (fill) building_sym.set_fill(*fill);
+        // fill-opacity
+        optional<double> opacity = get_opt_attr<double>(sym, "fill-opacity");
+        if (opacity) building_sym.set_opacity(*opacity);
+        // height
+        // TODO - expression
+        optional<double> height = get_opt_attr<double>(sym, "height");
+        if (height) building_sym.set_height(*height);
+
+        parse_metawriter_in_symbolizer(building_sym, sym);
+        rule.append(building_sym);
     }
     catch (const config_error & ex)
     {
-	ex.append_context("in PolygonSymbolizer");
-	throw;
+        ex.append_context("in BuildingSymbolizer");
+        throw;
     }
 }
 
-
-void map_parser::parse_building_symbolizer( rule_type & rule, ptree const & sym )
+void map_parser::parse_raster_symbolizer( rule & rule, ptree const & sym )
 {
-    try {
-	building_symbolizer building_sym;
+    // no support for meta-writer,meta-output
+    ensure_attrs(sym, "RasterSymbolizer", "mode,scaling,opacity,filter-factor,mesh-size");
+    try
+    {
+        raster_symbolizer raster_sym;
+
+        // mode
+        optional<std::string> mode = get_opt_attr<std::string>(sym, "mode");
+        if (mode) raster_sym.set_mode(*mode);
+
+        // scaling
+        optional<std::string> scaling = get_opt_attr<std::string>(sym, "scaling");
+        if (scaling) raster_sym.set_scaling(*scaling);
 
-	ptree::const_iterator cssIter = sym.begin();
-	ptree::const_iterator endCss = sym.end();
+        // opacity
+        optional<double> opacity = get_opt_attr<double>(sym, "opacity");
+        if (opacity) raster_sym.set_opacity(*opacity);
 
-	for(; cssIter != endCss; ++cssIter)
-	{
+        // filter factor
+        optional<double> filter_factor = get_opt_attr<double>(sym, "filter-factor");
+        if (filter_factor) raster_sym.set_filter_factor(*filter_factor);
+
+        // mesh-size
+        optional<unsigned> mesh_size = get_opt_attr<unsigned>(sym, "mesh-size");
+        if (mesh_size) raster_sym.set_mesh_size(*mesh_size);
+
+
+        ptree::const_iterator cssIter = sym.begin();
+        ptree::const_iterator endCss = sym.end();
+
+        for(; cssIter != endCss; ++cssIter)
+        {
             ptree::value_type const& css_tag = *cssIter;
-            ptree const & css = cssIter->second;
-
-            if (css_tag.first == "CssParameter")
-            {
-		std::string css_name  = get_attr<string>(css, "name");
-		std::string data = css.data();
-		if (css_name == "fill")
-		{
-		    color c = get_css<color>(css, css_name);
-		    building_sym.set_fill(c);
-		}
-		else if (css_name == "fill-opacity")
-		{
-		    float opacity = get_css<float>(css, css_name);
-		    building_sym.set_opacity(opacity);
-		}
-		else if (css_name == "height")
-		{
-		    float height = get_css<float>(css,css_name);
-		    building_sym.set_height(height);
-		}
-		else
-		{
-		    throw config_error(std::string("Failed to parse unknown CSS ") +
-				       "parameter '" + css_name + "'");
-		}
+
+            if (css_tag.first == "RasterColorizer")
+            {
+                raster_colorizer_ptr colorizer(new raster_colorizer());
+                raster_sym.set_colorizer(colorizer);
+                parse_raster_colorizer(colorizer, css_tag.second);
             }
             else if (css_tag.first != "<xmlcomment>" &&
                      css_tag.first != "<xmlattr>" )
             {
-		throw config_error(std::string("Unknown child node. ") +
-				   "Expected 'CssParameter' but got '" + css_tag.first + "'");
+                throw config_error(std::string("Unknown child node. ") +
+                                   "Expected 'RasterColorizer' but got '" + css_tag.first + "'");
             }
-	}
-	rule.append(building_sym);
+        }
+        //Note: raster_symbolizer doesn't support metawriters
+        rule.append(raster_sym);
     }
     catch (const config_error & ex)
     {
-	ex.append_context("in BuildingSymbolizer");
-	throw;
+        ex.append_context("in RasterSymbolizer");
+        throw;
     }
 }
 
-void map_parser::parse_raster_symbolizer( rule_type & rule, ptree const & sym )
+void map_parser::parse_glyph_symbolizer(rule & rule, ptree const & sym)
 {
+    ensure_attrs(sym, "GlyphSymbolizer", "face-name,char,angle,angle-mode,value,size,color,halo-fill,halo-radius,allow-overlap,avoid-edges,dx,dy,meta-writer,meta-output");
     try
     {
-	raster_symbolizer raster_sym;
-
-	ptree::const_iterator cssIter = sym.begin();
-	ptree::const_iterator endCss = sym.end();
+        // Parse required constructor args
+        std::string face_name = get_attr<std::string>(sym, "face-name");
+        std::string _char = get_attr<std::string>(sym, "char");
+
+        glyph_symbolizer glyph_sym = glyph_symbolizer(
+            face_name,
+            parse_expression(_char, "utf8")
+            );
+
+        //
+        // parse and set optional attrs.
+        //
+
+        // angle
+        optional<std::string> angle =
+            get_opt_attr<std::string>(sym, "angle");
+        if (angle)
+            glyph_sym.set_angle(parse_expression(*angle, "utf8"));
+
+        angle_mode_e angle_mode =
+            get_attr<angle_mode_e>(sym, "angle-mode", TRIGONOMETRIC);
+        glyph_sym.set_angle_mode(angle_mode);
+                    
+        // value
+        optional<std::string> value =
+            get_opt_attr<std::string>(sym, "value");
+        if (value)
+            glyph_sym.set_value(parse_expression(*value, "utf8"));
+
+        // size
+        std::string size =
+            get_attr<std::string>(sym, "size");
+        glyph_sym.set_size(parse_expression(size, "utf8"));
+
+        // color
+        optional<std::string> _color =
+            get_opt_attr<std::string>(sym, "color");
+        if (_color)
+            glyph_sym.set_color(parse_expression(*_color, "utf8"));
+
+        // halo_fill
+        optional<color> halo_fill = get_opt_attr<color>(sym, "halo-fill");
+        if (halo_fill)
+            glyph_sym.set_halo_fill(*halo_fill);
+
+        // halo_radius
+        optional<double> halo_radius = get_opt_attr<double>(
+            sym,
+            "halo-radius");
+        if (halo_radius)
+            glyph_sym.set_halo_radius(*halo_radius);
+        
+        // allow_overlap
+        optional<boolean> allow_overlap = get_opt_attr<boolean>(
+            sym,
+            "allow-overlap"
+            );
+        if (allow_overlap)
+            glyph_sym.set_allow_overlap(*allow_overlap);
+
+        // avoid_edges
+        optional<boolean> avoid_edges = get_opt_attr<boolean>(
+            sym,
+            "avoid-edges"
+            );
+        if (avoid_edges)
+            glyph_sym.set_avoid_edges(*avoid_edges);
+
+        // displacement
+        optional<double> dx = get_opt_attr<double>(sym, "dx");
+        optional<double> dy = get_opt_attr<double>(sym, "dy");
+        if (dx && dy)
+            glyph_sym.set_displacement(*dx, *dy);
+
+        // colorizer
+        ptree::const_iterator childIter = sym.begin();
+        ptree::const_iterator endChild = sym.end();
+
+        for (; childIter != endChild; ++childIter)
+        {
+            ptree::value_type const& tag = *childIter;
+
+            if (tag.first == "RasterColorizer")
+            {
+                raster_colorizer_ptr colorizer(new raster_colorizer());
+                glyph_sym.set_colorizer(colorizer);
+                parse_raster_colorizer(colorizer, tag.second);
+            }
+            else if (tag.first!="<xmlcomment>" && tag.first!="<xmlattr>" )
+            {
+                throw config_error(std::string("Unknown child node. ") +
+                                   "Expected 'RasterColorizer' but got '" +
+                                   tag.first + "'");
+            }
+        }
+
+        parse_metawriter_in_symbolizer(glyph_sym, sym);
+        rule.append(glyph_sym);
+    }
+    catch (const config_error & ex)
+    {
+        ex.append_context("in GlyphSymbolizer");
+        throw;
+    }
+}
 
-	for(; cssIter != endCss; ++cssIter)
-	{
-            ptree::value_type const& css_tag = *cssIter;
-            ptree const & css = cssIter->second;
-
-            if (css_tag.first == "CssParameter")
-            {
-		std::string css_name  = get_attr<string>(css, "name");
-		if (css_name == "mode")
-		{
-		    raster_sym.set_mode(get_css<string>(css, css_name));
-		}
-		else if (css_name == "scaling")
-		{
-		    raster_sym.set_scaling(get_css<string>(css, css_name));
-		}
-		else if (css_name == "opacity")
-		{
-		    float opacity = get_css<float>(css, css_name);
-		    raster_sym.set_opacity(opacity);
-		}
-		else
-		{
-		    throw config_error(std::string("Failed to parse unknown CSS ") +
-				       "parameter '" + css_name + "'");
-		}
+void map_parser::parse_raster_colorizer(raster_colorizer_ptr const& rc,
+                                        ptree const& node )
+{
+    try
+    {
+        ensure_attrs(node, "RasterColorizer", "default-mode,default-color,epsilon");
+        // mode
+        colorizer_mode default_mode =
+            get_attr<colorizer_mode>(node, "default-mode", COLORIZER_LINEAR);
+            
+        if(default_mode == COLORIZER_INHERIT) {
+            throw config_error("RasterColorizer mode must not be INHERIT. ");
+        }
+        rc->set_default_mode( default_mode );
+
+        // default colour
+        optional<color> default_color = get_opt_attr<color>(node, "default-color");
+        if (default_color) 
+        {
+            rc->set_default_color( *default_color );
+        }
+        
+
+        // epsilon
+        optional<float> eps = get_opt_attr<float>(node, "epsilon");
+        if (eps) 
+        {
+            if(*eps < 0) {
+                throw config_error("RasterColorizer epsilon must be > 0. ");
+            }
+            rc->set_epsilon( *eps );
+        }
+
+        
+        ptree::const_iterator stopIter = node.begin();
+        ptree::const_iterator endStop = node.end();
+        float maximumValue = -std::numeric_limits<float>::max();
+
+        for(; stopIter != endStop; ++stopIter)
+        {
+            ptree::value_type const& stop_tag = *stopIter;
+            ptree const & stop = stopIter->second;
+
+            if (stop_tag.first == "stop")
+            {
+                ensure_attrs(stop_tag.second, "stop", "color,mode,value,label");
+                // colour is optional.
+                optional<color> stopcolor = get_opt_attr<color>(stop, "color");
+                if (!stopcolor) {
+                    *stopcolor = *default_color;
+                }
+
+                // mode default to INHERIT
+                colorizer_mode mode =
+                    get_attr<colorizer_mode>(stop, "mode", COLORIZER_INHERIT);
+
+                // value is required, and it must be bigger than the previous
+                optional<float> value =
+                    get_opt_attr<float>(stop, "value");
+                    
+                if(!value) {
+                    throw config_error("stop tag missing value");
+                }
+                
+                if(value < maximumValue) {
+                    throw config_error("stop tag values must be in ascending order");
+                }
+                maximumValue = *value;
+
+                optional<std::string> label =
+                    get_opt_attr<std::string>(stop, "label");
+
+                //append the stop
+                colorizer_stop tmpStop;
+                tmpStop.set_color(*stopcolor);
+                tmpStop.set_mode(mode);
+                tmpStop.set_value(*value);
+                if (label)
+                    tmpStop.set_label(*label);
+                
+                rc->add_stop(tmpStop);
             }
-            else if (css_tag.first != "<xmlcomment>" &&
-                     css_tag.first != "<xmlattr>" )
+            else if (stop_tag.first != "<xmlcomment>" &&
+                     stop_tag.first != "<xmlattr>" )
             {
-		throw config_error(std::string("Unknown child node. ") +
-				   "Expected 'CssParameter' but got '" + css_tag.first + "'");
+                throw config_error(std::string("Unknown child node. ") +
+                                   "Expected 'stop' but got '" + stop_tag.first + "'");
             }
-	}
-	rule.append(raster_sym);
+        }
     }
     catch (const config_error & ex)
     {
-	ex.append_context("in RasterSymbolizer");
-	throw;
+        ex.append_context("in RasterColorizer");
+        throw;
     }
 }
 
@@ -1580,25 +2152,76 @@ void map_parser::ensure_font_face( const std::string & face_name )
 {
     if ( ! font_manager_.get_face( face_name ) )
     {
-	throw config_error("Failed to find font face '" +
-			   face_name + "'");
+        throw config_error("Failed to find font face '" +
+                           face_name + "'");
     }
 }
 
 std::string map_parser::ensure_relative_to_xml( boost::optional<std::string> opt_path )
 {
-    boost::filesystem::path xml_path = filename_;
-    boost::filesystem::path rel_path = *opt_path;
-    if ( !rel_path.has_root_path() ) {
-	boost::filesystem::path full = boost::filesystem::complete(xml_path.branch_path()/rel_path).normalize();
-#ifdef MAPNIK_DEBUG
-	std::clog << "\nModifying relative paths to be relative to xml...\n";
-	std::clog << "original base path: " << *opt_path << "\n";
-	std::clog << "relative base path: " << full.string() << "\n";
-#endif
-	return full.string();
+    if (relative_to_xml_)
+    {
+        boost::filesystem::path xml_path = filename_;
+        boost::filesystem::path rel_path = *opt_path;
+        if ( !rel_path.has_root_path() ) 
+        {
+    #if (BOOST_FILESYSTEM_VERSION == 3)
+            // TODO - normalize is now deprecated, use make_preferred?
+            boost::filesystem::path full = boost::filesystem::absolute(xml_path.parent_path()/rel_path);
+    #else // v2
+            boost::filesystem::path full = boost::filesystem::complete(xml_path.branch_path()/rel_path).normalize();
+    #endif
+    
+    #ifdef MAPNIK_DEBUG
+            std::clog << "\nModifying relative paths to be relative to xml...\n";
+            std::clog << "original base path: " << *opt_path << "\n";
+            std::clog << "relative base path: " << full.string() << "\n";
+    #endif
+            return full.string();
+        }
     }
     return *opt_path;
 }
 
+void map_parser::ensure_attrs(ptree const& sym, std::string name, std::string attrs)
+{
+
+    typedef ptree::key_type::value_type Ch;
+    //typedef boost::property_tree::xml_parser::xmlattr<Ch> x_att;
+    
+    std::set<std::string> attr_set;
+    boost::split(attr_set, attrs, boost::is_any_of(","));
+    for (ptree::const_iterator itr = sym.begin(); itr != sym.end(); ++itr)
+    {
+       //ptree::value_type const& v = *itr;
+       if (itr->first == boost::property_tree::xml_parser::xmlattr<Ch>())
+       {
+           optional<const ptree &> attribs = sym.get_child_optional( boost::property_tree::xml_parser::xmlattr<Ch>() );
+           if (attribs)
+           {
+               std::ostringstream s("");
+               s << "### " << name << " properties warning: ";
+               int missing = 0;
+               for (ptree::const_iterator it = attribs.get().begin(); it != attribs.get().end(); ++it)
+               {
+                   std::string name = it->first;
+                   bool found = (attr_set.find(name) != attr_set.end());
+                   if (!found)
+                   {
+                       if (missing) s << ",";
+                       s << "'" << name << "'";
+                       ++missing;
+                   }
+               }
+               if (missing) {
+                   if (missing > 1) s << " are";
+                   else s << " is";
+                   s << " invalid, acceptable values are:\n'" << attrs << "'\n";
+                   std::clog << s.str();
+               }
+           }
+       }
+   }
+}
+
 } // end of namespace mapnik
diff --git a/src/map.cpp b/src/map.cpp
index 718a7b6..a40ba59 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -23,509 +23,661 @@
 //$Id: map.cpp 17 2005-03-08 23:58:43Z pavlenko $,
 #include <mapnik/map.hpp>
 
-#include <mapnik/style.hpp>
 #include <mapnik/datasource.hpp>
 #include <mapnik/projection.hpp>
 #include <mapnik/filter_featureset.hpp>
 #include <mapnik/hit_test_filter.hpp>
 #include <mapnik/scale_denominator.hpp>
 
+// icu
+#include <unicode/uversion.h>
+
 namespace mapnik
 {
 
-   static const char * aspect_fix_mode_strings[] = {
-        "GROW_BBOX",
-        "GROW_CANVAS",
-        "SHRINK_BBOX",
-        "SHRINK_CANVAS",
-        "ADJUST_BBOX_WIDTH",
-        "ADJUST_BBOX_HEIGHT",
-        "ADJUST_CANVAS_WIDTH",
-        "ADJUST_CANVAS_HEIGHT",
-        ""
-    };
+/** Call cache_metawriters for each symbolizer.*/
+struct metawriter_cache_dispatch : public boost::static_visitor<>
+{
+    metawriter_cache_dispatch (Map const &m) : m_(m) {}
+
+    template <typename T> void operator () (T &sym) const
+    {
+        sym.cache_metawriters(m_);
+    }
+
+    Map const &m_;
+};
+
+static const char * aspect_fix_mode_strings[] = {
+    "GROW_BBOX",
+    "GROW_CANVAS",
+    "SHRINK_BBOX",
+    "SHRINK_CANVAS",
+    "ADJUST_BBOX_WIDTH",
+    "ADJUST_BBOX_HEIGHT",
+    "ADJUST_CANVAS_WIDTH",
+    "ADJUST_CANVAS_HEIGHT",
+    ""
+};
    
-   IMPLEMENT_ENUM( mapnik::aspect_fix_mode_e, aspect_fix_mode_strings );
-
-    Map::Map()
-        : width_(400),
-          height_(400),
-          srs_("+proj=latlong +datum=WGS84"),
-          buffer_size_(0),
-          aspectFixMode_(GROW_BBOX) {}
+IMPLEMENT_ENUM( aspect_fix_mode_e, aspect_fix_mode_strings )
+
+Map::Map()
+    : width_(400),
+      height_(400),
+      srs_("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"),
+      buffer_size_(0),
+      aspectFixMode_(GROW_BBOX),
+      base_path_("") {}
     
-    Map::Map(int width,int height, std::string const& srs)
-        : width_(width),
-          height_(height),
-          srs_(srs),
-          buffer_size_(0),
-          aspectFixMode_(GROW_BBOX) {}
+Map::Map(int width,int height, std::string const& srs)
+    : width_(width),
+      height_(height),
+      srs_(srs),
+      buffer_size_(0),
+      aspectFixMode_(GROW_BBOX),
+      base_path_("") {}
    
-    Map::Map(const Map& rhs)
-        : width_(rhs.width_),
-          height_(rhs.height_),
-          srs_(rhs.srs_),
-          buffer_size_(rhs.buffer_size_),
-          background_(rhs.background_),
-          styles_(rhs.styles_),
-          layers_(rhs.layers_),
-          aspectFixMode_(rhs.aspectFixMode_),
-          currentExtent_(rhs.currentExtent_) {}
+Map::Map(const Map& rhs)
+    : width_(rhs.width_),
+      height_(rhs.height_),
+      srs_(rhs.srs_),
+      buffer_size_(rhs.buffer_size_),
+      background_(rhs.background_),
+      background_image_(rhs.background_image_),
+      styles_(rhs.styles_),
+      metawriters_(rhs.metawriters_),
+      layers_(rhs.layers_),
+      aspectFixMode_(rhs.aspectFixMode_),
+      current_extent_(rhs.current_extent_),
+      maximum_extent_(rhs.maximum_extent_),
+      base_path_(rhs.base_path_),
+      extra_attr_(rhs.extra_attr_) {}
     
-    Map& Map::operator=(const Map& rhs)
-    {
-        if (this==&rhs) return *this;
-        width_=rhs.width_;
-        height_=rhs.height_;
-        srs_=rhs.srs_;
-        buffer_size_ = rhs.buffer_size_;
-        background_=rhs.background_;
-        styles_=rhs.styles_;
-        layers_=rhs.layers_;
-        aspectFixMode_=rhs.aspectFixMode_;
-        return *this;
-    }
+Map& Map::operator=(const Map& rhs)
+{
+    if (this==&rhs) return *this;
+    width_=rhs.width_;
+    height_=rhs.height_;
+    srs_=rhs.srs_;
+    buffer_size_ = rhs.buffer_size_;
+    background_=rhs.background_;
+    background_image_=rhs.background_image_;
+    styles_=rhs.styles_;
+    metawriters_ = rhs.metawriters_;
+    layers_=rhs.layers_;
+    aspectFixMode_=rhs.aspectFixMode_;
+    maximum_extent_=rhs.maximum_extent_;
+    base_path_=rhs.base_path_;
+    extra_attr_=rhs.extra_attr_;
+    return *this;
+}
    
-   std::map<std::string,feature_type_style> const& Map::styles() const
-   {
-      return styles_;
-   }
+std::map<std::string,feature_type_style> const& Map::styles() const
+{
+    return styles_;
+}
    
-   std::map<std::string,feature_type_style> & Map::styles()
-   {
-      return styles_;
-   }
+std::map<std::string,feature_type_style> & Map::styles()
+{
+    return styles_;
+}
    
-    Map::style_iterator Map::begin_styles()
-    {
-        return styles_.begin();
-    }
+Map::style_iterator Map::begin_styles()
+{
+    return styles_.begin();
+}
     
-    Map::style_iterator Map::end_styles()
-    {
-        return styles_.end();
-    }
+Map::style_iterator Map::end_styles()
+{
+    return styles_.end();
+}
     
-    Map::const_style_iterator  Map::begin_styles() const
-    {
-        return styles_.begin();
-    }
+Map::const_style_iterator  Map::begin_styles() const
+{
+    return styles_.begin();
+}
     
-    Map::const_style_iterator  Map::end_styles() const
-    {
-        return styles_.end();
-    }
+Map::const_style_iterator  Map::end_styles() const
+{
+    return styles_.end();
+}
     
-    bool Map::insert_style(std::string const& name,feature_type_style const& style) 
-    {
-        return styles_.insert(make_pair(name,style)).second;
-    }
+bool Map::insert_style(std::string const& name,feature_type_style const& style) 
+{
+    return styles_.insert(make_pair(name,style)).second;
+}
     
-    void Map::remove_style(std::string const& name) 
-    {
-        styles_.erase(name);
-    }
-   
-    bool Map::insert_fontset(std::string const& name, FontSet const& fontset) 
-    {
-        return fontsets_.insert(make_pair(name, fontset)).second;
-    }
-	 
-    FontSet const& Map::find_fontset(std::string const& name) const
-    {
-        std::map<std::string,FontSet>::const_iterator itr = fontsets_.find(name);
-        if (itr!=fontsets_.end())
-            return itr->second;
-        static FontSet default_fontset;
-        return default_fontset;
-    }
+void Map::remove_style(std::string const& name) 
+{
+    styles_.erase(name);
+}
 
-   std::map<std::string,FontSet> const& Map::fontsets() const
-   {
-      return fontsets_;
-   }
-
-   std::map<std::string,FontSet> & Map::fontsets()
-   {
-      return fontsets_;
-   }
-
-   boost::optional<feature_type_style const&> Map::find_style(std::string const& name) const
-   {
-      std::map<std::string,feature_type_style>::const_iterator itr = styles_.find(name);
-      if (itr!=styles_.end()) 
-         return boost::optional<feature_type_style const&>(itr->second);
-      else
-         return boost::optional<feature_type_style const&>() ;
-    }
-    
-    size_t Map::layerCount() const
-    {
-        return layers_.size();
-    }
+boost::optional<feature_type_style const&> Map::find_style(std::string const& name) const
+{
+    std::map<std::string,feature_type_style>::const_iterator itr = styles_.find(name);
+    if (itr != styles_.end())
+        return boost::optional<feature_type_style const&>(itr->second);
+    else
+        return boost::optional<feature_type_style const&>() ;
+}
+
+bool Map::insert_metawriter(std::string const& name, metawriter_ptr const& writer)
+{
+    return metawriters_.insert(make_pair(name, writer)).second;
+}
+
+void Map::remove_metawriter(std::string const& name)
+{
+    metawriters_.erase(name);
+}
+
+metawriter_ptr Map::find_metawriter(std::string const& name) const
+{
+    std::map<std::string, metawriter_ptr>::const_iterator itr = metawriters_.find(name);
+    if (itr != metawriters_.end())
+        return itr->second;
+    else
+        return metawriter_ptr();
+}
+
+std::map<std::string,metawriter_ptr> const& Map::metawriters() const
+{
+    return metawriters_;
+}
+
+Map::const_metawriter_iterator Map::begin_metawriters() const
+{
+    return metawriters_.begin();
+}
+
+Map::const_metawriter_iterator Map::end_metawriters() const
+{
+    return metawriters_.end();
+}
+
+bool Map::insert_fontset(std::string const& name, font_set const& fontset) 
+{
+    return fontsets_.insert(make_pair(name, fontset)).second;
+}
+         
+font_set const& Map::find_fontset(std::string const& name) const
+{
+    std::map<std::string,font_set>::const_iterator itr = fontsets_.find(name);
+    if (itr!=fontsets_.end())
+        return itr->second;
+    static font_set default_fontset;
+    return default_fontset;
+}
+
+std::map<std::string,font_set> const& Map::fontsets() const
+{
+    return fontsets_;
+}
+
+std::map<std::string,font_set> & Map::fontsets()
+{
+    return fontsets_;
+}
+
+size_t Map::layer_count() const
+{
+    return layers_.size();
+}
     
-    void Map::addLayer(const Layer& l)
-    {
-        layers_.push_back(l);
-    }
-    void Map::removeLayer(size_t index)
-    {
-        layers_.erase(layers_.begin()+index);
-    }
+void Map::addLayer(const layer& l)
+{
+    layers_.push_back(l);
+}
+
+void Map::removeLayer(size_t index)
+{
+    layers_.erase(layers_.begin()+index);
+}
     
-    void Map::remove_all() 
-    {
-        layers_.clear();
-        styles_.clear();
-    }
+void Map::remove_all() 
+{
+    layers_.clear();
+    styles_.clear();
+    metawriters_.clear();
+}
     
-    const Layer& Map::getLayer(size_t index) const
-    {
-        return layers_[index];
-    }
+const layer& Map::getLayer(size_t index) const
+{
+    return layers_[index];
+}
 
-    Layer& Map::getLayer(size_t index)
-    {
-        return layers_[index];
-    }
+layer& Map::getLayer(size_t index)
+{
+    return layers_[index];
+}
 
-    std::vector<Layer> const& Map::layers() const
-    {
-        return layers_;
-    }
+std::vector<layer> const& Map::layers() const
+{
+    return layers_;
+}
 
-    std::vector<Layer> & Map::layers()
-    {
-        return layers_;
-    }
+std::vector<layer> & Map::layers()
+{
+    return layers_;
+}
 
-    unsigned Map::getWidth() const
-    {
-        return width_;
-    }
+unsigned Map::width() const
+{
+    return width_;
+}
 
-    unsigned Map::getHeight() const
-    {
-        return height_;
-    }
+unsigned Map::height() const
+{
+    return height_;
+}
     
-    void Map::setWidth(unsigned width)
+void Map::set_width(unsigned width)
+{
+    if (width >= MIN_MAPSIZE && width <= MAX_MAPSIZE)
     {
-        if (width >= MIN_MAPSIZE && width <= MAX_MAPSIZE)
-        {
-            width_=width;
-            fixAspectRatio();
-        }	
-    }
+        width_=width;
+        fixAspectRatio();
+    }   
+}
 
-    void Map::setHeight(unsigned height)
+void Map::set_height(unsigned height)
+{
+    if (height >= MIN_MAPSIZE && height <= MAX_MAPSIZE)
     {
-        if (height >= MIN_MAPSIZE && height <= MAX_MAPSIZE)
-        {
-            height_=height;
-            fixAspectRatio();
-        }
+        height_=height;
+        fixAspectRatio();
     }
+}
     
-    void Map::resize(unsigned width,unsigned height)
+void Map::resize(unsigned width,unsigned height)
+{
+    if (width >= MIN_MAPSIZE && width <= MAX_MAPSIZE &&
+        height >= MIN_MAPSIZE && height <= MAX_MAPSIZE)
     {
-        if (width >= MIN_MAPSIZE && width <= MAX_MAPSIZE &&
-            height >= MIN_MAPSIZE && height <= MAX_MAPSIZE)
-        {
-            width_=width;
-            height_=height;
-            fixAspectRatio();
-        }
+        width_=width;
+        height_=height;
+        fixAspectRatio();
     }
+}
 
-    std::string const&  Map::srs() const
-    {
-        return srs_;
-    }
+std::string const&  Map::srs() const
+{
+    return srs_;
+}
     
-   void Map::set_srs(std::string const& srs)
-   {
-      srs_ = srs;
-   }
+void Map::set_srs(std::string const& srs)
+{
+    srs_ = srs;
+}
+   
+void Map::set_buffer_size( int buffer_size)
+{
+    buffer_size_ = buffer_size;
+}
+
+int Map::buffer_size() const
+{
+    return buffer_size_;
+}
    
-   void Map::set_buffer_size( int buffer_size)
-   {
-      buffer_size_ = buffer_size;
-   }
-
-   int Map::buffer_size() const
-   {
-      return buffer_size_;
-   }
+boost::optional<color> const& Map::background() const
+{
+    return background_;
+}
    
-   boost::optional<color> const& Map::background() const
-   {
-      return background_;
-   }
+void Map::set_background(const color& c)
+{
+    background_ = c;
+}
    
-   void Map::set_background(const color& c)
-   {
-      background_ = c;
-   }
+boost::optional<std::string> const& Map::background_image() const
+{
+    return background_image_;
+}
    
-    void Map::zoom(double factor)
-    {
-        coord2d center = currentExtent_.center();
-        double w = factor * currentExtent_.width();
-        double h = factor * currentExtent_.height();
-        currentExtent_ = Envelope<double>(center.x - 0.5 * w, 
-                                          center.y - 0.5 * h,
-                                          center.x + 0.5 * w, 
-                                          center.y + 0.5 * h);
-        fixAspectRatio();
-    }
+void Map::set_background_image(std::string const& image_filename)
+{
+    background_image_ = image_filename;
+}
+
+void Map::set_maximum_extent(box2d<double> const& box)
+{
+    maximum_extent_ = box;
+}
+        
+boost::optional<box2d<double> > const& Map::maximum_extent() const
+{
+    return maximum_extent_;
+}
+
+std::string const&  Map::base_path() const
+{
+    return base_path_;
+}
+
+void Map::set_base_path(std::string const& base)
+{
+    base_path_ = base;
+}
+
+void Map::zoom(double factor)
+{
+    coord2d center = current_extent_.center();
+    double w = factor * current_extent_.width();
+    double h = factor * current_extent_.height();
+    current_extent_ = box2d<double>(center.x - 0.5 * w, 
+                                   center.y - 0.5 * h,
+                                   center.x + 0.5 * w, 
+                                   center.y + 0.5 * h);
+    fixAspectRatio();
+}
     
-    void Map::zoom_all() 
+void Map::zoom_all() 
+{
+    if (maximum_extent_) {
+        zoom_to_box(*maximum_extent_);
+    }
+    else
     {
         try 
         {
             projection proj0(srs_);
-            Envelope<double> ext;
+            box2d<double> ext;
+            bool success = false;
             bool first = true;
-            std::vector<Layer>::const_iterator itr = layers_.begin();
-            std::vector<Layer>::const_iterator end = layers_.end();
+            std::vector<layer>::const_iterator itr = layers_.begin();
+            std::vector<layer>::const_iterator end = layers_.end();
             while (itr != end)
             {
-                std::string const& layer_srs = itr->srs();
-                projection proj1(layer_srs);
-                proj_transform prj_trans(proj0,proj1);
-                
-                Envelope<double> layerExt = itr->envelope();
-                double x0 = layerExt.minx();
-                double y0 = layerExt.miny();
-                double z0 = 0.0;
-                double x1 = layerExt.maxx();
-                double y1 = layerExt.maxy();
-                double z1 = 0.0;
-                prj_trans.backward(x0,y0,z0);
-                prj_trans.backward(x1,y1,z1);
-                
-                Envelope<double> layerExt2(x0,y0,x1,y1);
-#ifdef MAPNIK_DEBUG
-                std::clog << " layer1 - > " << layerExt << "\n";
-                std::clog << " layer2 - > " << layerExt2 << "\n";
-#endif                
-                if (first)
-                {
-                    ext = layerExt2;
-                    first = false;
-                }
-                else 
+                if (itr->isActive())
                 {
-                    ext.expand_to_include(layerExt2);
+                    std::string const& layer_srs = itr->srs();
+                    projection proj1(layer_srs);
+                    
+                    proj_transform prj_trans(proj0,proj1);
+                        
+                    box2d<double> layer_ext = itr->envelope();
+                    // TODO - consider using more robust method: http://trac.mapnik.org/ticket/751
+                    if (prj_trans.backward(layer_ext))
+                    {
+                        success = true;
+            #ifdef MAPNIK_DEBUG
+                        std::clog << " layer " << itr->name() << " original ext: " << itr->envelope() << "\n";
+                        std::clog << " layer " << itr->name() << " transformed to map srs: " << layer_ext << "\n";
+            #endif                
+                        if (first)
+                        {
+                            ext = layer_ext;
+                            first = false;
+                        }
+                        else 
+                        {
+                            ext.expand_to_include(layer_ext);
+                        }
+                    }
                 }
                 ++itr;
             }
-            zoomToBox(ext);
+            if (success) {
+                zoom_to_box(ext);
+            } else {
+                std::ostringstream s;
+                s << "could not zoom to combined layer extents "
+                  << "using zoom_all because proj4 could not "
+                  << "back project any layer extents into the map srs "
+                  << "(set map 'maximum-extent' to override layer extents)";
+                throw std::runtime_error(s.str());
+            }
         }
         catch (proj_init_error & ex)
         {
-           std::clog << "proj_init_error:" << ex.what() << '\n';
-        }
+            std::clog << "proj_init_error:" << ex.what() << "\n";
+        }    
     }
+}
 
-    void Map::zoomToBox(const Envelope<double> &box)
-    {
-        currentExtent_=box;
-        fixAspectRatio();
-    }
+void Map::zoom_to_box(const box2d<double> &box)
+{
+    current_extent_=box;
+    fixAspectRatio();
+}
 
-    void Map::fixAspectRatio()
-    {
-        double ratio1 = (double) width_ / (double) height_;
-        double ratio2 = currentExtent_.width() / currentExtent_.height();
-        if (ratio1 == ratio2) return;
+void Map::fixAspectRatio()
+{
+    double ratio1 = (double) width_ / (double) height_;
+    double ratio2 = current_extent_.width() / current_extent_.height();
+    if (ratio1 == ratio2) return;
 
-        switch(aspectFixMode_) 
-        {
-            case ADJUST_BBOX_HEIGHT:
-                currentExtent_.height(currentExtent_.width() / ratio1);
-                break;
-            case ADJUST_BBOX_WIDTH:
-                currentExtent_.width(currentExtent_.height() * ratio1);
-                break;
-            case ADJUST_CANVAS_HEIGHT:
-                height_ = int (width_ / ratio2 + 0.5); 
-                break;
-            case ADJUST_CANVAS_WIDTH:
-                width_ = int (height_ * ratio2 + 0.5); 
-                break;
-            case GROW_BBOX:
-                if (ratio2 > ratio1)
-                   currentExtent_.height(currentExtent_.width() / ratio1);
-                else 
-                   currentExtent_.width(currentExtent_.height() * ratio1);
-                break;  
-            case SHRINK_BBOX:
-                if (ratio2 < ratio1)
-                   currentExtent_.height(currentExtent_.width() / ratio1);
-                else 
-                   currentExtent_.width(currentExtent_.height() * ratio1);
-                break;  
-            case GROW_CANVAS:
-                if (ratio2 > ratio1)
-                    width_ = (int) (height_ * ratio2 + 0.5);
-                else
-                    height_ = int (width_ / ratio2 + 0.5); 
-                break;
-            case SHRINK_CANVAS:
-                if (ratio2 > ratio1)
-                    height_ = int (width_ / ratio2 + 0.5); 
-                else
-                    width_ = (int) (height_ * ratio2 + 0.5);
-                break;
-           default:
-              if (ratio2 > ratio1)
-                 currentExtent_.height(currentExtent_.width() / ratio1);
-              else 
-                 currentExtent_.width(currentExtent_.height() * ratio1);
-              break;  
-        }
+    switch(aspectFixMode_) 
+    {
+    case ADJUST_BBOX_HEIGHT:
+        current_extent_.height(current_extent_.width() / ratio1);
+        break;
+    case ADJUST_BBOX_WIDTH:
+        current_extent_.width(current_extent_.height() * ratio1);
+        break;
+    case ADJUST_CANVAS_HEIGHT:
+        height_ = int (width_ / ratio2 + 0.5); 
+        break;
+    case ADJUST_CANVAS_WIDTH:
+        width_ = int (height_ * ratio2 + 0.5); 
+        break;
+    case GROW_BBOX:
+        if (ratio2 > ratio1)
+            current_extent_.height(current_extent_.width() / ratio1);
+        else 
+            current_extent_.width(current_extent_.height() * ratio1);
+        break;  
+    case SHRINK_BBOX:
+        if (ratio2 < ratio1)
+            current_extent_.height(current_extent_.width() / ratio1);
+        else 
+            current_extent_.width(current_extent_.height() * ratio1);
+        break;  
+    case GROW_CANVAS:
+        if (ratio2 > ratio1)
+            width_ = (int) (height_ * ratio2 + 0.5);
+        else
+            height_ = int (width_ / ratio2 + 0.5); 
+        break;
+    case SHRINK_CANVAS:
+        if (ratio2 > ratio1)
+            height_ = int (width_ / ratio2 + 0.5); 
+        else
+            width_ = (int) (height_ * ratio2 + 0.5);
+        break;
+    default:
+        if (ratio2 > ratio1)
+            current_extent_.height(current_extent_.width() / ratio1);
+        else 
+            current_extent_.width(current_extent_.height() * ratio1);
+        break;  
     }
+}
    
-    const Envelope<double>& Map::getCurrentExtent() const
-    {
-        return currentExtent_;
-    }
+const box2d<double>& Map::get_current_extent() const
+{
+    return current_extent_;
+}
 
-   Envelope<double> Map::get_buffered_extent() const
-   {
-      double extra = 2.0 * scale() * buffer_size_;
-      Envelope<double> ext(currentExtent_);
-      ext.width(currentExtent_.width() + extra);
-      ext.height(currentExtent_.height() + extra);
-      return ext;
-   }
+box2d<double> Map::get_buffered_extent() const
+{
+    double extra = 2.0 * scale() * buffer_size_;
+    box2d<double> ext(current_extent_);
+    ext.width(current_extent_.width() + extra);
+    ext.height(current_extent_.height() + extra);
+    return ext;
+}
    
-    void Map::pan(int x,int y)
-    {
-        int dx = x - int(0.5 * width_);
-        int dy = int(0.5 * height_) - y;
-        double s = width_/currentExtent_.width();
-        double minx  = currentExtent_.minx() + dx/s;
-        double maxx  = currentExtent_.maxx() + dx/s;
-        double miny  = currentExtent_.miny() + dy/s;
-        double maxy  = currentExtent_.maxy() + dy/s;
-        currentExtent_.init(minx,miny,maxx,maxy);
-    }
+void Map::pan(int x,int y)
+{
+    int dx = x - int(0.5 * width_);
+    int dy = int(0.5 * height_) - y;
+    double s = width_/current_extent_.width();
+    double minx  = current_extent_.minx() + dx/s;
+    double maxx  = current_extent_.maxx() + dx/s;
+    double miny  = current_extent_.miny() + dy/s;
+    double maxy  = current_extent_.maxy() + dy/s;
+    current_extent_.init(minx,miny,maxx,maxy);
+}
 
-    void Map::pan_and_zoom(int x,int y,double factor)
-    {
-        pan(x,y);
-        zoom(factor);
-    }
+void Map::pan_and_zoom(int x,int y,double factor)
+{
+    pan(x,y);
+    zoom(factor);
+}
 
-    double Map::scale() const
-    {
-        if (width_>0)
-            return currentExtent_.width()/width_;
-        return currentExtent_.width();
-    }
+double Map::scale() const
+{
+    if (width_>0)
+        return current_extent_.width()/width_;
+    return current_extent_.width();
+}
 
-    double Map::scale_denominator() const 
-    {
-        projection map_proj(srs_);
-        return mapnik::scale_denominator( *this, map_proj.is_geographic());    
-    }
+double Map::scale_denominator() const 
+{
+    projection map_proj(srs_);
+    return mapnik::scale_denominator( *this, map_proj.is_geographic());    
+}
 
-    CoordTransform Map::view_transform() const
-    {
-        return CoordTransform(width_,height_,currentExtent_);
-    }
+CoordTransform Map::view_transform() const
+{
+    return CoordTransform(width_,height_,current_extent_);
+}
     
-    featureset_ptr Map::query_point(unsigned index, double x, double y) const
+featureset_ptr Map::query_point(unsigned index, double x, double y) const
+{
+    if ( index< layers_.size())
     {
-        if ( index< layers_.size())
+        mapnik::layer const& layer = layers_[index];    
+        try
         {
-            mapnik::Layer const& layer = layers_[index];    
-            try
-            {
-                double z = 0;
-                mapnik::projection dest(srs_);
-                mapnik::projection source(layer.srs());
-                proj_transform prj_trans(source,dest);
-                prj_trans.backward(x,y,z);
+            double z = 0;
+            mapnik::projection dest(srs_);
+            mapnik::projection source(layer.srs());
+            proj_transform prj_trans(source,dest);
+            prj_trans.backward(x,y,z);
                 
-                double minx = currentExtent_.minx();
-                double miny = currentExtent_.miny();
-                double maxx = currentExtent_.maxx();
-                double maxy = currentExtent_.maxy();
+            double minx = current_extent_.minx();
+            double miny = current_extent_.miny();
+            double maxx = current_extent_.maxx();
+            double maxy = current_extent_.maxy();
                 
-                prj_trans.backward(minx,miny,z);
-                prj_trans.backward(maxx,maxy,z);
-                double tol = (maxx - minx) / width_ * 3;
-                mapnik::datasource_ptr ds = layer.datasource();
-                if (ds)
-                {
+            prj_trans.backward(minx,miny,z);
+            prj_trans.backward(maxx,maxy,z);
+            double tol = (maxx - minx) / width_ * 3;
+            mapnik::datasource_ptr ds = layer.datasource();
+            if (ds)
+            {
 #ifdef MAPNIK_DEBUG
-                    std::clog << " query at point tol = " << tol << " (" << x << "," << y << ")\n";
+                std::clog << " query at point tol = " << tol << " (" << x << "," << y << ")\n";
 #endif    
-                    featureset_ptr fs = ds->features_at_point(mapnik::coord2d(x,y));
-                    if (fs) 
-                        return featureset_ptr(new filter_featureset<hit_test_filter>(fs,hit_test_filter(x,y,tol)));
-                }
+                featureset_ptr fs = ds->features_at_point(mapnik::coord2d(x,y));
+                if (fs) 
+                    return featureset_ptr(new filter_featureset<hit_test_filter>(fs,hit_test_filter(x,y,tol)));
             }
-            catch (...)
-            {
+        }
+        catch (...)
+        {
 #ifdef MAPNIK_DEBUG
-                std::clog << "exception caught in \"query_map_point\"\n";
+            std::clog << "exception caught in \"query_map_point\"\n";
 #endif
-            }
         }
-        return featureset_ptr();
     }
+    return featureset_ptr();
+}
     
-    featureset_ptr Map::query_map_point(unsigned index, double x, double y) const
+featureset_ptr Map::query_map_point(unsigned index, double x, double y) const
+{
+    if ( index< layers_.size())
     {
-        if ( index< layers_.size())
+        mapnik::layer const& layer = layers_[index];
+        CoordTransform tr = view_transform();
+        tr.backward(&x,&y);
+            
+        try
         {
-            mapnik::Layer const& layer = layers_[index];
-            CoordTransform tr = view_transform();
-            tr.backward(&x,&y);
-	    
-            try
-            {
-                mapnik::projection dest(srs_);
-                mapnik::projection source(layer.srs());
-                proj_transform prj_trans(source,dest);
-                double z = 0;
-                prj_trans.backward(x,y,z);
+            mapnik::projection dest(srs_);
+            mapnik::projection source(layer.srs());
+            proj_transform prj_trans(source,dest);
+            double z = 0;
+            prj_trans.backward(x,y,z);
                 
-                double minx = currentExtent_.minx();
-                double miny = currentExtent_.miny();
-                double maxx = currentExtent_.maxx();
-                double maxy = currentExtent_.maxy();
+            double minx = current_extent_.minx();
+            double miny = current_extent_.miny();
+            double maxx = current_extent_.maxx();
+            double maxy = current_extent_.maxy();
                 
-                prj_trans.backward(minx,miny,z);
-                prj_trans.backward(maxx,maxy,z);
-                double tol = (maxx - minx) / width_ * 3;
-                mapnik::datasource_ptr ds = layer.datasource();
-                if (ds)
-                {
+            prj_trans.backward(minx,miny,z);
+            prj_trans.backward(maxx,maxy,z);
+            double tol = (maxx - minx) / width_ * 3;
+            mapnik::datasource_ptr ds = layer.datasource();
+            if (ds)
+            {
 #ifdef MAPNIK_DEBUG
-                    std::clog << " query at point tol = " << tol << " (" << x << "," << y << ")\n";
+                std::clog << " query at point tol = " << tol << " (" << x << "," << y << ")\n";
 #endif
-                    featureset_ptr fs = ds->features_at_point(mapnik::coord2d(x,y));
-                    if (fs) 
-                        return featureset_ptr(new filter_featureset<hit_test_filter>(fs,hit_test_filter(x,y,tol)));
-                }
+                featureset_ptr fs = ds->features_at_point(mapnik::coord2d(x,y));
+                if (fs) 
+                    return featureset_ptr(new filter_featureset<hit_test_filter>(fs,hit_test_filter(x,y,tol)));
             }
-            catch (...)
-            {
+        }
+        catch (...)
+        {
 #ifdef MAPNIK_DEBUG
-                std::clog << "exception caught in \"query_map_point\"\n";
+            std::clog << "exception caught in \"query_map_point\"\n";
 #endif
+        }
+    }
+    return featureset_ptr();
+}
+
+Map::~Map() {}
+
+void Map::init_metawriters()
+{
+    metawriter_cache_dispatch d(*this);
+    Map::style_iterator styIter = begin_styles();
+    Map::style_iterator styEnd = end_styles();
+    for (; styIter!=styEnd; ++styIter) {
+        std::vector<rule>& rules = styIter->second.get_rules_nonconst();
+        std::vector<rule>::iterator ruleIter = rules.begin();
+        std::vector<rule>::iterator ruleEnd = rules.end();
+        for (; ruleIter!=ruleEnd; ++ruleIter) {
+            rule::symbolizers::iterator symIter = ruleIter->begin();
+            rule::symbolizers::iterator symEnd = ruleIter->end();
+            for (; symIter!=symEnd; ++symIter) {
+                boost::apply_visitor(d, *symIter);
             }
         }
-        return featureset_ptr();
     }
+}
 
-    Map::~Map() {}
+void Map::set_metawriter_property(std::string name, std::string value)
+{
+#if (U_ICU_VERSION_MAJOR_NUM > 4) || (U_ICU_VERSION_MAJOR_NUM == 4 && U_ICU_VERSION_MINOR_NUM >=2)
+    metawriter_output_properties[name] = UnicodeString::fromUTF8(value);
+#else
+    metawriter_output_properties[name] = UnicodeString(value.c_str());
+#endif
+}
+
+std::string Map::get_metawriter_property(std::string name) const
+{
+    std::string result;
+    to_utf8(metawriter_output_properties[name], result);
+    return result;
+}
+
+parameters const& Map::get_extra_attributes() const
+{
+    return extra_attr_;
+}
+
+void Map::set_extra_attributes(parameters& params)
+{
+    extra_attr_ = params;
+}
 
-   
 }
diff --git a/src/mapped_memory_cache.cpp b/src/mapped_memory_cache.cpp
new file mode 100644
index 0000000..443f2da
--- /dev/null
+++ b/src/mapped_memory_cache.cpp
@@ -0,0 +1,92 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+// mapnik
+#include <mapnik/mapped_memory_cache.hpp>
+
+// boost
+#include <boost/assert.hpp>
+#include <boost/interprocess/file_mapping.hpp>
+#include <boost/filesystem/operations.hpp>
+
+namespace mapnik 
+{
+
+boost::unordered_map<std::string, mapped_region_ptr> mapped_memory_cache::cache_;
+
+bool mapped_memory_cache::insert (std::string const& uri, mapped_region_ptr mem)
+{
+#ifdef MAPNIK_THREADSAFE
+    mutex::scoped_lock lock(mutex_);
+#endif
+    return cache_.insert(std::make_pair(uri,mem)).second;
+}
+
+boost::optional<mapped_region_ptr> mapped_memory_cache::find(std::string const& uri, bool update_cache)
+{
+#ifdef MAPNIK_THREADSAFE
+    mutex::scoped_lock lock(mutex_);
+#endif
+    typedef boost::unordered_map<std::string, mapped_region_ptr>::const_iterator iterator_type;
+    boost::optional<mapped_region_ptr> result;
+    iterator_type itr = cache_.find(uri);
+    if (itr != cache_.end())
+    {
+        result.reset(itr->second);
+        return result;
+    }
+    
+    boost::filesystem::path path(uri);
+    if (exists(path))
+    {
+        try
+        {
+            file_mapping mapping(uri.c_str(),read_only);
+            mapped_region_ptr region(new mapped_region(mapping,read_only));
+            
+            result.reset(region);
+            
+            if (update_cache)
+            {
+                cache_.insert(std::make_pair(uri,*result));
+            }
+            return result;
+        }
+        catch (...)
+        {
+            std::cerr << "Exception caught while loading mapping memory file: " << uri << std::endl;
+        }
+    }
+    /*else
+    {
+        std::cerr << "### WARNING Memory region does not exist file: " << uri << std::endl;
+    }*/
+    return result;
+}
+
+#ifdef MAPNIK_THREADSAFE
+boost::mutex mapped_memory_cache::mutex_;
+#endif
+
+}
diff --git a/src/marker_cache.cpp b/src/marker_cache.cpp
new file mode 100644
index 0000000..16a1d1e
--- /dev/null
+++ b/src/marker_cache.cpp
@@ -0,0 +1,138 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+// mapnik
+#include <mapnik/marker_cache.hpp>
+#include <mapnik/svg/svg_parser.hpp>
+#include <mapnik/svg/svg_storage.hpp>
+#include <mapnik/svg/svg_path_adapter.hpp>
+#include <mapnik/svg/svg_converter.hpp>
+#include <mapnik/image_util.hpp>
+#include <mapnik/image_reader.hpp>
+
+// boost
+#include <boost/assert.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <boost/algorithm/string.hpp>
+
+namespace mapnik 
+{
+
+boost::unordered_map<std::string, marker_ptr> marker_cache::cache_;
+
+bool marker_cache::insert (std::string const& uri, marker_ptr path)
+{
+#ifdef MAPNIK_THREADSAFE
+    mutex::scoped_lock lock(mutex_);
+#endif
+    return cache_.insert(std::make_pair(uri,path)).second;
+}
+
+boost::optional<marker_ptr> marker_cache::find(std::string const& uri, bool update_cache)
+{
+#ifdef MAPNIK_THREADSAFE
+    mutex::scoped_lock lock(mutex_);
+#endif
+    typedef boost::unordered_map<std::string, marker_ptr>::const_iterator iterator_type;
+    boost::optional<marker_ptr> result;
+    iterator_type itr = cache_.find(uri);
+    if (itr != cache_.end())
+    {
+        result.reset(itr->second);
+        return result;
+    }
+
+    // we can't find marker in cache, lets try to load it from filesystem
+    boost::filesystem::path path(uri);
+    if (exists(path))
+    {
+        if (is_svg(uri))
+        {
+            using namespace mapnik::svg;
+            try
+            {
+                path_ptr marker_path(new svg_storage_type);
+                vertex_stl_adapter<svg_path_storage> stl_storage(marker_path->source());
+                svg_path_adapter svg_path(stl_storage);
+                svg_converter_type svg(svg_path, marker_path->attributes());
+
+                svg_parser p(svg);
+                p.parse(uri);
+                //svg.arrange_orientations();
+                double lox,loy,hix,hiy;
+                svg.bounding_rect(&lox, &loy, &hix, &hiy);
+                marker_path->set_bounding_box(lox,loy,hix,hiy);
+
+                marker_ptr mark(new marker(marker_path));
+                result.reset(mark);
+                if (update_cache)
+                {
+                    cache_.insert(std::make_pair(uri,*result));
+                }
+                return result;
+            }
+            catch (...)
+            {
+                std::cerr << "Exception caught while loading SVG: " << uri << std::endl;
+            }
+        }
+        else
+        {
+            try
+            {
+                std::auto_ptr<mapnik::image_reader> reader(mapnik::get_image_reader(uri));
+                if (reader.get())
+                {
+                    unsigned width = reader->width();
+                    unsigned height = reader->height();
+                    BOOST_ASSERT(width > 0 && height > 0);
+                    mapnik::image_ptr image(new mapnik::image_data_32(width,height));
+                    reader->read(0,0,*image);
+                    marker_ptr mark(new marker(image));
+                    result.reset(mark);
+                    if (update_cache)
+                    {
+                        cache_.insert(std::make_pair(uri,*result));
+                    }
+                }
+            }
+
+            catch (...)
+            {
+                std::cerr << "Exception caught while loading image: " << uri << std::endl;
+            }
+        }
+    }
+    else
+    {
+        std::cerr << "### WARNING Marker does not exist: " << uri << std::endl;
+    }
+    return result;
+}
+
+#ifdef MAPNIK_THREADSAFE
+boost::mutex marker_cache::mutex_;
+#endif
+
+}
diff --git a/src/markers_symbolizer.cpp b/src/markers_symbolizer.cpp
new file mode 100644
index 0000000..7588d66
--- /dev/null
+++ b/src/markers_symbolizer.cpp
@@ -0,0 +1,176 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+#include <mapnik/markers_symbolizer.hpp>
+
+namespace mapnik {
+
+static const char * marker_placement_strings[] = {
+    "point",
+    "line",
+    ""
+};
+
+IMPLEMENT_ENUM( marker_placement_e, marker_placement_strings )
+
+
+static const char * marker_type_strings[] = {
+    "arrow",
+    "ellipse",
+    ""
+};
+
+IMPLEMENT_ENUM( marker_type_e, marker_type_strings )
+
+markers_symbolizer::markers_symbolizer()
+    : symbolizer_with_image(path_expression_ptr(new path_expression)),
+      symbolizer_base(),
+      allow_overlap_(false),
+      fill_(color(0,0,255)), 
+      spacing_(100.0), 
+      max_error_(0.2),
+      width_(5.0),
+      height_(5.0),
+      stroke_(),
+      marker_p_(MARKER_LINE_PLACEMENT),
+      marker_type_(ARROW) {}
+    
+markers_symbolizer::markers_symbolizer(path_expression_ptr filename) 
+    : symbolizer_with_image(filename), 
+      symbolizer_base(),
+      allow_overlap_(false),
+      fill_(color(0,0,255)), 
+      spacing_(100.0), 
+      max_error_(0.2),
+      width_(5.0),
+      height_(5.0),
+      stroke_(),
+      marker_p_(MARKER_LINE_PLACEMENT),
+      marker_type_(ARROW) {}
+
+markers_symbolizer::markers_symbolizer(markers_symbolizer const& rhs) 
+    : symbolizer_with_image(rhs), 
+      symbolizer_base(rhs),
+      allow_overlap_(rhs.allow_overlap_),
+      fill_(rhs.fill_), 
+      spacing_(rhs.spacing_), 
+      max_error_(rhs.max_error_),
+      width_(rhs.width_),
+      height_(rhs.height_),
+      stroke_(rhs.stroke_),
+      marker_p_(rhs.marker_p_),
+      marker_type_(rhs.marker_type_) {}
+    
+void markers_symbolizer::set_allow_overlap(bool overlap)
+{
+    allow_overlap_ = overlap;
+}
+    
+bool markers_symbolizer::get_allow_overlap() const
+{
+    return allow_overlap_;
+}
+
+void markers_symbolizer::set_spacing(double spacing)
+{
+    spacing_ = spacing;
+}
+    
+double markers_symbolizer::get_spacing() const
+{
+    return spacing_;
+}
+
+void markers_symbolizer::set_max_error(double max_error)
+{
+    max_error_ = max_error;
+}
+    
+double markers_symbolizer::get_max_error() const
+{
+    return max_error_;
+}
+    
+void markers_symbolizer::set_fill(color fill)
+{
+    fill_ = fill;
+}
+    
+color const& markers_symbolizer::get_fill() const
+{
+    return fill_;
+}
+
+void markers_symbolizer::set_width(double width)
+{
+    width_ = width;
+}
+
+double markers_symbolizer::get_width() const
+{
+    return width_;
+}
+
+void markers_symbolizer::set_height(double height)
+{
+    height_ = height;
+}
+
+double markers_symbolizer::get_height() const
+{
+    return height_;
+}
+
+stroke const& markers_symbolizer::get_stroke() const
+{
+    return stroke_;
+}
+    
+void markers_symbolizer::set_stroke(stroke const& stroke)
+{
+    stroke_ = stroke;
+}
+
+void markers_symbolizer::set_marker_placement(marker_placement_e marker_p)
+{
+    marker_p_ = marker_p;
+}
+
+marker_placement_e markers_symbolizer::get_marker_placement() const
+{
+    return marker_p_;
+}
+
+void markers_symbolizer::set_marker_type(marker_type_e marker_type)
+{
+    marker_type_ = marker_type;
+}
+
+marker_type_e markers_symbolizer::get_marker_type() const
+{
+    return marker_type_;
+}
+
+
+}
diff --git a/src/memory.cpp b/src/memory.cpp
index 78c9539..92a5c14 100644
--- a/src/memory.cpp
+++ b/src/memory.cpp
@@ -26,35 +26,35 @@
 
 namespace mapnik
 {
-    void* Object::operator new(size_t size)
-    {
-        void* block=::operator new (size);
-        return (char*) block;
-    }
+void* Object::operator new(size_t size)
+{
+    void* block=::operator new (size);
+    return (char*) block;
+}
 
-    void* Object::operator new(size_t size,MemoryManager* manager)
-    {
-        assert(manager);
-        size_t headerSize=MemoryUtils::alignPointerSize(sizeof(MemoryManager*));
-        void* const block=manager->allocate(headerSize+size);
-        *(MemoryManager**)block=manager;
-        return (char*)block+headerSize;
-    }
+void* Object::operator new(size_t size,MemoryManager* manager)
+{
+    assert(manager);
+    size_t headerSize=MemoryUtils::alignPointerSize(sizeof(MemoryManager*));
+    void* const block=manager->allocate(headerSize+size);
+    *(MemoryManager**)block=manager;
+    return (char*)block+headerSize;
+}
 
-    void Object::operator delete(void* p)
-    {
-        ::operator delete(p);
-    }
+void Object::operator delete(void* p)
+{
+    ::operator delete(p);
+}
 
-    void Object::operator delete(void* , MemoryManager* )
-    {
-        //std::clog <<"operator delete with Manager "<<std::hex<<p<<" "<<manager<<std::endl;
-    }
+void Object::operator delete(void* , MemoryManager* )
+{
+    //std::clog <<"operator delete with Manager "<<std::hex<<p<<" "<<manager<<std::endl;
+}
 
-    inline size_t MemoryUtils::alignPointerSize(size_t ptrSize)
-    {
-        size_t alignment=(sizeof(void*) >= sizeof(double)) ? sizeof(void*) : sizeof(double);
-        size_t current=ptrSize % alignment;
-        return (current==0)?ptrSize:(ptrSize+alignment-current);
-    }
+inline size_t MemoryUtils::alignPointerSize(size_t ptrSize)
+{
+    size_t alignment=(sizeof(void*) >= sizeof(double)) ? sizeof(void*) : sizeof(double);
+    size_t current=ptrSize % alignment;
+    return (current==0)?ptrSize:(ptrSize+alignment-current);
+}
 }
diff --git a/src/memory_datasource.cpp b/src/memory_datasource.cpp
index 542ee96..d22bcbd 100644
--- a/src/memory_datasource.cpp
+++ b/src/memory_datasource.cpp
@@ -21,79 +21,104 @@
  *****************************************************************************/
 
 //$Id$
+// mapnik
 #include <mapnik/memory_datasource.hpp>
-
 #include <mapnik/memory_featureset.hpp>
+#include <mapnik/feature_factory.hpp>
+// stl
 #include <algorithm>
 
 namespace mapnik {
     
-    struct accumulate_extent
-    {
-        accumulate_extent(Envelope<double> & ext)
-            : ext_(ext),first_(true) {}
+struct accumulate_extent
+{
+    accumulate_extent(box2d<double> & ext)
+        : ext_(ext),first_(true) {}
         
-        void operator() (feature_ptr feat)
+    void operator() (feature_ptr feat)
+    {
+        for (unsigned i=0;i<feat->num_geometries();++i)
         {
-           for (unsigned i=0;i<feat->num_geometries();++i)
-           {
-              geometry2d & geom = feat->get_geometry(i);
-              if ( first_ ) 
-              {
-                 first_ = false;
-                 ext_ = geom.envelope();
-              }
-              else
-              {
-                 ext_.expand_to_include(geom.envelope());
-              }
-           }
+            geometry_type & geom = feat->get_geometry(i);
+            if ( first_ ) 
+            {
+                first_ = false;
+                ext_ = geom.envelope();
+            }
+            else
+            {
+                ext_.expand_to_include(geom.envelope());
+            }
         }
+    }
         
-        Envelope<double> & ext_;
-        bool first_;
-    };
+    box2d<double> & ext_;
+    bool first_;
+};
     
-    memory_datasource::memory_datasource()
-        : datasource(parameters()) {}
-    memory_datasource::~memory_datasource() {}
+memory_datasource::memory_datasource()
+    : datasource(parameters()),
+      desc_("in-memory datasource","utf-8") {}
+
+memory_datasource::~memory_datasource() {}
     
-    void memory_datasource::push(feature_ptr feature)
-    {
-        features_.push_back(feature);
-    }
+void memory_datasource::push(feature_ptr feature)
+{
+    // TODO - collect attribute descriptors?
+    //desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Integer));
+    features_.push_back(feature);
+}
     
-    int memory_datasource::type() const
-    {
-        return datasource::Vector;
-    }
+int memory_datasource::type() const
+{
+    return datasource::Vector;
+}
     
-    featureset_ptr memory_datasource::features(const query& q) const
-    {
-        return featureset_ptr(new memory_featureset(q.get_bbox(),*this));
-    }
+featureset_ptr memory_datasource::features(const query& q) const
+{
+    return featureset_ptr(new memory_featureset(q.get_bbox(),*this));
+}
 
 
-    featureset_ptr memory_datasource::features_at_point(coord2d const& pt) const
-    {
-        return featureset_ptr();
-    }
+featureset_ptr memory_datasource::features_at_point(coord2d const& pt) const
+{
+    box2d<double> box = box2d<double>(pt.x, pt.y, pt.x, pt.y);
+#ifdef MAPNIK_DEBUG
+    std::clog << "box=" << box << ", pt x=" << pt.x << ", y=" << pt.y << "\n";
+#endif
+    return featureset_ptr(new memory_featureset(box,*this));
+}
     
-    Envelope<double> memory_datasource::envelope() const
-    {
-        Envelope<double> ext;
-        accumulate_extent func(ext);
-        std::for_each(features_.begin(),features_.end(),func);
-        return ext;      
-    }
+box2d<double> memory_datasource::envelope() const
+{
+    box2d<double> ext;
+    accumulate_extent func(ext);
+    std::for_each(features_.begin(),features_.end(),func);
+    return ext;      
+}
     
-    layer_descriptor memory_datasource::get_descriptor() const
-    {
-        return layer_descriptor("in-memory datasource","utf-8");
-    }
+layer_descriptor memory_datasource::get_descriptor() const
+{
+    return desc_;
+}
     
-    size_t memory_datasource::size() const
-    {
-        return features_.size();
-    }
+size_t memory_datasource::size() const
+{
+    return features_.size();
+}
+
+// point_datasource
+
+void point_datasource::add_point(double x, double y, const char* key, const char* value)
+{
+        feature_ptr feature(feature_factory::create(feature_id_));
+        ++feature_id_;
+        geometry_type * pt = new geometry_type(Point);
+        pt->move_to(x,y);
+        feature->add_geometry(pt);
+        transcoder tr("utf-8");
+        (*feature)[key] = tr.transcode(value);
+        this->push(feature);
+}
+
 }
diff --git a/src/metawriter.cpp b/src/metawriter.cpp
new file mode 100644
index 0000000..25022b5
--- /dev/null
+++ b/src/metawriter.cpp
@@ -0,0 +1,372 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Hermann Kraus
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+ 
+// Mapnik
+#include <mapnik/metawriter.hpp>
+#include <mapnik/metawriter_json.hpp>
+#include <mapnik/placement_finder.hpp>
+
+// Boost
+#include <boost/foreach.hpp>
+#include <boost/algorithm/string.hpp>
+
+// STL
+#include <iomanip>
+#include <cstdio>
+
+namespace mapnik {
+
+UnicodeString const& metawriter_property_map::operator[](std::string const& key) const
+{
+    std::map<std::string, UnicodeString>::const_iterator it;
+    it = m_.find(key);
+    if (it == m_.end()) return not_found_;
+    return (*it).second;
+}
+
+metawriter_properties::metawriter_properties(boost::optional<std::string> str)
+{
+    if (str) {
+        boost::split(*this, *str, boost::is_any_of(", "), boost::token_compress_on);
+    }
+}
+
+std::string metawriter_properties::to_string() const
+{
+    return boost::algorithm::join(*this, ",");
+}
+
+/********************************************************************************************/
+
+void metawriter_json_stream::start(metawriter_property_map const& /*properties*/)
+{
+    assert(trans_);
+    if (output_empty_) {
+        write_header();
+    } else {
+        count_ = HEADER_NOT_WRITTEN;
+    }
+}
+
+void metawriter_json_stream::write_header()
+{
+    assert(f_);
+    *f_ << "{ \"type\": \"FeatureCollection\", \"features\": [\n" << std::fixed << std::setprecision(pixel_coordinates_ ? 0 : 8);
+    count_ = STARTED;
+}
+
+void metawriter_json_stream::stop()
+{
+    if (count_ >= STARTED && f_) {
+        *f_ << " ] }\n";
+    }
+    count_ = STOPPED;
+}
+
+metawriter_json_stream::~metawriter_json_stream()
+{
+    if (count_ >= STARTED) {
+#ifdef MAPNIK_DEBUG
+        std::cerr << "WARNING: GeoJSON metawriter not stopped before destroying it.";
+#endif
+        stop();
+    }
+    if (trans_) delete trans_;
+}
+
+
+metawriter_json_stream::metawriter_json_stream(metawriter_properties dflt_properties)
+    : metawriter(dflt_properties), count_(-1), output_empty_(true),
+      trans_(0), output_srs_("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"),
+      pixel_coordinates_(false), f_(0)
+{
+}
+
+void metawriter_json_stream::write_properties(Feature const& feature, metawriter_properties const& properties)
+{
+    *f_ << "}," << //Close coordinates object
+            "\n  \"properties\": {";
+    std::map<std::string, value> const &fprops = feature.props();
+    int i = 0;
+    BOOST_FOREACH(std::string p, properties)
+    {
+        std::map<std::string, value>::const_iterator itr = fprops.find(p);
+        std::string text;
+        if (itr != fprops.end())
+        {
+            // Skip empty props
+            if(itr->second.to_string().size() == 0) continue; // ignore empty
+            
+            //Property found
+            text = boost::replace_all_copy(boost::replace_all_copy(itr->second.to_string(), "\\", "\\\\"), "\"", "\\\"");
+            if (i++) *f_ << ",";
+            *f_ << "\n    \"" << p << "\":\"" << text << "\"";
+        }
+    }
+
+    *f_ << "\n} }";
+}
+
+/* Coordinate transform in renderer:
+   input: layer srs
+   prj_trans.backwards()   [prj_trans: map -> layer]
+   intermediate: map srs
+   t_.forward()
+   output: pixels
+
+   Our transform:
+   input: pixels
+   t_.backward()
+   intermediate: map srs
+   trans_.forward()
+   output: WGS84
+*/
+
+
+void metawriter_json_stream::add_box(box2d<double> const &box, Feature const& feature,
+                              CoordTransform const& t, metawriter_properties const& properties)
+{
+    /* Check if feature is in bounds. */
+    if (box.maxx() < 0 || box.maxy() < 0 || box.minx() > width_ || box.miny() > height_) return;
+    double minx, miny, maxx, maxy;
+    if (pixel_coordinates_) {
+        minx = box.minx();
+        miny = box.miny();
+        maxx = box.maxx();
+        maxy = box.maxy();
+    } else {
+        //t_ coord transform has transform for box2d combined with proj_transform
+        box2d<double> transformed = t.backward(box, *trans_);
+
+        minx = transformed.minx();
+        miny = transformed.miny();
+        maxx = transformed.maxx();
+        maxy = transformed.maxy();
+    }
+
+    write_feature_header("Polygon");
+
+    *f_ << " [ [ [" <<
+            minx << ", " << miny << "], [" <<
+            maxx << ", " << miny << "], [" <<
+            maxx << ", " << maxy << "], [" <<
+            minx << ", " << maxy << "] ] ]";
+
+    write_properties(feature, properties);
+
+}
+
+void metawriter_json_stream::add_text(placement const& p,
+    face_set_ptr face,
+    Feature const& feature,
+    CoordTransform const& t,
+    metawriter_properties const& properties)
+{
+    /* Note:
+       Map coordinate system (and starting_{x,y}) starts in upper left corner
+         and grows towards lower right corner.
+       Font + placement vertex coordinate system starts in lower left corner
+         and grows towards upper right corner.
+       Therefore y direction is different. Keep this in mind while doing calculations.
+
+       The y value returned by vertex() is always the baseline.
+       Lowest y = baseline of bottom line
+       Hightest y = baseline of top line
+
+      */
+//    if (p.placements.size()) std::cout << p.info.get_string() << "\n";
+    for (unsigned n = 0; n < p.placements.size(); n++) {
+        placement_element & current_placement = const_cast<placement_element &>(p.placements[n]);
+
+        bool inside = false;
+        bool straight = true;
+        int c; double x, y, angle;
+        current_placement.rewind();
+        for (int i = 0; i < current_placement.num_nodes(); ++i) {
+            int cx = current_placement.starting_x;
+            int cy = current_placement.starting_y;
+            current_placement.vertex(&c, &x, &y, &angle);
+            if (cx+x >= 0 && cx+x < width_ && cy-y >= 0 && cy-y < height_) inside = true;
+            if (angle > 0.001 || angle < -0.001) straight = false;
+            if (inside && !straight) break;
+        }
+        if (!inside) continue;
+
+        current_placement.rewind();
+
+        if (straight) {
+            //Reduce number of polygons
+            double minx = INT_MAX, miny = INT_MAX, maxx = INT_MIN, maxy = INT_MIN;
+            for (int i = 0; i < current_placement.num_nodes(); ++i) {
+                current_placement.vertex(&c, &x, &y, &angle);
+                font_face_set::dimension_t ci = face->character_dimensions(c);
+                if (x < minx) minx = x;
+                if (x+ci.width > maxx) maxx = x+ci.width;
+                if (y+ci.height+ci.ymin > maxy) maxy = y+ci.height+ci.ymin;
+                if (y+ci.ymin < miny) miny = y+ci.ymin;
+                //                std::cout << (char) c << " height:" << ci.height << " ymin:" << ci.ymin << " y:" << y << " miny:"<< miny << " maxy:"<< maxy <<"\n";
+
+            }
+            add_box(box2d<double>(current_placement.starting_x+minx,
+                                  current_placement.starting_y-miny,
+                                  current_placement.starting_x+maxx,
+                                  current_placement.starting_y-maxy), feature, t, properties);
+            continue;
+        }
+
+        write_feature_header("MultiPolygon");
+        *f_ << "[";
+        c = ' ';
+        for (int i = 0; i < current_placement.num_nodes(); ++i) {
+            if (c != ' ') {
+                *f_ << ",";
+            }
+            current_placement.vertex(&c, &x, &y, &angle);
+            if (c == ' ') continue;
+            font_face_set::dimension_t ci = face->character_dimensions(c);
+
+            double x0, y0, x1, y1, x2, y2, x3, y3;
+            double sina = sin(angle);
+            double cosa = cos(angle);
+            x0 = current_placement.starting_x + x - sina*ci.ymin;
+            y0 = current_placement.starting_y - y - cosa*ci.ymin;
+            x1 = x0 + ci.width * cosa;
+            y1 = y0 - ci.width * sina;
+            x2 = x0 + (ci.width * cosa - ci.height * sina);
+            y2 = y0 - (ci.width * sina + ci.height * cosa);
+            x3 = x0 - ci.height * sina;
+            y3 = y0 - ci.height * cosa;
+
+            *f_ << "\n     [[";
+            write_point(t, x0, y0);
+            write_point(t, x1, y1);
+            write_point(t, x2, y2);
+            write_point(t, x3, y3, true);
+            *f_ << "]]";
+        }
+        *f_ << "]";
+        write_properties(feature, properties);
+    }
+}
+
+void metawriter_json_stream::add_polygon(path_type & path,
+    Feature const& feature,
+    CoordTransform const& t,
+    metawriter_properties const& properties)
+{
+    write_feature_header("Polygon");
+    write_line_polygon(path, t, true);
+    write_properties(feature, properties);
+}
+
+void metawriter_json_stream::add_line(path_type & path,
+    Feature const& feature,
+    CoordTransform const& t,
+    metawriter_properties const& properties)
+{
+    write_feature_header("MultiLineString");
+    write_line_polygon(path, t, false);
+    write_properties(feature, properties);
+}
+
+void metawriter_json_stream::write_line_polygon(path_type & path, CoordTransform const& t, bool /*polygon*/){
+    *f_ << " [";
+    double x, y, last_x=0.0, last_y=0.0;
+    unsigned cmd, last_cmd = SEG_END;
+    path.rewind(0);
+
+    int polygon_count = 0;
+    while ((cmd = path.vertex(&x, &y)) != SEG_END) {
+        if (cmd == SEG_LINETO) {
+            if (last_cmd == SEG_MOVETO) {
+                //Start new polygon/line
+                if (polygon_count++) *f_ << "], ";
+                *f_ << "[";
+                write_point(t, last_x, last_y, true);
+            }
+            *f_ << ",";
+            write_point(t, x, y, true);
+        }
+        last_x = x;
+        last_y = y;
+        last_cmd = cmd;
+    }
+    *f_ << "]]";
+}
+
+
+void metawriter_json_stream::set_map_srs(projection const& input_srs_)
+{
+    if (trans_) delete trans_;
+    trans_ = new proj_transform(input_srs_, output_srs_);
+}
+
+
+/********************************************************************************************/
+
+metawriter_json::metawriter_json(metawriter_properties dflt_properties, path_expression_ptr fn)
+    : metawriter_json_stream(dflt_properties), fn_(fn) {}
+
+
+void metawriter_json::start(metawriter_property_map const& properties)
+{
+    filename_ =
+        path_processor<metawriter_property_map>::evaluate(*fn_, properties);
+#ifdef MAPNIK_DEBUG
+    std::clog << "Metawriter JSON: filename=" << filename_ << "\n";
+#endif
+    metawriter_json_stream::start(properties);
+}
+
+void metawriter_json::write_header()
+{
+    f_.open(filename_.c_str(), std::fstream::out | std::fstream::trunc);
+    if (f_.fail()) perror((std::string("Metawriter JSON: Failed to open file ") + filename_).c_str());
+    set_stream(&f_);
+    metawriter_json_stream::write_header();
+}
+
+
+void metawriter_json::stop()
+{
+    metawriter_json_stream::stop();
+    if (f_.is_open()) {
+        f_.close();
+    }
+#ifdef MAPNIK_DEBUG
+    else if (count_ >= STARTED){
+        std::clog << "WARNING: File not open in metawriter_json::stop()!\n";
+    }
+#endif
+}
+
+void metawriter_json::set_filename(path_expression_ptr fn)
+{
+    fn_ = fn;
+}
+
+path_expression_ptr metawriter_json::get_filename() const
+{
+   return fn_;
+}
+
+}
diff --git a/src/metawriter_factory.cpp b/src/metawriter_factory.cpp
new file mode 100644
index 0000000..fc4ebbc
--- /dev/null
+++ b/src/metawriter_factory.cpp
@@ -0,0 +1,91 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 MapQuest
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+#include <mapnik/metawriter_factory.hpp>
+#include <mapnik/ptree_helpers.hpp>
+
+#include <mapnik/metawriter_json.hpp>
+#include <mapnik/metawriter_inmem.hpp>
+
+#include <boost/optional.hpp>
+
+using boost::property_tree::ptree;
+using boost::optional;
+using std::string;
+
+namespace mapnik
+{
+
+metawriter_ptr
+metawriter_create(const boost::property_tree::ptree &pt) {
+  metawriter_ptr writer;
+  string type = get_attr<string>(pt, "type");
+
+  optional<string> properties = get_opt_attr<string>(pt, "default-output");
+  if (type == "json") {
+    string file = get_attr<string>(pt, "file");
+    metawriter_json_ptr json = metawriter_json_ptr(new metawriter_json(properties, parse_path(file)));
+    optional<boolean> output_empty = get_opt_attr<boolean>(pt, "output-empty");
+    if (output_empty) {
+      json->set_output_empty(*output_empty);
+    }
+
+    optional<boolean> pixel_coordinates = get_opt_attr<boolean>(pt, "pixel-coordinates");
+    if (pixel_coordinates) {
+      json->set_pixel_coordinates(*pixel_coordinates);
+    }
+    writer = json;
+    
+  } else if (type == "inmem") {
+    metawriter_inmem_ptr inmem = metawriter_inmem_ptr(new metawriter_inmem(properties));
+    writer = inmem;
+  } else {
+    throw config_error(string("Unknown type '") + type + "'");
+  }
+
+  return writer;
+}
+
+void 
+metawriter_save(const metawriter_ptr &metawriter, ptree &metawriter_node, bool explicit_defaults) {
+  
+  metawriter_json *json = dynamic_cast<metawriter_json *>(metawriter.get());
+  if (json) {
+    set_attr(metawriter_node, "type", "json");
+    std::string const& filename = path_processor_type::to_string(*(json->get_filename()));
+    if (!filename.empty() || explicit_defaults) {
+      set_attr(metawriter_node, "file", filename);
+    }
+  }
+  
+  metawriter_inmem *inmem = dynamic_cast<metawriter_inmem *>(metawriter.get());
+  if (inmem) {
+    set_attr(metawriter_node, "type", "inmem");
+  }
+  
+  if (!metawriter->get_default_properties().empty() || explicit_defaults) {
+    set_attr(metawriter_node, "default-output", metawriter->get_default_properties().to_string());
+  }
+}
+
+} // namespace mapnik
diff --git a/src/metawriter_inmem.cpp b/src/metawriter_inmem.cpp
new file mode 100644
index 0000000..b0ca16d
--- /dev/null
+++ b/src/metawriter_inmem.cpp
@@ -0,0 +1,149 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 MapQuest
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+ 
+// Mapnik
+#include <mapnik/metawriter.hpp>
+#include <mapnik/metawriter_inmem.hpp>
+#include <mapnik/placement_finder.hpp>
+
+// Boost
+#include <boost/foreach.hpp>
+
+using std::map;
+using std::string;
+
+namespace {
+
+using mapnik::value;
+using mapnik::Feature;
+using mapnik::metawriter_properties;
+
+// intersect a set of properties with those in the feature descriptor
+map<string,value> intersect_properties(const Feature &feature, const metawriter_properties &properties) {
+  const map<string, value> &fprops = feature.props();
+  map<string,value> nprops;
+
+  BOOST_FOREACH(string p, properties) {
+    map<string, value>::const_iterator itr = fprops.find(p);
+    if (itr != fprops.end()) {
+      nprops.insert(*itr);
+    }
+  }
+
+  return nprops;
+}
+} // end anonymous namespace
+
+namespace mapnik {
+
+metawriter_inmem::metawriter_inmem(metawriter_properties dflt_properties) 
+  : metawriter(dflt_properties) {
+}
+
+metawriter_inmem::~metawriter_inmem() {
+}
+
+void 
+metawriter_inmem::add_box(box2d<double> const& box, Feature const& feature,
+                          CoordTransform const& /*t*/,
+                          metawriter_properties const& properties) {
+  meta_instance inst;
+  inst.box = box;
+  inst.properties = intersect_properties(feature, properties);
+  instances_.push_back(inst);
+}
+
+void 
+metawriter_inmem::add_text(placement const& p,
+                           face_set_ptr /*face*/,
+                           Feature const& feature,
+                           CoordTransform const& /*t*/,
+                           metawriter_properties const& properties) {
+  if (p.extents.valid()) {
+    meta_instance inst;
+    inst.properties = intersect_properties(feature, properties);
+    inst.box = p.extents;
+    instances_.push_back(inst);
+  }
+}
+
+void 
+metawriter_inmem::add_polygon(path_type & path,
+                              Feature const& feature,
+                              CoordTransform const& t,
+                              metawriter_properties const& properties) {
+  add_vertices(path, feature, t, properties);
+}
+
+void 
+metawriter_inmem::add_line(path_type & path,
+                           Feature const& feature,
+                           CoordTransform const& t,
+                           metawriter_properties const& properties) {
+  add_vertices(path, feature, t, properties);
+}
+
+void 
+metawriter_inmem::add_vertices(path_type & path,
+                               Feature const& feature,
+                               CoordTransform const& /*t*/,
+                               metawriter_properties const& properties) {
+  box2d<double> box;
+  unsigned cmd;
+  double x = 0.0, y = 0.0;
+
+  path.rewind(0);
+  while ((cmd = path.vertex(&x, &y)) != SEG_END) {
+    box.expand_to_include(x, y);
+  }
+  
+  if ((box.width() >= 0.0) && (box.height() >= 0.0)) {
+    meta_instance inst;
+    inst.properties = intersect_properties(feature, properties);
+    inst.box = box;
+    instances_.push_back(inst);
+  } 
+}
+
+void 
+metawriter_inmem::start(metawriter_property_map const& /*properties*/) {
+  instances_.clear();
+}
+
+const std::list<metawriter_inmem::meta_instance> &
+metawriter_inmem::instances() const {
+  return instances_;
+}
+
+metawriter_inmem::meta_instance_list::const_iterator 
+metawriter_inmem::inst_begin() const {
+  return instances_.begin();
+}
+
+metawriter_inmem::meta_instance_list::const_iterator 
+metawriter_inmem::inst_end() const {
+  return instances_.end();
+}
+
+
+}
+
diff --git a/src/palette.cpp b/src/palette.cpp
new file mode 100644
index 0000000..8ef8018
--- /dev/null
+++ b/src/palette.cpp
@@ -0,0 +1,194 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#include <mapnik/palette.hpp>
+
+namespace mapnik
+{
+
+rgb::rgb(rgba const& c)
+    : r(c.r), g(c.g), b(c.b) {}
+
+// ordering by mean(a,r,g,b), a, r, g, b
+bool rgba::mean_sort_cmp::operator() (const rgba& x, const rgba& y) const
+{
+    int t1 = (int)x.a + x.r + x.g + x.b;
+    int t2 = (int)y.a + y.r + y.g + y.b;
+    if (t1 != t2) return t1 < t2;
+
+    return (((int)x.a - y.a) >> 24) +
+           (((int)x.r - y.r) >> 16) +
+           (((int)x.g - y.g) >> 8) +
+           (((int)x.b - y.b));
+}
+
+std::size_t rgba::hash_func::operator()(rgba const& p) const
+{
+    return ((std::size_t)p.r * 33023 + (std::size_t)p.g * 30013 +
+            (std::size_t)p.b * 27011 + (std::size_t)p.a * 24007) % 21001;
+}
+
+
+rgba_palette::rgba_palette(std::string const& pal, palette_type type)
+    : colors_(0)
+{
+    parse(pal, type);
+}
+
+rgba_palette::rgba_palette()
+    : colors_(0) {}
+
+const std::vector<rgb>& rgba_palette::palette() const
+{
+    return rgb_pal_;
+}
+
+const std::vector<unsigned>& rgba_palette::alphaTable() const
+{
+    return alpha_pal_;
+}
+
+bool rgba_palette::valid() const
+{
+    return colors_ > 0;
+}
+
+// return color index in returned earlier palette
+unsigned rgba_palette::quantize(rgba const& c) const
+{
+    unsigned index = 0;
+    if (colors_ == 1) return index;
+
+    rgba_hash_table::iterator it = color_hashmap_.find(c);
+    if (it != color_hashmap_.end())
+    {
+        index = it->second;
+    }
+    else
+    {
+        int dr, dg, db, da;
+        int dist, newdist;
+
+        // find closest match based on mean of r,g,b,a
+        std::vector<rgba>::const_iterator pit =
+            std::lower_bound(sorted_pal_.begin(), sorted_pal_.end(), c, rgba::mean_sort_cmp());
+        index = pit - sorted_pal_.begin();
+        if (index == sorted_pal_.size()) index--;
+
+        dr = sorted_pal_[index].r - c.r;
+        dg = sorted_pal_[index].g - c.g;
+        db = sorted_pal_[index].b - c.b;
+        da = sorted_pal_[index].a - c.a;
+        dist = dr*dr + dg*dg + db*db + da*da;
+        int poz = index;
+
+        // search neighbour positions in both directions for better match
+        for (int i = poz - 1; i >= 0; i--)
+        {
+            dr = sorted_pal_[i].r - c.r;
+            dg = sorted_pal_[i].g - c.g;
+            db = sorted_pal_[i].b - c.b;
+            da = sorted_pal_[i].a - c.a;
+            // stop criteria based on properties of used sorting
+            if ((dr+db+dg+da) * (dr+db+dg+da) / 4 > dist)
+                break;
+            newdist = dr*dr + dg*dg + db*db + da*da;
+            if (newdist < dist)
+            {
+                index = i;
+                dist = newdist;
+            }
+        }
+        for (unsigned i = poz + 1; i < sorted_pal_.size(); i++)
+        {
+            dr = sorted_pal_[i].r - c.r;
+            dg = sorted_pal_[i].g - c.g;
+            db = sorted_pal_[i].b - c.b;
+            da = sorted_pal_[i].a - c.a;
+            // stop criteria based on properties of used sorting
+            if ((dr+db+dg+da) * (dr+db+dg+da) / 4 > dist)
+                break;
+            newdist = dr*dr + dg*dg + db*db + da*da;
+            if (newdist < dist)
+            {
+                index = i;
+                dist = newdist;
+            }
+        }
+
+        // Cache found index for the color c into the hashmap.
+        color_hashmap_[c] = index;
+    }
+
+    return index;
+}
+
+void rgba_palette::parse(std::string const& pal, palette_type type)
+{
+    int length = pal.length();
+
+    if ((type == PALETTE_RGBA && length % 4 > 0) ||
+        (type == PALETTE_RGB && length % 3 > 0) ||
+        (type == PALETTE_ACT && length != 772))
+    {
+        throw config_error("invalid palette length");
+    }
+
+    if (type == PALETTE_ACT)
+    {
+        length = (pal[768] << 8 | pal[769]) * 3;
+    }
+
+    sorted_pal_.clear();
+    color_hashmap_.clear();
+    rgb_pal_.clear();
+    alpha_pal_.clear();
+
+    if (type == PALETTE_RGBA) for (unsigned i = 0; i < length; i += 4)
+    {
+        sorted_pal_.push_back(rgba(pal[i], pal[i + 1], pal[i + 2], pal[i + 3]));
+    }
+    else for (unsigned i = 0; i < length; i += 3)
+    {
+        sorted_pal_.push_back(rgba(pal[i], pal[i + 1], pal[i + 2], 0xFF));
+    }
+
+    // Make sure we have at least one entry in the palette.
+    if (sorted_pal_.size() == 0)
+        sorted_pal_.push_back(rgba(0, 0, 0, 0));
+
+    colors_ = sorted_pal_.size();
+
+    // Sort palette for binary searching in quantization
+    std::sort(sorted_pal_.begin(), sorted_pal_.end(), rgba::mean_sort_cmp());
+
+    // Insert all palette colors into the hashmap and into the palette vectors.
+    for (unsigned i = 0; i < colors_; i++)
+    {
+        rgba c = sorted_pal_[i];
+        color_hashmap_[c] = i;
+        rgb_pal_.push_back(rgb(c));
+        if (c.a < 0xFF) alpha_pal_.push_back(c.a);
+    }
+}
+
+} // namespace mapnik
diff --git a/src/params.cpp b/src/params.cpp
deleted file mode 100644
index 1e1e146..0000000
--- a/src/params.cpp
+++ /dev/null
@@ -1,30 +0,0 @@
-/*****************************************************************************
- * 
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- *****************************************************************************/
-
-//$Id: params.cpp 17 2005-03-08 23:58:43Z pavlenko $
-
-#include <mapnik/params.hpp>
-
-namespace mapnik
-{
-    
-}
diff --git a/src/parse_path.cpp b/src/parse_path.cpp
new file mode 100644
index 0000000..d5ac0a9
--- /dev/null
+++ b/src/parse_path.cpp
@@ -0,0 +1,45 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#include <mapnik/parse_path.hpp>
+#include <mapnik/path_expression_grammar.hpp>
+
+namespace mapnik {
+
+path_expression_ptr parse_path(std::string const & str)
+{
+    path_expression_ptr path(new path_expression) ;
+    path_expression_grammar<std::string::const_iterator> g;
+
+    std::string::const_iterator itr = str.begin();
+    std::string::const_iterator end = str.end();
+    bool r = qi::phrase_parse(itr, end, g, space, *path);
+    if (r  && itr == end)
+    {
+        return path;
+    }
+    else
+    {
+        throw std::runtime_error("Failed to parse path expression");
+    }
+}
+}
diff --git a/src/placement_finder.cpp b/src/placement_finder.cpp
index af33b2b..a57da12 100644
--- a/src/placement_finder.cpp
+++ b/src/placement_finder.cpp
@@ -27,6 +27,7 @@
 #include <mapnik/placement_finder.hpp>
 #include <mapnik/geometry.hpp>
 #include <mapnik/text_path.hpp>
+#include <mapnik/fastmath.hpp>
 
 // agg
 #include "agg_path_length.h"
@@ -36,7 +37,6 @@
 #include <boost/shared_ptr.hpp>
 #include <boost/utility.hpp>
 #include <boost/ptr_container/ptr_vector.hpp>
-#include <boost/thread/mutex.hpp>
 #include <boost/tuple/tuple.hpp>
 
 //stl
@@ -49,73 +49,82 @@
 
 namespace mapnik
 {
-   placement::placement(string_info & info_,
-       shield_symbolizer const& sym, bool has_dimensions_)
-      : info(info_),
-        displacement_(sym.get_displacement()),
-        label_placement(sym.get_label_placement()),
-        wrap_width(sym.get_wrap_width()),
-        wrap_before(sym.get_wrap_before()),
-        wrap_char(sym.get_wrap_char()),
-        text_ratio(sym.get_text_ratio()),
-        label_spacing(sym.get_label_spacing()),
-        label_position_tolerance(sym.get_label_position_tolerance()),
-        force_odd_labels(sym.get_force_odd_labels()),
-        max_char_angle_delta(sym.get_max_char_angle_delta()),
-        minimum_distance(sym.get_minimum_distance()),
-        avoid_edges(sym.get_avoid_edges()),
-        has_dimensions(has_dimensions_),
-        allow_overlap(false),
-        dimensions(std::make_pair(sym.get_image()->width(),
-                                  sym.get_image()->height())),
-        text_size(sym.get_text_size())
-   {
-   }
-
-   placement::placement(string_info & info_,
-                        text_symbolizer const& sym)
-      : info(info_),
-        displacement_(sym.get_displacement()),
-        label_placement(sym.get_label_placement()),
-        wrap_width(sym.get_wrap_width()),
-        wrap_before(sym.get_wrap_before()),
-        wrap_char(sym.get_wrap_char()),
-        text_ratio(sym.get_text_ratio()),
-        label_spacing(sym.get_label_spacing()),
-        label_position_tolerance(sym.get_label_position_tolerance()),
-        force_odd_labels(sym.get_force_odd_labels()),
-        max_char_angle_delta(sym.get_max_char_angle_delta()),
-        minimum_distance(sym.get_minimum_distance()),
-        avoid_edges(sym.get_avoid_edges()),
-        has_dimensions(false),
-        allow_overlap(sym.get_allow_overlap()),
-        dimensions(),
-        text_size(sym.get_text_size())
-   {}
-
-   placement::~placement() {}
-
-   template<typename T>
-   std::pair<double, double> get_position_at_distance(double target_distance, T & shape_path)
-   {
-      double x1 = 0.0;
-      double y1 = 0.0;
-      double x2 = 0.0;
-      double y2 = 0.0;
-      double distance = 0.0;
-      bool first = true;
-      unsigned cmd;
-      double x = 0.0;
-      double y = 0.0;
-      shape_path.rewind(0);
-      while (!agg::is_stop(cmd = shape_path.vertex(&x2,&y2)))
-      {
-         if (first || agg::is_move_to(cmd))
-         {
+placement::placement(string_info & info_, 
+                     shield_symbolizer const& sym, 
+                     double scale_factor,
+                     unsigned w, unsigned h, 
+                     bool has_dimensions_)
+    : info(info_),
+      scale_factor_(scale_factor),
+      label_placement(sym.get_label_placement()),
+      wrap_width(sym.get_wrap_width()),
+      wrap_before(sym.get_wrap_before()),
+      wrap_char(sym.get_wrap_char()),
+      text_ratio(sym.get_text_ratio()),
+      label_spacing(scale_factor_ * sym.get_label_spacing()),
+      label_position_tolerance(sym.get_label_position_tolerance()),
+      force_odd_labels(sym.get_force_odd_labels()),
+      max_char_angle_delta(sym.get_max_char_angle_delta()),
+      minimum_distance(scale_factor_ * sym.get_minimum_distance()),
+      minimum_padding(scale_factor_ * sym.get_minimum_padding()),
+      minimum_path_length(0),
+      avoid_edges(sym.get_avoid_edges()),
+      has_dimensions(has_dimensions_),
+      allow_overlap(false),
+      dimensions(std::make_pair(w,h)),
+      collect_extents(false),
+      extents()
+{}
+
+placement::placement(string_info & info_,
+                     text_symbolizer const& sym,
+                     double scale_factor)
+    : info(info_),
+      scale_factor_(scale_factor),
+      label_placement(sym.get_label_placement()),
+      wrap_width(sym.get_wrap_width()),
+      wrap_before(sym.get_wrap_before()),
+      wrap_char(sym.get_wrap_char()),
+      text_ratio(sym.get_text_ratio()),
+      label_spacing(scale_factor_ * sym.get_label_spacing()),
+      label_position_tolerance(sym.get_label_position_tolerance()),
+      force_odd_labels(sym.get_force_odd_labels()),
+      max_char_angle_delta(sym.get_max_char_angle_delta()),
+      minimum_distance(scale_factor_ * sym.get_minimum_distance()),
+      minimum_padding(scale_factor_ * sym.get_minimum_padding()),
+      minimum_path_length(scale_factor_ * sym.get_minimum_path_length()),
+      avoid_edges(sym.get_avoid_edges()),
+      has_dimensions(false),
+      allow_overlap(sym.get_allow_overlap()),
+      dimensions(),
+      collect_extents(false),
+      extents()
+{}
+
+
+placement::~placement() {}
+
+template<typename T>
+std::pair<double, double> get_position_at_distance(double target_distance, T & shape_path)
+{
+    double x1 = 0.0;
+    double y1 = 0.0;
+    double x2 = 0.0;
+    double y2 = 0.0;
+    double distance = 0.0;
+    bool first = true;
+    unsigned cmd;
+    double x = 0.0;
+    double y = 0.0;
+    shape_path.rewind(0);
+    while (!agg::is_stop(cmd = shape_path.vertex(&x2,&y2)))
+    {
+        if (first || agg::is_move_to(cmd))
+        {
             first = false;
-         }
-         else
-         {
+        }
+        else
+        {
             double dx = x2-x1;
             double dy = y2-y1;
 
@@ -124,74 +133,81 @@ namespace mapnik
 
             if (distance > target_distance)
             {
-               x = x2 - dx * (distance - target_distance)/segment_length;
-               y = y2 - dy * (distance - target_distance)/segment_length;
-               break;
+                x = x2 - dx * (distance - target_distance)/segment_length;
+                y = y2 - dy * (distance - target_distance)/segment_length;
+                break;
             }
-         }
-         x1 = x2;
-         y1 = y2;
-      }
-      return std::pair<double, double>(x, y);
-   }
-
-   template<typename T>
-   double get_total_distance(T & shape_path)
-   {
-      return agg::path_length(shape_path);
-   }
-
-   template <typename DetectorT>
-   placement_finder<DetectorT>::placement_finder(DetectorT & detector)
-      : detector_(detector),
-        dimensions_(detector_.extent())
-   {
-   }
-
-   template <typename DetectorT>
-   template <typename T>
-   void placement_finder<DetectorT>::find_point_placements(placement & p, T & shape_path)
-   {
-      unsigned cmd;
-      double new_x = 0.0;
-      double new_y = 0.0;
-      double old_x = 0.0;
-      double old_y = 0.0;
-      bool first = true;
-
-      double total_distance = get_total_distance<T>(shape_path);
-      shape_path.rewind(0);
-
-      if (distance == 0) //Point data, not a line
-      {
-         double x, y;
-         shape_path.vertex(&x,&y);
-         find_point_placement(p, x, y);
-         return;
-      }
-
-      int num_labels = 1;
-      if (p.label_spacing > 0)
-         num_labels = static_cast<int> (floor(total_distance / p.label_spacing));
-
-      if (p.force_odd_labels && num_labels%2 == 0)
-         num_labels--;
-      if (num_labels <= 0)
-         num_labels = 1;
-
-      double distance = 0.0; // distance from last label
-      double spacing = total_distance / num_labels;
-      double target_distance = spacing / 2; // first label should be placed at half the spacing
-
-      while (!agg::is_stop(cmd = shape_path.vertex(&new_x,&new_y))) //For each node in the shape
-      {
-
-         if (first || agg::is_move_to(cmd)) //Don't do any processing if it is the first node
-         {
+        }
+        x1 = x2;
+        y1 = y2;
+    }
+    return std::pair<double, double>(x, y);
+}
+
+template<typename T>
+double get_total_distance(T & shape_path)
+{
+    return agg::path_length(shape_path);
+}
+
+template <typename DetectorT>
+placement_finder<DetectorT>::placement_finder(DetectorT & detector)
+    : detector_(detector),
+      dimensions_(detector_.extent())
+{
+}
+
+template <typename DetectorT>
+placement_finder<DetectorT>::placement_finder(DetectorT & detector, box2d<double> const& extent)
+    : detector_(detector),
+      dimensions_(extent)
+{
+}
+
+template <typename DetectorT>
+template <typename T>
+void placement_finder<DetectorT>::find_point_placements(placement & p, text_placement_info_ptr po, T & shape_path)
+{
+    unsigned cmd;
+    double new_x = 0.0;
+    double new_y = 0.0;
+    double old_x = 0.0;
+    double old_y = 0.0;
+    bool first = true;
+
+    double total_distance = get_total_distance<T>(shape_path);
+    shape_path.rewind(0);
+
+    if (distance == 0) //Point data, not a line
+    {
+        double x, y;
+        shape_path.vertex(&x,&y);
+        find_point_placement(p, po, x, y);
+        return;
+    }
+
+    int num_labels = 1;
+    if (p.label_spacing > 0)
+        num_labels = static_cast<int> (floor(total_distance / p.label_spacing));
+
+    if (p.force_odd_labels && num_labels%2 == 0)
+        num_labels--;
+    if (num_labels <= 0)
+        num_labels = 1;
+
+    double distance = 0.0; // distance from last label
+    double spacing = total_distance / num_labels;
+    double target_distance = spacing / 2; // first label should be placed at half the spacing
+
+    while (!agg::is_stop(cmd = shape_path.vertex(&new_x,&new_y))) //For each node in the shape
+    {
+
+        if (first || agg::is_move_to(cmd)) //Don't do any processing if it is the first node
+        {
             first = false;
-         }
-         else
-         {
+        }
+        else
+        {
             //Add the length of this segment to the total we have saved up
             double segment_length = std::sqrt(std::pow(old_x-new_x,2) + std::pow(old_y-new_y,2)); //Pythagoras
             distance += segment_length;
@@ -199,66 +215,65 @@ namespace mapnik
             //While we have enough distance to place text in
             while (distance > target_distance)
             {
-               //Try place at the specified place
-               double new_weight = (segment_length - (distance - target_distance))/segment_length;
-               find_point_placement(p, old_x + (new_x-old_x)*new_weight, old_y + (new_y-old_y)*new_weight);
+                //Try place at the specified place
+                double new_weight = (segment_length - (distance - target_distance))/segment_length;
+                find_point_placement(p, po, old_x + (new_x-old_x)*new_weight, old_y + (new_y-old_y)*new_weight);
 
-               distance -= target_distance; //Consume the spacing gap we have used up
-               target_distance = spacing; //Need to reset the target_distance as it is spacing/2 for the first label.
+                distance -= target_distance; //Consume the spacing gap we have used up
+                target_distance = spacing; //Need to reset the target_distance as it is spacing/2 for the first label.
             }
-         }
-
-         old_x = new_x;
-         old_y = new_y;
-      }
-
-   }
-
-   template <typename DetectorT>
-   void placement_finder<DetectorT>::find_point_placement(placement & p,
-                                                          double label_x,
-                                                          double label_y,
-                                                          vertical_alignment_e valign,
-                                                          unsigned line_spacing,
-                                                          unsigned character_spacing,
-                                                          horizontal_alignment_e halign,
-                                                          justify_alignment_e jalign)
-   {
-      double x, y;
-      std::auto_ptr<placement_element> current_placement(new placement_element);
-
-      std::pair<double, double> string_dimensions = p.info.get_dimensions();
-      double string_width = string_dimensions.first + (character_spacing *(p.info.num_characters()-1));
-      double string_height = string_dimensions.second;
-
-      // use height of tallest character in the string for the 'line' spacing to obtain consistent line spacing
-      double max_character_height = string_height;  // height of the tallest character in the string
-
-      // check if we need to wrap the string
-      double wrap_at = string_width + 1.0;
-      if (p.wrap_width && string_width > p.wrap_width)
-      {
-         if (p.text_ratio)
-            for (double i = 1.0; ((wrap_at = string_width/i)/(string_height*i)) > p.text_ratio && (string_width/i) > p.wrap_width; i += 1.0);
-         else
+        }
+
+        old_x = new_x;
+        old_y = new_y;
+    }
+
+}
+
+template <typename DetectorT>
+void placement_finder<DetectorT>::find_point_placement(placement & p,
+                                                       text_placement_info_ptr po,
+                                                       double label_x,
+                                                       double label_y,
+                                                       double angle,
+                                                       unsigned line_spacing,
+                                                       unsigned character_spacing)
+{
+    double x, y;
+    std::auto_ptr<placement_element> current_placement(new placement_element);
+    
+    std::pair<double, double> string_dimensions = p.info.get_dimensions();
+    double string_width = string_dimensions.first + (character_spacing *(p.info.num_characters()-1));
+    double string_height = string_dimensions.second;
+
+    // use height of tallest character in the string for the 'line' spacing to obtain consistent line spacing
+    double max_character_height = string_height;  // height of the tallest character in the string
+
+    // check if we need to wrap the string
+    double wrap_at = string_width + 1.0;
+    if (p.wrap_width && string_width > p.wrap_width)
+    {
+        if (p.text_ratio)
+            for (double i = 1.0; ((wrap_at = string_width/i)/(string_height*i)) > p.text_ratio && (string_width/i) > p.wrap_width; i += 1.0) ;
+        else
             wrap_at = p.wrap_width;
-      }
-
-      // work out where our line breaks need to be and the resultant width to the 'wrapped' string
-      std::vector<int> line_breaks;
-      std::vector<double> line_widths;
-
-      if (wrap_at < string_width && p.info.num_characters() > 0)
-      {
-         int last_wrap_char = 0;
-         int last_wrap_char_width = 0;
-         string_width = 0.0;
-         string_height = 0.0;
-         double line_width = 0.0;
-         double word_width = 0.0;
-
-         for (unsigned int ii = 0; ii < p.info.num_characters(); ii++)
-         {
+    }
+
+    // work out where our line breaks need to be and the resultant width to the 'wrapped' string
+    std::vector<int> line_breaks;
+    std::vector<double> line_widths;
+
+    if ((p.info.num_characters() > 0) && ((wrap_at < string_width) || p.info.has_line_breaks()))
+    {
+        int last_wrap_char = 0;
+        int last_wrap_char_width = 0;
+        string_width = 0.0;
+        string_height = 0.0;
+        double line_width = 0.0;
+        double word_width = 0.0;
+
+        for (unsigned int ii = 0; ii < p.info.num_characters(); ii++)
+        {
             character_info ci;
             ci = p.info.at(ii);
 
@@ -267,254 +282,314 @@ namespace mapnik
             unsigned c = ci.character;
             word_width += cwidth;
 
-            if (c == p.wrap_char)
+            if ((c == p.wrap_char) || (c == '\n'))
             {
-               last_wrap_char = ii;
-               last_wrap_char_width = cwidth;
-               line_width += word_width;
-               word_width = 0.0;
+                last_wrap_char = ii;
+                last_wrap_char_width = cwidth;
+                line_width += word_width;
+                word_width = 0.0;
             }
 
             // wrap text at first wrap_char after (default) the wrap width or immediately before the current word
-            if (line_width > 0 && (((line_width - character_spacing) > wrap_at && !p.wrap_before) ||
-                                   ((line_width + word_width - character_spacing) > wrap_at && p.wrap_before)) )
+            if ((c == '\n') ||
+                (line_width > 0 && (((line_width - character_spacing) > wrap_at && !p.wrap_before) ||
+                                   ((line_width + word_width - character_spacing) > wrap_at && p.wrap_before)) ))
             {
-               // Remove width of breaking space character since it is not rendered and the character_spacing for the last character on the line
-               line_width -= (last_wrap_char_width + character_spacing);
-               string_width = string_width > line_width ? string_width : line_width;
-               string_height += max_character_height;
-               line_breaks.push_back(last_wrap_char);
-               line_widths.push_back(line_width);
-               ii = last_wrap_char;
-               line_width = 0.0;
-               word_width = 0.0;
+                // Remove width of breaking space character since it is not rendered and the character_spacing for the last character on the line
+                line_width -= (last_wrap_char_width + character_spacing);
+                string_width = string_width > line_width ? string_width : line_width;
+                string_height += max_character_height;
+                line_breaks.push_back(last_wrap_char);
+                line_widths.push_back(line_width);
+                ii = last_wrap_char;
+                line_width = 0.0;
+                word_width = 0.0;
             }
-         }
-         line_width += (word_width - character_spacing);  // remove character_spacing from last character on the line
-         string_width = string_width > line_width ? string_width : line_width;
-         string_height += max_character_height;
-         line_breaks.push_back(p.info.num_characters());
-         line_widths.push_back(line_width);
-      }
-      if (line_breaks.size() == 0)
-      {
-         line_breaks.push_back(p.info.num_characters());
-         line_widths.push_back(string_width);
-      }
-      int   total_lines = line_breaks.size();
-
-      p.info.set_dimensions( string_width, (string_height + (line_spacing * (total_lines-1))) );
-
-      // if needed, adjust for desired vertical alignment
-      current_placement->starting_y = label_y;  // no adjustment, default is MIDDLE
-
-      if (valign == TOP)
-         current_placement->starting_y -= 0.5 * (string_height + (line_spacing * (total_lines-1)));  // move center up by 1/2 the total height
-
-      else if (valign == BOTTOM)
-         current_placement->starting_y += 0.5 * (string_height + (line_spacing * (total_lines-1)));  // move center down by the 1/2 the total height
-
-      // correct placement for error, but BOTTOM does not need to be adjusted
-      // (text rendering is at text_size, but line placement is by line_height (max_character_height),
-      //  and the rendering adds the extra space below the characters)
-      if (valign == TOP )
-         current_placement->starting_y -= (p.text_size - max_character_height);  // move up by the error
-
-      else if (valign == MIDDLE)
-         current_placement->starting_y -= ((p.text_size - max_character_height) / 2.0); // move up by 1/2 the error
-
-      // set horizontal position to middle of text
-      current_placement->starting_x = label_x;  // no adjustment, default is MIDDLE
-
-      if (halign == H_LEFT)
-         current_placement->starting_x -= 0.5 * string_width;  // move center left by 1/2 the string width
-
-      else if (halign == H_RIGHT)
-         current_placement->starting_x += 0.5 * string_width;  // move center right by 1/2 the string width
-
-      // adjust text envelope position by user's x-y displacement (dx, dy)
-      current_placement->starting_x += boost::tuples::get<0>(p.displacement_);
-      current_placement->starting_y += boost::tuples::get<1>(p.displacement_);
-
-      // presets for first line
-      unsigned int line_number = 0;
-      unsigned int index_to_wrap_at = line_breaks[0];
-      double line_width = line_widths[0];
-
-      // set for upper left corner of text envelope for the first line, bottom left of first character
-      x = -(line_width / 2.0);
-      y = (0.5 * (string_height + (line_spacing * (total_lines-1)))) - max_character_height;
-
-      // if needed, adjust for desired justification (J_MIDDLE is the default)
-      if( jalign == J_LEFT )
-         x = -(string_width / 2.0);
-
-      else if (jalign == J_RIGHT)
-         x = (string_width / 2.0) - line_width;
-
-      // save each character rendering position and build envelope as go thru loop
-      std::queue< Envelope<double> > c_envelopes;
-
-      for (unsigned i = 0; i < p.info.num_characters(); i++)
-      {
-         character_info ci;
-         ci = p.info.at(i);
-
-         double cwidth = ci.width + character_spacing;
-
-         unsigned c = ci.character;
-         if (i == index_to_wrap_at)
-         {
+        }
+        line_width += (word_width - character_spacing);  // remove character_spacing from last character on the line
+        string_width = string_width > line_width ? string_width : line_width;
+        string_height += max_character_height;
+        line_breaks.push_back(p.info.num_characters());
+        line_widths.push_back(line_width);
+    }
+    if (line_breaks.size() == 0)
+    {
+        line_breaks.push_back(p.info.num_characters());
+        line_widths.push_back(string_width);
+    }
+    int total_lines = line_breaks.size();
+
+    p.info.set_dimensions( string_width, (string_height + (line_spacing * (total_lines-1))) );
+
+    // if needed, adjust for desired vertical alignment
+    current_placement->starting_y = label_y;  // no adjustment, default is MIDDLE
+
+    vertical_alignment_e real_valign = po->valign;
+    if (real_valign == V_AUTO) {
+        if (po->displacement.get<1>() > 0.0)
+            real_valign = V_BOTTOM;
+        else if (po->displacement.get<1>() < 0.0)
+            real_valign = V_TOP;
+        else
+            real_valign = V_MIDDLE;
+    }
+
+    horizontal_alignment_e real_halign = po->halign;
+    if (real_halign == H_AUTO) {
+        if (po->displacement.get<0>() > 0.0)
+            real_halign = H_RIGHT;
+        else if (po->displacement.get<0>() < 0.0)
+            real_halign = H_LEFT;
+        else
+            real_halign = H_MIDDLE;
+    }
+
+    if (real_valign == V_TOP)
+        current_placement->starting_y -= 0.5 * (string_height + (line_spacing * (total_lines-1)));  // move center up by 1/2 the total height
+
+    else if (real_valign == V_BOTTOM)
+        current_placement->starting_y += 0.5 * (string_height + (line_spacing * (total_lines-1)));  // move center down by the 1/2 the total height
+
+    // correct placement for error, but BOTTOM does not need to be adjusted
+    // (text rendering is at text_size, but line placement is by line_height (max_character_height),
+    //  and the rendering adds the extra space below the characters)
+    if (real_valign == V_TOP )
+        current_placement->starting_y -= (po->text_size - max_character_height);  // move up by the error
+
+    else if (real_valign == V_MIDDLE)
+        current_placement->starting_y -= ((po->text_size - max_character_height) / 2.0); // move up by 1/2 the error
+
+    // set horizontal position to middle of text
+    current_placement->starting_x = label_x;  // no adjustment, default is MIDDLE
+
+    if (real_halign == H_LEFT)
+        current_placement->starting_x -= 0.5 * string_width;  // move center left by 1/2 the string width
+
+    else if (real_halign == H_RIGHT)
+        current_placement->starting_x += 0.5 * string_width;  // move center right by 1/2 the string width
+
+    // adjust text envelope position by user's x-y displacement (dx, dy)
+    current_placement->starting_x += p.scale_factor_ * boost::tuples::get<0>(po->displacement);
+    current_placement->starting_y += p.scale_factor_ * boost::tuples::get<1>(po->displacement);
+
+    // presets for first line
+    unsigned int line_number = 0;
+    unsigned int index_to_wrap_at = line_breaks[0];
+    double line_width = line_widths[0];
+
+    // set for upper left corner of text envelope for the first line, bottom left of first character
+    x = -(line_width / 2.0);
+    if (p.info.get_rtl()==false)
+    {
+		y = (0.5 * (string_height + (line_spacing * (total_lines-1)))) - max_character_height;
+	}
+	else
+	{
+		y = -(0.5 * (string_height + (line_spacing * (total_lines-1)))) + max_character_height;
+	}
+
+    // if needed, adjust for desired justification (J_MIDDLE is the default)
+    if( po->jalign == J_LEFT )
+        x = -(string_width / 2.0);
+
+    else if (po->jalign == J_RIGHT)
+        x = (string_width / 2.0) - line_width;
+
+    // save each character rendering position and build envelope as go thru loop
+    std::queue< box2d<double> > c_envelopes;
+
+    for (unsigned i = 0; i < p.info.num_characters(); i++)
+    {
+        character_info ci;
+        ci = p.info.at(i);
+
+        double cwidth = ci.width + character_spacing;
+
+        unsigned c = ci.character;
+        if (i == index_to_wrap_at)
+        {
             index_to_wrap_at = line_breaks[++line_number];
             line_width = line_widths[line_number];
 
-            y -= (max_character_height + line_spacing);  // move position down to line start
+			if (p.info.get_rtl()==false)
+			{
+				y -= (max_character_height + line_spacing);  // move position down to line start
+			}
+			else
+			{
+				y += (max_character_height + line_spacing);  // move position up to line start
+			}            
 
             // reset to begining of line position
-            x = ((jalign == J_LEFT)? -(string_width / 2.0): ((jalign == J_RIGHT)? ((string_width /2.0) - line_width): -(line_width / 2.0)));
+            x = ((po->jalign == J_LEFT)? -(string_width / 2.0): ((po->jalign == J_RIGHT)? ((string_width /2.0) - line_width): -(line_width / 2.0)));
             continue;
-         }
-         else
-         {
+        }
+        else
+        {
             // place the character relative to the center of the string envelope
-            current_placement->add_node(c, x, y, 0.0);
-
+            double rad = M_PI * angle/180.0;
+            double cosa = fast_cos(rad);
+            double sina = fast_sin(rad);
+            
+            double dx = x * cosa - y*sina;
+            double dy = x * sina + y*cosa;
+
+            current_placement->add_node(c, dx, dy, rad);        
+            
             // compute the Bounding Box for each character and test for:
             // overlap, minimum distance or edge avoidance - exit if condition occurs
-            Envelope<double> e;
+            box2d<double> e;
             if (p.has_dimensions)
             {
-               e.init(current_placement->starting_x - (p.dimensions.first/2.0),     // Top Left
-                      current_placement->starting_y - (p.dimensions.second/2.0),
+                e.init(current_placement->starting_x - (p.dimensions.first/2.0),     // Top Left
+                       current_placement->starting_y - (p.dimensions.second/2.0),
 
-                      current_placement->starting_x + (p.dimensions.first/2.0),     // Bottom Right
-                      current_placement->starting_y + (p.dimensions.second/2.0));
+                       current_placement->starting_x + (p.dimensions.first/2.0),     // Bottom Right
+                       current_placement->starting_y + (p.dimensions.second/2.0));
             }
             else
             {
-               e.init(current_placement->starting_x + x,                    // Bottom Left
-                      current_placement->starting_y - y,
+                e.init(current_placement->starting_x + dx,                    // Bottom Left
+                       current_placement->starting_y - dy,
 
-                      current_placement->starting_x + x + ci.width,         // Top Right
-                      current_placement->starting_y - y - max_character_height);
+                       current_placement->starting_x + dx + ci.width,         // Top Right
+                       current_placement->starting_y - dy - max_character_height);
             }
-
+            
             // if there is an overlap with existing envelopes, then exit - no placement
-            if (!dimensions_.intersects(e) || (!p.allow_overlap && !detector_.has_point_placement(e,p.minimum_distance)))
-               return;
+            if (!detector_.extent().intersects(e) || (!p.allow_overlap && !detector_.has_point_placement(e,p.minimum_distance)))
+                return;
 
+            // if avoid_edges test dimensions contains e 
             if (p.avoid_edges && !dimensions_.contains(e))
-               return;
+                return;
+            
+            if (p.minimum_padding > 0) 
+            {
+                box2d<double> epad(e.minx()-p.minimum_padding,
+                                      e.miny()-p.minimum_padding,
+                                      e.maxx()+p.minimum_padding,
+                                      e.maxy()+p.minimum_padding);
+                if (!dimensions_.contains(epad)) 
+                {
+                    return;
+                }
+            }
+  
 
             c_envelopes.push(e);  // add character's envelope to temp storage
-         }
-         x += cwidth;  // move position to next character
-      }
+        }
+        x += cwidth;  // move position to next character
+    }
 
-      // since there was no early exit, add the character envelopes to the placements' envelopes
-      while( !c_envelopes.empty() )
-      {
+    // since there was no early exit, add the character envelopes to the placements' envelopes
+    while( !c_envelopes.empty() )
+    {
         p.envelopes.push( c_envelopes.front() );
         c_envelopes.pop();
-      }
-
-      p.placements.push_back(current_placement.release());
-   }
-
-
-   template <typename DetectorT>
-   template <typename PathT>
-   void placement_finder<DetectorT>::find_line_placements(placement & p, PathT & shape_path)
-   {
-      unsigned cmd;
-      double new_x = 0.0;
-      double new_y = 0.0;
-      double old_x = 0.0;
-      double old_y = 0.0;
-      bool first = true;
-
-      //Pre-Cache all the path_positions and path_distances
-      //This stops the PathT from having to do multiple re-projections if we need to reposition ourself
-      // and lets us know how many points are in the shape.
-      std::vector<vertex2d> path_positions;
-      std::vector<double> path_distances; // distance from node x-1 to node x
-      double total_distance = 0;
-
-      shape_path.rewind(0);
-      while (!agg::is_stop(cmd = shape_path.vertex(&new_x,&new_y))) //For each node in the shape
-      {
-         if (!first && agg::is_line_to(cmd))
-         {
+    }
+
+    p.placements.push_back(current_placement.release());
+}
+
+
+template <typename DetectorT>
+template <typename PathT>
+void placement_finder<DetectorT>::find_line_placements(placement & p, text_placement_info_ptr po, PathT & shape_path)
+{
+    unsigned cmd;
+    double new_x = 0.0;
+    double new_y = 0.0;
+    double old_x = 0.0;
+    double old_y = 0.0;
+    bool first = true;
+
+    //Pre-Cache all the path_positions and path_distances
+    //This stops the PathT from having to do multiple re-projections if we need to reposition ourself
+    // and lets us know how many points are in the shape.
+    std::vector<vertex2d> path_positions;
+    std::vector<double> path_distances; // distance from node x-1 to node x
+    double total_distance = 0;
+
+    shape_path.rewind(0);
+    while (!agg::is_stop(cmd = shape_path.vertex(&new_x,&new_y))) //For each node in the shape
+    {
+        if (!first && agg::is_line_to(cmd))
+        {
             double dx = old_x - new_x;
             double dy = old_y - new_y;
             double distance = std::sqrt(dx*dx + dy*dy);
             total_distance += distance;
             path_distances.push_back(distance);
-         }
-         else
-         {
+        }
+        else
+        {
             path_distances.push_back(0);
-         }
-         first = false;
-         path_positions.push_back(vertex2d(new_x, new_y, cmd));
-         old_x = new_x;
-         old_y = new_y;
-      }
-      //Now path_positions is full and total_distance is correct
-      //shape_path shouldn't be used from here
+        }
+        first = false;
+        path_positions.push_back(vertex2d(new_x, new_y, cmd));
+        old_x = new_x;
+        old_y = new_y;
+    }
+    //Now path_positions is full and total_distance is correct
+    //shape_path shouldn't be used from here
+
+    // Ensure lines have a minimum length.
+    if (total_distance < p.minimum_path_length)
+        return;
 
-      double distance = 0.0;
-      std::pair<double, double> string_dimensions = p.info.get_dimensions();
+    double distance = 0.0;
+    std::pair<double, double> string_dimensions = p.info.get_dimensions();
 
-      double string_width = string_dimensions.first;
+    double string_width = string_dimensions.first;
 
-      double displacement = boost::tuples::get<1>(p.displacement_); // displace by dy
+    double displacement = boost::tuples::get<1>(po->displacement); // displace by dy
 
-      //Calculate a target_distance that will place the labels centered evenly rather than offset from the start of the linestring
-      if (total_distance < string_width) //Can't place any strings
+    //Calculate a target_distance that will place the labels centered evenly rather than offset from the start of the linestring
+    if (total_distance < string_width) //Can't place any strings
         return;
 
-      //If there is no spacing then just do one label, otherwise calculate how many there should be
-      int num_labels = 1;
-      if (p.label_spacing > 0)
-         num_labels = static_cast<int> (floor(total_distance / (p.label_spacing + string_width)));
-
-      if (p.force_odd_labels && num_labels%2 == 0)
-         num_labels--;
-      if (num_labels <= 0)
-         num_labels = 1;
-
-      //Now we know how many labels we are going to place, calculate the spacing so that they will get placed evenly
-      double spacing = total_distance / num_labels;
-      double target_distance = (spacing - string_width) / 2; // first label should be placed at half the spacing
-
-      //Calculate or read out the tolerance
-      double tolerance_delta, tolerance;
-      if (p.label_position_tolerance > 0)
-      {
-         tolerance = p.label_position_tolerance;
-         tolerance_delta = std::max ( 1.0, p.label_position_tolerance/100.0 );
-      }
-      else
-      {
-         tolerance = spacing/2.0;
-         tolerance_delta = std::max ( 1.0, spacing/100.0 );
-      }
-
-
-      first = true;
-      for (unsigned index = 0; index < path_positions.size(); index++) //For each node in the shape
-      {
-         cmd = path_positions[index].cmd;
-         new_x = path_positions[index].x;
-         new_y = path_positions[index].y;
-
-         if (first || agg::is_move_to(cmd)) //Don't do any processing if it is the first node
-         {
+    //If there is no spacing then just do one label, otherwise calculate how many there should be
+    int num_labels = 1;
+    if (p.label_spacing > 0)
+        num_labels = static_cast<int> (floor(total_distance / (p.label_spacing + string_width)));
+
+    if (p.force_odd_labels && num_labels%2 == 0)
+        num_labels--;
+    if (num_labels <= 0)
+        num_labels = 1;
+
+    //Now we know how many labels we are going to place, calculate the spacing so that they will get placed evenly
+    double spacing = total_distance / num_labels;
+    double target_distance = (spacing - string_width) / 2; // first label should be placed at half the spacing
+
+    //Calculate or read out the tolerance
+    double tolerance_delta, tolerance;
+    if (p.label_position_tolerance > 0)
+    {
+        tolerance = p.label_position_tolerance;
+        tolerance_delta = std::max ( 1.0, p.label_position_tolerance/100.0 );
+    }
+    else
+    {
+        tolerance = spacing/2.0;
+        tolerance_delta = std::max ( 1.0, spacing/100.0 );
+    }
+
+
+    first = true;
+    for (unsigned index = 0; index < path_positions.size(); index++) //For each node in the shape
+    {
+        cmd = path_positions[index].cmd;
+        new_x = path_positions[index].x;
+        new_y = path_positions[index].y;
+
+        if (first || agg::is_move_to(cmd)) //Don't do any processing if it is the first node
+        {
             first = false;
-         }
-         else
-         {
+        }
+        else
+        {
             //Add the length of this segment to the total we have saved up
             double segment_length = path_distances[index];
             distance += segment_length;
@@ -522,394 +597,429 @@ namespace mapnik
             //While we have enough distance to place text in
             while (distance > target_distance)
             {
-               for (double diff = 0; diff < tolerance; diff += tolerance_delta)
-               {
-                  for(int dir = -1; dir < 2; dir+=2) //-1, +1
-                  {
-                     //Record details for the start of the string placement
-                     int orientation = 0;
-                     std::auto_ptr<placement_element> current_placement = get_placement_offset(p, path_positions, path_distances, orientation, index, segment_length - (distance - target_distance) + (diff*dir));
-
-                     //We were unable to place here
-                     if (current_placement.get() == NULL)
-                        continue;
-
-                     //Apply displacement
-                     //NOTE: The text is centered on the line in get_placement_offset, so we are offsetting from there
-                     if (displacement != 0)
-                     {
-                        //Average the angle of all characters and then offset them all by that angle
-                        //NOTE: This probably calculates a bad angle due to going around the circle, test this!
-                        double anglesum = 0;
-                        for (unsigned i = 0; i < current_placement->nodes_.size(); i++)
+                for (double diff = 0; diff < tolerance; diff += tolerance_delta)
+                {
+                    for(int dir = -1; dir < 2; dir+=2) //-1, +1
+                    {
+                        //Record details for the start of the string placement
+                        int orientation = 0;
+                        std::auto_ptr<placement_element> current_placement = get_placement_offset(p, path_positions, path_distances, orientation, index, segment_length - (distance - target_distance) + (diff*dir));
+
+                        //We were unable to place here
+                        if (current_placement.get() == NULL)
+                            continue;
+
+                        //Apply displacement
+                        //NOTE: The text is centered on the line in get_placement_offset, so we are offsetting from there
+                        if (displacement != 0)
                         {
-                           anglesum += current_placement->nodes_[i].angle;
+                            //Average the angle of all characters and then offset them all by that angle
+                            //NOTE: This probably calculates a bad angle due to going around the circle, test this!
+                            double anglesum = 0;
+                            for (unsigned i = 0; i < current_placement->nodes_.size(); i++)
+                            {
+                                anglesum += current_placement->nodes_[i].angle;
+                            }
+                            anglesum /= current_placement->nodes_.size(); //Now it is angle average
+
+                            double disp_x = p.scale_factor_ * displacement*fast_cos(anglesum+M_PI/2);
+                            double disp_y = p.scale_factor_ * displacement*fast_sin(anglesum+M_PI/2);
+                            //Offset all the characters by this angle
+                            for (unsigned i = 0; i < current_placement->nodes_.size(); i++)
+                            {
+                                current_placement->nodes_[i].x += disp_x;
+                                current_placement->nodes_[i].y += disp_y;
+                            }
                         }
-                        anglesum /= current_placement->nodes_.size(); //Now it is angle average
 
-                        //Offset all the characters by this angle
-                        for (unsigned i = 0; i < current_placement->nodes_.size(); i++)
+                        bool status = test_placement(p, current_placement, orientation);
+
+                        if (status) //We have successfully placed one
                         {
-                           current_placement->nodes_[i].x += displacement*cos(anglesum+M_PI/2);
-                           current_placement->nodes_[i].y += displacement*sin(anglesum+M_PI/2);
+                            p.placements.push_back(current_placement.release());
+                            update_detector(p);
+
+                            //Totally break out of the loops
+                            diff = tolerance;
+                            break;
                         }
-                     }
-
-                     bool status = test_placement(p, current_placement, orientation);
-
-                     if (status) //We have successfully placed one
-                     {
-                        p.placements.push_back(current_placement.release());
-                        update_detector(p);
-
-                        //Totally break out of the loops
-                        diff = tolerance;
-                        break;
-                     }
-                     else
-                     {
-                        //If we've failed to place, remove all the envelopes we've added up
-                        while (!p.envelopes.empty())
-                           p.envelopes.pop();
-                     }
-
-                     //Don't need to loop twice when diff = 0
-                     if (diff == 0)
-                        break;
-                  }
-               }
-
-               distance -= target_distance; //Consume the spacing gap we have used up
-               target_distance = spacing; //Need to reset the target_distance as it is spacing/2 for the first label.
+                        else
+                        {
+                            //If we've failed to place, remove all the envelopes we've added up
+                            while (!p.envelopes.empty())
+                                p.envelopes.pop();
+                        }
+
+                        //Don't need to loop twice when diff = 0
+                        if (diff == 0)
+                            break;
+                    }
+                }
+
+                distance -= target_distance; //Consume the spacing gap we have used up
+                target_distance = spacing; //Need to reset the target_distance as it is spacing/2 for the first label.
             }
-         }
-
-         old_x = new_x;
-         old_y = new_y;
-      }
-   }
-
-   template <typename DetectorT>
-   std::auto_ptr<placement_element> placement_finder<DetectorT>::get_placement_offset(placement & p, const std::vector<vertex2d> &path_positions, const std::vector<double> &path_distances, int &orientation, unsigned index, double distance)
-   {
-      //Check that the given distance is on the given index and find the correct index and distance if not
-      while (distance < 0 && index > 1)
-      {
-         index--;
-         distance += path_distances[index];
-      }
-      if (index <= 1 && distance < 0) //We've gone off the start, fail out
-         return std::auto_ptr<placement_element>(NULL);
-
-      //Same thing, checking if we go off the end
-      while (index < path_distances.size() && distance > path_distances[index])
-      {
-         distance -= path_distances[index];
-         index++;
-      }
-      if (index >= path_distances.size())
-         return std::auto_ptr<placement_element>(NULL);
-
-      //Keep track of the initial index,distance incase we need to re-call get_placement_offset
-      const unsigned initial_index = index;
-      const double initial_distance = distance;
-
-      std::auto_ptr<placement_element> current_placement(new placement_element);
-
-      double string_height = p.info.get_dimensions().second;
-      double old_x = path_positions[index-1].x;
-      double old_y = path_positions[index-1].y;
-
-      double new_x = path_positions[index].x;
-      double new_y = path_positions[index].y;
-
-      double dx = new_x - old_x;
-      double dy = new_y - old_y;
-
-      double segment_length = path_distances[index];
-      if (segment_length == 0) {
-          // Not allowed to place across on 0 length segments or discontinuities
-          return std::auto_ptr<placement_element>(NULL);
-      }
-
-      current_placement->starting_x = old_x + dx*distance/segment_length;
-      current_placement->starting_y = old_y + dy*distance/segment_length;
-      double angle = atan2(-dy, dx);
-
-      bool orientation_forced = (orientation != 0); //Wether the orientation was set by the caller
-      if (!orientation_forced)
-         orientation = (angle > 0.55*M_PI || angle < -0.45*M_PI) ? -1 : 1;
-
-      unsigned upside_down_char_count = 0; //Count of characters that are placed upside down.
-
-      for (unsigned i = 0; i < p.info.num_characters(); ++i)
-      {
-         character_info ci;
-         unsigned c;
-
-         double last_character_angle = angle;
-
-         // grab the next character according to the orientation
-         ci = orientation > 0 ? p.info.at(i) : p.info.at(p.info.num_characters() - i - 1);
-         c = ci.character;
-
-         //Coordinates this character will start at
+        }
+
+        old_x = new_x;
+        old_y = new_y;
+    }
+}
+
+template <typename DetectorT>
+std::auto_ptr<placement_element> placement_finder<DetectorT>::get_placement_offset(placement & p, const std::vector<vertex2d> &path_positions, const std::vector<double> &path_distances, int &orientation, unsigned index, double distance)
+{
+    //Check that the given distance is on the given index and find the correct index and distance if not
+    while (distance < 0 && index > 1)
+    {
+        index--;
+        distance += path_distances[index];
+    }
+    if (index <= 1 && distance < 0) //We've gone off the start, fail out
+        return std::auto_ptr<placement_element>(NULL);
+
+    //Same thing, checking if we go off the end
+    while (index < path_distances.size() && distance > path_distances[index])
+    {
+        distance -= path_distances[index];
+        index++;
+    }
+    if (index >= path_distances.size())
+        return std::auto_ptr<placement_element>(NULL);
+
+    //Keep track of the initial index,distance incase we need to re-call get_placement_offset
+    const unsigned initial_index = index;
+    const double initial_distance = distance;
+
+    std::auto_ptr<placement_element> current_placement(new placement_element);
+
+    double string_height = p.info.get_dimensions().second;
+    double old_x = path_positions[index-1].x;
+    double old_y = path_positions[index-1].y;
+
+    double new_x = path_positions[index].x;
+    double new_y = path_positions[index].y;
+
+    double dx = new_x - old_x;
+    double dy = new_y - old_y;
+
+    double segment_length = path_distances[index];
+    if (segment_length == 0) {
+        // Not allowed to place across on 0 length segments or discontinuities
+        return std::auto_ptr<placement_element>(NULL);
+    }
+
+    current_placement->starting_x = old_x + dx*distance/segment_length;
+    current_placement->starting_y = old_y + dy*distance/segment_length;
+    double angle = fast_atan2(-dy, dx);
+
+    bool orientation_forced = (orientation != 0); //Wether the orientation was set by the caller
+    if (!orientation_forced)
+        orientation = (angle > 0.55*M_PI || angle < -0.45*M_PI) ? -1 : 1;
+
+    unsigned upside_down_char_count = 0; //Count of characters that are placed upside down.
+
+    for (unsigned i = 0; i < p.info.num_characters(); ++i)
+    {
+        character_info ci;
+        unsigned c;
+
+        double last_character_angle = angle;
+
+        // grab the next character according to the orientation
+        ci = orientation > 0 ? p.info.at(i) : p.info.at(p.info.num_characters() - i - 1);
+        c = ci.character;
+
+        //Coordinates this character will start at
         if (segment_length == 0) {
             // Not allowed to place across on 0 length segments or discontinuities
             return std::auto_ptr<placement_element>(NULL);
         }
-         double start_x = old_x + dx*distance/segment_length;
-         double start_y = old_y + dy*distance/segment_length;
-         //Coordinates this character ends at, calculated below
-         double end_x = 0;
-         double end_y = 0;
-
-         if (segment_length - distance  >= ci.width)
-         {
+        double start_x = old_x + dx*distance/segment_length;
+        double start_y = old_y + dy*distance/segment_length;
+        //Coordinates this character ends at, calculated below
+        double end_x = 0;
+        double end_y = 0;
+
+        if (segment_length - distance  >= ci.width)
+        {
             //if the distance remaining in this segment is enough, we just go further along the segment
             distance += ci.width;
 
             end_x = old_x + dx*distance/segment_length;
             end_y = old_y + dy*distance/segment_length;
-         }
-         else
-         {
+        }
+        else
+        {
             //If there isn't enough distance left on this segment
-            // then we need to search untill we find the line segment that ends further than ci.width away
+            // then we need to search until we find the line segment that ends further than ci.width away
             do
             {
-               old_x = new_x;
-               old_y = new_y;
-               index++;
-               if (index >= path_positions.size()) //Bail out if we run off the end of the shape
-               {
-                  //std::clog << "FAIL: Out of space" << std::endl;
-                  return std::auto_ptr<placement_element>(NULL);
-               }
-               new_x = path_positions[index].x;
-               new_y = path_positions[index].y;
-               dx = new_x - old_x;
-               dy = new_y - old_y;
-
-               segment_length = path_distances[index];
+                old_x = new_x;
+                old_y = new_y;
+                index++;
+                if (index >= path_positions.size()) //Bail out if we run off the end of the shape
+                {
+                    //std::clog << "FAIL: Out of space" << std::endl;
+                    return std::auto_ptr<placement_element>(NULL);
+                }
+                new_x = path_positions[index].x;
+                new_y = path_positions[index].y;
+                dx = new_x - old_x;
+                dy = new_y - old_y;
+
+                segment_length = path_distances[index];
             }
             while (std::sqrt(std::pow(start_x - new_x, 2) + std::pow(start_y - new_y, 2)) < ci.width); //Distance from start_ to new_
 
             //Calculate the position to place the end of the character on
             find_line_circle_intersection(
-               start_x, start_y, ci.width,
-               old_x, old_y, new_x, new_y,
-               end_x, end_y); //results are stored in end_x, end_y
+                start_x, start_y, ci.width,
+                old_x, old_y, new_x, new_y,
+                end_x, end_y); //results are stored in end_x, end_y
 
             //Need to calculate distance on the new segment
             distance = std::sqrt(std::pow(old_x - end_x, 2) + std::pow(old_y - end_y, 2));
-         }
+        }
 
-         //Calculate angle from the start of the character to the end based on start_/end_ position
-         angle = atan2(start_y-end_y, end_x-start_x);
+        //Calculate angle from the start of the character to the end based on start_/end_ position
+        angle = fast_atan2(start_y-end_y, end_x-start_x);
 
-         //Test last_character_angle vs angle
-         // since our rendering angle has changed then check against our
-         // max allowable angle change.
-         double angle_delta = last_character_angle - angle;
-         // normalise between -180 and 180
-         while (angle_delta > M_PI)
+        //Test last_character_angle vs angle
+        // since our rendering angle has changed then check against our
+        // max allowable angle change.
+        double angle_delta = last_character_angle - angle;
+        // normalise between -180 and 180
+        while (angle_delta > M_PI)
             angle_delta -= 2*M_PI;
-         while (angle_delta < -M_PI)
+        while (angle_delta < -M_PI)
             angle_delta += 2*M_PI;
-         if (p.max_char_angle_delta > 0 &&
-               fabs(angle_delta) > p.max_char_angle_delta*(M_PI/180))
-         {
+        if (p.max_char_angle_delta > 0 &&
+            fabs(angle_delta) > p.max_char_angle_delta)
+        {
             //std::clog << "FAIL: Too Bendy!" << std::endl;
             return std::auto_ptr<placement_element>(NULL);
-         }
+        }
 
-         double render_angle = angle;
+        double render_angle = angle;
+        double cosa = fast_cos(angle);
+        double sina = fast_sin(angle);
 
-         double render_x = start_x;
-         double render_y = start_y;
+        double render_x = start_x;
+        double render_y = start_y;
 
-         //Center the text on the line
-         render_x -= (((double)string_height/2.0) - 1.0)*cos(render_angle+M_PI/2);
-         render_y += (((double)string_height/2.0) - 1.0)*sin(render_angle+M_PI/2);
+        //Center the text on the line
+        render_x += (((double)string_height/2.0) - 1.0)*sina;
+        render_y += (((double)string_height/2.0) - 1.0)*cosa;
 
-         if (orientation < 0)
-         {
+        if (orientation < 0)
+        {
             // rotate in place
-            render_x += ci.width*cos(render_angle) - (string_height-2)*sin(render_angle);
-            render_y -= ci.width*sin(render_angle) + (string_height-2)*cos(render_angle);
+            render_x += ci.width*cosa - (string_height-2)*sina;
+            render_y -= ci.width*sina + (string_height-2)*cosa;
             render_angle += M_PI;
-         }
-         current_placement->add_node(c,render_x - current_placement->starting_x,
-                                       -render_y + current_placement->starting_y,
-                                       render_angle);
+        }
+        current_placement->add_node(c,render_x - current_placement->starting_x,
+                                    -render_y + current_placement->starting_y,
+                                    render_angle);
 
-         //Normalise to 0 <= angle < 2PI
-         while (render_angle >= 2*M_PI)
+        //Normalise to 0 <= angle < 2PI
+        while (render_angle >= 2*M_PI)
             render_angle -= 2*M_PI;
-         while (render_angle < 0)
+        while (render_angle < 0)
             render_angle += 2*M_PI;
 
-         if (render_angle > M_PI/2 && render_angle < 1.5*M_PI)
+        if (render_angle > M_PI/2 && render_angle < 1.5*M_PI)
             upside_down_char_count++;
-      }
-
-      //If we placed too many characters upside down
-      if (upside_down_char_count >= p.info.num_characters()/2.0)
-      {
-         //if we auto-detected the orientation then retry with the opposite orientation
-         if (!orientation_forced)
-         {
+    }
+
+    //If we placed too many characters upside down
+    if (upside_down_char_count >= p.info.num_characters()/2.0)
+    {
+        //if we auto-detected the orientation then retry with the opposite orientation
+        if (!orientation_forced)
+        {
             orientation = -orientation;
             current_placement = get_placement_offset(p, path_positions, path_distances, orientation, initial_index, initial_distance);
-         }
-         else
-         {
+        }
+        else
+        {
             //Otherwise we have failed to find a placement
             //std::clog << "FAIL: Double upside-down!" << std::endl;
             return std::auto_ptr<placement_element>(NULL);
-         }
-      }
-
-      return current_placement;
-   }
-
-   template <typename DetectorT>
-   bool placement_finder<DetectorT>::test_placement(placement & p, const std::auto_ptr<placement_element> & current_placement, const int & orientation)
-   {
-      std::pair<double, double> string_dimensions = p.info.get_dimensions();
-
-      double string_height = string_dimensions.second;
-
-
-      //Create and test envelopes
-      bool status = true;
-      for (unsigned i = 0; i < p.info.num_characters(); ++i)
-      {
-         // grab the next character according to the orientation
-         character_info ci = orientation > 0 ? p.info.at(i) : p.info.at(p.info.num_characters() - i - 1);
-         int c;
-         double x, y, angle;
-         current_placement->vertex(&c, &x, &y, &angle);
-         x = current_placement->starting_x + x;
-         y = current_placement->starting_y - y;
-         if (orientation < 0)
-         {
+        }
+    }
+
+    return current_placement;
+}
+
+template <typename DetectorT>
+bool placement_finder<DetectorT>::test_placement(placement & p, const std::auto_ptr<placement_element> & current_placement, const int & orientation)
+{
+    std::pair<double, double> string_dimensions = p.info.get_dimensions();
+
+    double string_height = string_dimensions.second;
+
+
+    //Create and test envelopes
+    bool status = true;
+    for (unsigned i = 0; i < p.info.num_characters(); ++i)
+    {
+        // grab the next character according to the orientation
+        character_info ci = orientation > 0 ? p.info.at(i) : p.info.at(p.info.num_characters() - i - 1);
+        int c;
+        double x, y, angle;
+        current_placement->vertex(&c, &x, &y, &angle);
+        x = current_placement->starting_x + x;
+        y = current_placement->starting_y - y;
+        if (orientation < 0)
+        {
+            double sina = fast_sin(angle);
+            double cosa = fast_cos(angle);
             // rotate in place
-            x += ci.width*cos(angle) - (string_height-2)*sin(angle);
-            y -= ci.width*sin(angle) + (string_height-2)*cos(angle);
+            x += ci.width*cosa - (string_height-2)*sina;
+            y -= ci.width*sina + (string_height-2)*cosa;
             angle += M_PI;
-         }
+        }
 
-         Envelope<double> e;
-         if (p.has_dimensions)
-         {
+        box2d<double> e;
+        if (p.has_dimensions)
+        {
             e.init(x, y, x + p.dimensions.first, y + p.dimensions.second);
-         }
-         else
-         {
+        }
+        else
+        {
+            double sina = fast_sin(angle);
+            double cosa = fast_cos(angle);
             // put four corners of the letter into envelope
-            e.init(x, y, x + ci.width*cos(angle),
-                     y - ci.width*sin(angle));
-            e.expand_to_include(x - ci.height*sin(angle),
-                                 y - ci.height*cos(angle));
-            e.expand_to_include(x + (ci.width*cos(angle) - ci.height*sin(angle)),
-                                 y - (ci.width*sin(angle) + ci.height*cos(angle)));
-         }
-
-         if (!dimensions_.intersects(e) ||
-               !detector_.has_placement(e, p.info.get_string(), p.minimum_distance))
-         {
+            e.init(x, y, x + ci.width*cosa,
+                   y - ci.width*sina);
+            e.expand_to_include(x - ci.height*sina,
+                                y - ci.height*cosa);
+            e.expand_to_include(x + (ci.width*cosa - ci.height*sina),
+                                y - (ci.width*sina + ci.height*cosa));
+        }
+
+        if (!detector_.extent().intersects(e) ||
+            !detector_.has_placement(e, p.info.get_string(), p.minimum_distance))
+        {
             //std::clog << "No Intersects:" << !dimensions_.intersects(e) << ": " << e << " @ " << dimensions_ << std::endl;
             //std::clog << "No Placements:" << !detector_.has_placement(e, p.info.get_string(), p.minimum_distance) << std::endl;
             status = false;
             break;
-         }
+        }
 
-         if (p.avoid_edges && !dimensions_.contains(e))
-         {
+        if (p.avoid_edges && !dimensions_.contains(e))
+        {
             //std::clog << "Fail avoid edges" << std::endl;
             status = false;
             break;
-         }
-
-         p.envelopes.push(e);
-      }
-
-      current_placement->rewind();
-
-      return status;
-   }
-
-   template <typename DetectorT>
-   void placement_finder<DetectorT>::find_line_circle_intersection(
-      const double &cx, const double &cy, const double &radius,
-      const double &x1, const double &y1, const double &x2, const double &y2,
-      double &ix, double &iy)
-   {
-      double dx = x2 - x1;
-      double dy = y2 - y1;
-
-      double A = dx * dx + dy * dy;
-      double B = 2 * (dx * (x1 - cx) + dy * (y1 - cy));
-      double C = (x1 - cx) * (x1 - cx) + (y1 - cy) * (y1 - cy) - radius * radius;
-
-      double det = B * B - 4 * A * C;
-      if (A <= 0.0000001 || det < 0)
-      {
-         //Should never happen
-         //' No real solutions.
-         return;
-      }
-      else if (det == 0)
-      {
-         //Could potentially happen....
-         //One solution.
-         double t = -B / (2 * A);
-         ix = x1 + t * dx;
-         iy = y1 + t * dy;
-         return;
-      }
-      else
-      {
-         //Two solutions.
-
-         //Always use the 1st one
-         //We only really have one solution here, as we know the line segment will start in the circle and end outside
-         double t = (-B + std::sqrt(det)) / (2 * A);
-         ix = x1 + t * dx;
-         iy = y1 + t * dy;
-
-         //t = (-B - std::sqrt(det)) / (2 * A);
-         //ix = x1 + t * dx;
-         //iy = y1 + t * dy;
-
-         return;
-      }
-   }
-
-   template <typename DetectorT>
-   void placement_finder<DetectorT>::update_detector(placement & p)
-   {
-      while (!p.envelopes.empty())
-      {
-         Envelope<double> e = p.envelopes.front();
-         detector_.insert(e, p.info.get_string());
-         p.envelopes.pop();
-      }
-   }
-
-   template <typename DetectorT>
-   void placement_finder<DetectorT>::clear()
-   {
-      detector_.clear();
-   }
-
-   typedef coord_transform2<CoordTransform,geometry2d> PathType;
-   typedef label_collision_detector4 DetectorType;
-
-   template class placement_finder<DetectorType>;
-   template void placement_finder<DetectorType>::find_point_placements<PathType> (placement&, PathType & );
-   template void placement_finder<DetectorType>::find_line_placements<PathType> (placement&, PathType & );
+        }
+        if (p.minimum_padding > 0) 
+        { 
+            box2d<double> epad(e.minx()-p.minimum_padding,
+                               e.miny()-p.minimum_padding,
+                               e.maxx()+p.minimum_padding,
+                               e.maxy()+p.minimum_padding);
+            if (!dimensions_.contains(epad)) 
+            {
+                status = false;
+                break;
+            }
+        }
+        p.envelopes.push(e);
+    }
+    
+    current_placement->rewind();
+
+    return status;
+}
+
+template <typename DetectorT>
+void placement_finder<DetectorT>::find_line_circle_intersection(
+    const double &cx, const double &cy, const double &radius,
+    const double &x1, const double &y1, const double &x2, const double &y2,
+    double &ix, double &iy)
+{
+    double dx = x2 - x1;
+    double dy = y2 - y1;
+
+    double A = dx * dx + dy * dy;
+    double B = 2 * (dx * (x1 - cx) + dy * (y1 - cy));
+    double C = (x1 - cx) * (x1 - cx) + (y1 - cy) * (y1 - cy) - radius * radius;
+
+    double det = B * B - 4 * A * C;
+    if (A <= 0.0000001 || det < 0)
+    {
+        //Should never happen
+        //' No real solutions.
+        return;
+    }
+    else if (det == 0)
+    {
+        //Could potentially happen....
+        //One solution.
+        double t = -B / (2 * A);
+        ix = x1 + t * dx;
+        iy = y1 + t * dy;
+        return;
+    }
+    else
+    {
+        //Two solutions.
+
+        //Always use the 1st one
+        //We only really have one solution here, as we know the line segment will start in the circle and end outside
+        double t = (-B + std::sqrt(det)) / (2 * A);
+        ix = x1 + t * dx;
+        iy = y1 + t * dy;
+
+        //t = (-B - std::sqrt(det)) / (2 * A);
+        //ix = x1 + t * dx;
+        //iy = y1 + t * dy;
+
+        return;
+    }
+}
+
+template <typename DetectorT>
+void placement_finder<DetectorT>::update_detector(placement & p)
+{
+    bool first = true;
+
+    // add the bboxes to the detector and remove from the placement
+    while (!p.envelopes.empty())
+    {
+        box2d<double> e = p.envelopes.front();
+        detector_.insert(e, p.info.get_string());
+        p.envelopes.pop();
+
+        if (p.collect_extents)
+        {
+            if(first)
+            {
+                first = false;
+                p.extents = e;
+            }
+            else
+            {
+                p.extents.expand_to_include(e);
+            }
+        }
+    }
+}
+
+template <typename DetectorT>
+void placement_finder<DetectorT>::clear()
+{
+    detector_.clear();
+}
+
+typedef coord_transform2<CoordTransform,geometry_type> PathType;
+typedef label_collision_detector4 DetectorType;
+
+template class placement_finder<DetectorType>;
+template void placement_finder<DetectorType>::find_point_placements<PathType> (placement&, text_placement_info_ptr po, PathType & );
+template void placement_finder<DetectorType>::find_line_placements<PathType> (placement&, text_placement_info_ptr po, PathType & );
 
 }  // namespace
diff --git a/src/plugin.cpp b/src/plugin.cpp
index dc87920..7e5aa94 100644
--- a/src/plugin.cpp
+++ b/src/plugin.cpp
@@ -28,25 +28,25 @@
 namespace mapnik
 {
 
-    PluginInfo::PluginInfo (const std::string& name,const lt_dlhandle module)
-        :name_(name),module_(module) {}
+PluginInfo::PluginInfo (const std::string& name,const lt_dlhandle module)
+    :name_(name),module_(module) {}
 
-    PluginInfo::~PluginInfo()
+PluginInfo::~PluginInfo()
+{
+    if (module_)
     {
-        if (module_)
-        {
-            lt_dlclose(module_),module_=0;
-        }
+        lt_dlclose(module_),module_=0;
     }
+}
 
-    const std::string& PluginInfo::name() const
-    {
-        return name_;
-    }
+const std::string& PluginInfo::name() const
+{
+    return name_;
+}
 
-    lt_dlhandle PluginInfo::handle() const
-    {
-        return module_;
-    }
+lt_dlhandle PluginInfo::handle() const
+{
+    return module_;
+}
 
 }
diff --git a/src/png_reader.cpp b/src/png_reader.cpp
index 24ae504..3dfaab3 100644
--- a/src/png_reader.cpp
+++ b/src/png_reader.cpp
@@ -38,177 +38,181 @@ extern "C"
 
 namespace mapnik
 {
-    class PngReader : public ImageReader, boost::noncopyable
-    {
-    private:
-        std::string fileName_;
-        unsigned width_;
-        unsigned height_;
-        int bit_depth_;
-        int color_type_;
-    public:
-        explicit PngReader(const std::string& fileName);
-        ~PngReader();
-        unsigned width() const;
-        unsigned height() const;
-        void read(unsigned x,unsigned y,ImageData32& image);	
-    private:
-        void init();
-    };
+class png_reader : public image_reader, boost::noncopyable
+{
+private:
+    std::string fileName_;
+    unsigned width_;
+    unsigned height_;
+    int bit_depth_;
+    int color_type_;
+public:
+    explicit png_reader(const std::string& fileName);
+    ~png_reader();
+    unsigned width() const;
+    unsigned height() const;
+    void read(unsigned x,unsigned y,image_data_32& image);      
+private:
+    void init();
+};
   
-    namespace 
-    {
-        ImageReader* createPngReader(const std::string& file)
-        {
-            return new PngReader(file);
-        }
-        const bool registered = register_image_reader("png",createPngReader);
-    }
+namespace 
+{
+image_reader* create_png_reader(const std::string& file)
+{
+    return new png_reader(file);
+}
+const bool registered = register_image_reader("png",create_png_reader);
+}
 
-    PngReader::PngReader(const std::string& fileName) 
-        : fileName_(fileName),
-          width_(0),
-          height_(0),
-          bit_depth_(0),
-          color_type_(0)
-    {
-        init();
-    }
+png_reader::png_reader(const std::string& fileName) 
+    : fileName_(fileName),
+      width_(0),
+      height_(0),
+      bit_depth_(0),
+      color_type_(0)
+{
+    init();
+}
 
-    PngReader::~PngReader() {}
+png_reader::~png_reader() {}
 
-    static void
-    png_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
-    {
-        png_size_t check;
-        check = (png_size_t)fread(data, (png_size_t)1, length,
-                                  (FILE *)png_ptr->io_ptr);
+static void
+png_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
+{
+    png_size_t check;
+    check = (png_size_t)fread(data, (png_size_t)1, length,
+                              (FILE *)png_get_io_ptr(png_ptr));
 
-        if (check != length)
-        {
-            png_error(png_ptr, "Read Error");
-        }
+    if (check != length)
+    {
+        png_error(png_ptr, "Read Error");
     }
+}
   
 
-    void PngReader::init()
+void png_reader::init()
+{
+    FILE *fp=fopen(fileName_.c_str(),"rb");
+    if (!fp) throw image_reader_exception("cannot open image file "+fileName_);
+    png_byte header[8];
+    memset(header,0,8);
+    if ( fread(header,1,8,fp) != 8)
     {
-        FILE *fp=fopen(fileName_.c_str(),"rb");
-        if (!fp) throw ImageReaderException("cannot open image file "+fileName_);
-        png_byte header[8];
-        memset(header,0,8);
-        fread(header,1,8,fp);
-        int is_png=!png_sig_cmp(header,0,8);
-        if (!is_png)
-        {
-            fclose(fp);
-            throw ImageReaderException(fileName_ + " is not a png file");
-        }
-        png_structp png_ptr = png_create_read_struct
-            (PNG_LIBPNG_VER_STRING,0,0,0);
+        fclose(fp);
+        throw image_reader_exception("Could not read " + fileName_);
+    }
+    int is_png=!png_sig_cmp(header,0,8);
+    if (!is_png)
+    {
+        fclose(fp);
+        throw image_reader_exception(fileName_ + " is not a png file");
+    }
+    png_structp png_ptr = png_create_read_struct
+        (PNG_LIBPNG_VER_STRING,0,0,0);
 
-        if (!png_ptr) 
-        {
-            fclose(fp);
-            throw ImageReaderException("failed to allocate png_ptr");
-        }
-        png_infop info_ptr = png_create_info_struct(png_ptr);
-        if (!info_ptr)
-        {
-            png_destroy_read_struct(&png_ptr,0,0);
-            fclose(fp);
-            throw ImageReaderException("failed to create info_ptr");
-        }
+    if (!png_ptr) 
+    {
+        fclose(fp);
+        throw image_reader_exception("failed to allocate png_ptr");
+    }
+    png_infop info_ptr = png_create_info_struct(png_ptr);
+    if (!info_ptr)
+    {
+        png_destroy_read_struct(&png_ptr,0,0);
+        fclose(fp);
+        throw image_reader_exception("failed to create info_ptr");
+    }
 
-        png_set_read_fn(png_ptr, (png_voidp)fp, png_read_data);
+    png_set_read_fn(png_ptr, (png_voidp)fp, png_read_data);
 
-        png_set_sig_bytes(png_ptr,8);
-        png_read_info(png_ptr, info_ptr);
+    png_set_sig_bytes(png_ptr,8);
+    png_read_info(png_ptr, info_ptr);
 
-        png_uint_32  width, height;
-        png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth_, &color_type_,0,0,0);
+    png_uint_32  width, height;
+    png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth_, &color_type_,0,0,0);
 
-        width_=width;
-        height_=height;
+    width_=width;
+    height_=height;
 #ifdef MAPNIK_DEBUG
-        std::clog<<"bit_depth="<<bit_depth_<<" color_type="<<color_type_<<std::endl;
+    std::clog<<"bit_depth="<<bit_depth_<<" color_type="<<color_type_<<std::endl;
 #endif
-        png_destroy_read_struct(&png_ptr,&info_ptr,0);	
-        fclose(fp);
-    }
+    png_destroy_read_struct(&png_ptr,&info_ptr,0);      
+    fclose(fp);
+}
+
+unsigned png_reader::width() const 
+{
+    return width_;
+}
+
+unsigned png_reader::height() const 
+{
+    return height_;
+}
+    
+void png_reader::read(unsigned x0, unsigned y0,image_data_32& image) 
+{
+    FILE *fp=fopen(fileName_.c_str(),"rb");
+    if (!fp) throw image_reader_exception("cannot open image file "+fileName_);
 
-    unsigned PngReader::width() const 
+    png_structp png_ptr = png_create_read_struct
+        (PNG_LIBPNG_VER_STRING,0,0,0);
+
+    if (!png_ptr) 
     {
-        return width_;
+        fclose(fp);
+        throw image_reader_exception("failed to allocate png_ptr");
     }
 
-    unsigned PngReader::height() const 
+    png_infop info_ptr = png_create_info_struct(png_ptr);
+    if (!info_ptr)
     {
-        return height_;
+        png_destroy_read_struct(&png_ptr,0,0);
+        fclose(fp);
+        throw image_reader_exception("failed to create info_ptr");
     }
-    
-    void PngReader::read(unsigned x0, unsigned y0,ImageData32& image) 
-    {
-        FILE *fp=fopen(fileName_.c_str(),"rb");
-        if (!fp) throw ImageReaderException("cannot open image file "+fileName_);
 
-        png_structp png_ptr = png_create_read_struct
-            (PNG_LIBPNG_VER_STRING,0,0,0);
-
-        if (!png_ptr) 
-        {
-            fclose(fp);
-            throw ImageReaderException("failed to allocate png_ptr");
-        }
-
-        png_infop info_ptr = png_create_info_struct(png_ptr);
-        if (!info_ptr)
-        {
-            png_destroy_read_struct(&png_ptr,0,0);
-            fclose(fp);
-            throw ImageReaderException("failed to create info_ptr");
-        }
-
-        png_set_read_fn(png_ptr, (png_voidp)fp, png_read_data);
-        png_read_info(png_ptr, info_ptr);
-
-        if (color_type_ == PNG_COLOR_TYPE_PALETTE)
-            png_set_expand(png_ptr);
-        if (color_type_ == PNG_COLOR_TYPE_GRAY && bit_depth_ < 8)
-            png_set_expand(png_ptr);
-        if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
-            png_set_expand(png_ptr);
-        if (bit_depth_ == 16)
-            png_set_strip_16(png_ptr);
-        if (color_type_ == PNG_COLOR_TYPE_GRAY ||
-            color_type_ == PNG_COLOR_TYPE_GRAY_ALPHA)
-            png_set_gray_to_rgb(png_ptr);
-
-        // quick hack -- only work in >=libpng 1.2.7
-        png_set_add_alpha(png_ptr,0xff,PNG_FILLER_AFTER); //rgba
+    png_set_read_fn(png_ptr, (png_voidp)fp, png_read_data);
+    png_read_info(png_ptr, info_ptr);
+
+    if (color_type_ == PNG_COLOR_TYPE_PALETTE)
+        png_set_expand(png_ptr);
+    if (color_type_ == PNG_COLOR_TYPE_GRAY && bit_depth_ < 8)
+        png_set_expand(png_ptr);
+    if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
+        png_set_expand(png_ptr);
+    if (bit_depth_ == 16)
+        png_set_strip_16(png_ptr);
+    if (color_type_ == PNG_COLOR_TYPE_GRAY ||
+        color_type_ == PNG_COLOR_TYPE_GRAY_ALPHA)
+        png_set_gray_to_rgb(png_ptr);
+
+    // quick hack -- only work in >=libpng 1.2.7
+    png_set_add_alpha(png_ptr,0xff,PNG_FILLER_AFTER); //rgba
         
-        double gamma;
-        if (png_get_gAMA(png_ptr, info_ptr, &gamma))
-            png_set_gamma(png_ptr, 2.2, gamma);
-
-        png_read_update_info(png_ptr, info_ptr);
-
-        //START read image rows
-        unsigned w=std::min(unsigned(image.width()),width_);
-        unsigned h=std::min(unsigned(image.height()),height_);
-        unsigned rowbytes=png_get_rowbytes(png_ptr, info_ptr);
-        boost::scoped_array<png_byte> row(new png_byte[rowbytes]);
-	for (unsigned i=0;i<height_;++i)
+    double gamma;
+    if (png_get_gAMA(png_ptr, info_ptr, &gamma))
+        png_set_gamma(png_ptr, 2.2, gamma);
+
+    png_read_update_info(png_ptr, info_ptr);
+
+    //START read image rows
+    unsigned w=std::min(unsigned(image.width()),width_);
+    unsigned h=std::min(unsigned(image.height()),height_);
+    unsigned rowbytes=png_get_rowbytes(png_ptr, info_ptr);
+    boost::scoped_array<png_byte> row(new png_byte[rowbytes]);
+    for (unsigned i=0;i<height_;++i)
+    {
+        png_read_row(png_ptr,row.get(),0);
+        if (i>=y0 && i<h) 
         {
-            png_read_row(png_ptr,row.get(),0);
-            if (i>=y0 && i<h) 
-            {
-                image.setRow(i-y0,reinterpret_cast<unsigned*>(&row[x0]),w);
-            } 
-        }
-        //END
-        png_read_end(png_ptr,0);
-        png_destroy_read_struct(&png_ptr, &info_ptr,0);
-        fclose(fp);
+            image.setRow(i-y0,reinterpret_cast<unsigned*>(&row[x0]),w);
+        } 
     }
+    //END
+    png_read_end(png_ptr,0);
+    png_destroy_read_struct(&png_ptr, &info_ptr,0);
+    fclose(fp);
+}
 }
diff --git a/src/point_symbolizer.cpp b/src/point_symbolizer.cpp
index df3e6fd..c7d6264 100644
--- a/src/point_symbolizer.cpp
+++ b/src/point_symbolizer.cpp
@@ -23,41 +23,40 @@
 //$Id$
 // mapnik
 #include <mapnik/point_symbolizer.hpp>
-
-#include <mapnik/image_data.hpp>
-#include <mapnik/image_reader.hpp>
-// boost
-#include <boost/scoped_ptr.hpp>
-// stl
-#include <iostream>
+#include <mapnik/enumeration.hpp>
 
 namespace mapnik
 {
+
+static const char * point_placement_strings[] = {
+    "centroid",
+    "interior",
+    ""
+};
+
+IMPLEMENT_ENUM( point_placement_e, point_placement_strings )
+
 point_symbolizer::point_symbolizer()
-    : symbolizer_with_image(boost::shared_ptr<ImageData32>(new ImageData32(4,4))),
-      opacity_(1.0),
-      overlap_(false)
-          
-{
-    //default point symbol is black 4x4px square
-    image_->set(0xff000000);
-}
-    
-point_symbolizer::point_symbolizer(std::string const& file,
-				   std::string const& type,
-				   unsigned width,unsigned height) 
-    : symbolizer_with_image(file, type, width, height),
-      opacity_(1.0),      
-      overlap_(false)
-          
-{ }
+    : symbolizer_with_image(path_expression_ptr(new path_expression)), // FIXME
+      symbolizer_base(),
+      overlap_(false),
+      point_p_(CENTROID_POINT_PLACEMENT),
+      ignore_placement_(false) {}
     
+point_symbolizer::point_symbolizer(path_expression_ptr file) 
+    : symbolizer_with_image(file),
+      symbolizer_base(),
+      overlap_(false),
+      point_p_(CENTROID_POINT_PLACEMENT),
+      ignore_placement_(false) {}
+
 point_symbolizer::point_symbolizer(point_symbolizer const& rhs)
     : symbolizer_with_image(rhs),
-      opacity_(rhs.opacity_),
-      overlap_(rhs.overlap_)
-{}
-    
+      symbolizer_base(rhs),
+      overlap_(rhs.overlap_),
+      point_p_(rhs.point_p_),
+      ignore_placement_(rhs.ignore_placement_) {}
+
 void point_symbolizer::set_allow_overlap(bool overlap)
 {
     overlap_ = overlap;
@@ -68,14 +67,24 @@ bool point_symbolizer::get_allow_overlap() const
     return overlap_;
 }
 
-void point_symbolizer::set_opacity(float opacity)
+void point_symbolizer::set_point_placement(point_placement_e point_p)
+{
+    point_p_ = point_p;
+}
+
+point_placement_e point_symbolizer::get_point_placement() const
 {
-    opacity_ = opacity;
+    return point_p_;
 }
 
-float point_symbolizer::get_opacity() const
+void point_symbolizer::set_ignore_placement(bool ignore_placement)
+{
+    ignore_placement_ = ignore_placement;
+}
+    
+bool point_symbolizer::get_ignore_placement() const
 {
-    return opacity_;
+    return ignore_placement_;
 }
 
 }
diff --git a/src/polygon_pattern_symbolizer.cpp b/src/polygon_pattern_symbolizer.cpp
index 237fa6d..4519670 100644
--- a/src/polygon_pattern_symbolizer.cpp
+++ b/src/polygon_pattern_symbolizer.cpp
@@ -20,23 +20,50 @@
  *
  *****************************************************************************/
 //$Id$
+
 // mapnik
 #include <mapnik/polygon_pattern_symbolizer.hpp>
 
-#include <mapnik/image_reader.hpp>
-// stl
-#include <iostream>
-
 namespace mapnik
 {
-    polygon_pattern_symbolizer::polygon_pattern_symbolizer(std::string const& file,
-                                                           std::string const& type,
-                                                           unsigned width,unsigned height) 
-        : symbolizer_with_image( file, type, width, height )
-    {
-    }
-    polygon_pattern_symbolizer::polygon_pattern_symbolizer(polygon_pattern_symbolizer const& rhs)
-        : symbolizer_with_image(rhs) {}
     
+static const char * pattern_alignment_strings[] = {
+    "local", // feature
+    "global", // map
+    ""
+};
+
+IMPLEMENT_ENUM( pattern_alignment_e, pattern_alignment_strings )
+      
+polygon_pattern_symbolizer::polygon_pattern_symbolizer(path_expression_ptr file)                                                         
+    : symbolizer_with_image(file), symbolizer_base(),
+      alignment_(LOCAL_ALIGNMENT),
+      gamma_(1.0) {}
+
+polygon_pattern_symbolizer::polygon_pattern_symbolizer(polygon_pattern_symbolizer const& rhs)
+    : symbolizer_with_image(rhs), symbolizer_base(rhs),
+      alignment_(rhs.alignment_),
+      gamma_(rhs.gamma_) {}
+
+pattern_alignment_e polygon_pattern_symbolizer::get_alignment() const
+{
+    return alignment_;
+}
+
+void polygon_pattern_symbolizer::set_alignment(pattern_alignment_e align)
+{
+    alignment_ = align;
+}
+
+double polygon_pattern_symbolizer::get_gamma() const
+{
+    return gamma_;
+}
+
+void polygon_pattern_symbolizer::set_gamma(double gamma)
+{
+    gamma_ = gamma;
+}
+
 }
 
diff --git a/src/proj_transform.cpp b/src/proj_transform.cpp
index 26c32b0..9921fde 100644
--- a/src/proj_transform.cpp
+++ b/src/proj_transform.cpp
@@ -24,90 +24,302 @@
 
 // mapnik
 #include <mapnik/proj_transform.hpp>
+#include <mapnik/coord.hpp> 
 #include <mapnik/utils.hpp>
+
 // proj4
 #include <proj_api.h>
 
+// stl
+#include <vector>
+
+static const float MAXEXTENT = 20037508.34;
+static const float M_PI_by2 = M_PI / 2;
+static const float D2R = M_PI / 180;
+static const float R2D = 180 / M_PI;
+static const float M_PIby360 = M_PI / 360;
+static const float MAXEXTENTby180 = MAXEXTENT/180;
+
 namespace mapnik {
     
-    proj_transform::proj_transform(projection const& source, 
-                                   projection const& dest)
-            : source_(source),
-              dest_(dest) 
+proj_transform::proj_transform(projection const& source, 
+                               projection const& dest)
+    : source_(source),
+      dest_(dest)
+{
+    is_source_longlat_ = source_.is_geographic();
+    is_dest_longlat_ = dest_.is_geographic();
+    is_source_equal_dest_ = (source_ == dest_);
+    if (source.params() == "+init=epsg:3857" && dest.params() == "+init=epsg:4326")
     {
-#ifdef MAPNIK_THREADSAFE
-        mutex::scoped_lock lock(projection::mutex_);
-#endif
-        is_source_latlong_ = pj_is_latlong(source_.proj_) ? true : false;
-        is_dest_latlong_ = pj_is_latlong(dest_.proj_) ? true : false ;
-        is_source_equal_dest = (source_ == dest_);
+        wgs84_to_merc_ = true;
+    }
+    else
+    {
+        wgs84_to_merc_ = false;
+    }
+}
+
+bool proj_transform::equal() const
+{
+    return is_source_equal_dest_;
+}
+
+
+bool proj_transform::forward (double & x, double & y , double & z) const
+{
+    return forward(&x, &y, &z, 1);
+}
+
+bool proj_transform::forward (double * x, double * y , double * z, int point_count) const
+{
+
+    if (is_source_equal_dest_)
+        return true;
+
+    if (wgs84_to_merc_) {
+        int i;
+        for(i=0; i<point_count; i++) {
+            x[i] = (x[i] / MAXEXTENT) * 180;
+            y[i] = (y[i] / MAXEXTENT) * 180;
+            y[i] = R2D * (2 * atan(exp(y[i] * D2R)) - M_PI_by2);
+            if (x[i] > 180) x[i] = 180;
+            if (x[i] < -180) x[i] = -180;
+            if (y[i] > 85.0511) y[i] = 85.0511;
+            if (y[i] < -85.0511) y[i] = -85.0511;
+        }
+        return true;
     }
     
-    bool proj_transform::forward (double & x, double & y , double & z) const
+        if (is_source_longlat_)
     {
-#ifdef MAPNIK_THREADSAFE
+        int i;
+        for(i=0; i<point_count; i++) {
+            x[i] *= DEG_TO_RAD;
+            y[i] *= DEG_TO_RAD;
+        }
+    }
+
+    do {
+#if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480
         mutex::scoped_lock lock(projection::mutex_);
 #endif
-        if (is_source_equal_dest)
-            return true;
-
-        if (is_source_latlong_)
-        {
-            x *= DEG_TO_RAD;
-            y *= DEG_TO_RAD;
-        }
-        
-        if (pj_transform( source_.proj_, dest_.proj_, 1, 
-                          0, &x,&y,&z) != 0)
+        if (pj_transform( source_.proj_, dest_.proj_, point_count, 
+                          0, x,y,z) != 0)
         {
             return false;
         }
-        
-        if (is_dest_latlong_)
-        {
-            x *= RAD_TO_DEG;
-            y *= RAD_TO_DEG;
+    } while(false);
+
+    if (is_dest_longlat_)
+    {
+        int i;
+        for(i=0; i<point_count; i++) {
+            x[i] *= RAD_TO_DEG;
+            y[i] *= RAD_TO_DEG;
+        }
+    }
+
+    return true;
+}
+
+bool proj_transform::backward (double * x, double * y , double * z, int point_count) const
+{
+    if (is_source_equal_dest_)
+        return true;
+
+    if (wgs84_to_merc_) {
+        int i;
+        for(i=0; i<point_count; i++) {
+            x[i] = x[i] * MAXEXTENTby180;
+            y[i] = log(tan((90 + y[i]) * M_PIby360)) / D2R;
+            y[i] = y[i] * MAXEXTENTby180;
+            if (x[i] > MAXEXTENT) x[i] = MAXEXTENT;
+            if (x[i] < -MAXEXTENT) x[i] = -MAXEXTENT;
+            if (y[i] > MAXEXTENT) y[i] = MAXEXTENT;
+            if (y[i] < -MAXEXTENT) y[i] = -MAXEXTENT;
         }
-        
         return true;
-    } 
-        
-    bool proj_transform::backward (double & x, double & y , double & z) const
+    }
+
+    if (is_dest_longlat_)
     {
-#ifdef MAPNIK_THREADSAFE
+        int i;
+        for(i=0; i<point_count; i++) {
+            x[i] *= DEG_TO_RAD;
+            y[i] *= DEG_TO_RAD;
+        }
+    }
+
+    do {
+#if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480
         mutex::scoped_lock lock(projection::mutex_);
 #endif
-        if (is_source_equal_dest)
-            return true;
-      
-        if (is_dest_latlong_)
-        {
-            x *= DEG_TO_RAD;
-            y *= DEG_TO_RAD;
-        }
-        
-        if (pj_transform( dest_.proj_, source_.proj_, 1, 
-                          0, &x,&y,&z) != 0)
+
+        if (pj_transform( dest_.proj_, source_.proj_, point_count, 
+                          0, x,y,z) != 0)
         {
             return false;
         }
-        
-        if (is_source_latlong_)
-        {
-            x *= RAD_TO_DEG;
-            y *= RAD_TO_DEG;
+    } while(false);
+
+    if (is_source_longlat_)
+    {
+        int i;
+        for(i=0; i<point_count; i++) {
+            x[i] *= RAD_TO_DEG;
+            y[i] *= RAD_TO_DEG;
         }
-        
+    }
+
+    return true;
+}
+
+bool proj_transform::backward (double & x, double & y , double & z) const
+{
+    return backward(&x, &y, &z, 1);
+}
+
+
+bool proj_transform::forward (box2d<double> & box) const
+{
+    if (is_source_equal_dest_)
+        return true;
+
+    double minx = box.minx();
+    double miny = box.miny();
+    double maxx = box.maxx();
+    double maxy = box.maxy();
+    double z = 0.0;
+    if (!forward(minx,miny,z))
+        return false;
+    if (!forward(maxx,maxy,z))
+        return false;
+    box.init(minx,miny,maxx,maxy);
+    return true;
+} 
+
+bool proj_transform::backward (box2d<double> & box) const
+{
+    if (is_source_equal_dest_)
         return true;
+
+    double minx = box.minx();
+    double miny = box.miny();
+    double maxx = box.maxx();
+    double maxy = box.maxy();
+    double z = 0.0;
+    if (!backward(minx,miny,z))
+        return false;
+    if (!backward(maxx,maxy,z))
+        return false;
+    box.init(minx,miny,maxx,maxy);
+    return true;
+}
+
+void envelope_points(std::vector< coord<double,2> > & coords, box2d<double>& env, int points)
+{
+    double width = env.width();
+    double height = env.height();
+    
+    int steps;
+    
+    if (points <= 4) {
+        steps = 0;
+    } else {
+        steps = static_cast<int>(ceil((points - 4) / 4.0));
     }
+    
+    steps += 1;
+    double xstep = width / steps;
+    double ystep = height / steps;
+    
+    for (int i=0; i<=steps; i++) {
+        coords.push_back(coord<double,2>(env.minx() + i * xstep, env.miny()));
+        coords.push_back(coord<double,2>(env.minx() + i * xstep, env.maxy()));
 
-    mapnik::projection const& proj_transform::source() const
-    {
-        return source_;
     }
-    mapnik::projection const& proj_transform::dest() const
-    {
-        return dest_;
+    for (int i=1; i<steps; i++) {
+        coords.push_back(coord<double,2>(env.minx(), env.miny() + i * ystep));
+        coords.push_back(coord<double,2>(env.maxx(), env.miny() + i * ystep));
+    }
+}
+
+box2d<double> calculate_bbox(std::vector<coord<double,2> > & points) {
+    std::vector<coord<double,2> >::iterator it = points.begin();
+    std::vector<coord<double,2> >::iterator it_end = points.end();
+    
+    box2d<double> env(*it, *(++it));
+    for (; it!=it_end; ++it) {
+        env.expand_to_include(*it);
+    }
+    return env;
+}
+
+
+/* More robust, but expensive, bbox transform
+ * in the face of proj4 out of bounds conditions.
+ * Can result in 20 -> 10 r/s performance hit.
+ * Alternative is to provide proper clipping box
+ * in the target srs by setting map 'maximum-extent' 
+ */
+bool proj_transform::backward(box2d<double>& env, int points) const
+{
+    if (is_source_equal_dest_)
+        return true;
+    
+    std::vector<coord<double,2> > coords;
+    envelope_points(coords, env, points);
+    
+    double z;
+    for (std::vector<coord<double,2> >::iterator it = coords.begin(); it!=coords.end(); ++it) {
+        z = 0;
+        if (!backward(it->x, it->y, z)) {
+            return false;
+        }
+    }
+
+    box2d<double> result = calculate_bbox(coords);
+    
+    env.re_center(result.center().x, result.center().y);
+    env.height(result.height());
+    env.width(result.width());
+
+    return true;
+}
+
+bool proj_transform::forward(box2d<double>& env, int points) const
+{
+    if (is_source_equal_dest_)
+        return true;
+    
+    std::vector<coord<double,2> > coords;
+    envelope_points(coords, env, points);
+    
+    double z;
+    for (std::vector<coord<double,2> >::iterator it = coords.begin(); it!=coords.end(); ++it) {
+        z = 0;
+        if (!forward(it->x, it->y, z)) {
+            return false;
+        }
     }
+
+    box2d<double> result = calculate_bbox(coords);
+    
+    env.re_center(result.center().x, result.center().y);
+    env.height(result.height());
+    env.width(result.width());
+
+    return true;
+}
+
+mapnik::projection const& proj_transform::source() const
+{
+    return source_;
+}
+mapnik::projection const& proj_transform::dest() const
+{
+    return dest_;
+}
  
 }
diff --git a/src/projection.cpp b/src/projection.cpp
index a9ecc1a..c6a74f3 100644
--- a/src/projection.cpp
+++ b/src/projection.cpp
@@ -25,118 +25,138 @@
 // mapnik
 #include <mapnik/projection.hpp>
 #include <mapnik/utils.hpp>
+
+// boost
+#include <boost/algorithm/string.hpp>
+
 // proj4
 #include <proj_api.h>
 
 namespace mapnik {
 
-#ifdef MAPNIK_THREADSAFE
-    boost::mutex projection::mutex_;
+#if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480
+boost::mutex projection::mutex_;
 #endif
    
-    projection::projection(std::string  params)
-        : params_(params)
-    { 
-        init(); //
-    }
+projection::projection(std::string const& params)
+    : params_(params)
+{ 
+    init(); //
+}
     
-    projection::projection(projection const& rhs)
-        : params_(rhs.params_) 
-    {
-        init(); //
-    }
+projection::projection(projection const& rhs)
+    : params_(rhs.params_) 
+{
+    init(); //
+}
         
-    projection& projection::operator=(projection const& rhs) 
-    { 
-        projection tmp(rhs);
-        swap(tmp);
-        return *this;
-    }
+projection& projection::operator=(projection const& rhs) 
+{ 
+    projection tmp(rhs);
+    swap(tmp);
+    return *this;
+}
     
-    bool projection::operator==(const projection& other) const 
-    {
-        return (params_ == other.params_);
-    }
+bool projection::operator==(const projection& other) const 
+{
+    return (params_ == other.params_);
+}
     
-    bool projection::operator!=(const projection& other) const 
-    {
-        return !(*this == other);
-    }
+bool projection::operator!=(const projection& other) const 
+{
+    return !(*this == other);
+}
     
-    bool projection::is_initialized() const
-    {
-        return proj_ ? true : false;
-    }
+bool projection::is_initialized() const
+{
+    return proj_ ? true : false;
+}
     
-    bool projection::is_geographic() const
-    {
-#ifdef MAPNIK_THREADSAFE
-        mutex::scoped_lock lock(mutex_);
-#endif
-        return pj_is_latlong(proj_) ? true : false;  
-    }
+bool projection::is_geographic() const
+{
+    return is_geographic_;
+}
     
-    std::string const& projection::params() const
-    {
-        return params_;
-    }
+std::string const& projection::params() const
+{
+    return params_;
+}
     
-    void projection::forward(double & x, double &y ) const
-    {
-#ifdef MAPNIK_THREADSAFE
-        mutex::scoped_lock lock(mutex_);
+void projection::forward(double & x, double &y ) const
+{
+#if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480
+    mutex::scoped_lock lock(mutex_);
 #endif
-        projUV p;
-        p.u = x * DEG_TO_RAD;
-        p.v = y * DEG_TO_RAD;
-        p = pj_fwd(p,proj_);
-        x = p.u;
-        y = p.v;
-        if (pj_is_latlong(proj_))
-        {
-           x *=RAD_TO_DEG;
-           y *=RAD_TO_DEG;
-        }           
-    }
-    
-    void projection::inverse(double & x,double & y) const
+    projUV p;
+    p.u = x * DEG_TO_RAD;
+    p.v = y * DEG_TO_RAD;
+    p = pj_fwd(p,proj_);
+    x = p.u;
+    y = p.v;
+    if (is_geographic_)
     {
-#ifdef MAPNIK_THREADSAFE
-       mutex::scoped_lock lock(mutex_);
-#endif
-       if (pj_is_latlong(proj_))
-       {
-          x *=DEG_TO_RAD;
-          y *=DEG_TO_RAD;
-       }  
-       projUV p;
-       p.u = x;
-       p.v = y;
-       p = pj_inv(p,proj_);
-       x = RAD_TO_DEG * p.u;
-       y = RAD_TO_DEG * p.v;
-    }
+        x *=RAD_TO_DEG;
+        y *=RAD_TO_DEG;
+    }           
+}
     
-    projection::~projection() 
+void projection::inverse(double & x,double & y) const
+{
+#if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480
+    mutex::scoped_lock lock(mutex_);
+#endif
+    if (is_geographic_)
     {
-#ifdef MAPNIK_THREADSAFE
-       mutex::scoped_lock lock(mutex_);
+        x *=DEG_TO_RAD;
+        y *=DEG_TO_RAD;
+    }  
+    projUV p;
+    p.u = x;
+    p.v = y;
+    p = pj_inv(p,proj_);
+    x = RAD_TO_DEG * p.u;
+    y = RAD_TO_DEG * p.v;
+}
+    
+projection::~projection() 
+{
+#if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480
+    mutex::scoped_lock lock(mutex_);
 #endif
-       if (proj_) pj_free(proj_);
-    }
+    if (proj_) pj_free(proj_);
+#if PJ_VERSION >= 480
+    if (proj_ctx_) pj_ctx_free(proj_ctx_);
+#endif
+}
     
-    void projection::init()
-    {
-#ifdef MAPNIK_THREADSAFE
-       mutex::scoped_lock lock(mutex_);
+void projection::init()
+{
+#if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480
+    mutex::scoped_lock lock(mutex_);
+#endif
+#if PJ_VERSION >= 480
+    proj_ctx_=pj_ctx_alloc();
+    proj_=pj_init_plus_ctx(proj_ctx_, params_.c_str());
+#else
+    proj_=pj_init_plus(params_.c_str());
 #endif
-       proj_=pj_init_plus(params_.c_str());
-       if (!proj_) throw proj_init_error(params_);
+    if (!proj_) throw proj_init_error(params_);
+    is_geographic_ = pj_is_latlong(proj_) ? true : false;
+}
+
+std::string projection::expanded() const
+{
+    if (proj_) {
+        std::string def(pj_get_def( proj_, 0 ));
+        //boost::algorithm::ireplace_first(def,params_,"");
+        return boost::trim_copy(def);
     }
+    return std::string("");
+}
     
-    void projection::swap (projection& rhs)
-    {
-        std::swap(params_,rhs.params_);
-        init ();
-    }
+void projection::swap (projection& rhs)
+{
+    std::swap(params_,rhs.params_);
+    init ();
+}
 }
diff --git a/src/raster_colorizer.cpp b/src/raster_colorizer.cpp
new file mode 100644
index 0000000..8b58e8e
--- /dev/null
+++ b/src/raster_colorizer.cpp
@@ -0,0 +1,259 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id:  $
+
+#include <mapnik/raster_colorizer.hpp>
+#include <limits>
+
+namespace mapnik
+{
+
+//! \brief Strings for the colorizer_mode enumeration
+static const char *colorizer_mode_strings[] = {
+    "inherit",
+    "linear",
+    "discrete",
+    "exact",
+    ""
+};
+
+IMPLEMENT_ENUM( colorizer_mode, colorizer_mode_strings )
+
+
+colorizer_stop::colorizer_stop(const float value/* = 0*/, const colorizer_mode mode/* = COLORIZER_INHERIT*/, const color& _color/* = color(0,0,0,0)*/, const std::string& label/* ) ""*/)
+    : value_(value)
+    , mode_(mode)
+    , color_(_color)
+    , label_(label)
+{
+    
+}
+
+colorizer_stop::colorizer_stop(const colorizer_stop& stop)
+    : value_(stop.value_)
+    , mode_(stop.mode_)
+    , color_(stop.color_)
+    , label_(stop.label_)
+{
+}
+
+
+colorizer_stop::~colorizer_stop()
+{
+    
+}
+
+
+bool colorizer_stop::operator==(colorizer_stop const& other) const
+{
+    return  (value_ == other.value_) && 
+            (color_ == other.color_) &&
+            (mode_ == other.mode_);
+            (label_ == other.label_);
+}
+
+
+std::string colorizer_stop::to_string() const
+{
+    std::stringstream ss;
+    ss << color_.to_string() << " " << value_ << " " << mode_.as_string();
+    return ss.str();
+}    
+
+
+
+
+
+raster_colorizer::raster_colorizer(colorizer_mode mode/* = COLORIZER_LINEAR*/, const color& _color/* = color(0,0,0,0)*/)
+    : default_mode_(mode)
+    , default_color_(_color)
+    , epsilon_(std::numeric_limits<float>::epsilon())
+{
+    
+}
+
+raster_colorizer::~raster_colorizer()
+{
+}
+
+bool raster_colorizer::add_stop(const colorizer_stop & stop) {
+    //make sure stops are added in order of value
+    if(stops_.size()) {
+        if(stop.get_value() <= stops_.back().get_value()) {
+            return false;
+        }
+    }
+    
+    stops_.push_back(stop);
+
+    return true;
+}
+
+void raster_colorizer::colorize(raster_ptr const& raster,const std::map<std::string,value> &Props) const
+{
+    unsigned *imageData = raster->data_.getData();
+    
+    int len = raster->data_.width() * raster->data_.height();
+    
+    bool hasNoData = false;
+    float noDataValue = 0;
+
+    if (Props.count("NODATA")>0)
+    {
+        hasNoData = true;
+        noDataValue = Props.at("NODATA").to_double();
+    }
+
+    for (int i=0; i<len; ++i)
+    {
+        // the GDAL plugin reads single bands as floats
+        float value = *reinterpret_cast<float *> (&imageData[i]);
+        if (hasNoData && noDataValue == value)
+            imageData[i] = color(0,0,0,0).rgba();
+        else
+            imageData[i] = get_color(value).rgba();
+    }
+}
+
+inline float interpolate(float start,float end, float fraction)
+{
+    return fraction * (end - start) + start;
+}
+
+color raster_colorizer::get_color(float value) const {
+    int stopCount = stops_.size();
+    
+    //use default color if no stops
+    if(stopCount == 0) {
+        return default_color_;
+    }
+    
+    //1 - Find the stop that the value is in
+    int stopIdx = -1;
+    bool foundStopIdx = false;
+    
+    for(int i=0; i<stopCount; i++) {
+        if(value < stops_[i].get_value()) {
+            stopIdx = i-1;
+            foundStopIdx = true;
+            break;
+        }
+    }
+    if(!foundStopIdx) {
+        stopIdx = stopCount-1;
+    }
+    
+    //2 - Find the next stop
+    int nextStopIdx = stopIdx + 1;
+    if(nextStopIdx >= stopCount) {      //there is no next stop
+        nextStopIdx = stopCount - 1;
+    }
+    
+    //3 - Work out the mode
+    colorizer_mode stopMode;
+    if( stopIdx == -1 ) {       //before the first stop
+        stopMode = default_mode_;
+    }
+    else {
+        stopMode = stops_[stopIdx].get_mode();
+        if(stopMode == COLORIZER_INHERIT) {
+            stopMode = default_mode_;
+        }
+    }
+    
+    //4 - Calculate the colour
+    color stopColor;
+    color nextStopColor;
+    float stopValue = 0;
+    float nextStopValue = 0;
+    color outputColor = get_default_color();
+    if(stopIdx == -1) {
+        stopColor = default_color_;
+        nextStopColor = stops_[nextStopIdx].get_color();
+        stopValue = value;
+        nextStopValue = stops_[nextStopIdx].get_value();
+    }
+    else {
+        stopColor = stops_[stopIdx].get_color();
+        nextStopColor = stops_[nextStopIdx].get_color();
+        stopValue = stops_[stopIdx].get_value();
+        nextStopValue = stops_[nextStopIdx].get_value();
+    }
+    
+    switch(stopMode) {
+    case COLORIZER_LINEAR:
+        {
+            //deal with this separately so we don't have to worry about div0
+            if(nextStopValue == stopValue) {
+                outputColor = stopColor;
+            }
+            else {
+                float fraction = (value - stopValue) / (nextStopValue - stopValue);
+                
+                float r = interpolate(stopColor.red(), nextStopColor.red(),fraction);
+                float g = interpolate(stopColor.green(), nextStopColor.green(),fraction);
+                float b = interpolate(stopColor.blue(), nextStopColor.blue(),fraction);
+                float a = interpolate(stopColor.alpha(), nextStopColor.alpha(),fraction);
+                
+                outputColor.set_red(r);
+                outputColor.set_green(g);
+                outputColor.set_blue(b);
+                outputColor.set_alpha(a);
+            }
+            
+        }
+        break;
+    case COLORIZER_DISCRETE:
+        outputColor = stopColor;
+        break;
+    case COLORIZER_EXACT:
+    default:
+        //approximately equal (within epsilon)
+        if(fabs(value - stopValue) < epsilon_) {
+            outputColor = stopColor;
+        }
+        else {
+            outputColor = default_color_;
+        }
+        break;
+    }
+    
+
+    /*
+    std::clog << "get_color: " << value << "\n";
+    std::clog << "\tstopIdx: " << stopIdx << "\n";
+    std::clog << "\tnextStopIdx: " << nextStopIdx << "\n";
+    std::clog << "\tstopValue: " << stopValue << "\n";
+    std::clog << "\tnextStopValue: " << nextStopValue << "\n";
+    std::clog << "\tstopColor: " << stopColor.to_string() << "\n";
+    std::clog << "\tnextStopColor: " << nextStopColor.to_string() << "\n";
+    std::clog << "\tstopMode: " << stopMode.as_string() << "\n";
+    std::clog << "\toutputColor: " << outputColor.to_string() << "\n";
+*/
+
+    return outputColor;
+}
+
+
+}
+
diff --git a/src/save_map.cpp b/src/save_map.cpp
index 8d8f756..0e885c9 100644
--- a/src/save_map.cpp
+++ b/src/save_map.cpp
@@ -20,15 +20,17 @@
  *
  *****************************************************************************/
 // $Id$
+
 // mapnik
 #include <mapnik/save_map.hpp>
-#include <mapnik/image_util.hpp>
+#include <mapnik/map.hpp>
 #include <mapnik/ptree_helpers.hpp>
+#include <mapnik/expression_string.hpp>
+#include <mapnik/raster_colorizer.hpp>
+#include <mapnik/metawriter_factory.hpp>
 
 // boost
 #include <boost/algorithm/string.hpp>
-#include <boost/lexical_cast.hpp>
-#include <boost/tokenizer.hpp>
 #include <boost/optional.hpp>
 #include <boost/property_tree/ptree.hpp>
 #include <boost/property_tree/xml_parser.hpp>
@@ -38,559 +40,901 @@
 
 namespace mapnik
 {
-    using boost::property_tree::ptree;
-    using boost::optional;
-
-    class serialize_symbolizer : public boost::static_visitor<>
-    {
-        public:
-            serialize_symbolizer( ptree & r , bool explicit_defaults):
-            rule_(r),
-            explicit_defaults_(explicit_defaults) {}
-
-            void operator () ( const  point_symbolizer & sym )
-            {
-                ptree & sym_node = rule_.push_back(
-                        ptree::value_type("PointSymbolizer", ptree()))->second;
-
-                add_image_attributes( sym_node, sym );
-
-                point_symbolizer dfl;
-                if (sym.get_allow_overlap() != dfl.get_allow_overlap() || explicit_defaults_ )
-                {
-                    set_attr( sym_node, "allow_overlap", sym.get_allow_overlap() );
-                }
-                if ( sym.get_opacity() != dfl.get_opacity() || explicit_defaults_ )
-                {
-                    set_attr( sym_node, "opacity", sym.get_opacity() );
-                }
-            }
-
-            void operator () ( const line_symbolizer & sym )
-            {
-                ptree & sym_node = rule_.push_back(
-                        ptree::value_type("LineSymbolizer", ptree()))->second;
-                const stroke & strk = sym.get_stroke();
-                stroke dfl = stroke();
-
-                if ( strk.get_color() != dfl.get_color() || explicit_defaults_ )
-                {
-                    set_css( sym_node, "stroke", strk.get_color() );
-                }
-                if ( strk.get_width() != dfl.get_width() || explicit_defaults_ )
-                {
-                    set_css( sym_node, "stroke-width", strk.get_width() );
-                }
-                if ( strk.get_opacity() != dfl.get_opacity() || explicit_defaults_ )
-                {
-                    set_css( sym_node, "stroke-opacity", strk.get_opacity() );
-                }
-                if ( strk.get_line_join() != dfl.get_line_join() || explicit_defaults_ )
-                {
-                    set_css( sym_node, "stroke-linejoin", strk.get_line_join() );
-                }
-                if ( strk.get_line_cap() != dfl.get_line_cap() || explicit_defaults_ )
-                {
-                    set_css( sym_node, "stroke-linecap", strk.get_line_cap() );
-                }
-                if ( ! strk.get_dash_array().empty() )
-                {
-                    std::ostringstream os;
-                    const dash_array & dashes = strk.get_dash_array();
-                    for (unsigned i = 0; i < dashes.size(); ++i) {
-                        os << dashes[i].first << ", " << dashes[i].second;
-                        if ( i + 1 < dashes.size() ) os << ", ";
-                    }
-                    set_css( sym_node, "stroke-dasharray", os.str() );
-                }
-            }
-
-            void operator () ( const line_pattern_symbolizer & sym )
-            {
-                ptree & sym_node = rule_.push_back(
-                        ptree::value_type("LinePatternSymbolizer",
-                        ptree()))->second;
+using boost::property_tree::ptree;
+using boost::optional;
 
-                add_image_attributes( sym_node, sym );
-            }
 
-            void operator () ( const polygon_symbolizer & sym )
-            {
-                ptree & sym_node = rule_.push_back(
-                        ptree::value_type("PolygonSymbolizer", ptree()))->second;
-                polygon_symbolizer dfl;
-
-                if ( sym.get_fill() != dfl.get_fill() || explicit_defaults_ )
-                {
-                    set_css( sym_node, "fill", sym.get_fill() );
-                }
-                if ( sym.get_opacity() != dfl.get_opacity() || explicit_defaults_ )
-                {
-                    set_css( sym_node, "fill-opacity", sym.get_opacity() );
-                }
-                if ( sym.get_gamma() != dfl.get_gamma() || explicit_defaults_ )
-                {
-                    set_css( sym_node, "gamma", sym.get_gamma() );
-                }
-            }
+class serialize_symbolizer : public boost::static_visitor<>
+{
+public:
+    serialize_symbolizer( ptree & r , bool explicit_defaults):
+        rule_(r),
+        explicit_defaults_(explicit_defaults) {}
 
-            void operator () ( const polygon_pattern_symbolizer & sym )
-            {
-                ptree & sym_node = rule_.push_back(
-                        ptree::value_type("PolygonPatternSymbolizer",
-                        ptree()))->second;
+    void operator () ( const  point_symbolizer & sym )
+    {
+        ptree & sym_node = rule_.push_back(
+            ptree::value_type("PointSymbolizer", ptree()))->second;
 
-                add_image_attributes( sym_node, sym );
-            }
+        add_image_attributes( sym_node, sym );
 
-            void operator () ( const raster_symbolizer & sym )
-            {
-                ptree & sym_node = rule_.push_back(
-                        ptree::value_type("RasterSymbolizer", ptree()))->second;
-                raster_symbolizer dfl;
-
-                if ( sym.get_mode() != dfl.get_mode() || explicit_defaults_ )
-                {
-                    set_css( sym_node, "mode", sym.get_mode() );
-                }
-                if ( sym.get_scaling() != dfl.get_scaling() || explicit_defaults_ )
-                {
-                    set_css( sym_node, "scaling", sym.get_scaling() );
-                }
-                if ( sym.get_opacity() != dfl.get_opacity() || explicit_defaults_ )
-                {
-                    set_css( sym_node, "opacity", sym.get_opacity() );
-                }
-            }
+        point_symbolizer dfl;
+        if (sym.get_allow_overlap() != dfl.get_allow_overlap() || explicit_defaults_ )
+        {
+            set_attr( sym_node, "allow-overlap", sym.get_allow_overlap() );
+        }
+        if ( sym.get_opacity() != dfl.get_opacity() || explicit_defaults_ )
+        {
+            set_attr( sym_node, "opacity", sym.get_opacity() );
+        }
+        if ( sym.get_point_placement() != dfl.get_point_placement() || explicit_defaults_ )
+        {
+            set_attr( sym_node, "placement", sym.get_point_placement() );
+        }
+        add_metawriter_attributes(sym_node, sym);
+    }
 
-            void operator () ( const shield_symbolizer & sym )
-            {
-                ptree & sym_node = rule_.push_back(
-                        ptree::value_type("ShieldSymbolizer",
-                        ptree()))->second;
-
-                add_font_attributes( sym_node, sym);
-                add_image_attributes( sym_node, sym);
-
-                // pseudo-default-construct a shield_symbolizer. It is used
-                // to avoid printing of attributes with default values without
-                // repeating the default values here.
-                // maybe add a real, explicit default-ctor?
-                shield_symbolizer sym_dfl("<no default>", "<no default>", 0, color(0,0,0), "<no default>", "<no default>", 0, 0 );
-                if (sym.get_unlock_image() != sym_dfl.get_unlock_image() || explicit_defaults_ )
-                {
-                    set_attr( sym_node, "unlock_image", sym.get_unlock_image() );
-                }
-                if (sym.get_no_text() != sym_dfl.get_no_text() || explicit_defaults_ )
-                {
-                    set_attr( sym_node, "no_text", sym.get_no_text() );
-                }
-            }
+    void operator () ( const line_symbolizer & sym )
+    {
+        ptree & sym_node = rule_.push_back(
+            ptree::value_type("LineSymbolizer", ptree()))->second;
 
-            void operator () ( const text_symbolizer & sym )
-            {
-                ptree & sym_node = rule_.push_back(
-                        ptree::value_type("TextSymbolizer",
-                        ptree()))->second;
+        const stroke & strk =  sym.get_stroke();
+        add_stroke_attributes(sym_node, strk);
+        add_metawriter_attributes(sym_node, sym);
 
-                add_font_attributes( sym_node, sym);
+        line_symbolizer dfl;
+        if ( sym.get_rasterizer() != dfl.get_rasterizer() || explicit_defaults_ )
+        {
+            set_attr( sym_node, "rasterizer", sym.get_rasterizer() );
+        }
+    }
+        
+    void operator () ( const line_pattern_symbolizer & sym )
+    {
+        ptree & sym_node = rule_.push_back(
+            ptree::value_type("LinePatternSymbolizer",
+                              ptree()))->second;
 
-            }
+        add_image_attributes( sym_node, sym );
+        add_metawriter_attributes(sym_node, sym);
+    }
 
-            void operator () ( const building_symbolizer & sym )
-            {
-                ptree & sym_node = rule_.push_back(
-                        ptree::value_type("BuildingSymbolizer", ptree()))->second;
-                building_symbolizer dfl;
-
-                if ( sym.get_fill() != dfl.get_fill() || explicit_defaults_ )
-                {
-                    set_css( sym_node, "fill", sym.get_fill() );
-                }
-                if ( sym.get_opacity() != dfl.get_opacity() || explicit_defaults_ )
-                {
-                    set_css( sym_node, "fill-opacity", sym.get_opacity() );
-                }
-                if ( sym.height() != dfl.height() || explicit_defaults_ )
-                {
-                    set_css( sym_node, "height", sym.height() );
-                }
-            }
+    void operator () ( const polygon_symbolizer & sym )
+    {
+        ptree & sym_node = rule_.push_back(
+            ptree::value_type("PolygonSymbolizer", ptree()))->second;
+        polygon_symbolizer dfl;
 
-          void operator () ( markers_symbolizer const& )
-          {
-             // FIXME!!!!!
-          }
-        private:
-            serialize_symbolizer();
-            void add_image_attributes(ptree & node, const symbolizer_with_image & sym)
-            {
-                const std::string & filename = sym.get_filename();
-                if ( ! filename.empty() ) {
-                    set_attr( node, "file", filename );
-                    set_attr( node, "type", guess_type( filename ) );
-
-                    boost::shared_ptr<ImageData32> img = sym.get_image();
-                    if ( img )
-                    {
-                        if ( img->width() > 0)
-                        {
-                            set_attr( node, "width", img->width() );
-                        }
-                        if ( img->height() > 0)
-                        {
-                            set_attr( node, "height", img->height() );
-                        }
-                    }
-
-                }
-            }
-            void add_font_attributes(ptree & node, const text_symbolizer & sym)
-            {
-                const std::string & name = sym.get_name();
-                if ( ! name.empty() ) {
-                    set_attr( node, "name", name );
-                }
-                const std::string & face_name = sym.get_face_name();
-                if ( ! face_name.empty() ) {
-                    set_attr( node, "face_name", face_name );
-                }
-                const std::string & fontset_name = sym.get_fontset().get_name();
-                if ( ! fontset_name.empty() ) {
-                    set_attr( node, "fontset_name", fontset_name );
-                }
-
-                set_attr( node, "size", sym.get_text_size() );
-                set_attr( node, "fill", sym.get_fill() );
-
-                // pseudo-default-construct a text_symbolizer. It is used
-                // to avoid printing ofattributes with default values without
-                // repeating the default values here.
-                // maybe add a real, explicit default-ctor?
-                text_symbolizer dfl("<no default>", "<no default>",
-                                    0, color(0,0,0) );
-
-                position displacement = sym.get_displacement();
-                if ( displacement.get<0>() != dfl.get_displacement().get<0>() || explicit_defaults_ )
-                {
-                    set_attr( node, "dx", displacement.get<0>() );
-                }
-                if ( displacement.get<1>() != dfl.get_displacement().get<1>() || explicit_defaults_ )
-                {
-                    set_attr( node, "dy", displacement.get<1>() );
-                }
-
-                if (sym.get_label_placement() != dfl.get_label_placement() || explicit_defaults_ )
-                {
-                    set_attr( node, "placement", sym.get_label_placement() );
-                }
-
-                if (sym.get_vertical_alignment() != dfl.get_vertical_alignment() || explicit_defaults_ )
-                {
-                    set_attr( node, "vertical_alignment", sym.get_vertical_alignment() );
-                }
-
-                if (sym.get_halo_radius() != dfl.get_halo_radius() || explicit_defaults_ )
-                {
-                    set_attr( node, "halo_radius", sym.get_halo_radius() );
-                }
-                const color & c = sym.get_halo_fill();
-                if ( c != dfl.get_halo_fill() || explicit_defaults_ )
-                {
-                    set_attr( node, "halo_fill", c );
-                }
-                if (sym.get_text_ratio() != dfl.get_text_ratio() || explicit_defaults_ )
-                {
-                    set_attr( node, "text_ratio", sym.get_text_ratio() );
-                }
-                if (sym.get_wrap_width() != dfl.get_wrap_width() || explicit_defaults_ )
-                {
-                    set_attr( node, "wrap_width", sym.get_wrap_width() );
-                }
-                if (sym.get_wrap_before() != dfl.get_wrap_before() || explicit_defaults_ )
-                {
-                    set_attr( node, "wrap_before", sym.get_wrap_before() );
-                }
-                if (sym.get_wrap_char() != dfl.get_wrap_char() || explicit_defaults_ )
-                {
-                    set_attr( node, "wrap_character", std::string(1, sym.get_wrap_char()) );
-                }
-                if (sym.get_text_convert() != dfl.get_text_convert() || explicit_defaults_ )
-                {
-                    set_attr( node, "text_convert", sym.get_text_convert() );
-                }
-                if (sym.get_line_spacing() != dfl.get_line_spacing() || explicit_defaults_ )
-                {
-                    set_attr( node, "line_spacing", sym.get_line_spacing() );
-                }
-                if (sym.get_character_spacing() != dfl.get_character_spacing() || explicit_defaults_ )
-                {
-                    set_attr( node, "character_spacing", sym.get_character_spacing() );
-                }
-                if (sym.get_label_spacing() != dfl.get_label_spacing() || explicit_defaults_ )
-                {
-                    set_attr( node, "spacing", sym.get_label_spacing() );
-                }
-                if (sym.get_minimum_distance() != dfl.get_minimum_distance() || explicit_defaults_ )
-                {
-                    set_attr( node, "min_distance", sym.get_minimum_distance() );
-                }
-                if (sym.get_allow_overlap() != dfl.get_allow_overlap() || explicit_defaults_ )
-                {
-                    set_attr( node, "allow_overlap", sym.get_allow_overlap() );
-                }
-                if (sym.get_avoid_edges() != dfl.get_avoid_edges() || explicit_defaults_ )
-                {
-                    set_attr( node, "avoid_edges", sym.get_avoid_edges() );
-                }
-                if (sym.get_opacity() != dfl.get_opacity() || explicit_defaults_ )
-                {
-                    set_attr( node, "opacity", sym.get_opacity() );
-                }
-                if (sym.get_horizontal_alignment() != dfl.get_horizontal_alignment() || explicit_defaults_ )
-                {
-                    set_attr( node, "horizontal_alignment", sym.get_horizontal_alignment() );
-                }
-                if (sym.get_justify_alignment() != dfl.get_justify_alignment() || explicit_defaults_ )
-                {
-                    set_attr( node, "justify_alignment", sym.get_justify_alignment() );
-                }
-            }
-            ptree & rule_;
-            bool explicit_defaults_;
-    };
+        if ( sym.get_fill() != dfl.get_fill() || explicit_defaults_ )
+        {
+            set_attr( sym_node, "fill", sym.get_fill() );
+        }
+        if ( sym.get_opacity() != dfl.get_opacity() || explicit_defaults_ )
+        {
+            set_attr( sym_node, "fill-opacity", sym.get_opacity() );
+        }
+        if ( sym.get_gamma() != dfl.get_gamma() || explicit_defaults_ )
+        {
+            set_attr( sym_node, "gamma", sym.get_gamma() );
+        }
+        add_metawriter_attributes(sym_node, sym);
+    }
 
-    void serialize_rule( ptree & style_node, const rule_type & rule, bool explicit_defaults)
+    void operator () ( const polygon_pattern_symbolizer & sym )
     {
-        ptree & rule_node = style_node.push_back(
-                ptree::value_type("Rule", ptree() ))->second;
+        ptree & sym_node = rule_.push_back(
+            ptree::value_type("PolygonPatternSymbolizer",
+                              ptree()))->second;
+        polygon_pattern_symbolizer dfl(parse_path(""));
 
-        rule_type dfl;
-        if ( rule.get_name() != dfl.get_name() )
+        if ( sym.get_alignment() != dfl.get_alignment() || explicit_defaults_ )
         {
-            set_attr(rule_node, "name", rule.get_name());
+            set_attr( sym_node, "alignment", sym.get_alignment() );
         }
-        if ( rule.get_title() != dfl.get_title() )
+
+        if ( sym.get_gamma() != dfl.get_gamma() || explicit_defaults_ )
         {
-            set_attr(rule_node, "title", rule.get_title());
+            set_attr( sym_node, "gamma", sym.get_gamma() );
         }
 
-        if ( rule.has_else_filter() )
+        add_image_attributes( sym_node, sym );
+        add_metawriter_attributes(sym_node, sym);
+    }
+
+    void operator () ( const raster_symbolizer & sym )
+    {
+        ptree & sym_node = rule_.push_back(
+            ptree::value_type("RasterSymbolizer", ptree()))->second;
+        raster_symbolizer dfl;
+
+        if ( sym.get_mode() != dfl.get_mode() || explicit_defaults_ )
         {
-            rule_node.push_back( ptree::value_type(
-                    "ElseFilter", ptree()));
+            set_attr( sym_node, "mode", sym.get_mode() );
         }
-        else
+
+        if ( sym.get_scaling() != dfl.get_scaling() || explicit_defaults_ )
         {
-            // filters are not comparable, so compare strings for now
-            std::string filter = rule.get_filter()->to_string();
-            std::string default_filter = dfl.get_filter()->to_string();
-            if ( filter != default_filter)
-            {
-                rule_node.push_back( ptree::value_type(
-                            "Filter", ptree()))->second.put_own( filter );
-            }
+            set_attr( sym_node, "scaling", sym.get_scaling() );
         }
-
-        if (rule.get_min_scale() != dfl.get_min_scale() )
+        
+        if ( sym.get_opacity() != dfl.get_opacity() || explicit_defaults_ )
         {
-            ptree & min_scale = rule_node.push_back( ptree::value_type(
-                    "MinScaleDenominator", ptree()))->second;
-            min_scale.put_own( rule.get_min_scale() );
+            set_attr( sym_node, "opacity", sym.get_opacity() );
         }
 
-        if (rule.get_max_scale() != dfl.get_max_scale() )
+        if ( sym.get_mesh_size() != dfl.get_mesh_size() || explicit_defaults_ )
         {
-            ptree & max_scale = rule_node.push_back( ptree::value_type(
-                    "MaxScaleDenominator", ptree()))->second;
-            max_scale.put_own( rule.get_max_scale() );
+            set_attr( sym_node, "mesh-size", sym.get_mesh_size() );
         }
 
-        symbolizers::const_iterator begin = rule.get_symbolizers().begin();
-        symbolizers::const_iterator end = rule.get_symbolizers().end();
-        serialize_symbolizer serializer( rule_node, explicit_defaults);
-        std::for_each( begin, end , boost::apply_visitor( serializer ));
+        if (sym.get_colorizer()) {
+            serialize_raster_colorizer(sym_node, sym.get_colorizer(),
+                                       explicit_defaults_);
+        }
+        //Note: raster_symbolizer doesn't support metawriters
     }
 
-    void serialize_style( ptree & map_node, Map::const_style_iterator style_it, bool explicit_defaults )
+    void operator () ( const shield_symbolizer & sym )
     {
-        const feature_type_style & style = style_it->second;
-        const std::string & name = style_it->first;
+        ptree & sym_node = rule_.push_back(
+            ptree::value_type("ShieldSymbolizer",
+                              ptree()))->second;
 
-        ptree & style_node = map_node.push_back(
-                ptree::value_type("Style", ptree()))->second;
+        add_font_attributes( sym_node, sym);
+        add_image_attributes( sym_node, sym);
+        add_metawriter_attributes(sym_node, sym);
 
-        set_attr(style_node, "name", name);
+        // pseudo-default-construct a shield_symbolizer. It is used
+        // to avoid printing of attributes with default values without
+        // repeating the default values here.
+        // maybe add a real, explicit default-ctor?
 
-        rules::const_iterator it = style.get_rules().begin();
-        rules::const_iterator end = style.get_rules().end();
-        for (; it != end; ++it)
+        
+        shield_symbolizer dfl(expression_ptr(), "<no default>", 0, color(0,0,0), path_expression_ptr());
+        
+        if (sym.get_unlock_image() != dfl.get_unlock_image() || explicit_defaults_ )
+        {
+            set_attr( sym_node, "unlock-image", sym.get_unlock_image() );
+        }
+        if (sym.get_no_text() != dfl.get_no_text() || explicit_defaults_ )
         {
-            serialize_rule( style_node, * it , explicit_defaults);
+            set_attr( sym_node, "no-text", sym.get_no_text() );
+        }
+        if (sym.get_text_opacity() != dfl.get_text_opacity() || explicit_defaults_ )
+        {
+            set_attr( sym_node, "text-opacity", sym.get_text_opacity() );
+        }
+        position displacement = sym.get_shield_displacement();
+        if ( displacement.get<0>() != dfl.get_shield_displacement().get<0>() || explicit_defaults_ )
+        {
+            set_attr( sym_node, "shield-dx", displacement.get<0>() );
+        }
+        if ( displacement.get<1>() != dfl.get_shield_displacement().get<1>() || explicit_defaults_ )
+        {
+            set_attr( sym_node, "shield-dy", displacement.get<1>() );
         }
 
     }
 
-    void serialize_fontset( ptree & map_node, Map::const_fontset_iterator fontset_it )
+    void operator () ( const text_symbolizer & sym )
     {
-        const FontSet & fontset = fontset_it->second;
-        const std::string & name = fontset_it->first;
+        ptree & sym_node = rule_.push_back(
+            ptree::value_type("TextSymbolizer",
+                              ptree()))->second;
 
-        ptree & fontset_node = map_node.push_back(
-                ptree::value_type("FontSet", ptree()))->second;
+        add_font_attributes( sym_node, sym);
+        add_metawriter_attributes(sym_node, sym);
+    }
 
-        set_attr(fontset_node, "name", name);
+    void operator () ( const building_symbolizer & sym )
+    {
+        ptree & sym_node = rule_.push_back(
+            ptree::value_type("BuildingSymbolizer", ptree()))->second;
+        building_symbolizer dfl;
 
-        std::vector<std::string>::const_iterator it = fontset.get_face_names().begin();
-        std::vector<std::string>::const_iterator end = fontset.get_face_names().end();
-        for (; it != end; ++it)
+        if ( sym.get_fill() != dfl.get_fill() || explicit_defaults_ )
         {
-            ptree & font_node = fontset_node.push_back(
-                    ptree::value_type("Font", ptree()))->second;
-            set_attr(font_node, "face_name", *it);
+            set_attr( sym_node, "fill", sym.get_fill() );
         }
-
+        if ( sym.get_opacity() != dfl.get_opacity() || explicit_defaults_ )
+        {
+            set_attr( sym_node, "fill-opacity", sym.get_opacity() );
+        }
+        if ( sym.height() != dfl.height() || explicit_defaults_ )
+        {
+            set_attr( sym_node, "height", sym.height() );
+        }
+        add_metawriter_attributes(sym_node, sym);
     }
 
-    void serialize_datasource( ptree & layer_node, datasource_ptr datasource)
+    void operator () ( markers_symbolizer const& sym)
     {
-        ptree & datasource_node = layer_node.push_back(
-                ptree::value_type("Datasource", ptree()))->second;
-
-        parameters::const_iterator it = datasource->params().begin();
-        parameters::const_iterator end = datasource->params().end();
-        for (; it != end; ++it)
+        ptree & sym_node = rule_.push_back(
+            ptree::value_type("MarkersSymbolizer", ptree()))->second;
+        markers_symbolizer dfl(parse_path("")); //TODO: Parameter?
+        std::string const& filename = path_processor_type::to_string( *sym.get_filename());
+        if ( ! filename.empty() ) {
+            set_attr( sym_node, "file", filename );
+        }
+        if (sym.get_allow_overlap() != dfl.get_allow_overlap() || explicit_defaults_)
         {
-            boost::property_tree::ptree & param_node = datasource_node.push_back(
-                    boost::property_tree::ptree::value_type("Parameter",
-                    boost::property_tree::ptree()))->second;
-            param_node.put("<xmlattr>.name", it->first );
-            param_node.put_own( it->second );
-
+            set_attr( sym_node, "allow-overlap", sym.get_allow_overlap() );
+        }
+        if (sym.get_spacing() != dfl.get_spacing() || explicit_defaults_)
+        {
+            set_attr( sym_node, "spacing", sym.get_spacing() );
+        }
+        if (sym.get_max_error() != dfl.get_max_error() || explicit_defaults_)
+        {
+            set_attr( sym_node, "max-error", sym.get_max_error() );
+        }
+        if (sym.get_fill() != dfl.get_fill() || explicit_defaults_)
+        {
+            set_attr( sym_node, "fill", sym.get_fill() );
         }
+        if (sym.get_opacity() != dfl.get_opacity() || explicit_defaults_)
+        {
+            set_attr( sym_node, "opacity", sym.get_opacity() );
+        }
+        if (sym.get_width() != dfl.get_width() || explicit_defaults_)
+        {
+            set_attr( sym_node, "width", sym.get_width() );
+        }
+        if (sym.get_height() != dfl.get_height() || explicit_defaults_)
+        {
+            set_attr( sym_node, "height", sym.get_height() );
+        }
+        if (sym.get_marker_type() != dfl.get_marker_type() || explicit_defaults_)
+        {
+            set_attr( sym_node, "marker-type", sym.get_marker_type() );
+        }
+        if (sym.get_marker_placement() != dfl.get_marker_placement() || explicit_defaults_)
+        {
+            set_attr( sym_node, "placement", sym.get_marker_placement() );
+        }
+        std::string tr_str = sym.get_transform_string();
+        if (tr_str != "matrix(1, 0, 0, 1, 0, 0)" || explicit_defaults_ )
+        {
+            set_attr( sym_node, "transform", tr_str );
+        }
+
+        const stroke & strk =  sym.get_stroke();
+        add_stroke_attributes(sym_node, strk);
+
+        add_metawriter_attributes(sym_node, sym);
     }
 
-    void serialize_layer( ptree & map_node, const Layer & layer, bool explicit_defaults )
+    void operator () ( glyph_symbolizer const& sym)
     {
-        ptree & layer_node = map_node.push_back(
-                ptree::value_type("Layer", ptree()))->second;
-        if ( layer.name() != "" )
+        ptree &node = rule_.push_back(
+            ptree::value_type("GlyphSymbolizer", ptree())
+            )->second;
+                
+        glyph_symbolizer dfl("<no default>", expression_ptr());
+
+        // face_name
+        set_attr( node, "face-name", sym.get_face_name() );    
+
+        // char
+        if (sym.get_char()) {
+            const std::string &str =
+                to_expression_string(*sym.get_char());
+            set_attr( node, "char", str );
+        }
+
+        // angle
+        if (sym.get_angle()) {
+            const std::string &str =
+                to_expression_string(*sym.get_angle());
+            set_attr( node, "angle", str );
+        }
+
+        // value
+        if (sym.get_value()) {
+            const std::string &str =
+                to_expression_string(*sym.get_value());
+            set_attr( node, "value", str );
+        }
+
+        // size
+        if (sym.get_size()) {
+            const std::string &str =
+                to_expression_string(*sym.get_size());
+            set_attr( node, "size", str );
+        }
+
+        // color
+        if (sym.get_color()) {
+            const std::string &str =
+                to_expression_string(*sym.get_color());
+            set_attr( node, "color", str );
+        }
+
+        // colorizer
+        if (sym.get_colorizer()) {
+            serialize_raster_colorizer(node, sym.get_colorizer(),
+                                       explicit_defaults_);
+        }
+
+        // allow_overlap
+        if (sym.get_allow_overlap() != dfl.get_allow_overlap() || explicit_defaults_ )
+        {
+            set_attr( node, "allow-overlap", sym.get_allow_overlap() );
+        }
+        // avoid_edges
+        if (sym.get_avoid_edges() != dfl.get_avoid_edges() || explicit_defaults_ )
         {
-            set_attr( layer_node, "name", layer.name() );
+            set_attr( node, "avoid-edges", sym.get_avoid_edges() );
         }
 
-        if ( layer.abstract() != "" )
+        // displacement
+        position displacement = sym.get_displacement();
+        if ( displacement.get<0>() != dfl.get_displacement().get<0>() || explicit_defaults_ )
+        {
+            set_attr( node, "dx", displacement.get<0>() );
+        }
+        if ( displacement.get<1>() != dfl.get_displacement().get<1>() || explicit_defaults_ )
         {
-            set_attr( layer_node, "abstract", layer.abstract() );
+            set_attr( node, "dy", displacement.get<1>() );
         }
 
-        if ( layer.title() != "" )
+        // halo fill & radius
+        const color & c = sym.get_halo_fill();
+        if ( c != dfl.get_halo_fill() || explicit_defaults_ )
         {
-            set_attr( layer_node, "title", layer.title() );
+            set_attr( node, "halo-fill", c );
+        }
+        
+        if (sym.get_halo_radius() != dfl.get_halo_radius() || explicit_defaults_ )
+        {
+            set_attr( node, "halo-radius", sym.get_halo_radius() );
         }
 
-        if ( layer.srs() != "" )
+        // angle_mode
+        if (sym.get_angle_mode() != dfl.get_angle_mode() || explicit_defaults_ )
         {
-            set_attr( layer_node, "srs", layer.srs() );
+            set_attr( node, "angle-mode", sym.get_angle_mode() );
         }
+        add_metawriter_attributes(node, sym);
+    }
 
-        if ( !layer.isActive() || explicit_defaults )
+private:
+    serialize_symbolizer();
+    
+    void serialize_raster_colorizer(ptree & sym_node,
+                                    raster_colorizer_ptr const& colorizer,
+                                    bool explicit_defaults)
+    {
+        ptree & col_node = sym_node.push_back(
+            ptree::value_type("RasterColorizer", ptree() ))->second;
+
+        set_attr(col_node, "default-mode", colorizer->get_default_mode());
+        set_attr(col_node, "default-color", colorizer->get_default_color());
+        set_attr(col_node, "epsilon", colorizer->get_epsilon());
+
+        unsigned i;
+        colorizer_stops const &stops = colorizer->get_stops();
+        for (i=0; i<stops.size(); i++) {
+            ptree &stop_node = col_node.push_back( ptree::value_type("stop", ptree()) )->second;
+            set_attr(stop_node, "value", stops[i].get_value());
+            set_attr(stop_node, "color", stops[i].get_color());
+            set_attr(stop_node, "mode", stops[i].get_mode().as_string());
+            if (stops[i].get_label()!=std::string(""))
+                set_attr(stop_node, "label", stops[i].get_label());
+        }
+
+    }
+    
+    void add_image_attributes(ptree & node, const symbolizer_with_image & sym)
+    {
+        std::string const& filename = path_processor_type::to_string( *sym.get_filename());
+        if ( ! filename.empty() ) {
+            set_attr( node, "file", filename );
+        }
+        if (sym.get_opacity() != 1.0 || explicit_defaults_ )
         {
-            set_attr/*<bool>*/( layer_node, "status", layer.isActive() );
+            set_attr( node, "opacity", sym.get_opacity() );
         }
         
-        if ( layer.clear_label_cache() || explicit_defaults )
-        {        
-            set_attr/*<bool>*/( layer_node, "clear_label_cache", layer.clear_label_cache() );
+        std::string tr_str = sym.get_transform_string();
+        if (tr_str != "matrix(1, 0, 0, 1, 0, 0)" || explicit_defaults_ )
+        {
+            set_attr( node, "transform", tr_str );
         }
 
-        if ( layer.getMinZoom() )
-        {
-            set_attr( layer_node, "minzoom", layer.getMinZoom() );
+    }
+    void add_font_attributes(ptree & node, const text_symbolizer & sym)
+    {
+        expression_ptr const& expr = sym.get_name();
+        const std::string & name = to_expression_string(*expr);
+                
+        if (!name.empty()) {
+            ptree& text_node = node.push_back(ptree::value_type("<xmltext>", ptree()))->second;
+            text_node.put_value(name);
         }
+        const std::string & face_name = sym.get_face_name();
+        if ( ! face_name.empty() ) {
+            set_attr( node, "face-name", face_name );
+        }
+        const std::string & fontset_name = sym.get_fontset().get_name();
+        if ( ! fontset_name.empty() ) {
+            set_attr( node, "fontset-name", fontset_name );
+        }
+
+        set_attr( node, "size", sym.get_text_size() );
+        set_attr( node, "fill", sym.get_fill() );
 
-        if ( layer.getMaxZoom() != std::numeric_limits<double>::max() )
+        // pseudo-default-construct a text_symbolizer. It is used
+        // to avoid printing ofattributes with default values without
+        // repeating the default values here.
+        // maybe add a real, explicit default-ctor?
+        // FIXME
+        text_symbolizer dfl(expression_ptr(), "<no default>",
+                            0, color(0,0,0) );
+
+        position displacement = sym.get_displacement();
+        if ( displacement.get<0>() != dfl.get_displacement().get<0>() || explicit_defaults_ )
+        {
+            set_attr( node, "dx", displacement.get<0>() );
+        }
+        if ( displacement.get<1>() != dfl.get_displacement().get<1>() || explicit_defaults_ )
         {
-            set_attr( layer_node, "maxzoom", layer.getMaxZoom() );
+            set_attr( node, "dy", displacement.get<1>() );
         }
 
-        if ( layer.isQueryable() || explicit_defaults )
+        if (sym.get_label_placement() != dfl.get_label_placement() || explicit_defaults_ )
         {
-            set_attr( layer_node, "queryable", layer.isQueryable() );
+            set_attr( node, "placement", sym.get_label_placement() );
         }
 
-        std::vector<std::string> const& style_names = layer.styles();
-        for (unsigned i = 0; i < style_names.size(); ++i)
+        if (sym.get_vertical_alignment() != dfl.get_vertical_alignment() || explicit_defaults_ )
         {
-            boost::property_tree::ptree & style_node = layer_node.push_back(
-                    boost::property_tree::ptree::value_type("StyleName",
-                    boost::property_tree::ptree()))->second;
-            style_node.put_own( style_names[i] );
+            set_attr( node, "vertical-alignment", sym.get_vertical_alignment() );
         }
 
-        datasource_ptr datasource = layer.datasource();
-        if ( datasource )
+        if (sym.get_halo_radius() != dfl.get_halo_radius() || explicit_defaults_ )
+        {
+            set_attr( node, "halo-radius", sym.get_halo_radius() );
+        }
+        const color & c = sym.get_halo_fill();
+        if ( c != dfl.get_halo_fill() || explicit_defaults_ )
+        {
+            set_attr( node, "halo-fill", c );
+        }
+        if (sym.get_text_ratio() != dfl.get_text_ratio() || explicit_defaults_ )
+        {
+            set_attr( node, "text-ratio", sym.get_text_ratio() );
+        }
+        if (sym.get_wrap_width() != dfl.get_wrap_width() || explicit_defaults_ )
+        {
+            set_attr( node, "wrap-width", sym.get_wrap_width() );
+        }
+        if (sym.get_wrap_before() != dfl.get_wrap_before() || explicit_defaults_ )
+        {
+            set_attr( node, "wrap-before", sym.get_wrap_before() );
+        }
+        if (sym.get_wrap_char() != dfl.get_wrap_char() || explicit_defaults_ )
+        {
+            set_attr( node, "wrap-character", std::string(1, sym.get_wrap_char()) );
+        }
+        if (sym.get_text_transform() != dfl.get_text_transform() || explicit_defaults_ )
+        {
+            set_attr( node, "text-transform", sym.get_text_transform() );
+        }
+        if (sym.get_line_spacing() != dfl.get_line_spacing() || explicit_defaults_ )
+        {
+            set_attr( node, "line-spacing", sym.get_line_spacing() );
+        }
+        if (sym.get_character_spacing() != dfl.get_character_spacing() || explicit_defaults_ )
+        {
+            set_attr( node, "character-spacing", sym.get_character_spacing() );
+        }
+        if (sym.get_label_position_tolerance() != dfl.get_label_position_tolerance() || explicit_defaults_ )
+        {
+            set_attr( node, "label-position-tolerance", sym.get_label_position_tolerance() );
+        }
+        if (sym.get_label_spacing() != dfl.get_label_spacing() || explicit_defaults_ )
+        {
+            set_attr( node, "spacing", sym.get_label_spacing() );
+        }
+        if (sym.get_minimum_distance() != dfl.get_minimum_distance() || explicit_defaults_ )
+        {
+            set_attr( node, "minimum-distance", sym.get_minimum_distance() );
+        }
+        if (sym.get_minimum_padding() != dfl.get_minimum_padding() || explicit_defaults_ )
+        {
+            set_attr( node, "minimum-padding", sym.get_minimum_padding() );
+        }
+        if (sym.get_minimum_path_length() != dfl.get_minimum_path_length() || explicit_defaults_ )
+        {
+            set_attr( node, "minimum-path-length", sym.get_minimum_path_length() );
+        }
+        if (sym.get_allow_overlap() != dfl.get_allow_overlap() || explicit_defaults_ )
         {
-            serialize_datasource( layer_node, datasource );
+            set_attr( node, "allow-overlap", sym.get_allow_overlap() );
+        }
+        if (sym.get_avoid_edges() != dfl.get_avoid_edges() || explicit_defaults_ )
+        {
+            set_attr( node, "avoid-edges", sym.get_avoid_edges() );
+        }
+        // for shield_symbolizer this is later overridden
+        if (sym.get_text_opacity() != dfl.get_text_opacity() || explicit_defaults_ )
+        {
+            set_attr( node, "opacity", sym.get_text_opacity() );
+        }
+        if (sym.get_max_char_angle_delta() != dfl.get_max_char_angle_delta() || explicit_defaults_ )
+        {
+            set_attr( node, "max-char-angle-delta", sym.get_max_char_angle_delta() );
+        }
+        if (sym.get_horizontal_alignment() != dfl.get_horizontal_alignment() || explicit_defaults_ )
+        {
+            set_attr( node, "horizontal-alignment", sym.get_horizontal_alignment() );
+        }
+        if (sym.get_justify_alignment() != dfl.get_justify_alignment() || explicit_defaults_ )
+        {
+            set_attr( node, "justify-alignment", sym.get_justify_alignment() );
         }
     }
 
-    void serialize_map(ptree & pt, Map const & map, bool explicit_defaults)
-    {
-
-        ptree & map_node = pt.push_back(ptree::value_type("Map", ptree() ))->second;
 
-        set_attr( map_node, "srs", map.srs() );
+    void add_stroke_attributes(ptree & node, const stroke & strk)
+    {
 
-        optional<color> c = map.background();
-        if ( c )
+        stroke dfl = stroke();
+        
+        if ( strk.get_color() != dfl.get_color() || explicit_defaults_ )
         {
-            set_attr( map_node, "bgcolor", * c );
+            set_attr( node, "stroke", strk.get_color() );
         }
-
-        unsigned buffer_size = map.buffer_size();
-        if ( buffer_size || explicit_defaults)
+        if ( strk.get_width() != dfl.get_width() || explicit_defaults_ )
         {
-            set_attr( map_node, "buffer_size", buffer_size ); 
+            set_attr( node, "stroke-width", strk.get_width() );
         }
-
+        if ( strk.get_opacity() != dfl.get_opacity() || explicit_defaults_ )
+        {
+            set_attr( node, "stroke-opacity", strk.get_opacity() );
+        }
+        if ( strk.get_line_join() != dfl.get_line_join() || explicit_defaults_ )
+        {
+            set_attr( node, "stroke-linejoin", strk.get_line_join() );
+        }
+        if ( strk.get_line_cap() != dfl.get_line_cap() || explicit_defaults_ )
         {
-            Map::const_fontset_iterator it = map.fontsets().begin();
-            Map::const_fontset_iterator end = map.fontsets().end();
-            for (; it != end; ++it)
-            {
-                serialize_fontset( map_node, it);
+            set_attr( node, "stroke-linecap", strk.get_line_cap() );
+        }
+        if ( strk.get_gamma() != dfl.get_gamma() || explicit_defaults_ )
+        {
+            set_attr( node, "stroke-gamma", strk.get_gamma());
+        }
+        if ( strk.dash_offset() != dfl.dash_offset() || explicit_defaults_ )
+        {
+            set_attr( node, "stroke-dash-offset", strk.dash_offset());
+        }
+        if ( ! strk.get_dash_array().empty() )
+        {
+            std::ostringstream os;
+            const dash_array & dashes = strk.get_dash_array();
+            for (unsigned i = 0; i < dashes.size(); ++i) {
+                os << dashes[i].first << ", " << dashes[i].second;
+                if ( i + 1 < dashes.size() ) os << ", ";
             }
+            set_attr( node, "stroke-dasharray", os.str() );
+        }
+                
+    }
+    void add_metawriter_attributes(ptree &node, symbolizer_base const& sym)
+    {
+        if (!sym.get_metawriter_name().empty() || explicit_defaults_) {
+            set_attr(node, "meta-writer", sym.get_metawriter_name());
+        }
+        if (!sym.get_metawriter_properties_overrides().empty() || explicit_defaults_) {
+            set_attr(node, "meta-output", sym.get_metawriter_properties_overrides().to_string());
         }
+    }
 
-        Map::const_style_iterator it = map.styles().begin();
-        Map::const_style_iterator end = map.styles().end();
-        for (; it != end; ++it)
+    ptree & rule_;
+    bool explicit_defaults_;
+};
+
+void serialize_rule( ptree & style_node, const rule & r, bool explicit_defaults)
+{
+    ptree & rule_node = style_node.push_back(
+        ptree::value_type("Rule", ptree() ))->second;
+
+    rule dfl;
+    if ( r.get_name() != dfl.get_name() )
+    {
+        set_attr(rule_node, "name", r.get_name());
+    }
+    if ( r.get_title() != dfl.get_title() )
+    {
+        set_attr(rule_node, "title", r.get_title());
+    }
+
+    if ( r.has_else_filter() )
+    {
+        rule_node.push_back( ptree::value_type(
+                                 "ElseFilter", ptree()));
+    }
+    else if ( r.has_also_filter() )
+    {
+        rule_node.push_back( ptree::value_type(
+                                 "AlsoFilter", ptree()));
+    }
+    else
+    {
+        // filters were not comparable, perhaps should now compare expressions?
+        expression_ptr const& expr = r.get_filter();
+        std::string filter = mapnik::to_expression_string(*expr);
+        std::string default_filter = mapnik::to_expression_string(*dfl.get_filter());
+            
+        if ( filter != default_filter)
         {
-            serialize_style( map_node, it, explicit_defaults);
+            rule_node.push_back( ptree::value_type(
+                                     "Filter", ptree()))->second.put_value( filter );
         }
+    }
+
+    if (r.get_min_scale() != dfl.get_min_scale() )
+    {
+        ptree & min_scale = rule_node.push_back( ptree::value_type(
+                                                     "MinScaleDenominator", ptree()))->second;
+        min_scale.put_value( r.get_min_scale() );
+    }
+
+    if (r.get_max_scale() != dfl.get_max_scale() )
+    {
+        ptree & max_scale = rule_node.push_back( ptree::value_type(
+                                                     "MaxScaleDenominator", ptree()))->second;
+        max_scale.put_value( r.get_max_scale() );
+    }
+
+    rule::symbolizers::const_iterator begin = r.get_symbolizers().begin();
+    rule::symbolizers::const_iterator end = r.get_symbolizers().end();
+    serialize_symbolizer serializer( rule_node, explicit_defaults);
+    std::for_each( begin, end , boost::apply_visitor( serializer ));
+}
+
+void serialize_style( ptree & map_node, Map::const_style_iterator style_it, bool explicit_defaults )
+{
+    const feature_type_style & style = style_it->second;
+    const std::string & name = style_it->first;
+    filter_mode_e filter_mode = style.get_filter_mode();
 
-        std::vector<Layer> const & layers = map.layers();
-        for (unsigned i = 0; i < layers.size(); ++i )
+    ptree & style_node = map_node.push_back(
+        ptree::value_type("Style", ptree()))->second;
+
+    set_attr(style_node, "name", name);
+    
+    feature_type_style dfl;
+    if (filter_mode != dfl.get_filter_mode() || explicit_defaults)
+    {
+        set_attr(style_node, "filter-mode", filter_mode);
+    }
+
+    rules::const_iterator it = style.get_rules().begin();
+    rules::const_iterator end = style.get_rules().end();
+    for (; it != end; ++it)
+    {
+        serialize_rule( style_node, * it , explicit_defaults);
+    }
+
+}
+
+void serialize_fontset( ptree & map_node, Map::const_fontset_iterator fontset_it )
+{
+    const font_set & fontset = fontset_it->second;
+    const std::string & name = fontset_it->first;
+
+    ptree & fontset_node = map_node.push_back(
+        ptree::value_type("FontSet", ptree()))->second;
+
+    set_attr(fontset_node, "name", name);
+
+    std::vector<std::string>::const_iterator it = fontset.get_face_names().begin();
+    std::vector<std::string>::const_iterator end = fontset.get_face_names().end();
+    for (; it != end; ++it)
+    {
+        ptree & font_node = fontset_node.push_back(
+            ptree::value_type("Font", ptree()))->second;
+        set_attr(font_node, "face-name", *it);
+    }
+
+}
+
+void serialize_datasource( ptree & layer_node, datasource_ptr datasource)
+{
+    ptree & datasource_node = layer_node.push_back(
+        ptree::value_type("Datasource", ptree()))->second;
+
+    parameters::const_iterator it = datasource->params().begin();
+    parameters::const_iterator end = datasource->params().end();
+    for (; it != end; ++it)
+    {
+        boost::property_tree::ptree & param_node = datasource_node.push_back(
+            boost::property_tree::ptree::value_type("Parameter",
+                                                    boost::property_tree::ptree()))->second;
+        param_node.put("<xmlattr>.name", it->first );
+        param_node.put_value( it->second );
+
+    }
+}
+
+void serialize_layer( ptree & map_node, const layer & layer, bool explicit_defaults )
+{
+    ptree & layer_node = map_node.push_back(
+        ptree::value_type("Layer", ptree()))->second;
+    if ( layer.name() != "" )
+    {
+        set_attr( layer_node, "name", layer.name() );
+    }
+
+    if ( layer.abstract() != "" )
+    {
+        set_attr( layer_node, "abstract", layer.abstract() );
+    }
+
+    if ( layer.title() != "" )
+    {
+        set_attr( layer_node, "title", layer.title() );
+    }
+
+    if ( layer.srs() != "" )
+    {
+        set_attr( layer_node, "srs", layer.srs() );
+    }
+
+    if ( !layer.isActive() || explicit_defaults )
+    {
+        set_attr/*<bool>*/( layer_node, "status", layer.isActive() );
+    }
+        
+    if ( layer.clear_label_cache() || explicit_defaults )
+    {        
+        set_attr/*<bool>*/( layer_node, "clear-label-cache", layer.clear_label_cache() );
+    }
+
+    if ( layer.getMinZoom() )
+    {
+        set_attr( layer_node, "minzoom", layer.getMinZoom() );
+    }
+
+    if ( layer.getMaxZoom() != std::numeric_limits<double>::max() )
+    {
+        set_attr( layer_node, "maxzoom", layer.getMaxZoom() );
+    }
+
+    if ( layer.isQueryable() || explicit_defaults )
+    {
+        set_attr( layer_node, "queryable", layer.isQueryable() );
+    }
+
+    if ( layer.cache_features() || explicit_defaults )
+    {        
+        set_attr/*<bool>*/( layer_node, "cache-features", layer.cache_features() );
+    }
+
+    std::vector<std::string> const& style_names = layer.styles();
+    for (unsigned i = 0; i < style_names.size(); ++i)
+    {
+        boost::property_tree::ptree & style_node = layer_node.push_back(
+            boost::property_tree::ptree::value_type("StyleName",
+                                                    boost::property_tree::ptree()))->second;
+        style_node.put_value( style_names[i] );
+    }
+
+    datasource_ptr datasource = layer.datasource();
+    if ( datasource )
+    {
+        serialize_datasource( layer_node, datasource );
+    }
+}
+
+void serialize_metawriter(ptree & map_node, Map::const_metawriter_iterator metawriter_it, bool explicit_defaults)
+{
+    std::string const& name = metawriter_it->first;
+    metawriter_ptr const& metawriter = metawriter_it->second;
+
+    ptree & metawriter_node = map_node.push_back(
+        ptree::value_type("MetaWriter", ptree()))->second;
+
+    set_attr(metawriter_node, "name", name);
+    metawriter_save(metawriter, metawriter_node, explicit_defaults);
+}
+
+void serialize_map(ptree & pt, Map const & map, bool explicit_defaults)
+{
+
+    ptree & map_node = pt.push_back(ptree::value_type("Map", ptree() ))->second;
+
+    set_attr( map_node, "srs", map.srs() );
+
+    optional<color> const& c = map.background();
+    if ( c )
+    {
+        set_attr( map_node, "background-color", * c );
+    }
+
+    optional<std::string> const& image_filename = map.background_image();
+    if ( image_filename )
+    {
+        set_attr( map_node, "background-image", *image_filename );
+    }
+    
+    unsigned buffer_size = map.buffer_size();
+    if ( buffer_size || explicit_defaults)
+    {
+        set_attr( map_node, "buffer-size", buffer_size ); 
+    }
+
+    std::string const& base_path = map.base_path();
+    if ( !base_path.empty() || explicit_defaults)
+    {
+        set_attr( map_node, "base", base_path ); 
+    }
+
+    optional<box2d<double> > const& maximum_extent = map.maximum_extent();
+    if ( maximum_extent)
+    {
+        std::ostringstream s;
+        s << std::setprecision(16)
+          << maximum_extent->minx() << "," << maximum_extent->miny() << ","
+          << maximum_extent->maxx() << "," << maximum_extent->maxy();
+        set_attr( map_node, "maximum-extent", s.str() ); 
+    }
+
+    {
+        Map::const_fontset_iterator it = map.fontsets().begin();
+        Map::const_fontset_iterator end = map.fontsets().end();
+        for (; it != end; ++it)
         {
-            serialize_layer( map_node, layers[i], explicit_defaults );
+            serialize_fontset( map_node, it);
         }
     }
 
-    void save_map(Map const & map, std::string const& filename, bool explicit_defaults)
+    parameters extra_attr = map.get_extra_attributes();
+    parameters::const_iterator p_it = extra_attr.begin();
+    parameters::const_iterator p_end = extra_attr.end();
+    for (; p_it != p_end; ++p_it)
+    {
+        set_attr( map_node, p_it->first, p_it->second ); 
+    }
+
+    Map::const_style_iterator it = map.styles().begin();
+    Map::const_style_iterator end = map.styles().end();
+    for (; it != end; ++it)
     {
-        ptree pt;
-        serialize_map(pt,map,explicit_defaults);
-        write_xml(filename,pt);
+        serialize_style( map_node, it, explicit_defaults);
     }
 
-    std::string save_map_to_string(Map const & map, bool explicit_defaults)
+    std::vector<layer> const & layers = map.layers();
+    for (unsigned i = 0; i < layers.size(); ++i )
     {
-        ptree pt;
-        serialize_map(pt,map,explicit_defaults);
-        std::ostringstream ss;
-        write_xml(ss,pt);
-        return ss.str();
+        serialize_layer( map_node, layers[i], explicit_defaults );
     }
 
+    Map::const_metawriter_iterator m_it = map.begin_metawriters();
+    Map::const_metawriter_iterator m_end = map.end_metawriters();
+    for (; m_it != m_end; ++m_it) {
+        serialize_metawriter(map_node, m_it, explicit_defaults);
+    }
+}
+
+void save_map(Map const & map, std::string const& filename, bool explicit_defaults)
+{
+    ptree pt;
+    serialize_map(pt,map,explicit_defaults);
+    write_xml(filename,pt,std::locale(),boost::property_tree::xml_writer_make_settings(' ',4));
+}
+
+std::string save_map_to_string(Map const & map, bool explicit_defaults)
+{
+    ptree pt;
+    serialize_map(pt,map,explicit_defaults);
+    std::ostringstream ss;
+    write_xml(ss,pt,boost::property_tree::xml_writer_make_settings(' ',4));
+    return ss.str();
+}
+
 }
diff --git a/src/scale_denominator.cpp b/src/scale_denominator.cpp
index 58c7ce3..e9cff6d 100644
--- a/src/scale_denominator.cpp
+++ b/src/scale_denominator.cpp
@@ -29,13 +29,13 @@
 
 namespace mapnik {
  
-    static const double pi = 3.14159265359; 
-    static const double meters_per_degree = 6378137 * 2 * pi/ 360;
+static const double pi = 3.14159265359; 
+static const double meters_per_degree = 6378137 * 2 * pi/ 360;
     
-    double scale_denominator(Map const& map, bool geographic)
-    {
-        double denom = map.scale() / 0.00028;
-        if (geographic) denom *= meters_per_degree;
-        return denom; 
-    }
+double scale_denominator(Map const& map, bool geographic)
+{
+    double denom = map.scale() / 0.00028;
+    if (geographic) denom *= meters_per_degree;
+    return denom; 
+}
 }
diff --git a/src/shield_symbolizer.cpp b/src/shield_symbolizer.cpp
index ffc9400..c810244 100644
--- a/src/shield_symbolizer.cpp
+++ b/src/shield_symbolizer.cpp
@@ -34,53 +34,63 @@
 
 namespace mapnik
 {
-    shield_symbolizer::shield_symbolizer(
-                          std::string const& name,
-                          std::string const& face_name,
-                          unsigned size,
-                          color const& fill,
-                          std::string const& file,
-                          std::string const& type,
-                          unsigned width,unsigned height)
-        : text_symbolizer(name, face_name, size, fill),
-          symbolizer_with_image( file, type, width, height ),
-          unlock_image_(false),
-          no_text_(false)
-    {
-    }
 
-    shield_symbolizer::shield_symbolizer(
-                          std::string const& name,
-                          unsigned size,
-                          color const& fill,
-                          std::string const& file,
-                          std::string const& type,
-                          unsigned width,unsigned height)
-        : text_symbolizer(name, size, fill),
-          symbolizer_with_image( file, type, width, height ),
-          unlock_image_(false),
-          no_text_(false)
-    {
-    }
+shield_symbolizer::shield_symbolizer(
+    expression_ptr name,
+    std::string const& face_name,
+    unsigned size,
+    color const& fill,
+    path_expression_ptr file)
+    : text_symbolizer(name, face_name, size, fill),
+      symbolizer_with_image(file),
+      unlock_image_(false),
+      no_text_(false),
+      shield_displacement_(boost::make_tuple<double,double>(0,0))
+{
+}
+
+shield_symbolizer::shield_symbolizer(
+    expression_ptr name,
+    unsigned size,
+    color const& fill,
+    path_expression_ptr file)
+    : text_symbolizer(name, size, fill),
+      symbolizer_with_image(file),
+      unlock_image_(false),
+      no_text_(false),
+      shield_displacement_(boost::make_tuple<double,double>(0,0))
+{
+}
 
-    void shield_symbolizer::set_unlock_image(bool unlock_image)
-    {
-       unlock_image_ = unlock_image;
-    }
+void shield_symbolizer::set_unlock_image(bool unlock_image)
+{
+    unlock_image_ = unlock_image;
+}
 
-    bool shield_symbolizer::get_unlock_image() const
-    {
-      return unlock_image_;
-    }
+bool shield_symbolizer::get_unlock_image() const
+{
+    return unlock_image_;
+}
 
-    void shield_symbolizer::set_no_text(bool no_text)
-    {
-       no_text_ = no_text;
-    }
+void shield_symbolizer::set_no_text(bool no_text)
+{
+    no_text_ = no_text;
+}
+
+bool shield_symbolizer::get_no_text() const
+{
+    return no_text_;
+}
+
+void shield_symbolizer::set_shield_displacement(double shield_dx,double shield_dy)
+{
+    shield_displacement_ = boost::make_tuple(shield_dx,shield_dy);
+}
+                      
+boost::tuple<double,double> const& shield_symbolizer::get_shield_displacement() const
+{
+    return shield_displacement_;
+}
 
-    bool shield_symbolizer::get_no_text() const
-    {
-      return no_text_;
-    }
 }
 
diff --git a/src/stroke.cpp b/src/stroke.cpp
index 3a1d6e4..0a9ecb4 100644
--- a/src/stroke.cpp
+++ b/src/stroke.cpp
@@ -25,133 +25,160 @@
 namespace mapnik
 {
 
-    static const char * line_cap_strings[] = {
-        "butt",
-        "square",
-        "round",
-        ""
-    };
+static const char * line_cap_strings[] = {
+    "butt",
+    "square",
+    "round",
+    ""
+};
+
+
+IMPLEMENT_ENUM( line_cap_e, line_cap_strings )
+
+
+static const char * line_join_strings[] = {
+    "miter",
+    "miter_revert",
+    "round",
+    "bevel",
+    ""
+};
+
+IMPLEMENT_ENUM( line_join_e, line_join_strings )
+
+
+stroke::stroke() 
+    : c_(0,0,0),
+      width_(1.0),
+      opacity_(1.0),
+      line_cap_(BUTT_CAP),
+      line_join_(MITER_JOIN),
+      gamma_(1.0),
+      dash_(),
+      dash_offset_(0) {}
+
+stroke::stroke(color const& c, double width)
+    : c_(c),
+      width_(width),
+      opacity_(1.0),
+      line_cap_(BUTT_CAP),
+      line_join_(MITER_JOIN),
+      gamma_(1.0),
+      dash_(),
+      dash_offset_(0.0) {}
+
+stroke::stroke(stroke const& other)
+    : c_(other.c_),
+      width_(other.width_),
+      opacity_(other.opacity_),
+      line_cap_(other.line_cap_),
+      line_join_(other.line_join_),
+      gamma_(other.gamma_),
+      dash_(other.dash_), 
+      dash_offset_(other.dash_offset_) {}
+
+stroke & stroke::operator=(const stroke& rhs)
+{
+    stroke tmp(rhs);
+    swap(tmp);
+    return *this;
+}
+
+void stroke::set_color(const color& c) 
+{
+    c_=c;
+}
+
+color const& stroke::get_color() const
+{
+    return c_;
+}
+
+double stroke::get_width() const
+{
+    return width_;
+}
+void stroke::set_width(double w)
+{
+    width_=w;
+}
 
+void stroke::set_opacity(double opacity)
+{    
+    if (opacity > 1.0) opacity_=1.0;
+    else if (opacity < 0.0) opacity_=0.0;
+    else opacity_=opacity;
+}
 
-    static const char * line_join_strings[] = {
-        "miter",
-        "miter_revert",
-        "round",
-        "bevel",
-        ""
-    };
+double stroke::get_opacity() const 
+{
+    return opacity_;
+}
 
+void stroke::set_line_cap(line_cap_e line_cap)
+{
+    line_cap_=line_cap;
 }
 
-IMPLEMENT_ENUM( mapnik::line_cap_e, line_cap_strings );
-IMPLEMENT_ENUM( mapnik::line_join_e, line_join_strings );
+line_cap_e stroke::get_line_cap() const 
+{
+    return line_cap_;
+}
 
+void stroke::set_line_join(line_join_e line_join) 
+{
+    line_join_=line_join;
+}
 
-namespace mapnik
+line_join_e stroke::get_line_join() const 
 {
-    stroke::stroke() 
-        : c_(0,0,0),
-        width_(1.0),
-        opacity_(1.0),
-        line_cap_(BUTT_CAP),
-        line_join_(MITER_JOIN),
-        dash_() {}
-
-    stroke::stroke(color const& c, float width)
-        : c_(c),
-        width_(width),
-        opacity_(1.0),
-        line_cap_(BUTT_CAP),
-        line_join_(MITER_JOIN),
-        dash_() {}
-
-    stroke::stroke(stroke const& other)
-        : c_(other.c_),
-        width_(other.width_),
-        opacity_(other.opacity_),
-        line_cap_(other.line_cap_),
-        line_join_(other.line_join_),
-        dash_(other.dash_) {}
-
-    stroke & stroke::operator=(const stroke& rhs)
-    {
-        stroke tmp(rhs);
-        swap(tmp);
-        return *this;
-    }
-
-    void stroke::set_color(const color& c) 
-    {
-        c_=c;
-    }
-
-    color const& stroke::get_color() const
-    {
-        return c_;
-    }
-
-    float stroke::get_width() const
-    {
-        return width_;
-    }
-    void stroke::set_width(float w)
-    {
-        width_=w;
-    }
-
-    void stroke::set_opacity(float opacity)
-    {    
-        if (opacity > 1.0) opacity_=1.0;
-        else if (opacity < 0.0) opacity_=0.0;
-        else opacity_=opacity;
-    }
-
-    float stroke::get_opacity() const 
-    {
-        return opacity_;
-    }
-
-    void stroke::set_line_cap(line_cap_e line_cap)
-    {
-        line_cap_=line_cap;
-    }
-
-    line_cap_e stroke::get_line_cap() const 
-    {
-        return line_cap_;
-    }
-
-    void stroke::set_line_join(line_join_e line_join) 
-    {
-        line_join_=line_join;
-    }
-
-    line_join_e stroke::get_line_join() const 
-    {
-        return line_join_;
-    }
-
-    void stroke::add_dash(float dash,float gap)
-    {
-        dash_.push_back(std::make_pair(dash,gap));
-    }
-    bool stroke::has_dash() const 
-    {
-        return ! dash_.empty();
-    }
-
-    dash_array const& stroke::get_dash_array() const
-    {
-        return  dash_;
-    }
-
-    void stroke::swap(const stroke& other) throw()
-    {
-        c_=other.c_;
-        width_=other.width_;
-        opacity_=other.opacity_;
-        line_cap_=other.line_cap_;
-        line_join_=other.line_join_;
-        dash_ = other.dash_;
-    }
+    return line_join_;
+}
+
+void stroke::set_gamma(double gamma)
+{
+    gamma_ = gamma;
+}
+
+double stroke::get_gamma() const
+{
+    return gamma_;
+}
+
+void stroke::add_dash(double dash, double gap)
+{
+    dash_.push_back(std::make_pair(dash,gap));
+}
+
+bool stroke::has_dash() const 
+{
+    return ! dash_.empty();
+}
+
+void stroke::set_dash_offset(double offset)
+{
+    dash_offset_ = offset;
+}
+
+double stroke::dash_offset() const
+{
+    return dash_offset_;
+}
+
+dash_array const& stroke::get_dash_array() const
+{
+    return dash_;
+}
+
+void stroke::swap(const stroke& other) throw()
+{
+    c_=other.c_;
+    width_=other.width_;
+    opacity_=other.opacity_;
+    line_cap_=other.line_cap_;
+    line_join_=other.line_join_;
+    gamma_=other.gamma_;
+    dash_ = other.dash_;
+    dash_offset_ = other.dash_offset_;
+}
 }
diff --git a/src/svg/process_building_symbolizer.cpp b/src/svg/process_building_symbolizer.cpp
new file mode 100644
index 0000000..e35bd73
--- /dev/null
+++ b/src/svg/process_building_symbolizer.cpp
@@ -0,0 +1,40 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/svg_renderer.hpp>
+
+namespace mapnik
+{
+    template <typename T>
+    void svg_renderer<T>::process(building_symbolizer const& sym,
+          Feature const& feature,
+          proj_transform const& prj_trans)
+    {
+          // nothing yet.
+    }
+
+    template void svg_renderer<std::ostream_iterator<char> >::process(building_symbolizer const& sym,
+                      Feature const& feature,
+                      proj_transform const& prj_trans);
+}
diff --git a/src/svg/process_glyph_symbolizer.cpp b/src/svg/process_glyph_symbolizer.cpp
new file mode 100644
index 0000000..cfcea7e
--- /dev/null
+++ b/src/svg/process_glyph_symbolizer.cpp
@@ -0,0 +1,40 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/svg_renderer.hpp>
+
+namespace mapnik
+{
+    template <typename T>
+    void svg_renderer<T>::process(glyph_symbolizer const& sym,
+          Feature const& feature,
+          proj_transform const& prj_trans)
+    {
+          // nothing yet.
+    }
+
+    template void svg_renderer<std::ostream_iterator<char> >::process(glyph_symbolizer const& sym,
+                      Feature const& feature,
+                      proj_transform const& prj_trans);
+}
diff --git a/src/svg/process_line_pattern_symbolizer.cpp b/src/svg/process_line_pattern_symbolizer.cpp
new file mode 100644
index 0000000..a72bd59
--- /dev/null
+++ b/src/svg/process_line_pattern_symbolizer.cpp
@@ -0,0 +1,40 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/svg_renderer.hpp>
+
+namespace mapnik
+{
+    template <typename T>
+    void svg_renderer<T>::process(line_pattern_symbolizer const& sym,
+              Feature const& feature,
+              proj_transform const& prj_trans)
+    {
+        // nothing yet.
+    }
+
+    template void svg_renderer<std::ostream_iterator<char> >::process(line_pattern_symbolizer const& sym,
+                      Feature const& feature,
+                      proj_transform const& prj_trans);
+}
diff --git a/src/svg/process_line_symbolizer.cpp b/src/svg/process_line_symbolizer.cpp
new file mode 100644
index 0000000..0e99eb6
--- /dev/null
+++ b/src/svg/process_line_symbolizer.cpp
@@ -0,0 +1,49 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/svg_renderer.hpp>
+
+namespace mapnik
+{
+    /*!
+     * @brief Collect presentation attributes found in line symbolizer.
+     */
+    template <typename T>
+    void svg_renderer<T>::process(line_symbolizer const& sym,
+          Feature const& feature,
+          proj_transform const& prj_trans)
+    {
+        path_attributes_.set_stroke_color(sym.get_stroke().get_color());
+        path_attributes_.set_stroke_opacity(sym.get_stroke().get_opacity());
+        path_attributes_.set_stroke_width(sym.get_stroke().get_width());
+        path_attributes_.set_stroke_linecap(sym.get_stroke().get_line_cap());
+        path_attributes_.set_stroke_linejoin(sym.get_stroke().get_line_join());
+        path_attributes_.set_stroke_dasharray(sym.get_stroke().get_dash_array());
+        path_attributes_.set_stroke_dashoffset(sym.get_stroke().dash_offset());
+    }
+
+    template void svg_renderer<std::ostream_iterator<char> >::process(line_symbolizer const& sym,
+                      Feature const& feature,
+                      proj_transform const& prj_trans);
+}
diff --git a/src/svg/process_markers_symbolizer.cpp b/src/svg/process_markers_symbolizer.cpp
new file mode 100644
index 0000000..c6e88f0
--- /dev/null
+++ b/src/svg/process_markers_symbolizer.cpp
@@ -0,0 +1,40 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/svg_renderer.hpp>
+
+namespace mapnik
+{
+    template <typename T>
+    void svg_renderer<T>::process(markers_symbolizer const& sym,
+          Feature const& feature,
+          proj_transform const& prj_trans)
+    {
+  // nothing yet.
+    }
+
+    template void svg_renderer<std::ostream_iterator<char> >::process(markers_symbolizer const& sym,
+                      Feature const& feature,
+                      proj_transform const& prj_trans);
+}
diff --git a/src/svg/process_point_symbolizer.cpp b/src/svg/process_point_symbolizer.cpp
new file mode 100644
index 0000000..0d586e2
--- /dev/null
+++ b/src/svg/process_point_symbolizer.cpp
@@ -0,0 +1,40 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/svg_renderer.hpp>
+
+namespace mapnik
+{
+    template <typename T>
+    void svg_renderer<T>::process(point_symbolizer const& sym,
+             Feature const& feature,
+             proj_transform const& prj_trans)
+    {
+  // nothing yet.
+    }
+
+    template void svg_renderer<std::ostream_iterator<char> >::process(point_symbolizer const& sym,
+                      Feature const& feature,
+                      proj_transform const& prj_trans);
+}
diff --git a/src/svg/process_polygon_pattern_symbolizer.cpp b/src/svg/process_polygon_pattern_symbolizer.cpp
new file mode 100644
index 0000000..8ff791a
--- /dev/null
+++ b/src/svg/process_polygon_pattern_symbolizer.cpp
@@ -0,0 +1,40 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/svg_renderer.hpp>
+
+namespace mapnik
+{
+    template <typename T>
+    void svg_renderer<T>::process(polygon_pattern_symbolizer const& sym,
+             Feature const& feature,
+             proj_transform const& prj_trans)
+    {
+  // nothing yet.
+    }
+
+    template void svg_renderer<std::ostream_iterator<char> >::process(polygon_pattern_symbolizer const& sym,
+                      Feature const& feature,
+                      proj_transform const& prj_trans);
+}
diff --git a/src/svg/process_polygon_symbolizer.cpp b/src/svg/process_polygon_symbolizer.cpp
new file mode 100644
index 0000000..d6a65ae
--- /dev/null
+++ b/src/svg/process_polygon_symbolizer.cpp
@@ -0,0 +1,44 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/svg_renderer.hpp>
+
+namespace mapnik
+{
+    /*!
+     * @brief Collect presentation attributes found in polygon symbolizer.
+     */
+    template <typename T>
+    void svg_renderer<T>::process(polygon_symbolizer const& sym,
+          Feature const& feature,
+          proj_transform const& prj_trans)
+    {
+        path_attributes_.set_fill_color(sym.get_fill());
+        path_attributes_.set_fill_opacity(sym.get_opacity());
+    }
+
+    template void svg_renderer<std::ostream_iterator<char> >::process(polygon_symbolizer const& sym,
+                      Feature const& feature,
+                      proj_transform const& prj_trans);
+}
diff --git a/src/svg/process_raster_symbolizer.cpp b/src/svg/process_raster_symbolizer.cpp
new file mode 100644
index 0000000..d68be67
--- /dev/null
+++ b/src/svg/process_raster_symbolizer.cpp
@@ -0,0 +1,40 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/svg_renderer.hpp>
+
+namespace mapnik 
+{
+    template <typename T>
+    void svg_renderer<T>::process(raster_symbolizer const& sym,
+             Feature const& feature,
+             proj_transform const& prj_trans)
+    {
+        // nothing yet.
+    }
+
+    template void svg_renderer<std::ostream_iterator<char> >::process(raster_symbolizer const& sym,
+                      Feature const& feature,
+                      proj_transform const& prj_trans);
+}
diff --git a/src/svg/process_shield_symbolizer.cpp b/src/svg/process_shield_symbolizer.cpp
new file mode 100644
index 0000000..b342b32
--- /dev/null
+++ b/src/svg/process_shield_symbolizer.cpp
@@ -0,0 +1,40 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/svg_renderer.hpp>
+
+namespace mapnik
+{
+    template <typename T>
+    void svg_renderer<T>::process(shield_symbolizer const& sym,
+                               Feature const& feature,
+                               proj_transform const& prj_trans)
+    {
+        // nothing yet.
+    }
+
+    template void svg_renderer<std::ostream_iterator<char> >::process(shield_symbolizer const& sym,
+                      Feature const& feature,
+                      proj_transform const& prj_trans);
+}
diff --git a/src/svg/process_symbolizers.cpp b/src/svg/process_symbolizers.cpp
new file mode 100644
index 0000000..16adc8b
--- /dev/null
+++ b/src/svg/process_symbolizers.cpp
@@ -0,0 +1,68 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/svg_renderer.hpp>
+
+namespace mapnik { 
+
+template <typename OutputIterator>
+bool svg_renderer<OutputIterator>::process(rule::symbolizers const& syms,
+                                           Feature const& feature,
+                                           proj_transform const& prj_trans)
+{
+    // svg renderer supports processing of multiple symbolizers.
+
+    typedef coord_transform2<CoordTransform, geometry_type> path_type;
+
+    // process each symbolizer to collect its (path) information.
+    // path information (attributes from line_ and polygon_ symbolizers)
+    // is collected with the path_attributes_ data member.
+    BOOST_FOREACH(symbolizer const& sym, syms)
+    {
+        boost::apply_visitor(symbol_dispatch(*this, feature, prj_trans), sym);
+    }
+
+    // generate path output for each geometry of the current feature.
+    for(unsigned i=0; i<feature.num_geometries(); ++i)
+    {
+        geometry_type const& geom = feature.get_geometry(i);
+        if(geom.num_points() > 1)
+        {
+            path_type path(t_, geom, prj_trans);
+            generator_.generate_path(path, path_attributes_);
+        }
+    }
+
+    // set the previously collected values back to their defaults
+    // for the feature that will be processed next.
+    path_attributes_.reset();
+
+    return true;
+};
+
+template bool svg_renderer<std::ostream_iterator<char> >::process(rule::symbolizers const& syms,
+                                                                  Feature const& feature,
+                                                                  proj_transform const& prj_trans);
+
+}
diff --git a/src/svg/process_text_symbolizer.cpp b/src/svg/process_text_symbolizer.cpp
new file mode 100644
index 0000000..1b3549c
--- /dev/null
+++ b/src/svg/process_text_symbolizer.cpp
@@ -0,0 +1,40 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/svg_renderer.hpp>
+
+namespace mapnik 
+{
+    template <typename T>
+    void svg_renderer<T>::process(text_symbolizer const& sym,
+             Feature const& feature,
+             proj_transform const& prj_trans)
+    {
+         // nothing yet.
+    }
+
+    template void svg_renderer<std::ostream_iterator<char> >::process(text_symbolizer const& sym,
+                      Feature const& feature,
+                      proj_transform const& prj_trans);
+}
diff --git a/src/svg/svg_generator.cpp b/src/svg/svg_generator.cpp
new file mode 100644
index 0000000..f2fe7fb
--- /dev/null
+++ b/src/svg/svg_generator.cpp
@@ -0,0 +1,81 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+// mapnik
+#include <mapnik/svg/svg_generator.hpp>
+#include <mapnik/geometry.hpp>
+
+// boost
+#include <boost/spirit/include/karma.hpp>
+
+namespace mapnik { namespace svg {
+
+    using namespace boost::spirit;
+
+    template <typename OutputIterator>
+    svg_generator<OutputIterator>::svg_generator(OutputIterator& output_iterator) 
+      : output_iterator_(output_iterator) {}
+
+    template <typename OutputIterator>
+    svg_generator<OutputIterator>::~svg_generator() {}
+
+    template <typename OutputIterator>
+    void svg_generator<OutputIterator>::generate_header()
+    {
+        karma::generate(output_iterator_, lit("<?xml version=\"1.0\" standalone=\"no\"?>\n"));
+        karma::generate(output_iterator_, lit("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n"));
+    }
+
+    template <typename OutputIterator>
+    void svg_generator<OutputIterator>::generate_opening_root(root_output_attributes const& root_attributes)
+    {
+        root_attributes_grammar attributes_grammar;
+        karma::generate(output_iterator_, lit("<svg ") << attributes_grammar << lit(">\n"), root_attributes);
+    }
+
+    template <typename OutputIterator>
+    void svg_generator<OutputIterator>::generate_closing_root()
+    {
+        karma::generate(output_iterator_, lit("</svg>"));
+    }
+
+    template <typename OutputIterator>
+    void svg_generator<OutputIterator>::generate_rect(rect_output_attributes const& rect_attributes)
+    {
+        rect_attributes_grammar attributes_grammar;
+        karma::generate(output_iterator_, lit("<rect ") << attributes_grammar << lit("/>\n"), rect_attributes);
+    }
+
+    template <typename OutputIterator>
+    void svg_generator<OutputIterator>::generate_path(path_type const& path, path_output_attributes const& path_attributes) 
+    {  
+        path_data_grammar data_grammar(path);
+        path_attributes_grammar attributes_grammar;
+        path_dash_array_grammar dash_array_grammar;
+      
+        karma::generate(output_iterator_, lit("<path ")  << data_grammar, path);
+        karma::generate(output_iterator_, lit(" ") << dash_array_grammar, path_attributes.stroke_dasharray());
+        karma::generate(output_iterator_, lit(" ") << attributes_grammar << lit("/>\n"), path_attributes);
+    }
+
+    template class svg_generator<std::ostream_iterator<char> >;
+}}
diff --git a/src/svg/svg_output_attributes.cpp b/src/svg/svg_output_attributes.cpp
new file mode 100644
index 0000000..a9b209d
--- /dev/null
+++ b/src/svg/svg_output_attributes.cpp
@@ -0,0 +1,292 @@
+
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+//$Id$
+
+// mapnik
+#include <mapnik/svg/svg_output_attributes.hpp>
+
+namespace mapnik { namespace svg {
+
+    // path_output_attributes
+
+    void path_output_attributes::set_fill_color(color const& fill_color)
+    {
+        fill_color_ = fill_color.to_hex_string();
+    }
+
+    void path_output_attributes::set_fill_opacity(const double fill_opacity)
+    {
+        fill_opacity_ = fill_opacity;
+    }
+
+    void path_output_attributes::set_stroke_color(color const& stroke_color)
+    {
+        stroke_color_ = stroke_color.to_hex_string();
+    }
+
+    void path_output_attributes::set_stroke_opacity(const double stroke_opacity)
+    {
+        stroke_opacity_ = stroke_opacity;
+    }
+
+    void path_output_attributes::set_stroke_width(const double stroke_width)
+    {
+        stroke_width_ = stroke_width;
+    }
+    
+    void path_output_attributes::set_stroke_linecap(const line_cap_e stroke_linecap)
+    {
+      switch(stroke_linecap)
+      {
+      case BUTT_CAP:
+          stroke_linecap_ = "butt";
+          break;
+      case SQUARE_CAP:
+          stroke_linecap_ = "square";
+          break;
+      case ROUND_CAP:
+          stroke_linecap_ = "round";
+          break;
+      default:
+          stroke_linecap_ = "butt";
+      }
+    }
+
+    void path_output_attributes::set_stroke_linejoin(const line_join_e stroke_linejoin)
+    {
+      switch(stroke_linejoin)
+      {
+      case MITER_JOIN:
+          stroke_linejoin_ = "miter";
+          break;
+      case MITER_REVERT_JOIN:
+          stroke_linejoin_ = "miter";
+          break;
+      case ROUND_JOIN:
+          stroke_linejoin_ = "round";
+          break;
+      case BEVEL_JOIN:
+          stroke_linejoin_ = "bevel";
+          break;
+      default:
+          stroke_linejoin_ = "miter";
+      }
+    }
+
+    void path_output_attributes::set_stroke_dasharray(const dash_array stroke_dasharray)
+    {
+        stroke_dasharray_ = stroke_dasharray;
+    }
+
+    void path_output_attributes::set_stroke_dashoffset(const double stroke_dashoffset)
+    {
+        stroke_dashoffset_ = stroke_dashoffset;
+    }
+
+    const std::string path_output_attributes::fill_color() const
+    {
+        return fill_color_;
+    }
+
+    const double path_output_attributes::fill_opacity() const
+    {
+        return fill_opacity_;
+    }
+
+    const std::string path_output_attributes::stroke_color() const
+    {
+        return stroke_color_;
+    }
+
+    const double path_output_attributes::stroke_opacity() const
+    {
+        return stroke_opacity_;
+    }
+
+    const double path_output_attributes::stroke_width() const
+    {
+        return stroke_width_;
+    }
+
+    const std::string path_output_attributes::stroke_linecap() const
+    {
+        return stroke_linecap_;
+    }
+
+    const std::string path_output_attributes::stroke_linejoin() const
+    {
+        return stroke_linejoin_;
+    }
+
+    const dash_array path_output_attributes::stroke_dasharray() const
+    {
+        return stroke_dasharray_;
+    }
+
+    const double path_output_attributes::stroke_dashoffset() const
+    {
+        return stroke_dashoffset_;
+    }
+
+    void path_output_attributes::reset()
+    {
+        fill_color_ = "none";
+        fill_opacity_ = 1.0;
+        stroke_color_ = "none";
+        stroke_opacity_ = 1.0;
+        stroke_width_ = 0.0;
+        stroke_linecap_ = "butt";
+        stroke_linejoin_ = "miter";
+        stroke_dasharray_.clear();
+        stroke_dashoffset_ = 0.0;
+    }
+
+    // rect_output_attributes
+
+    void rect_output_attributes::set_x(const int x)
+    {
+        x_ = x;
+    }
+
+    void rect_output_attributes::set_y(const int y)
+    {
+        y_ = y;
+    }
+
+    void rect_output_attributes::set_width(const unsigned width)
+    {
+        width_ = width;
+    }
+
+    void rect_output_attributes::set_height(const unsigned height)
+    {
+        height_ = height;
+    }
+
+    void rect_output_attributes::set_fill_color(color const& fill_color)
+    {
+        fill_color_ = fill_color.to_hex_string();
+    }
+
+    const int rect_output_attributes::x() const
+    {
+        return x_;
+    }
+
+    const int rect_output_attributes::y() const
+    {
+        return y_;
+    }
+
+    const int rect_output_attributes::width() const
+    {
+        return width_;
+    }
+
+    const int rect_output_attributes::height() const
+    {
+        return height_;
+    }
+
+    const std::string rect_output_attributes::fill_color() const
+    {
+        return fill_color_;
+    }
+
+    void rect_output_attributes::reset()
+    {
+        x_ = 0;
+        y_ = 0;
+        width_ = 400;
+        height_ = 400;
+        fill_color_ = "#000000";
+    }
+
+    // rect_output_attributes
+
+    const double root_output_attributes::SVG_VERSION = 1.1;    
+    const std::string root_output_attributes::SVG_NAMESPACE_URL = "http://www.w3.org/2000/svg";    
+
+    root_output_attributes::root_output_attributes()
+  : width_(400),
+    height_(400),
+    svg_version_(SVG_VERSION),
+    svg_namespace_url_(SVG_NAMESPACE_URL)
+    {}
+
+    root_output_attributes::root_output_attributes(const unsigned width, const unsigned height)
+  : width_(width),
+    height_(height),
+    svg_version_(SVG_VERSION),
+    svg_namespace_url_(SVG_NAMESPACE_URL)
+    {}
+
+    void root_output_attributes::set_width(const unsigned width)
+    {
+        width_ = width;
+    }
+
+    void root_output_attributes::set_height(const unsigned height)
+    {
+        height_ = height;
+    }
+
+    void root_output_attributes::set_svg_version(const double svg_version)
+    {
+        svg_version_ = svg_version;
+    }
+
+    void root_output_attributes::set_svg_namespace_url(std::string const& svg_namespace_url)
+    {
+        svg_namespace_url_ = svg_namespace_url;
+    }
+
+    const unsigned root_output_attributes::width() const
+    {
+        return width_;
+    }
+
+    const unsigned root_output_attributes::height() const
+    {
+        return height_;
+    }
+
+    const double root_output_attributes::svg_version() const
+    {
+        return svg_version_;
+    }
+
+    const std::string root_output_attributes::svg_namespace_url() const
+    {
+        return svg_namespace_url_;
+    }
+
+    void root_output_attributes::reset()
+    {
+        width_ = 400;
+        height_ = 400;
+        svg_version_ = SVG_VERSION;
+        svg_namespace_url_ = SVG_NAMESPACE_URL;
+    }
+}}
diff --git a/src/svg/svg_renderer.cpp b/src/svg/svg_renderer.cpp
new file mode 100644
index 0000000..b38644e
--- /dev/null
+++ b/src/svg/svg_renderer.cpp
@@ -0,0 +1,102 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2006 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/svg_renderer.hpp>
+#include <mapnik/map.hpp>
+
+// stl
+#ifdef MAPNIK_DEBUG
+#include <iostream>
+#endif
+#include <ostream>
+
+namespace mapnik
+{
+    template <typename T>
+    svg_renderer<T>::svg_renderer(Map const& m, T & output_iterator, unsigned offset_x, unsigned offset_y) :
+      feature_style_processor<svg_renderer>(m),
+      output_iterator_(output_iterator),
+      width_(m.width()),
+      height_(m.height()),
+      t_(m.width(),m.height(),m.get_current_extent(),offset_x,offset_y),
+      generator_(output_iterator)
+      {}
+
+    template <typename T>
+    svg_renderer<T>::~svg_renderer() {}
+
+    template <typename T>
+    void svg_renderer<T>::start_map_processing(Map const& map)
+    {
+        #ifdef MAPNIK_DEBUG
+        std::clog << "start map processing" << std::endl;
+        #endif
+    
+        // generate XML header.
+        generator_.generate_header();
+    
+        // generate SVG root element opening tag.
+        // the root element defines the size of the image,
+        // which is taken from the map's dimensions.
+        svg::root_output_attributes root_attributes(width_, height_);
+        generator_.generate_opening_root(root_attributes);    
+    
+        boost::optional<color> const& bgcolor = map.background();
+        if(bgcolor)
+        {
+            // generate background color as a rectangle that spans the whole image.        
+            svg::rect_output_attributes bg_attributes(0, 0, width_, height_, *bgcolor);
+            generator_.generate_rect(bg_attributes);
+        }
+    }
+
+    template <typename T>
+    void svg_renderer<T>::end_map_processing(Map const& map)
+    {
+        // generate SVG root element closing tag.
+        generator_.generate_closing_root();
+    
+        #ifdef MAPNIK_DEBUG
+        std::clog << "end map processing" << std::endl;
+        #endif
+    }
+
+    template <typename T>
+    void svg_renderer<T>::start_layer_processing(layer const& lay)
+    {
+        #ifdef MAPNIK_DEBUG
+        std::clog << "start layer processing: " << lay.name() << std::endl;
+        #endif
+    }
+    
+    template <typename T>
+    void svg_renderer<T>::end_layer_processing(layer const& lay)
+    {
+        #ifdef MAPNIK_DEBUG
+        std::clog << "end layer processing: " << lay.name() << std::endl;
+        #endif
+    }
+
+    template class svg_renderer<std::ostream_iterator<char> >;
+}
diff --git a/src/svg_parser.cpp b/src/svg_parser.cpp
new file mode 100644
index 0000000..3bd6143
--- /dev/null
+++ b/src/svg_parser.cpp
@@ -0,0 +1,842 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#include <mapnik/color_factory.hpp>
+
+#include <mapnik/svg/svg_parser.hpp>
+#include <mapnik/svg/svg_path_parser.hpp>
+
+#include "agg_ellipse.h"
+#include "agg_rounded_rect.h"
+#include "agg_span_gradient.h"
+
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/fusion/include/std_pair.hpp>
+#include <boost/foreach.hpp>
+#include <boost/algorithm/string/predicate.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include <iostream>
+#include <string>
+#include <stdexcept>
+#include <vector>
+
+namespace mapnik { namespace svg {
+
+
+typedef std::vector<std::pair<double, agg::rgba8> > color_lookup_type;
+
+namespace qi = boost::spirit::qi;
+
+typedef std::vector<std::pair<std::string, std::string> > pairs_type;
+
+template <typename Iterator,typename SkipType>
+struct key_value_sequence_ordered 
+    : qi::grammar<Iterator, pairs_type(), SkipType>
+{
+    key_value_sequence_ordered()
+        : key_value_sequence_ordered::base_type(query)
+    {
+        query =  pair >> *( qi::lit(';') >> pair);
+        pair  =  key >> -(':' >> value);
+        key   =  qi::char_("a-zA-Z_") >> *qi::char_("a-zA-Z_0-9-");
+        value = +(qi::char_ - qi::lit(';'));
+    }
+    
+    qi::rule<Iterator, pairs_type(), SkipType> query;
+    qi::rule<Iterator, std::pair<std::string, std::string>(), SkipType> pair;
+    qi::rule<Iterator, std::string(), SkipType> key, value;
+};
+
+agg::rgba8 parse_color(const char* str)
+{
+    mapnik::color c(100,100,100);
+    try
+    {
+        mapnik::color_factory::init_from_string(c,str);
+    }
+    catch (mapnik::config_error & ex) 
+    {
+        std::cerr << ex.what() << std::endl;
+    }
+    return agg::rgba8(c.red(), c.green(), c.blue(), c.alpha());
+}
+
+double parse_double(const char* str)
+{
+    using namespace boost::spirit::qi;
+    double val = 0.0;
+    parse(str, str+ strlen(str),double_,val);
+    return val;    
+}
+
+/*
+ * parse a double that might end with a %
+ * if it does then set the ref bool true and divide the result by 100
+ */
+double parse_double_optional_percent(const char* str, bool &percent)
+{
+    using namespace boost::spirit::qi;
+    using boost::phoenix::ref;
+    using qi::_1;
+
+    double val = 0.0;
+    char unit='\0';
+    parse(str, str+ strlen(str),double_[ref(val)=_1] >> *char_('%')[ref(unit)=_1]);
+    if (unit =='%')
+    {
+        percent = true;
+        val/=100.0;
+    }
+    else
+    {
+        percent = false;
+    }
+    return val;
+}
+
+bool parse_style (const char* str, pairs_type & v)
+{
+    using namespace boost::spirit::qi;
+    typedef boost::spirit::ascii::space_type skip_type;
+    key_value_sequence_ordered<const char*, skip_type> kv_parser;
+    return phrase_parse(str, str + strlen(str), kv_parser, skip_type(), v);
+}
+
+svg_parser::svg_parser(svg_converter<svg_path_adapter, 
+                                     agg::pod_bvector<mapnik::svg::path_attributes> > & path)
+    : path_(path),
+      is_defs_(false) {}
+   
+svg_parser::~svg_parser() {}
+
+void svg_parser::parse(std::string const& filename)
+{
+    xmlTextReaderPtr reader = xmlNewTextReaderFilename(filename.c_str());
+    if (reader != 0) 
+    {
+        int ret = xmlTextReaderRead(reader);
+        while (ret == 1) 
+        {
+            process_node(reader);
+            ret = xmlTextReaderRead(reader);
+        }
+        xmlFreeTextReader(reader);
+        if (ret != 0) 
+        {
+            std::cerr << "Failed to parse " << filename << std::endl;
+        }
+    } else {
+        std::cerr << "Unable to open " <<  filename << std::endl;
+    }
+}
+
+void svg_parser::process_node(xmlTextReaderPtr reader)
+{
+    int node_type = xmlTextReaderNodeType(reader);
+    switch (node_type)
+    {
+    case 1: //start element
+        start_element(reader);
+        break;
+    case 15:// end element
+        end_element(reader);
+        break;
+    default:
+        break;
+    }
+}
+
+void svg_parser::start_element(xmlTextReaderPtr reader)
+{
+    const xmlChar *name;
+    name = xmlTextReaderConstName(reader);   
+    
+    if (!is_defs_ && xmlStrEqual(name, BAD_CAST "g"))
+    {
+        path_.push_attr();
+        parse_attr(reader);
+    }
+    else if (xmlStrEqual(name, BAD_CAST "defs"))
+    {
+        if (xmlTextReaderIsEmptyElement(reader) == 0)
+            is_defs_ = true;
+    }
+    else if ( !is_defs_ &&  xmlStrEqual(name, BAD_CAST "path"))
+    {
+        parse_path(reader);
+    } 
+    else if (!is_defs_ && xmlStrEqual(name, BAD_CAST "polygon") )
+    {
+        parse_polygon(reader);
+    } 
+    else if (!is_defs_ && xmlStrEqual(name, BAD_CAST "polyline"))
+    {
+        parse_polyline(reader);
+    }
+    else if (!is_defs_ && xmlStrEqual(name, BAD_CAST "line"))
+    {
+        parse_line(reader);
+    } 
+    else if (!is_defs_ && xmlStrEqual(name, BAD_CAST "rect"))
+    {
+        parse_rect(reader);
+    } 
+    else if (!is_defs_ && xmlStrEqual(name, BAD_CAST "circle"))
+    {
+        parse_circle(reader);
+    }
+    else if (!is_defs_ && xmlStrEqual(name, BAD_CAST "ellipse"))
+    {
+        parse_ellipse(reader);
+    }
+    // the gradient tags *should* be in defs, but illustrator seems not to put them in there so
+    // accept them anywhere
+    else if (xmlStrEqual(name, BAD_CAST "linearGradient"))
+    {
+        parse_linear_gradient(reader);
+    }
+    else if (xmlStrEqual(name, BAD_CAST "radialGradient"))
+    {
+        parse_radial_gradient(reader);
+    }
+    else if (xmlStrEqual(name, BAD_CAST "stop"))
+    {
+        parse_gradient_stop(reader);
+    }
+    else if (!xmlStrEqual(name, BAD_CAST "svg"))
+    {
+        std::clog << "notice: unhandled svg element: " << name << "\n";
+    }
+}
+
+void svg_parser::end_element(xmlTextReaderPtr reader)
+{
+    const xmlChar *name;
+    name = xmlTextReaderConstName(reader);   
+    if (!is_defs_ && xmlStrEqual(name, BAD_CAST "g"))
+    {
+        path_.pop_attr();
+    }
+    else if (xmlStrEqual(name, BAD_CAST "defs"))
+    {
+        is_defs_ = false;
+    }
+    else if ((xmlStrEqual(name, BAD_CAST "linearGradient")) || (xmlStrEqual(name, BAD_CAST "radialGradient")))
+    {
+        gradient_map_[temporary_gradient_.first] = temporary_gradient_.second;
+    }
+}
+
+void svg_parser::parse_attr(const xmlChar * name, const xmlChar * value )
+{
+    if (xmlStrEqual(name, BAD_CAST "transform"))
+    {
+        agg::trans_affine tr;
+        mapnik::svg::parse_transform((const char*) value,tr);
+        path_.transform().premultiply(tr);
+    }
+    else if (xmlStrEqual(name, BAD_CAST "fill"))
+    {
+        if (xmlStrEqual(value, BAD_CAST "none"))
+        {
+            path_.fill_none();
+        }
+        else if (boost::starts_with((const char*)value, "url(#"))
+        {
+            // see if we have a known gradient fill
+            std::string id = std::string((const char*)&value[5]);
+            // get rid of the trailing )
+            id.erase(id.end()-1);
+            if (gradient_map_.count(id) > 0)
+            {
+                path_.add_fill_gradient(gradient_map_[id]);
+            }
+            else
+            {
+                std::cerr << "Failed to find gradient fill: " << id << std::endl;
+            }
+        }
+        else
+        {
+            path_.fill(parse_color((const char*) value));
+        }
+    }
+    else if (xmlStrEqual(name, BAD_CAST "fill-opacity"))
+    {
+        path_.fill_opacity(parse_double((const char*) value));  
+    }
+    else if (xmlStrEqual(name, BAD_CAST "fill-rule"))
+    {
+        if (xmlStrEqual(value, BAD_CAST "evenodd"))
+        {
+            path_.even_odd(true);
+        }
+    }
+    else if (xmlStrEqual(name, BAD_CAST "stroke"))
+    {
+        if (xmlStrEqual(value, BAD_CAST "none"))
+        {
+            path_.stroke_none();
+        }
+        else if (boost::starts_with((const char*)value, "url(#"))
+        {
+            // see if we have a known gradient fill
+            std::string id = std::string((const char*)&value[5]);
+            // get rid of the trailing )
+            id.erase(id.end()-1);
+            if (gradient_map_.count(id) > 0)
+            {
+                path_.add_stroke_gradient(gradient_map_[id]);
+            }
+            else
+            {
+                std::cerr << "Failed to find gradient fill: " << id << std::endl;
+            }
+        }
+        else
+        {
+            path_.stroke(parse_color((const char*) value));
+        }
+    }
+    else if (xmlStrEqual(name, BAD_CAST "stroke-width"))
+    {
+        path_.stroke_width(parse_double((const char*)value));
+    }
+    else if (xmlStrEqual(name, BAD_CAST "stroke-opacity"))
+    {
+        path_.stroke_opacity(parse_double((const char*)value));
+    }
+    else if(xmlStrEqual(name,BAD_CAST "stroke-width"))
+    {
+        path_.stroke_width(parse_double((const char*) value));
+    }
+    else if(xmlStrEqual(name,BAD_CAST "stroke-linecap"))
+    {
+        if(xmlStrEqual(value,BAD_CAST "butt"))        
+            path_.line_cap(agg::butt_cap);
+        else if(xmlStrEqual(value,BAD_CAST "round"))  
+            path_.line_cap(agg::round_cap);
+        else if(xmlStrEqual(value,BAD_CAST "square")) 
+            path_.line_cap(agg::square_cap);
+    }
+    else if(xmlStrEqual(name,BAD_CAST "stroke-linejoin"))
+    {
+        if(xmlStrEqual(value,BAD_CAST "miter"))     
+            path_.line_join(agg::miter_join);
+        else if(xmlStrEqual(value,BAD_CAST "round")) 
+            path_.line_join(agg::round_join);
+        else if(xmlStrEqual(value,BAD_CAST "bevel")) 
+            path_.line_join(agg::bevel_join);
+    }
+    else if(xmlStrEqual(name,BAD_CAST "stroke-miterlimit"))
+    {
+        path_.miter_limit(parse_double((const char*)value));
+    }
+    
+    else if(xmlStrEqual(name, BAD_CAST "opacity"))
+    {
+        double opacity = parse_double((const char*)value);
+        path_.opacity(opacity);
+    }
+    else if (xmlStrEqual(name, BAD_CAST "visibility"))
+    {
+        path_.visibility(!xmlStrEqual(value, BAD_CAST "hidden"));
+    }
+}
+
+
+void svg_parser::parse_attr(xmlTextReaderPtr reader)
+{
+    const xmlChar *name, *value;
+    while (xmlTextReaderMoveToNextAttribute(reader))
+    {
+        name = xmlTextReaderConstName(reader);
+        value = xmlTextReaderConstValue(reader);
+        if (xmlStrEqual(name, BAD_CAST "style"))
+        {
+            typedef std::vector<std::pair<std::string,std::string> > cont_type; 
+            typedef cont_type::value_type value_type;
+            cont_type vec;
+            parse_style((const char*)value, vec);
+            BOOST_FOREACH(value_type kv , vec )
+            {
+                parse_attr(BAD_CAST kv.first.c_str(),BAD_CAST kv.second.c_str()); 
+            }       
+        }
+        else
+        {
+            parse_attr(name,value);
+        }
+    }
+}
+void svg_parser::parse_path(xmlTextReaderPtr reader)
+{
+    const xmlChar *value;
+
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "d");
+    if (value) 
+    {
+        path_.begin_path();
+        parse_attr(reader);
+        
+        if (!mapnik::svg::parse_path((const char*) value, path_))
+        {
+            std::runtime_error("can't parse PATH\n");
+        }
+        path_.end_path();
+    }
+}
+
+void svg_parser::parse_polygon(xmlTextReaderPtr reader)
+{
+    const xmlChar *value;
+    
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "points");
+    if (value) 
+    {
+        path_.begin_path();
+        parse_attr(reader);
+        if (!mapnik::svg::parse_points((const char*) value, path_))
+        {
+            throw std::runtime_error("Failed to parse <polygon>\n");
+        }
+        path_.close_subpath();
+        path_.end_path();
+    }
+}
+
+void svg_parser::parse_polyline(xmlTextReaderPtr reader)
+{
+    const xmlChar *value;
+    
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "points");
+    if (value) 
+    {
+        path_.begin_path();
+        parse_attr(reader);
+        if (!mapnik::svg::parse_points((const char*) value, path_))
+        {
+            throw std::runtime_error("Failed to parse <polygon>\n");
+        }
+        
+        path_.end_path();
+    }
+}
+
+void svg_parser::parse_line(xmlTextReaderPtr reader)
+{
+    const xmlChar *value;
+    double x1 = 0.0;
+    double y1 = 0.0;
+    double x2 = 0.0;
+    double y2 = 0.0;
+    
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "x1");
+    if (value) x1 = parse_double((const char*)value);
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "y1");
+    if (value) y1 = parse_double((const char*)value);
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "x2");
+    if (value) x2 = parse_double((const char*)value);
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "y2");
+    if (value) y2 = parse_double((const char*)value);
+    
+    path_.begin_path();    
+    parse_attr(reader);
+    path_.move_to(x1, y1);
+    path_.line_to(x2, y2);
+    path_.end_path();
+    
+}
+
+void svg_parser::parse_circle(xmlTextReaderPtr reader)
+{
+    const xmlChar *value;
+    double cx = 0.0;
+    double cy = 0.0;
+    double r = 0.0;
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "cx");
+    if (value) cx = parse_double((const char*)value);
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "cy");
+    if (value) cy = parse_double((const char*)value);
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "r");
+    if (value) r = parse_double((const char*)value);
+
+    path_.begin_path();     
+    parse_attr(reader);
+    
+    if(r != 0.0)
+    {
+        if(r < 0.0) throw std::runtime_error("parse_circle: Invalid radius");
+        agg::ellipse c(cx, cy, r, r);
+        path_.storage().concat_path(c);
+    }
+    
+    path_.end_path();
+}
+
+void svg_parser::parse_ellipse(xmlTextReaderPtr reader)
+{
+    const xmlChar *value;
+    double cx = 0.0;
+    double cy = 0.0;
+    double rx = 0.0;
+    double ry = 0.0;
+    
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "cx");
+    if (value) cx = parse_double((const char*)value);
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "cy");
+    if (value) cy = parse_double((const char*)value);
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "rx");
+    if (value) rx = parse_double((const char*)value);
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "ry");
+    if (value) ry = parse_double((const char*)value);
+    
+    path_.begin_path();   
+    parse_attr(reader);
+    
+    if(rx != 0.0 && ry != 0.0)
+    {
+        if(rx < 0.0) throw std::runtime_error("parse_ellipse: Invalid rx");
+        if(ry < 0.0) throw std::runtime_error("parse_ellipse: Invalid ry");
+        agg::ellipse c(cx, cy, rx, ry);
+        path_.storage().concat_path(c);
+    }
+    
+    path_.end_path();
+}
+
+void svg_parser::parse_rect(xmlTextReaderPtr reader)
+{
+    const xmlChar *value;
+    double x = 0.0;
+    double y = 0.0;
+    double w = 0.0;
+    double h = 0.0;
+    double rx = 0.0;
+    double ry = 0.0;
+ 
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "x");
+    if (value) x = parse_double((const char*)value);
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "y");
+    if (value) y = parse_double((const char*)value);
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "width");
+    if (value) w = parse_double((const char*)value);
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "height");
+    if (value) h = parse_double((const char*)value);
+    
+    bool rounded = true;
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "rx");
+    
+    if (value) rx = parse_double((const char*)value);
+    else rounded = false;
+    
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "ry");
+    if (value)
+    {
+        ry = parse_double((const char*)value);
+        if (!rounded) 
+        {
+            rx = ry;
+            rounded = true;
+        }
+    }
+    else if (rounded) 
+    {
+        ry = rx;
+    }
+    
+    if(w != 0.0 && h != 0.0)
+    {
+        if(w < 0.0) throw std::runtime_error("parse_rect: Invalid width");
+        if(h < 0.0) throw std::runtime_error("parse_rect: Invalid height");
+        if(rx < 0.0) throw std::runtime_error("parse_rect: Invalid rx");
+        if(ry < 0.0) throw std::runtime_error("parse_rect: Invalid ry");
+        
+        path_.begin_path();
+        parse_attr(reader);
+        
+        if(rounded)
+        {
+            //path_.move_to(x + rx,y);
+            //path_.line_to(x + w - rx,y);         
+            //path_.arc_to (rx,ry,0,0,1,x + w, y + ry);
+            //path_.line_to(x + w, y + h - ry);
+            //path_.arc_to (rx,ry,0,0,1,x + w - rx, y + h);
+            //path_.line_to(x + rx, y + h);
+            //path_.arc_to(rx,ry,0,0,1,x,y + h - ry);
+            //path_.line_to(x,y+ry);
+            //path_.arc_to(rx,ry,0,0,1,x + rx,y);
+            //path_.close_subpath();
+            agg::rounded_rect r;
+            r.rect(x,y,x+w,y+h);
+            r.radius(rx,ry);
+            path_.storage().concat_path(r);
+        }
+        else
+        {
+            path_.move_to(x,     y);
+            path_.line_to(x + w, y);
+            path_.line_to(x + w, y + h);
+            path_.line_to(x,     y + h);
+            path_.close_subpath();
+        }
+        path_.end_path();
+    }
+}
+
+
+/*
+ *       <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3763" />
+ */
+void svg_parser::parse_gradient_stop(xmlTextReaderPtr reader)
+{
+    const xmlChar *value;
+
+    double offset = 0.0;
+    mapnik::color stop_color;
+    double opacity = 1.0;
+
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "offset");
+    if (value) offset = parse_double((const char*)value);
+
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "style");
+    if (value)
+    {
+        typedef std::vector<std::pair<std::string,std::string> > cont_type;
+        typedef cont_type::value_type value_type;
+        cont_type vec;
+        parse_style((const char*)value, vec);
+
+        BOOST_FOREACH(value_type kv , vec )
+        {
+            if (kv.first == "stop-color")
+            {
+                try
+                {
+                    mapnik::color_factory::init_from_string(stop_color,kv.second.c_str());
+                }
+                catch (mapnik::config_error & ex)
+                {
+                    std::cerr << ex.what() << std::endl;
+                }
+            }
+            else if (kv.first == "stop-opacity")
+            {
+                opacity = parse_double(kv.second.c_str());
+            }
+        }
+    }
+
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "stop-color");
+    if (value)
+    {
+        try
+        {
+            mapnik::color_factory::init_from_string(stop_color,(const char *) value);
+        }
+        catch (mapnik::config_error & ex)
+        {
+            std::cerr << ex.what() << std::endl;
+        }
+    }
+
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "stop-opacity");
+    if (value)
+    {
+        opacity = parse_double((const char *) value);
+    }
+
+
+    stop_color.set_alpha(opacity*255);
+
+    temporary_gradient_.second.add_stop(offset, stop_color);
+
+    //std::cerr << "\tFound Stop: " << offset << " " << (unsigned)stop_color.red() << " " << (unsigned)stop_color.green() << " " << (unsigned)stop_color.blue() << " " << (unsigned)stop_color.alpha() << std::endl;
+
+}
+
+bool svg_parser::parse_common_gradient(xmlTextReaderPtr reader)
+{
+    const xmlChar *value;
+
+    std::string id;
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "id");
+    if (value)
+    {
+        // start a new gradient
+        gradient new_grad;
+        id = std::string((const char *) value);
+        temporary_gradient_ = std::make_pair(id, new_grad);
+    }
+    else
+    {
+        // no point without an ID
+        return false;
+    }
+
+    // check if we should inherit from another tag
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "xlink:href");
+    if (value && value[0] == '#')
+    {
+        std::string linkid = (const char *) &value[1];
+        if (gradient_map_.count(linkid))
+        {
+            //std::cerr << "\tLoading linked gradient properties from " << linkid << std::endl;
+            temporary_gradient_.second = gradient_map_[linkid];
+        }
+        else
+        {
+            std::cerr << "Failed to find linked gradient " << linkid << std::endl;
+        }
+    }
+
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "gradientUnits");
+    if (value && std::string((const char*) value) == "userSpaceOnUse")
+    {
+        temporary_gradient_.second.set_units(USER_SPACE_ON_USE);
+    }
+    else
+    {
+        temporary_gradient_.second.set_units(OBJECT_BOUNDING_BOX);
+    }
+
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "gradientTransform");
+    if (value)
+    {
+        agg::trans_affine tr;
+        mapnik::svg::parse_transform((const char*) value,tr);
+        temporary_gradient_.second.set_transform(tr);
+    }
+
+    return true;
+}
+
+/**
+ *         <radialGradient
+       collect="always"
+       xlink:href="#linearGradient3759"
+       id="radialGradient3765"
+       cx="-1.2957155"
+       cy="-21.425594"
+       fx="-1.2957155"
+       fy="-21.425594"
+       r="5.1999998"
+       gradientUnits="userSpaceOnUse" />
+ */
+void svg_parser::parse_radial_gradient(xmlTextReaderPtr reader)
+{
+    if (!parse_common_gradient(reader))
+        return;
+
+    const xmlChar *value;
+    double cx = 0.5;
+    double cy = 0.5;
+    double fx = 0.0;
+    double fy = 0.0;
+    double r = 0.5;
+    bool has_percent=true;
+
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "cx");
+    if (value) cx = parse_double_optional_percent((const char*)value, has_percent);
+
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "cy");
+    if (value) cy = parse_double_optional_percent((const char*)value, has_percent);
+
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "fx");
+    if (value)
+        fx = parse_double_optional_percent((const char*)value, has_percent);
+    else
+        fx = cx;
+
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "fy");
+    if (value)
+        fy = parse_double_optional_percent((const char*)value, has_percent);
+    else
+        fy = cy;
+
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "r");
+    if (value) r = parse_double_optional_percent((const char*)value, has_percent);
+
+    // this logic for detecting %'s will not support mixed coordinates.
+    if (has_percent && temporary_gradient_.second.get_units() == USER_SPACE_ON_USE)
+    {
+        temporary_gradient_.second.set_units(USER_SPACE_ON_USE_BOUNDING_BOX);
+    }
+
+    temporary_gradient_.second.set_gradient_type(RADIAL);
+    temporary_gradient_.second.set_control_points(fx,fy,cx,cy,r);
+    // add this here in case we have no end tag, will be replaced if we do
+    gradient_map_[temporary_gradient_.first] = temporary_gradient_.second;
+
+    //std::cerr << "Found Radial Gradient: " << " " << cx << " " << cy << " " << fx << " " << fy << " " << r << std::endl;
+}
+
+void svg_parser::parse_linear_gradient(xmlTextReaderPtr reader)
+{
+    if (!parse_common_gradient(reader))
+        return;
+
+    const xmlChar *value;
+    double x1 = 0.0;
+    double x2 = 1.0;
+    double y1 = 0.0;
+    double y2 = 1.0;
+
+    bool has_percent=true;
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "x1");
+    if (value) x1 = parse_double_optional_percent((const char*)value, has_percent);
+
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "x2");
+    if (value) x2 = parse_double_optional_percent((const char*)value, has_percent);
+
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "y1");
+    if (value) y1 = parse_double_optional_percent((const char*)value, has_percent);
+
+    value = xmlTextReaderGetAttribute(reader, BAD_CAST "y2");
+    if (value) y2 = parse_double_optional_percent((const char*)value, has_percent);
+
+    // this logic for detecting %'s will not support mixed coordinates.
+    if (has_percent && temporary_gradient_.second.get_units() == USER_SPACE_ON_USE)
+    {
+        temporary_gradient_.second.set_units(USER_SPACE_ON_USE_BOUNDING_BOX);
+    }
+
+    temporary_gradient_.second.set_gradient_type(LINEAR);
+    temporary_gradient_.second.set_control_points(x1,y1,x2,y2);
+    // add this here in case we have no end tag, will be replaced if we do
+    gradient_map_[temporary_gradient_.first] = temporary_gradient_.second;
+
+    //std::cerr << "Found Linear Gradient: " << "(" << x1 << " " << y1 << "),(" << x2 << " " << y2 << ")" << std::endl;
+}
+
+void svg_parser::parse_pattern(xmlTextReaderPtr reader)
+{
+    //const xmlChar *value;
+}
+
+}}
diff --git a/src/svg_path_parser.cpp b/src/svg_path_parser.cpp
new file mode 100644
index 0000000..2949ff3
--- /dev/null
+++ b/src/svg_path_parser.cpp
@@ -0,0 +1,51 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+// mapnik
+#include <mapnik/svg/svg_path_attributes.hpp>
+#include <mapnik/svg/svg_path_parser.hpp>
+#include <mapnik/svg/svg_path_grammar.hpp>
+#include <mapnik/svg/svg_converter.hpp>
+#include <mapnik/svg/svg_renderer.hpp>
+// agg
+#include "agg_path_storage.h"
+
+// stl
+#include <string>
+
+namespace mapnik { namespace svg { 
+
+template <typename PathType>
+bool parse_path(const char* wkt, PathType & p)
+{
+    using namespace boost::spirit;
+    typedef const char* iterator_type;
+    typedef ascii::space_type skip_type;
+    svg_path_grammar<iterator_type,skip_type,PathType> g(p);
+    iterator_type first = wkt;
+    iterator_type last =  wkt + std::strlen(wkt);
+    return qi::phrase_parse(first, last, g, skip_type());
+}
+
+template bool parse_path<svg_converter_type>(const char*, svg_converter_type&);
+
+}}
diff --git a/src/svg_points_parser.cpp b/src/svg_points_parser.cpp
new file mode 100644
index 0000000..c4d410d
--- /dev/null
+++ b/src/svg_points_parser.cpp
@@ -0,0 +1,46 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+// mapnik
+#include <mapnik/svg/svg_path_parser.hpp>
+#include <mapnik/svg/svg_points_grammar.hpp>
+#include <mapnik/svg/svg_converter.hpp>
+// stl
+#include <string>
+
+namespace mapnik { namespace svg { 
+
+template <typename PathType>
+bool parse_points(const char* wkt, PathType & p)
+{
+    using namespace boost::spirit;
+    typedef const char*  iterator_type;
+    typedef ascii::space_type skip_type;
+    svg_points_grammar<iterator_type,skip_type,PathType> g(p);
+    iterator_type first = wkt;
+    iterator_type last =  wkt + std::strlen(wkt);
+    return qi::phrase_parse(first, last, g, skip_type());
+}
+
+template bool parse_points<svg_converter_type>(const char*, svg_converter_type&);
+
+}}
diff --git a/src/svg_transform_parser.cpp b/src/svg_transform_parser.cpp
new file mode 100644
index 0000000..e73aaa1
--- /dev/null
+++ b/src/svg_transform_parser.cpp
@@ -0,0 +1,60 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+// mapnik
+#include <mapnik/svg/svg_path_parser.hpp>
+#include <mapnik/svg/svg_transform_grammar.hpp>
+// agg
+#include "agg_trans_affine.h"
+// stl
+#include <string>
+
+namespace mapnik { namespace svg { 
+
+template <typename TransformType>
+bool parse_transform(const char * wkt, TransformType & p)
+{
+    using namespace boost::spirit;
+    typedef const char * iterator_type;
+    typedef ascii::space_type skip_type;
+    svg_transform_grammar<iterator_type,skip_type,TransformType> g(p);
+    iterator_type first = wkt;
+    iterator_type last =  wkt + std::strlen(wkt);
+    return qi::phrase_parse(first, last, g, skip_type());
+}
+
+template <typename TransformType>
+bool parse_transform(std::string const& wkt, TransformType & p)
+{
+    using namespace boost::spirit;
+    typedef std::string::const_iterator iterator_type;
+    typedef ascii::space_type skip_type;
+    svg_transform_grammar<iterator_type,skip_type,TransformType> g(p);
+    iterator_type first = wkt.begin();
+    iterator_type last =  wkt.end();
+    return qi::phrase_parse(first, last, g, skip_type());
+}
+
+template bool parse_transform<agg::trans_affine>(const char*, agg::trans_affine&);
+template bool parse_transform<agg::trans_affine>(std::string const& , agg::trans_affine&);
+
+}}
diff --git a/src/symbolizer.cpp b/src/symbolizer.cpp
index 9eb8f3d..240c1b5 100644
--- a/src/symbolizer.cpp
+++ b/src/symbolizer.cpp
@@ -21,50 +21,113 @@
  *****************************************************************************/
 //$Id$
 
+//mapnik
 #include <mapnik/symbolizer.hpp>
+#include <mapnik/map.hpp>
 
-#include <mapnik/image_reader.hpp>
+namespace mapnik {
 
-#include <iostream>
+void symbolizer_base::add_metawriter(std::string const& name, metawriter_properties const& properties)
+{
+    writer_name_ = name;
+    properties_ = properties;
+}
 
-namespace mapnik {
+void symbolizer_base::add_metawriter(metawriter_ptr writer_ptr, metawriter_properties const& properties,
+                    std::string const& name)
+{
+    writer_ptr_ = writer_ptr;
+    properties_ = properties;
+    writer_name_ = name;
+    if (writer_ptr) {
+        properties_complete_ = writer_ptr->get_default_properties();
+        properties_complete_.insert(properties_.begin(), properties_.end());
+    } else {
+        properties_complete_.clear();
+    }
+}
 
-   symbolizer_with_image::symbolizer_with_image(boost::shared_ptr<ImageData32> img) :
-      image_( img ) {}
-
-   symbolizer_with_image::symbolizer_with_image(std::string const& file,
-                                                std::string const& type, unsigned width,unsigned height)
-      : image_(new ImageData32(width,height)),
-        image_filename_( file )
-   {
-      std::auto_ptr<ImageReader> reader(get_image_reader(file,type));
-      if (reader.get())
-         reader->read(0,0,*image_);		
-   }
-   
-   symbolizer_with_image::symbolizer_with_image( symbolizer_with_image const& rhs)
-      : image_(rhs.image_), image_filename_(rhs.image_filename_) {}
-   
-   
-   boost::shared_ptr<ImageData32> symbolizer_with_image::get_image() const
-   {
-      return image_;
-   }
-   void symbolizer_with_image::set_image(boost::shared_ptr<ImageData32> image) 
-   {
-      image_ = image;
-   }
+void symbolizer_base::cache_metawriters(Map const &m)
+{
+    if (writer_name_.empty()) {
+        properties_complete_.clear();
+        writer_ptr_ = metawriter_ptr();
+        return; // No metawriter
+    }
+
+    writer_ptr_ = m.find_metawriter(writer_name_);
+    if (writer_ptr_) {
+        properties_complete_ = writer_ptr_->get_default_properties();
+        properties_complete_.insert(properties_.begin(), properties_.end());
+    } else {
+        properties_complete_.clear();
+        std::cerr << "WARNING: Metawriter '" << writer_name_ << "' used but not defined.\n";
+    }
+}
+
+metawriter_with_properties symbolizer_base::get_metawriter() const
+{
+    return metawriter_with_properties(writer_ptr_, properties_complete_);
+}
+
+symbolizer_with_image::symbolizer_with_image(path_expression_ptr file)
+    : image_filename_( file ),
+      opacity_(1.0f)
+
+{
+    matrix_[0] = 1.0;
+    matrix_[1] = 0.0;
+    matrix_[2] = 0.0;
+    matrix_[3] = 1.0;
+    matrix_[4] = 0.0;
+    matrix_[5] = 0.0;
+}
+
+symbolizer_with_image::symbolizer_with_image( symbolizer_with_image const& rhs)
+    : image_filename_(rhs.image_filename_),
+      opacity_(rhs.opacity_),
+      matrix_(rhs.matrix_) {}
    
-   std::string const& symbolizer_with_image::get_filename() const
-   {
-      return image_filename_;
-   }
-
-   void symbolizer_with_image::set_filename(std::string const& image_filename) 
-   {
-      image_filename_ = image_filename;
-   }
+path_expression_ptr symbolizer_with_image::get_filename() const
+{
+    return image_filename_;
+}
+
+void symbolizer_with_image::set_filename(path_expression_ptr image_filename) 
+{
+    image_filename_ = image_filename;
+}
       
+void symbolizer_with_image::set_transform(transform_type const& matrix)
+{
+    matrix_ = matrix;
+}
+
+transform_type const& symbolizer_with_image::get_transform() const
+{
+    return matrix_;
+}
+
+std::string const symbolizer_with_image::get_transform_string() const
+{
+    std::stringstream ss;
+    ss << "matrix(" << matrix_[0] << ", " << matrix_[1] << ", "
+       << matrix_[2] << ", " << matrix_[3] << ", "
+       << matrix_[4] << ", " << matrix_[5] << ")";
+    return ss.str();
+}
+
+
+void symbolizer_with_image::set_opacity(float opacity)
+{
+    opacity_ = opacity;
+}
+
+float symbolizer_with_image::get_opacity() const
+{
+    return opacity_;
+}
+
 } // end of namespace mapnik
 
 
diff --git a/src/text_placements.cpp b/src/text_placements.cpp
new file mode 100644
index 0000000..f7f22d5
--- /dev/null
+++ b/src/text_placements.cpp
@@ -0,0 +1,191 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Hermann Kraus
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#include <mapnik/text_placements.hpp>
+#include <mapnik/text_placements_simple.hpp>
+
+#include <boost/tuple/tuple.hpp>
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_stl.hpp>
+
+namespace mapnik {
+
+namespace qi = boost::spirit::qi;
+namespace phoenix = boost::phoenix;
+using boost::spirit::ascii::space;
+using phoenix::push_back;
+using phoenix::ref;
+using qi::_1;
+
+
+/************************************************************************/
+
+text_placement_info::text_placement_info(text_placements const* parent):
+    displacement(parent->displacement_),
+    text_size(parent->text_size_), halign(parent->halign_), jalign(parent->jalign_),
+    valign(parent->valign_)
+{
+
+}
+
+bool text_placement_info_dummy::next()
+{
+    if (state) return false;
+    state++;
+    return true;
+}
+
+bool text_placement_info_dummy::next_position_only()
+{
+    if (position_state) return false;
+    position_state++;
+    return true;
+}
+
+text_placement_info_ptr text_placements_dummy::get_placement_info() const
+{
+    return text_placement_info_ptr(new text_placement_info_dummy(this));
+}
+
+
+/************************************************************************/
+
+bool text_placement_info_simple::next()
+{
+    position_state = 0;
+    if (state == 0) {
+        text_size = parent_->text_size_;
+    } else {
+        if (state > parent_->text_sizes_.size()) return false;
+        text_size = parent_->text_sizes_[state-1];
+    }
+    state++;
+    return true;
+}
+
+bool text_placement_info_simple::next_position_only()
+{
+    if (position_state >= parent_->direction_.size()) return false;
+    directions_t dir = parent_->direction_[position_state];
+    switch (dir) {
+    case EXACT_POSITION:
+        displacement = parent_->displacement_;
+        break;
+    case NORTH:
+        displacement = boost::make_tuple(0, -abs(parent_->displacement_.get<1>()));
+        break;
+    case EAST:
+        displacement = boost::make_tuple(abs(parent_->displacement_.get<0>()), 0);
+        break;
+    case SOUTH:
+        displacement = boost::make_tuple(0, abs(parent_->displacement_.get<1>()));
+        break;
+    case WEST:
+        displacement = boost::make_tuple(-abs(parent_->displacement_.get<0>()), 0);
+        break;
+    case NORTHEAST:
+        displacement = boost::make_tuple(
+                     abs(parent_->displacement_.get<0>()),
+                    -abs(parent_->displacement_.get<1>()));
+    case SOUTHEAST:
+        displacement = boost::make_tuple(
+                     abs(parent_->displacement_.get<0>()),
+                     abs(parent_->displacement_.get<1>()));
+    case NORTHWEST:
+        displacement = boost::make_tuple(
+                    -abs(parent_->displacement_.get<0>()),
+                    -abs(parent_->displacement_.get<1>()));
+    case SOUTHWEST:
+        displacement = boost::make_tuple(
+                    -abs(parent_->displacement_.get<0>()),
+                     abs(parent_->displacement_.get<1>()));
+        break;
+    default:
+        std::cerr << "WARNING: Unknown placement\n";
+    }
+    position_state++;
+    return true;
+}
+
+
+text_placement_info_ptr text_placements_simple::get_placement_info() const
+{
+    return text_placement_info_ptr(new text_placement_info_simple(this));
+}
+
+/** Positiion string: [POS][SIZE]
+  * [POS] is any combination of
+  * N, E, S, W, NE, SE, NW, SW, X (exact position) (separated by commas)
+  * [SIZE] is a list of font sizes, separated by commas. The first font size
+  * is always the one given in the TextSymbolizer's parameters.
+  * First all directions are tried, then font size is reduced
+  * and all directions are tried again. The process ends when a placement is
+  * found or the last fontsize is tried without success.
+  * Example: N,S,15,10,8 (tries placement above, then below and if
+  *    that fails it tries the additional font sizes 15, 10 and 8.
+  */
+void text_placements_simple::set_positions(std::string positions)
+{
+    positions_ = positions;
+    struct direction_name_ : qi::symbols<char, directions_t>
+    {
+        direction_name_()
+        {
+            add
+                ("N" , NORTH)
+                ("E" , EAST)
+                ("S" , SOUTH)
+                ("W" , WEST)
+                ("NE", NORTHEAST)
+                ("SE", SOUTHEAST)
+                ("NW", NORTHWEST)
+                ("SW", SOUTHWEST)
+                ("X" , EXACT_POSITION)
+            ;
+        }
+
+    } direction_name;
+
+    std::string::iterator first = positions.begin(),  last = positions.end();
+    qi::phrase_parse(first, last,
+        (direction_name[push_back(ref(direction_), _1)] % ',') >> *(',' >> qi::int_[push_back(ref(text_sizes_), _1)]),
+        space
+    );
+    if (first != last) {
+        std::cerr << "WARNING: Could not parse text_placement_simple placement string ('" << positions << "').\n";
+    }
+    if (direction_.size() == 0) {
+        std::cerr << "WARNING: text_placements_simple with no valid placments! ('"<< positions<<"')\n";
+    }
+}
+
+text_placements_simple::text_placements_simple()
+{
+    set_positions("X");
+}
+
+text_placements_simple::text_placements_simple(std::string positions)
+{
+    set_positions(positions);
+}
+} //namespace
diff --git a/src/text_symbolizer.cpp b/src/text_symbolizer.cpp
index 65f97d3..dd55a89 100644
--- a/src/text_symbolizer.cpp
+++ b/src/text_symbolizer.cpp
@@ -27,471 +27,526 @@
 // boost
 #include <boost/scoped_ptr.hpp>
 
+namespace mapnik
+{
+
 static const char * label_placement_strings[] = {
     "point",
     "line",
     "vertex",
+    "interior",
     ""
 };
 
 
-IMPLEMENT_ENUM( mapnik::label_placement_e, label_placement_strings );
+IMPLEMENT_ENUM( label_placement_e, label_placement_strings )
 
 static const char * vertical_alignment_strings[] = {
     "top",
     "middle",
     "bottom",
+    "auto",
     ""
 };
 
 
-IMPLEMENT_ENUM( mapnik::vertical_alignment_e, vertical_alignment_strings );
+IMPLEMENT_ENUM( vertical_alignment_e, vertical_alignment_strings )
 
 static const char * horizontal_alignment_strings[] = {
     "left",
     "middle",
     "right",
+    "auto",
     ""
 };
 
 
-IMPLEMENT_ENUM( mapnik::horizontal_alignment_e, horizontal_alignment_strings );
+IMPLEMENT_ENUM( horizontal_alignment_e, horizontal_alignment_strings )
 
 static const char * justify_alignment_strings[] = {
     "left",
-    "middle",
+    "center",
     "right",
     ""
 };
 
 
-IMPLEMENT_ENUM( mapnik::justify_alignment_e, justify_alignment_strings );
+IMPLEMENT_ENUM( justify_alignment_e, justify_alignment_strings )
 
-static const char * text_convert_strings[] = {
+static const char * text_transform_strings[] = {
     "none",
-    "toupper",
-    "tolower",
+    "uppercase",
+    "lowercase",
+    "capitalize",
     ""
 };
 
 
-IMPLEMENT_ENUM( mapnik::text_convert_e, text_convert_strings );
+IMPLEMENT_ENUM( text_transform_e, text_transform_strings )
+
+
+
+text_symbolizer::text_symbolizer(expression_ptr name, std::string const& face_name,
+                                 unsigned size, color const& fill,
+                                 text_placements_ptr placements)
+    : symbolizer_base(),
+      name_(name),
+      face_name_(face_name),
+      //fontset_(default_fontset),
+      text_ratio_(0),
+      wrap_width_(0),
+      wrap_char_(' '),
+      text_transform_(NONE),
+      line_spacing_(0),
+      character_spacing_(0),
+      label_spacing_(0),
+      label_position_tolerance_(0),
+      force_odd_labels_(false),
+      max_char_angle_delta_(22.5 * M_PI/180.0),
+      fill_(fill),
+      halo_fill_(color(255,255,255)),
+      halo_radius_(0),
+      label_p_(POINT_PLACEMENT),
+      anchor_(0.0,0.5),
+      avoid_edges_(false),
+      minimum_distance_(0.0),
+      minimum_padding_(0.0),
+      minimum_path_length_(0.0),
+      overlap_(false),
+      text_opacity_(1.0),
+      wrap_before_(false),
+      placement_options_(placements)
+{
+    set_text_size(size);
+}
 
+text_symbolizer::text_symbolizer(expression_ptr name, unsigned size, color const& fill,
+                                 text_placements_ptr placements)
+    : symbolizer_base(),
+      name_(name),
+      //face_name_(""),
+      //fontset_(default_fontset),
+      text_ratio_(0),
+      wrap_width_(0),
+      wrap_char_(' '),
+      text_transform_(NONE),
+      line_spacing_(0),
+      character_spacing_(0),
+      label_spacing_(0),
+      label_position_tolerance_(0),
+      force_odd_labels_(false),
+      max_char_angle_delta_(22.5 * M_PI/180.0),
+      fill_(fill),
+      halo_fill_(color(255,255,255)),
+      halo_radius_(0),
+      label_p_(POINT_PLACEMENT),
+      anchor_(0.0,0.5),
+      avoid_edges_(false),
+      minimum_distance_(0.0),
+      minimum_padding_(0.0),
+      minimum_path_length_(0.0),
+      overlap_(false),
+      text_opacity_(1.0),
+      wrap_before_(false),
+      placement_options_(placements)
+{
+    set_text_size(size);
+}
 
-namespace mapnik
+text_symbolizer::text_symbolizer(text_symbolizer const& rhs)
+    : symbolizer_base(rhs),
+      name_(rhs.name_),
+      orientation_(rhs.orientation_),
+      face_name_(rhs.face_name_),
+      fontset_(rhs.fontset_),
+      text_ratio_(rhs.text_ratio_),
+      wrap_width_(rhs.wrap_width_),
+      wrap_char_(rhs.wrap_char_),
+      text_transform_(rhs.text_transform_),
+      line_spacing_(rhs.line_spacing_),
+      character_spacing_(rhs.character_spacing_),
+      label_spacing_(rhs.label_spacing_),
+      label_position_tolerance_(rhs.label_position_tolerance_),
+      force_odd_labels_(rhs.force_odd_labels_),
+      max_char_angle_delta_(rhs.max_char_angle_delta_),
+      fill_(rhs.fill_),
+      halo_fill_(rhs.halo_fill_),
+      halo_radius_(rhs.halo_radius_),
+      label_p_(rhs.label_p_),
+      anchor_(rhs.anchor_),
+      avoid_edges_(rhs.avoid_edges_),
+      minimum_distance_(rhs.minimum_distance_),
+      minimum_padding_(rhs.minimum_padding_),
+      minimum_path_length_(rhs.minimum_path_length_),
+      overlap_(rhs.overlap_),
+      text_opacity_(rhs.text_opacity_),
+      wrap_before_(rhs.wrap_before_),
+      placement_options_(rhs.placement_options_) /*TODO: Copy options! */ {}
+
+text_symbolizer& text_symbolizer::operator=(text_symbolizer const& other)
 {
-    text_symbolizer::text_symbolizer(std::string const& name, std::string const& face_name, unsigned size, color const& fill)
-        : name_(name),
-          face_name_(face_name),
-          //fontset_(default_fontset),
-          size_(size),
-          text_ratio_(0),
-          wrap_width_(0),
-          wrap_char_(' '),
-          text_convert_(NONE),
-          line_spacing_(0),
-          character_spacing_(0),
-          label_spacing_(0),
-          label_position_tolerance_(0),
-          force_odd_labels_(false),
-          max_char_angle_delta_(0.0),
-          fill_(fill),
-          halo_fill_(color(255,255,255)),
-          halo_radius_(0),
-          label_p_(POINT_PLACEMENT),
-          valign_(MIDDLE),
-          anchor_(0.0,0.5),
-          displacement_(0.0,0.0),
-          avoid_edges_(false),
-          minimum_distance_(0.0),
-          overlap_(false),
-          opacity_(1.0),
-          wrap_before_(false),
-          halign_(H_MIDDLE),
-          jalign_(J_MIDDLE) {}
-
-    text_symbolizer::text_symbolizer(std::string const& name, unsigned size, color const& fill)
-        : name_(name),
-          //face_name_(""),
-          //fontset_(default_fontset),
-          size_(size),
-          text_ratio_(0),
-          wrap_width_(0),
-          wrap_char_(' '),
-          text_convert_(NONE),
-          line_spacing_(0),
-          character_spacing_(0),
-          label_spacing_(0),
-          label_position_tolerance_(0),
-          force_odd_labels_(false),
-          max_char_angle_delta_(0.0),
-          fill_(fill),
-          halo_fill_(color(255,255,255)),
-          halo_radius_(0),
-          label_p_(POINT_PLACEMENT),
-          valign_(MIDDLE),
-          anchor_(0.0,0.5),
-          displacement_(0.0,0.0),
-          avoid_edges_(false),
-          minimum_distance_(0.0),
-          overlap_(false),
-          opacity_(1.0),
-          wrap_before_(false),
-          halign_(H_MIDDLE),
-          jalign_(J_MIDDLE) {}
-
-    text_symbolizer::text_symbolizer(text_symbolizer const& rhs)
-        : name_(rhs.name_),
-          face_name_(rhs.face_name_),
-          fontset_(rhs.fontset_),
-          size_(rhs.size_),
-          text_ratio_(rhs.text_ratio_),
-          wrap_width_(rhs.wrap_width_),
-          wrap_char_(rhs.wrap_char_),
-          text_convert_(rhs.text_convert_),
-          line_spacing_(rhs.line_spacing_),
-          character_spacing_(rhs.character_spacing_),
-          label_spacing_(rhs.label_spacing_),
-          label_position_tolerance_(rhs.label_position_tolerance_),
-          force_odd_labels_(rhs.force_odd_labels_),
-          max_char_angle_delta_(rhs.max_char_angle_delta_),
-          fill_(rhs.fill_),
-          halo_fill_(rhs.halo_fill_),
-          halo_radius_(rhs.halo_radius_),
-          label_p_(rhs.label_p_),
-          valign_(rhs.valign_),
-          anchor_(rhs.anchor_),
-          displacement_(rhs.displacement_),
-          avoid_edges_(rhs.avoid_edges_),
-          minimum_distance_(rhs.minimum_distance_),
-          overlap_(rhs.overlap_),
-          opacity_(rhs.opacity_),
-          wrap_before_(rhs.wrap_before_),
-          halign_(rhs.halign_),
-          jalign_(rhs.jalign_) {}
-
-    text_symbolizer& text_symbolizer::operator=(text_symbolizer const& other)
-    {
-        if (this == &other)
-            return *this;
-        name_ = other.name_;
-        face_name_ = other.face_name_;
-        fontset_ = other.fontset_;
-        size_ = other.size_;
-        text_ratio_ = other.text_ratio_;
-        wrap_width_ = other.wrap_width_;
-        wrap_char_ = other.wrap_char_;
-        text_convert_ = other.text_convert_;
-        line_spacing_ = other.line_spacing_;
-        character_spacing_ = other.character_spacing_;
-        label_spacing_ = other.label_spacing_;
-        label_position_tolerance_ = other.label_position_tolerance_;
-        force_odd_labels_ = other.force_odd_labels_;
-        max_char_angle_delta_ = other.max_char_angle_delta_;
-        fill_ = other.fill_;
-        halo_fill_ = other.halo_fill_;
-        halo_radius_ = other.halo_radius_;
-        label_p_ = other.label_p_;
-        valign_ = other.valign_;
-        anchor_ = other.anchor_;
-        displacement_ = other.displacement_;
-        avoid_edges_ = other.avoid_edges_;
-        minimum_distance_ = other.minimum_distance_;
-        overlap_ = other.overlap_;
-        opacity_ = other.opacity_;
-        wrap_before_ = other.wrap_before_;
-        halign_ = other.halign_;
-        jalign_ = other.jalign_;
+    if (this == &other)
         return *this;
-    }
-
-    std::string const&  text_symbolizer::get_name() const
-    {
-        return name_;
-    }
-
-    void text_symbolizer::set_name(std::string name)
-    {
-        name_ = name;
-    }
-
-    std::string const&  text_symbolizer::get_face_name() const
-    {
-        return face_name_;
-    }
-
-    void text_symbolizer::set_face_name(std::string face_name)
-    {
-        face_name_ = face_name;
-    }
-
-    void text_symbolizer::set_fontset(FontSet const& fontset)
-    {
-        fontset_ = fontset;
-    }
-
-    FontSet const& text_symbolizer::get_fontset() const
-    {
-        return fontset_;
-    }
-
-    unsigned  text_symbolizer::get_text_ratio() const
-    {
-        return text_ratio_;
-    }
-
-    void  text_symbolizer::set_text_ratio(unsigned ratio)
-    {
-        text_ratio_ = ratio;
-    }
-
-    unsigned  text_symbolizer::get_wrap_width() const
-    {
-        return wrap_width_;
-    }
-
-    void  text_symbolizer::set_wrap_width(unsigned width)
-    {
-        wrap_width_ = width;
-    }
-
-    bool  text_symbolizer::get_wrap_before() const
-    {
-        return wrap_before_;
-    }
-
-    void  text_symbolizer::set_wrap_before(bool wrap_before)
-    {
-        wrap_before_ = wrap_before;
-    }
-
-    unsigned char text_symbolizer::get_wrap_char() const
-    {
-        return wrap_char_;
-    }
-
-    std::string text_symbolizer::get_wrap_char_string() const
-    {
-        return std::string(1, wrap_char_);
-    }
-
-    void  text_symbolizer::set_wrap_char(unsigned char character)
-    {
-        wrap_char_ = character;
-    }
-
-    void  text_symbolizer::set_wrap_char_from_string(std::string const& character)
-    {
-        wrap_char_ = (character)[0];
-    }
-
-    text_convert_e  text_symbolizer::get_text_convert() const
-    {
-        return text_convert_;
-    }
-
-    void  text_symbolizer::set_text_convert(text_convert_e convert)
-    {
-        text_convert_ = convert;
-    }
-
-    unsigned  text_symbolizer::get_line_spacing() const
-    {
-        return line_spacing_;
-    }
-
-    void  text_symbolizer::set_line_spacing(unsigned spacing)
-    {
-        line_spacing_ = spacing;
-    }
-
-    unsigned  text_symbolizer::get_character_spacing() const
-    {
-        return character_spacing_;
-    }
-
-    void  text_symbolizer::set_character_spacing(unsigned spacing)
-    {
-        character_spacing_ = spacing;
-    }
-
-    unsigned  text_symbolizer::get_label_spacing() const
-    {
-        return label_spacing_;
-    }
-
-    void  text_symbolizer::set_label_spacing(unsigned spacing)
-    {
-        label_spacing_ = spacing;
-    }
-
-    unsigned  text_symbolizer::get_label_position_tolerance() const
-    {
-        return label_position_tolerance_;
-    }
-
-    void  text_symbolizer::set_label_position_tolerance(unsigned tolerance)
-    {
-        label_position_tolerance_ = tolerance;
-    }
-
-    bool  text_symbolizer::get_force_odd_labels() const
-    {
-        return force_odd_labels_;
-    }
-
-    void  text_symbolizer::set_force_odd_labels(bool force)
-    {
-        force_odd_labels_ = force;
-    }
-
-    double text_symbolizer::get_max_char_angle_delta() const
-    {
-        return max_char_angle_delta_;
-    }
-
-    void text_symbolizer::set_max_char_angle_delta(double angle)
-    {
-        max_char_angle_delta_ = angle;
-    }
-
-    void text_symbolizer::set_text_size(unsigned size)
-    {
-        size_ = size;
-    }
-
-    unsigned  text_symbolizer::get_text_size() const
-    {
-        return size_;
-    }
-
-    void text_symbolizer::set_fill(color const& fill)
-    {
-        fill_ = fill;
-    }
-
-    color const&  text_symbolizer::get_fill() const
-    {
-        return fill_;
-    }
-
-    void  text_symbolizer::set_halo_fill(color const& fill)
-    {
-        halo_fill_ = fill;
-    }
-
-    color const&  text_symbolizer::get_halo_fill() const
-    {
-        return halo_fill_;
-    }
-
-    void  text_symbolizer::set_halo_radius(unsigned radius)
-    {
-        halo_radius_ = radius;
-    }
-
-    unsigned  text_symbolizer::get_halo_radius() const
-    {
-        return halo_radius_;
-    }
-
-    void  text_symbolizer::set_label_placement(label_placement_e label_p)
-    {
-        label_p_ = label_p;
-    }
-
-    label_placement_e  text_symbolizer::get_label_placement() const
-    {
-        return label_p_;
-    }
-
-    void text_symbolizer::set_vertical_alignment(vertical_alignment_e valign)
-    {
-       valign_ = valign;
-    }
-
-    vertical_alignment_e text_symbolizer::get_vertical_alignment() const
-    {
-       return valign_;
-    }
-
-    void  text_symbolizer::set_anchor(double x, double y)
-    {
-        anchor_ = boost::make_tuple(x,y);
-    }
-
-    position const& text_symbolizer::get_anchor() const
-    {
-        return anchor_;
-    }
-
-    void  text_symbolizer::set_displacement(double x, double y)
-    {
-        displacement_ = boost::make_tuple(x,y);
-    }
-
-    position const& text_symbolizer::get_displacement() const
-    {
-        return displacement_;
-    }
-
-    bool text_symbolizer::get_avoid_edges() const
-    {
-        return avoid_edges_;
-    }
-
-    void text_symbolizer::set_avoid_edges(bool avoid)
-    {
-        avoid_edges_ = avoid;
-    }
-
-    double text_symbolizer::get_minimum_distance() const
-    {
-        return minimum_distance_;
-    }
-
-    void text_symbolizer::set_minimum_distance(double distance)
-    {
-        minimum_distance_ = distance;
-    }
-
-    void text_symbolizer::set_allow_overlap(bool overlap)
-    {
-       overlap_ = overlap;
-    }
-
-    bool text_symbolizer::get_allow_overlap() const
-    {
-      return overlap_;
-    }
-
-    void text_symbolizer::set_opacity(double opacity)
-    {
-       opacity_ = opacity;
-    }
-
-    double text_symbolizer::get_opacity() const
-    {
-      return opacity_;
-    }
-
-    void text_symbolizer::set_horizontal_alignment(horizontal_alignment_e halign)
-    {
-       halign_ = halign;
-    }
-
-    horizontal_alignment_e text_symbolizer::get_horizontal_alignment() const
-    {
-       return halign_;
-    }
-
-    void text_symbolizer::set_justify_alignment(justify_alignment_e jalign)
-    {
-       jalign_ = jalign;
-    }
-
-    justify_alignment_e text_symbolizer::get_justify_alignment() const
-    {
-       return jalign_;
-    }
+    name_ = other.name_;
+    orientation_ = other.orientation_;
+    face_name_ = other.face_name_;
+    fontset_ = other.fontset_;
+    text_ratio_ = other.text_ratio_;
+    wrap_width_ = other.wrap_width_;
+    wrap_char_ = other.wrap_char_;
+    text_transform_ = other.text_transform_;
+    line_spacing_ = other.line_spacing_;
+    character_spacing_ = other.character_spacing_;
+    label_spacing_ = other.label_spacing_;
+    label_position_tolerance_ = other.label_position_tolerance_;
+    force_odd_labels_ = other.force_odd_labels_;
+    max_char_angle_delta_ = other.max_char_angle_delta_;
+    fill_ = other.fill_;
+    halo_fill_ = other.halo_fill_;
+    halo_radius_ = other.halo_radius_;
+    label_p_ = other.label_p_;
+    anchor_ = other.anchor_;
+    avoid_edges_ = other.avoid_edges_;
+    minimum_distance_ = other.minimum_distance_;
+    minimum_padding_ = other.minimum_padding_;
+    minimum_path_length_ = other.minimum_path_length_;
+    overlap_ = other.overlap_;
+    text_opacity_ = other.text_opacity_;
+    wrap_before_ = other.wrap_before_;
+    placement_options_ = other.placement_options_; /*TODO?*/
+    std::cout << "TODO: Metawriter (text_symbolizer::operator=)\n";
+    return *this;
+}
+
+expression_ptr text_symbolizer::get_name() const
+{
+    return name_;
+}
+
+void text_symbolizer::set_name(expression_ptr name)
+{
+    name_ = name;
+}
+
+expression_ptr text_symbolizer::get_orientation() const
+{
+    return orientation_;
+}
+
+void text_symbolizer::set_orientation(expression_ptr orientation)
+{
+    orientation_ = orientation;
+}
+
+std::string const&  text_symbolizer::get_face_name() const
+{
+    return face_name_;
+}
+
+void text_symbolizer::set_face_name(std::string face_name)
+{
+    face_name_ = face_name;
+}
+
+void text_symbolizer::set_fontset(font_set const& fontset)
+{
+    fontset_ = fontset;
+}
+
+font_set const& text_symbolizer::get_fontset() const
+{
+    return fontset_;
+}
+
+unsigned  text_symbolizer::get_text_ratio() const
+{
+    return text_ratio_;
+}
+
+void  text_symbolizer::set_text_ratio(unsigned ratio)
+{
+    text_ratio_ = ratio;
+}
+
+unsigned  text_symbolizer::get_wrap_width() const
+{
+    return wrap_width_;
+}
+
+void  text_symbolizer::set_wrap_width(unsigned width)
+{
+    wrap_width_ = width;
+}
+
+bool  text_symbolizer::get_wrap_before() const
+{
+    return wrap_before_;
+}
+
+void  text_symbolizer::set_wrap_before(bool wrap_before)
+{
+    wrap_before_ = wrap_before;
+}
+
+unsigned char text_symbolizer::get_wrap_char() const
+{
+    return wrap_char_;
+}
+
+std::string text_symbolizer::get_wrap_char_string() const
+{
+    return std::string(1, wrap_char_);
+}
+
+void  text_symbolizer::set_wrap_char(unsigned char character)
+{
+    wrap_char_ = character;
+}
+
+void  text_symbolizer::set_wrap_char_from_string(std::string const& character)
+{
+    wrap_char_ = (character)[0];
+}
+
+text_transform_e  text_symbolizer::get_text_transform() const
+{
+    return text_transform_;
+}
+
+void  text_symbolizer::set_text_transform(text_transform_e convert)
+{
+    text_transform_ = convert;
+}
+
+unsigned  text_symbolizer::get_line_spacing() const
+{
+    return line_spacing_;
+}
+
+void  text_symbolizer::set_line_spacing(unsigned spacing)
+{
+    line_spacing_ = spacing;
+}
+
+unsigned  text_symbolizer::get_character_spacing() const
+{
+    return character_spacing_;
+}
+
+void  text_symbolizer::set_character_spacing(unsigned spacing)
+{
+    character_spacing_ = spacing;
+}
+
+unsigned  text_symbolizer::get_label_spacing() const
+{
+    return label_spacing_;
+}
+
+void  text_symbolizer::set_label_spacing(unsigned spacing)
+{
+    label_spacing_ = spacing;
+}
+
+unsigned  text_symbolizer::get_label_position_tolerance() const
+{
+    return label_position_tolerance_;
+}
+
+void  text_symbolizer::set_label_position_tolerance(unsigned tolerance)
+{
+    label_position_tolerance_ = tolerance;
+}
+
+bool  text_symbolizer::get_force_odd_labels() const
+{
+    return force_odd_labels_;
+}
+
+void  text_symbolizer::set_force_odd_labels(bool force)
+{
+    force_odd_labels_ = force;
+}
+
+double text_symbolizer::get_max_char_angle_delta() const
+{
+    return max_char_angle_delta_;
+}
+
+void text_symbolizer::set_max_char_angle_delta(double angle)
+{
+    max_char_angle_delta_ = angle;
+}
+
+void text_symbolizer::set_text_size(unsigned size)
+{
+    placement_options_->set_default_text_size(size);
+}
+
+unsigned  text_symbolizer::get_text_size() const
+{
+    return placement_options_->get_default_text_size();
+}
+
+void text_symbolizer::set_fill(color const& fill)
+{
+    fill_ = fill;
+}
+
+color const&  text_symbolizer::get_fill() const
+{
+    return fill_;
+}
+
+void  text_symbolizer::set_halo_fill(color const& fill)
+{
+    halo_fill_ = fill;
+}
+
+color const&  text_symbolizer::get_halo_fill() const
+{
+    return halo_fill_;
+}
+
+void  text_symbolizer::set_halo_radius(double radius)
+{
+    halo_radius_ = radius;
+}
+
+double text_symbolizer::get_halo_radius() const
+{
+    return halo_radius_;
+}
+
+void  text_symbolizer::set_label_placement(label_placement_e label_p)
+{
+    label_p_ = label_p;
+}
+
+label_placement_e  text_symbolizer::get_label_placement() const
+{
+    return label_p_;
+}
+
+void  text_symbolizer::set_anchor(double x, double y)
+{
+    anchor_ = boost::make_tuple(x,y);
+}
+
+position const& text_symbolizer::get_anchor() const
+{
+    return anchor_;
+}
+
+void  text_symbolizer::set_displacement(double x, double y)
+{
+    placement_options_->set_default_displacement(boost::make_tuple(x,y));
+}
+
+position const& text_symbolizer::get_displacement() const
+{
+    return placement_options_->get_default_displacement();
+}
+
+bool text_symbolizer::get_avoid_edges() const
+{
+    return avoid_edges_;
+}
+
+void text_symbolizer::set_avoid_edges(bool avoid)
+{
+    avoid_edges_ = avoid;
+}
+
+double text_symbolizer::get_minimum_distance() const
+{
+    return minimum_distance_;
+}
+
+void text_symbolizer::set_minimum_distance(double distance)
+{
+    minimum_distance_ = distance;
+}
+
+double text_symbolizer::get_minimum_padding() const
+{
+    return minimum_padding_;
+}
+
+void text_symbolizer::set_minimum_padding(double distance)
+{
+    minimum_padding_ = distance;
+}
+
+double text_symbolizer::get_minimum_path_length() const
+{
+    return minimum_path_length_;
+}
+
+void text_symbolizer::set_minimum_path_length(double size)
+{
+    minimum_path_length_ = size;
+}
+
+void text_symbolizer::set_allow_overlap(bool overlap)
+{
+    overlap_ = overlap;
+}
+
+bool text_symbolizer::get_allow_overlap() const
+{
+    return overlap_;
+}
+
+void text_symbolizer::set_text_opacity(double text_opacity)
+{
+    text_opacity_ = text_opacity;
+}
+
+double text_symbolizer::get_text_opacity() const
+{
+    return text_opacity_;
+}
+
+void text_symbolizer::set_vertical_alignment(vertical_alignment_e valign)
+{
+    placement_options_->set_default_valign(valign);
+}
+
+vertical_alignment_e text_symbolizer::get_vertical_alignment() const
+{
+    return placement_options_->get_default_valign();
+}
+
+void text_symbolizer::set_horizontal_alignment(horizontal_alignment_e halign)
+{
+    placement_options_->set_default_halign(halign);
+}
+
+horizontal_alignment_e text_symbolizer::get_horizontal_alignment() const
+{
+    return placement_options_->get_default_halign();
+}
+
+void text_symbolizer::set_justify_alignment(justify_alignment_e jalign)
+{
+    placement_options_->set_default_jalign(jalign);
+}
+
+justify_alignment_e text_symbolizer::get_justify_alignment() const
+{
+    return placement_options_->get_default_jalign();
+}
+
+text_placements_ptr text_symbolizer::get_placement_options() const
+{
+    return placement_options_;
+}
+
+void text_symbolizer::set_placement_options(text_placements_ptr placement_options)
+{
+    placement_options_ = placement_options;
+}
+
+
 }
diff --git a/src/tiff_reader.cpp b/src/tiff_reader.cpp
index ce646d9..6c000a0 100644
--- a/src/tiff_reader.cpp
+++ b/src/tiff_reader.cpp
@@ -23,10 +23,11 @@
 //$Id: tiff_reader.cpp 17 2005-03-08 23:58:43Z pavlenko $
 // mapnik
 #include <mapnik/image_reader.hpp>
-#include "boost/filesystem/operations.hpp"
+#include <boost/filesystem/operations.hpp>
+
 extern "C" 
 {
-   #include <tiffio.h>    
+#include <tiffio.h>    
 }
 // stl
 #include <iostream>
@@ -34,238 +35,238 @@ extern "C"
 namespace mapnik 
 {
 
-    using std::min;
-    using std::max;
+using std::min;
+using std::max;
 
-    class TiffReader : public ImageReader
-    {
-    private:
-        std::string file_name_;
-        int read_method_;
-        unsigned width_;
-        unsigned height_;
-        int rows_per_strip_;
-        int tile_width_;
-        int tile_height_;
-    public:
-        enum TiffType {
-            generic=1,
-            stripped,
-            tiled
-        };
-        explicit TiffReader(const std::string& file_name);
-        virtual ~TiffReader();
-        unsigned width() const;
-        unsigned height() const;
-        void read(unsigned x,unsigned y,ImageData32& image);
-    private:
-        TiffReader(const TiffReader&);
-        TiffReader& operator=(const TiffReader&);
-        void init();
-        void read_generic(unsigned x,unsigned y,ImageData32& image);
-        void read_stripped(unsigned x,unsigned y,ImageData32& image);
-        void read_tiled(unsigned x,unsigned y,ImageData32& image);
-        TIFF* load_if_exists(const std::string& filename);
+class tiff_reader : public image_reader
+{
+private:
+    std::string file_name_;
+    int read_method_;
+    unsigned width_;
+    unsigned height_;
+    int rows_per_strip_;
+    int tile_width_;
+    int tile_height_;
+public:
+    enum TiffType {
+        generic=1,
+        stripped,
+        tiled
     };
+    explicit tiff_reader(const std::string& file_name);
+    virtual ~tiff_reader();
+    unsigned width() const;
+    unsigned height() const;
+    void read(unsigned x,unsigned y,image_data_32& image);
+private:
+    tiff_reader(const tiff_reader&);
+    tiff_reader& operator=(const tiff_reader&);
+    void init();
+    void read_generic(unsigned x,unsigned y,image_data_32& image);
+    void read_stripped(unsigned x,unsigned y,image_data_32& image);
+    void read_tiled(unsigned x,unsigned y,image_data_32& image);
+    TIFF* load_if_exists(const std::string& filename);
+};
+
+namespace
+{
+image_reader* create_tiff_reader(const std::string& file)
+{
+    return new tiff_reader(file);
+}
+    
+const bool registered = register_image_reader("tiff",create_tiff_reader);
+}
 
-    namespace
-    {
-        ImageReader* createTiffReader(const std::string& file)
-        {
-            return new TiffReader(file);
-        }
-
-        const bool registered = register_image_reader("tiff",createTiffReader);
-    }
-
-    TiffReader::TiffReader(const std::string& file_name)
-        : file_name_(file_name),
-          read_method_(generic),
-          width_(0),
-          height_(0),
-          rows_per_strip_(0),
-          tile_width_(0),
-          tile_height_(0)
-    {
-        init();
-    }
+tiff_reader::tiff_reader(const std::string& file_name)
+    : file_name_(file_name),
+      read_method_(generic),
+      width_(0),
+      height_(0),
+      rows_per_strip_(0),
+      tile_width_(0),
+      tile_height_(0)
+{
+    init();
+}
 
 
-    void TiffReader::init()
+void tiff_reader::init()
+{
+    // TODO: error handling
+    TIFFSetWarningHandler(0);
+    TIFF* tif = load_if_exists(file_name_);
+    if (!tif) throw image_reader_exception ("Can't load tiff file");
+    
+    char msg[1024];
+    
+    if (TIFFRGBAImageOK(tif,msg))
     {
-        // TODO: error handling
-        TIFFSetWarningHandler(0);
-        TIFF* tif = load_if_exists(file_name_);
-        if (!tif) return;
-	
-        char msg[1024];
-
-        if (TIFFRGBAImageOK(tif,msg))
+        TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width_);
+        TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height_);
+        if (TIFFIsTiled(tif))
         {
-            TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width_);
-            TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height_);
-            if (TIFFIsTiled(tif))
-            {
-                TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tile_width_);
-                TIFFGetField(tif, TIFFTAG_TILELENGTH, &tile_height_);
-                read_method_=tiled;
-            }
-            else if (TIFFGetField(tif,TIFFTAG_ROWSPERSTRIP,&rows_per_strip_)!=0)
-            {
-                read_method_=stripped;
-            }
-            TIFFClose(tif);
+            TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tile_width_);
+            TIFFGetField(tif, TIFFTAG_TILELENGTH, &tile_height_);
+            read_method_=tiled;
         }
-        else
+        else if (TIFFGetField(tif,TIFFTAG_ROWSPERSTRIP,&rows_per_strip_)!=0)
         {
-            TIFFClose(tif);
-            throw ImageReaderException(msg);
+            read_method_=stripped;
         }
+        TIFFClose(tif);
     }
-
-
-    TiffReader::~TiffReader()
+    else
     {
-        //
+        TIFFClose(tif);
+        throw image_reader_exception(msg);
     }
+}
 
 
-    unsigned TiffReader::width() const
-    {
-        return width_;
-    }
+tiff_reader::~tiff_reader()
+{
+    //
+}
 
 
-    unsigned TiffReader::height() const
-    {
-        return height_;
-    }
+unsigned tiff_reader::width() const
+{
+    return width_;
+}
 
 
-    void TiffReader::read(unsigned x,unsigned y,ImageData32& image)
-    {    
-        if (read_method_==stripped)
-        {
-            read_stripped(x,y,image);
-        }
-        else if (read_method_==tiled)
-        {
-            read_tiled(x,y,image);
-        }
-        else
-        {
-            read_generic(x,y,image);
-        }
+unsigned tiff_reader::height() const
+{
+    return height_;
+}
+
+
+void tiff_reader::read(unsigned x,unsigned y,image_data_32& image)
+{    
+    if (read_method_==stripped)
+    {
+        read_stripped(x,y,image);
     }
+    else if (read_method_==tiled)
+    {
+        read_tiled(x,y,image);
+    }
+    else
+    {
+        read_generic(x,y,image);
+    }
+}
 
 
-    void TiffReader::read_generic(unsigned x,unsigned y,ImageData32& image)
+void tiff_reader::read_generic(unsigned /*x*/,unsigned /*y*/,image_data_32& /*image*/)
+{
+    TIFF* tif = load_if_exists(file_name_);
+    if (tif)
     {
-	TIFF* tif = load_if_exists(file_name_);
-        if (tif)
-        {
-            std::clog<<"TODO:tiff is not stripped or tiled\n";
-            TIFFClose(tif);
-        }
+        std::clog << "TODO:tiff is not stripped or tiled\n";
+        TIFFClose(tif);
     }
+}
 
 
-    void TiffReader::read_tiled(unsigned x0,unsigned y0,ImageData32& image)
+void tiff_reader::read_tiled(unsigned x0,unsigned y0,image_data_32& image)
+{
+    TIFF* tif = load_if_exists(file_name_);
+    if (tif)
     {
-	TIFF* tif = load_if_exists(file_name_);
-        if (tif)
-        {
-            uint32* buf = (uint32*)_TIFFmalloc(tile_width_*tile_height_*sizeof(uint32));
-            int width=image.width();
-            int height=image.height();
+        uint32* buf = (uint32*)_TIFFmalloc(tile_width_*tile_height_*sizeof(uint32));
+        int width=image.width();
+        int height=image.height();
 
-            int start_y=(y0/tile_height_)*tile_height_;
-            int end_y=((y0+height)/tile_height_+1)*tile_height_;
+        int start_y=(y0/tile_height_)*tile_height_;
+        int end_y=((y0+height)/tile_height_+1)*tile_height_;
 
-            int start_x=(x0/tile_width_)*tile_width_;
-            int end_x=((x0+width)/tile_width_+1)*tile_width_;
-            int row,tx0,tx1,ty0,ty1;
+        int start_x=(x0/tile_width_)*tile_width_;
+        int end_x=((x0+width)/tile_width_+1)*tile_width_;
+        int row,tx0,tx1,ty0,ty1;
 
-            for (int y=start_y;y<end_y;y+=tile_height_)
-            {
-                ty0 = max(y0,(unsigned)y) - y;
-                ty1 = min(height+y0,(unsigned)(y+tile_height_)) - y;
+        for (int y=start_y;y<end_y;y+=tile_height_)
+        {
+            ty0 = max(y0,(unsigned)y) - y;
+            ty1 = min(height+y0,(unsigned)(y+tile_height_)) - y;
 
-                int n0=tile_height_-ty1;
-                int n1=tile_height_-ty0-1;
+            int n0=tile_height_-ty1;
+            int n1=tile_height_-ty0-1;
 
-                for (int x=start_x;x<end_x;x+=tile_width_)
-                {
+            for (int x=start_x;x<end_x;x+=tile_width_)
+            {
 
-                    if (!TIFFReadRGBATile(tif,x,y,buf)) break;
+                if (!TIFFReadRGBATile(tif,x,y,buf)) break;
 
-                    tx0=max(x0,(unsigned)x);
-                    tx1=min(width+x0,(unsigned)(x+tile_width_));
-                    row=y+ty0-y0;
-                    for (int n=n1;n>=n0;--n)
-                    {
-                        image.setRow(row,tx0-x0,tx1-x0,(const unsigned*)&buf[n*tile_width_+tx0-x]);
-                        ++row;
-                    }
+                tx0=max(x0,(unsigned)x);
+                tx1=min(width+x0,(unsigned)(x+tile_width_));
+                row=y+ty0-y0;
+                for (int n=n1;n>=n0;--n)
+                {
+                    image.setRow(row,tx0-x0,tx1-x0,(const unsigned*)&buf[n*tile_width_+tx0-x]);
+                    ++row;
                 }
             }
-            _TIFFfree(buf);
-            TIFFClose(tif);
         }
+        _TIFFfree(buf);
+        TIFFClose(tif);
     }
+}
 
 
-    void TiffReader::read_stripped(unsigned x0,unsigned y0,ImageData32& image)
+void tiff_reader::read_stripped(unsigned x0,unsigned y0,image_data_32& image)
+{
+    TIFF* tif = load_if_exists(file_name_);
+    if (tif)
     {
-	TIFF* tif = load_if_exists(file_name_);
-        if (tif)
-        {
-            uint32* buf = (uint32*)_TIFFmalloc(width_*rows_per_strip_*sizeof(uint32));
+        uint32* buf = (uint32*)_TIFFmalloc(width_*rows_per_strip_*sizeof(uint32));
 
-            int width=image.width();
-            int height=image.height();
+        int width=image.width();
+        int height=image.height();
 
-            unsigned start_y=(y0/rows_per_strip_)*rows_per_strip_;
-            unsigned end_y=((y0+height)/rows_per_strip_+1)*rows_per_strip_;
-            bool laststrip=((unsigned)end_y > height_)?true:false;
-            int row,tx0,tx1,ty0,ty1;
+        unsigned start_y=(y0/rows_per_strip_)*rows_per_strip_;
+        unsigned end_y=((y0+height)/rows_per_strip_+1)*rows_per_strip_;
+        bool laststrip=((unsigned)end_y > height_)?true:false;
+        int row,tx0,tx1,ty0,ty1;
 
-            tx0=x0;
-            tx1=min(width+x0,(unsigned)width_);
+        tx0=x0;
+        tx1=min(width+x0,(unsigned)width_);
 
-            for (unsigned y=start_y; y < end_y; y+=rows_per_strip_)
-            {
-                ty0 = max(y0,y)-y;
-                ty1 = min(height+y0,y+rows_per_strip_)-y;
+        for (unsigned y=start_y; y < end_y; y+=rows_per_strip_)
+        {
+            ty0 = max(y0,y)-y;
+            ty1 = min(height+y0,y+rows_per_strip_)-y;
 
-                if (!TIFFReadRGBAStrip(tif,y,buf)) break;
+            if (!TIFFReadRGBAStrip(tif,y,buf)) break;
 
-                row=y+ty0-y0;
+            row=y+ty0-y0;
 
-                int n0=laststrip ? 0:(rows_per_strip_-ty1);
-                int n1=laststrip ? (ty1-ty0-1):(rows_per_strip_-ty0-1);
-                for (int n=n1;n>=n0;--n)
-                {
-                    image.setRow(row,tx0-x0,tx1-x0,(const unsigned*)&buf[n*width_+tx0]);
-                    ++row;
-                }
+            int n0=laststrip ? 0:(rows_per_strip_-ty1);
+            int n1=laststrip ? (ty1-ty0-1):(rows_per_strip_-ty0-1);
+            for (int n=n1;n>=n0;--n)
+            {
+                image.setRow(row,tx0-x0,tx1-x0,(const unsigned*)&buf[n*width_+tx0]);
+                ++row;
             }
-            _TIFFfree(buf);
-            TIFFClose(tif);
         }
+        _TIFFfree(buf);
+        TIFFClose(tif);
     }
+}
     
-    TIFF* TiffReader::load_if_exists(std::string const& filename)
-    {
-        TIFF * tif = 0;
-        boost::filesystem::path path(file_name_);
-        if (exists(path)) //  && is_regular(path)) { -- not supported in boost-1.33.*
-        {    
-            // File path is a full file path and does exist
-            tif = TIFFOpen(filename.c_str(), "rb");
-        }
-        
-        return tif;
+TIFF* tiff_reader::load_if_exists(std::string const& filename)
+{
+    TIFF * tif = 0;
+    boost::filesystem::path path(file_name_);
+    if (exists(path)) //  && is_regular(path)) { -- not supported in boost-1.33.*
+    {    
+        // File path is a full file path and does exist
+        tif = TIFFOpen(filename.c_str(), "rb");
     }
+        
+    return tif;
+}
 }
 
diff --git a/src/unicode.cpp b/src/unicode.cpp
index 874943d..a768705 100644
--- a/src/unicode.cpp
+++ b/src/unicode.cpp
@@ -2,7 +2,7 @@
  * 
  * This file is part of Mapnik (c++ mapping toolkit)
  *
- * Copyright (C) 2006 Artem Pavlenko
+ * Copyright (C) 2006,2009 Artem Pavlenko
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -25,10 +25,6 @@
 #include <cstdlib>
 #include <mapnik/unicode.hpp>
 
-#ifdef USE_FRIBIDI
-#include <fribidi/fribidi.h>
-#endif
-
 #include <string>
 
 #ifdef MAPNIK_DEBUG
@@ -36,188 +32,31 @@
 #endif 
 
 namespace mapnik {
-    
-/*
-** Use FRIBIDI to encode the string.
-** The return value must be freed by the caller.
-*/
-
-#ifdef USE_FRIBIDI
-    inline wchar_t* bidi_string(const wchar_t *logical)
-    {
-        FriBidiCharType base = FRIBIDI_TYPE_ON;
-        size_t len;
-
-        len = wcslen(logical);
-
-        FriBidiChar *visual;
-
-        FriBidiStrIndex *ltov, *vtol;
-        FriBidiLevel *levels;
-        FriBidiStrIndex new_len;
-        fribidi_boolean log2vis;
-        
-        visual = (FriBidiChar *) calloc (sizeof (FriBidiChar), len + 1);
-        ltov = 0;
-        vtol = 0;
-        levels = 0;
-
-        /* Create a bidi string. */
-        log2vis = fribidi_log2vis ((FriBidiChar *)logical, len, &base,
-                /* output */
-                visual, ltov, vtol, levels);
 
-        if (!log2vis) {
-            return 0;
-        }
-
-        new_len = len;
-
-        return (wchar_t *)visual;
-    }
-#endif
+transcoder::transcoder (std::string const& encoding)
+    : ok_(false),
+      conv_(0)
+{
+    UErrorCode err = U_ZERO_ERROR;
+    conv_ = ucnv_open(encoding.c_str(),&err);
+    if (U_SUCCESS(err)) ok_ = true;
+    // TODO ??
+}
 
-/*
-    inline std::wstring to_unicode(std::string const& text)
+UnicodeString transcoder::transcode(const char* data, boost::int32_t length) const
+{
+    UErrorCode err = U_ZERO_ERROR;
+    
+    UnicodeString ustr(data,length,conv_,err); 
+    if (ustr.isBogus())
     {
-        std::wstring out;
-        unsigned long code = 0;
-        int expect = 0;
-        std::string::const_iterator itr=text.begin();
-        std::string::const_iterator end=text.end();
-        while ( itr != end)
-        {
-            unsigned p = (*itr++) & 0xff;
-            if ( p >= 0xc0)
-            {
-                if ( p < 0xe0)      // U+0080 - U+07ff
-                {
-                    expect = 1;
-                    code = p & 0x1f;
-                }
-                else if ( p < 0xf0)  // U+0800 - U+ffff
-                {
-                    expect = 2;
-                    code = p & 0x0f;
-                }
-                else if ( p  < 0xf8) // U+1000 - U+10ffff
-                {
-                    expect = 3;
-                    code = p & 0x07;
-                }
-                continue;
-            }
-            else if (p >= 0x80)
-            {
-                --expect;
-                if (expect >= 0)
-                {
-                    code <<= 6;
-                    code += p & 0x3f;
-                }
-                if (expect > 0)
-                    continue;
-                expect = 0;
-            }
-            else 
-            {
-                code = p;            // U+0000 - U+007f (ascii)
-            }
-            out.push_back(wchar_t(code));
-        }
-#ifdef USE_FRIBIDI
-        wchar_t *bidi_text = bidi_string(out.c_str());
-        out = bidi_text;
-        free(bidi_text);
-#endif
-        
-        return out;
+        ustr.remove();
     }
-   
-   inline std::wstring latin1_to_unicode(std::string const& text)
-   {
-      std::wstring out;
-      std::string::const_iterator itr=text.begin();
-      std::string::const_iterator end=text.end();
-      while ( itr != end)
-      {
-         unsigned p = (*itr++) & 0xff;     
-         out.push_back(wchar_t(p));
-      }      
-      return out;
-   }
-
-   inline std::string latin1_to_unicode2(std::string const& text)
-   {
-      std::string out;
-      std::string::const_iterator itr=text.begin();
-      std::string::const_iterator end=text.end();
-      while ( itr != end)
-      {
-         out.push_back(0x00);
-         out.push_back(*itr++);  
-      }      
-      return out;
-   }
-   
-*/
-   transcoder::transcoder (std::string const& encoding)
-      : ok_(false),
-        conv_(0)
-   {
-      
-//#ifndef WORDS_BIGENDIAN
-         //     desc_ = iconv_open("UCS-4LE",encoding.c_str());
-//#else
-         //     desc_ = iconv_open("UCS-4BE",encoding.c_str());
-//#endif
-      
-      UErrorCode err = U_ZERO_ERROR;
-      conv_ = ucnv_open(encoding.c_str(),&err);
-      if (U_SUCCESS(err)) ok_ = true;
-      // TODO
-   }
-   
-   UnicodeString transcoder::transcode(const char* data) const
-   {
+    return ustr;
+}
 
-      UErrorCode err = U_ZERO_ERROR;
-      
-      UnicodeString ustr(data,-1,conv_,err); 
-      if (ustr.isBogus())
-      {
-         ustr.remove();
-      }
-      return ustr;
-/*
-      if (desc_ == iconv_t(-1)) return to_unicode(input); 
-      size_t inleft = input.size();
-      std::wstring output(inleft,0);
-      size_t outleft = inleft * sizeof(wchar_t);
-#if (!defined(OSX_LEOPARD) && defined(DARWIN)) || defined(SUNOS) || defined(FREEBSD)
-      const char * in = input.c_str();
-#else
-      char * in = const_cast<char*>(input.data());
-#endif
-      char * out = const_cast<char*>(reinterpret_cast<const char*>(output.data()));			
-      iconv(desc_,&in,&inleft,&out,&outleft);
-      output = output.substr(0,output.size()-(outleft/sizeof(wchar_t)));
-#ifdef USE_FRIBIDI
-      if (output.length() > 0)
-      {
-         wchar_t *bidi_text = bidi_string(output.c_str());
-         output = bidi_text;
-         free(bidi_text);
-      }
-#endif
-      return output;
-*/
-   }
-   
-   transcoder::~transcoder()
-   {
-      // if (desc_ != iconv_t(-1)) iconv_close(desc_);
-      if (conv_)
-         ucnv_close(conv_);
-   }   
+transcoder::~transcoder()
+{
+    if (conv_) ucnv_close(conv_);
+}   
 }
diff --git a/src/warp.cpp b/src/warp.cpp
new file mode 100644
index 0000000..b9768d1
--- /dev/null
+++ b/src/warp.cpp
@@ -0,0 +1,210 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+//$Id$
+
+// mapnik
+#include <mapnik/warp.hpp>
+#include <mapnik/config.hpp>
+#include <mapnik/image_data.hpp>
+#include <mapnik/image_util.hpp>
+#include <mapnik/box2d.hpp>
+#include <mapnik/ctrans.hpp>
+
+// agg
+#include "agg_image_filters.h"
+#include "agg_trans_bilinear.h"
+#include "agg_span_interpolator_linear.h"
+#include "agg_span_image_filter_rgba.h"
+#include "agg_rendering_buffer.h"
+#include "agg_pixfmt_rgba.h"
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_basics.h"
+#include "agg_scanline_u.h"
+#include "agg_renderer_scanline.h"
+#include "agg_span_allocator.h"
+#include "agg_image_accessors.h"
+#include "agg_renderer_scanline.h"
+
+namespace mapnik {
+
+void reproject_raster(raster &target, raster const& source,
+                      proj_transform const& prj_trans,
+                      double offset_x, double offset_y,
+                      unsigned mesh_size,
+                      double filter_radius,
+                      double scale_factor,
+                      std::string scaling_method_name)
+{
+    if (prj_trans.equal()) {
+    
+        if (scaling_method_name == "bilinear8"){
+            scale_image_bilinear8<image_data_32>(target.data_,source.data_,
+                                                 offset_x, offset_y);
+        } else {
+            scaling_method_e scaling_method = get_scaling_method_by_name(scaling_method_name);
+            scale_image_agg<image_data_32>(target.data_,source.data_, (scaling_method_e)scaling_method, scale_factor, offset_x, offset_y, filter_radius);
+        }
+    } else {
+        CoordTransform ts(source.data_.width(), source.data_.height(),
+                          source.ext_);
+        CoordTransform tt(target.data_.width(), target.data_.height(),
+                          target.ext_, offset_x, offset_y);
+        unsigned i, j;
+        unsigned mesh_nx = ceil(source.data_.width()/double(mesh_size)+1);
+        unsigned mesh_ny = ceil(source.data_.height()/double(mesh_size)+1);
+
+        ImageData<double> xs(mesh_nx, mesh_ny);
+        ImageData<double> ys(mesh_nx, mesh_ny);
+
+        // Precalculate reprojected mesh
+        for(j=0; j<mesh_ny; j++) {
+            for (i=0; i<mesh_nx; i++) {
+                xs(i,j) = i*mesh_size;
+                ys(i,j) = j*mesh_size;
+                ts.backward(&xs(i,j), &ys(i,j));
+            }
+        }
+        prj_trans.backward(xs.getData(), ys.getData(), NULL, mesh_nx*mesh_ny);
+
+        // Initialize AGG objects
+        typedef agg::pixfmt_rgba32 pixfmt;
+        typedef pixfmt::color_type color_type;
+        typedef agg::renderer_base<pixfmt> renderer_base;
+        typedef agg::pixfmt_rgba32_pre pixfmt_pre;
+        typedef agg::renderer_base<pixfmt_pre> renderer_base_pre;
+
+        agg::rasterizer_scanline_aa<> rasterizer;
+        agg::scanline_u8  scanline;
+        agg::rendering_buffer buf((unsigned char*)target.data_.getData(),
+                                  target.data_.width(),
+                                  target.data_.height(),
+                                  target.data_.width()*4);
+        pixfmt_pre pixf_pre(buf);
+        renderer_base_pre rb_pre(pixf_pre);
+        rasterizer.clip_box(0, 0, target.data_.width(), target.data_.height());
+        agg::rendering_buffer buf_tile(
+            (unsigned char*)source.data_.getData(),
+            source.data_.width(),
+            source.data_.height(),
+            source.data_.width() * 4);
+
+        pixfmt pixf_tile(buf_tile);
+
+        typedef agg::image_accessor_clone<pixfmt> img_accessor_type;
+        img_accessor_type ia(pixf_tile);
+
+        agg::span_allocator<color_type> sa;
+
+        // Initialize filter
+        agg::image_filter_lut filter;
+        scaling_method_e scaling_method = get_scaling_method_by_name(
+            scaling_method_name);
+        switch(scaling_method)
+        {
+            case SCALING_NEAR: break;
+            case SCALING_BILINEAR:
+                filter.calculate(agg::image_filter_bilinear(), true); break;
+            case SCALING_BICUBIC:
+                filter.calculate(agg::image_filter_bicubic(), true); break;
+            case SCALING_SPLINE16:
+                filter.calculate(agg::image_filter_spline16(), true); break;
+            case SCALING_SPLINE36:
+                filter.calculate(agg::image_filter_spline36(), true); break;
+            case SCALING_HANNING:
+                filter.calculate(agg::image_filter_hanning(), true); break;
+            case SCALING_HAMMING:
+                filter.calculate(agg::image_filter_hamming(), true); break;
+            case SCALING_HERMITE:
+                filter.calculate(agg::image_filter_hermite(), true); break;
+            case SCALING_KAISER:
+                filter.calculate(agg::image_filter_kaiser(), true); break;
+            case SCALING_QUADRIC:
+                filter.calculate(agg::image_filter_quadric(), true); break;
+            case SCALING_CATROM:
+                filter.calculate(agg::image_filter_catrom(), true); break;
+            case SCALING_GAUSSIAN:
+                filter.calculate(agg::image_filter_gaussian(), true); break;
+            case SCALING_BESSEL:
+                filter.calculate(agg::image_filter_bessel(), true); break;
+            case SCALING_MITCHELL:
+                filter.calculate(agg::image_filter_mitchell(), true); break;
+            case SCALING_SINC:
+                filter.calculate(agg::image_filter_sinc(filter_radius), true); break;
+            case SCALING_LANCZOS:
+                filter.calculate(agg::image_filter_lanczos(filter_radius), true); break;
+            case SCALING_BLACKMAN:
+                filter.calculate(agg::image_filter_blackman(filter_radius), true); break;
+        }
+
+        // Project mesh cells into target interpolating raster inside each one
+        for(j=0; j<mesh_ny-1; j++) {
+            for (i=0; i<mesh_nx-1; i++) {
+                double polygon[8] = {xs(i,j), ys(i,j),
+                                     xs(i+1,j), ys(i+1,j),
+                                     xs(i+1,j+1), ys(i+1,j+1),
+                                     xs(i,j+1), ys(i,j+1)};
+                tt.forward(polygon+0, polygon+1);
+                tt.forward(polygon+2, polygon+3);
+                tt.forward(polygon+4, polygon+5);
+                tt.forward(polygon+6, polygon+7);
+
+                rasterizer.reset();
+                rasterizer.move_to_d(polygon[0]-1, polygon[1]-1);
+                rasterizer.line_to_d(polygon[2]+1, polygon[3]-1);
+                rasterizer.line_to_d(polygon[4]+1, polygon[5]+1);
+                rasterizer.line_to_d(polygon[6]-1, polygon[7]+1);
+
+                unsigned x0 = i * mesh_size;
+                unsigned y0 = j * mesh_size;
+                unsigned x1 = (i+1) * mesh_size;
+                unsigned y1 = (j+1) * mesh_size;
+
+                agg::trans_affine tr(polygon, x0, y0, x1, y1);
+                if (tr.is_valid())
+                {
+                    typedef agg::span_interpolator_linear<agg::trans_affine>
+                        interpolator_type;
+                    interpolator_type interpolator(tr);
+
+                    if (scaling_method == SCALING_NEAR) {
+                        typedef agg::span_image_filter_rgba_nn
+                            <img_accessor_type, interpolator_type>
+                            span_gen_type;
+                        span_gen_type sg(ia, interpolator);
+                        agg::render_scanlines_aa(rasterizer, scanline, rb_pre,
+                                                 sa, sg);
+                    } else {
+                        typedef agg::span_image_filter_rgba_2x2
+                            <img_accessor_type, interpolator_type>
+                            span_gen_type;
+
+                        span_gen_type sg(ia, interpolator, filter);
+                        agg::render_scanlines_aa(rasterizer, scanline, rb_pre,
+                                                 sa, sg);
+                    }
+                }
+
+            }
+        }
+    }
+}
+}// namespace mapnik
diff --git a/src/wkb.cpp b/src/wkb.cpp
index dcefbbc..f193776 100644
--- a/src/wkb.cpp
+++ b/src/wkb.cpp
@@ -32,264 +32,301 @@
 
 namespace mapnik
 {
-    struct wkb_reader : boost::noncopyable
-    {
-    private:
-        enum wkbByteOrder {
-            wkbXDR=0,
-            wkbNDR=1
-        };
-        const char* wkb_;
-        unsigned size_;
-        unsigned pos_;
-        wkbByteOrder byteOrder_;
-        bool needSwap_;
-        wkbFormat format_;
+struct wkb_reader : boost::noncopyable
+{
+private:
+    enum wkbByteOrder {
+        wkbXDR=0,
+        wkbNDR=1
+    };
+    const char* wkb_;
+    unsigned size_;
+    unsigned pos_;
+    wkbByteOrder byteOrder_;
+    bool needSwap_;
+    wkbFormat format_;
 
-    public:
-	
-        enum wkbGeometryType {
-            wkbPoint=1,
-            wkbLineString=2,
-            wkbPolygon=3,
-            wkbMultiPoint=4,
-            wkbMultiLineString=5,
-            wkbMultiPolygon=6,
-            wkbGeometryCollection=7
-        };
-	
-        wkb_reader(const char* wkb,unsigned size,wkbFormat format)
-            : wkb_(wkb),
-              size_(size),
-              pos_(0),
-              format_(format)
+public:
+        
+    enum wkbGeometryType {
+        wkbPoint=1,
+        wkbLineString=2,
+        wkbPolygon=3,
+        wkbMultiPoint=4,
+        wkbMultiLineString=5,
+        wkbMultiPolygon=6,
+        wkbGeometryCollection=7
+    };
+        
+    wkb_reader(const char* wkb,unsigned size, wkbFormat format)
+        : wkb_(wkb),
+          size_(size),
+          pos_(0),
+          format_(format)
+    {
+        switch (format_)
         {
-            switch (format_)
-            {
-            case wkbSpatiaLite:
-                byteOrder_ = (wkbByteOrder) wkb_[1];
-                pos_ = 39;
-                break;
+        case wkbSpatiaLite:
+            byteOrder_ = (wkbByteOrder) wkb_[1];
+            pos_ = 39;
+            break;
 
-            case wkbGeneric:
-            default:
-                byteOrder_ = (wkbByteOrder) wkb_[0];
-                pos_ = 1;
-                break;
-            }
+        case wkbGeneric:
+        default:
+            byteOrder_ = (wkbByteOrder) wkb_[0];
+            pos_ = 1;
+            break;
+        }
 
 #ifndef MAPNIK_BIG_ENDIAN
-            needSwap_=byteOrder_?wkbXDR:wkbNDR;
+        needSwap_=byteOrder_?wkbXDR:wkbNDR;
 #else
-            needSwap_=byteOrder_?wkbNDR:wkbXDR;	
-#endif	    
-        }
+        needSwap_=byteOrder_?wkbNDR:wkbXDR;     
+#endif      
+    }
 
-        ~wkb_reader() {}
+    ~wkb_reader() {}
 
-        void read_multi(Feature & feature) 
+    void read_multi(boost::ptr_vector<geometry_type> & paths) 
+    {
+        int type=read_integer();
+        switch (type)
         {
-            int type=read_integer();
-            switch (type)
-            {
-            case wkbPoint:
-                read_point(feature);
-                break;
-            case wkbLineString:
-                read_linestring(feature);
-                break;
-            case wkbPolygon:
-                read_polygon(feature);
-                break;
-            case wkbMultiPoint:
-                read_multipoint(feature);
-                break;
-            case wkbMultiLineString:
-                read_multilinestring(feature);
-                break;
-            case wkbMultiPolygon:
-                read_multipolygon(feature);
-                break;
-            case wkbGeometryCollection:
-                break;
-            default:
-                break;
-            }
+        case wkbPoint:
+            read_point(paths);
+            break;
+        case wkbLineString:
+            read_linestring(paths);
+            break;
+        case wkbPolygon:
+            read_polygon(paths);
+            break;
+        case wkbMultiPoint:
+            read_multipoint(paths);
+            break;
+        case wkbMultiLineString:
+            read_multilinestring(paths);
+            break;
+        case wkbMultiPolygon:
+            read_multipolygon(paths);
+            break;
+        case wkbGeometryCollection:
+            read_collection(paths);
+            break;
+        default:
+            break;
         }
+    }
          
-        void read(Feature & feature) 
+    void read(boost::ptr_vector<geometry_type> & paths) 
+    {
+        int type=read_integer();
+        switch (type)
         {
-            int type=read_integer();
-            switch (type)
-            {
-            case wkbPoint:
-                read_point(feature);
-                break;
-            case wkbLineString:
-                read_linestring(feature);
-                break;
-            case wkbPolygon:
-                read_polygon(feature);
-                break;
-            case wkbMultiPoint:
-                read_multipoint_2(feature);
-                break;
-            case wkbMultiLineString:
-                read_multilinestring_2(feature);
-                break;
-            case wkbMultiPolygon:
-                read_multipolygon_2(feature);
-                break;
-            case wkbGeometryCollection:
-                break;
-            default:
-                break;
-            }
+        case wkbPoint:
+            read_point(paths);
+            break;
+        case wkbLineString:
+            read_linestring(paths);
+            break;
+        case wkbPolygon:
+            read_polygon(paths);
+            break;
+        case wkbMultiPoint:
+            read_multipoint_2(paths);
+            break;
+        case wkbMultiLineString:
+            read_multilinestring_2(paths);
+            break;
+        case wkbMultiPolygon:
+            read_multipolygon_2(paths);
+            break;
+        case wkbGeometryCollection:
+            read_collection_2(paths);
+            break;
+        default:
+            break;
         }
+    }
           
-    private:
+private:
         
-        int read_integer() 
+    int read_integer() 
+    {
+        boost::int32_t n;
+        if (needSwap_)
         {
-	    boost::int32_t n;
-            if (needSwap_)
-            {
-                read_int32_xdr(wkb_+pos_,n);
-            } 
-            else 
-            {
-                read_int32_ndr(wkb_+pos_,n);
-            }
-            pos_+=4;
+            read_int32_xdr(wkb_+pos_,n);
+        } 
+        else 
+        {
+            read_int32_ndr(wkb_+pos_,n);
+        }
+        pos_+=4;
             
-            return n;
+        return n;
+    }
+        
+    double read_double()
+    {
+        double d;
+        if (needSwap_)
+        {
+            read_double_xdr(wkb_ + pos_, d);
         }
-	
-        double read_double()
+        else 
         {
-            double d;
-            if (needSwap_)
-            {
-                read_double_xdr(wkb_ + pos_, d);
-            }
-            else 
-            {
-                read_double_ndr(wkb_ + pos_, d);
-            }
-            pos_+=8;
+            read_double_ndr(wkb_ + pos_, d);
+        }
+        pos_+=8;
             
-            return d;
+        return d;
+    }
+        
+    void read_coords(CoordinateArray& ar)
+    {
+        int size=sizeof(coord<double,2>)*ar.size();
+        if (!needSwap_)
+        {
+            std::memcpy(&ar[0],wkb_+pos_,size);
+            pos_+=size;
         }
-	
-        void read_coords(CoordinateArray& ar)
+        else 
         {
-            int size=sizeof(coord<double,2>)*ar.size();
-            if (!needSwap_)
-            {
-                std::memcpy(&ar[0],wkb_+pos_,size);
-                pos_+=size;
-            }
-            else 
+            for (unsigned i=0;i<ar.size();++i)
             {
-                for (unsigned i=0;i<ar.size();++i)
-                {
-                    read_double_xdr(wkb_ + pos_,ar[i].x);
-                    read_double_xdr(wkb_ + pos_ + 8,ar[i].y);
-                    pos_ += 16;
-                }
+                read_double_xdr(wkb_ + pos_,ar[i].x);
+                read_double_xdr(wkb_ + pos_ + 8,ar[i].y);
+                pos_ += 16;
             }
+        }
             
+    }
+        
+    void read_point(boost::ptr_vector<geometry_type> & paths)
+    {
+        geometry_type * pt = new geometry_type(Point);
+        double x = read_double();
+        double y = read_double();
+        pt->move_to(x,y);
+        paths.push_back(pt);
+    }
+         
+    void read_multipoint(boost::ptr_vector<geometry_type> & paths)
+    {
+        int num_points = read_integer();
+        for (int i=0;i<num_points;++i) 
+        {
+            pos_+=5;
+            read_point(paths);
         }
-	
-        void read_point(Feature & feature)
+    }
+         
+    void read_multipoint_2(boost::ptr_vector<geometry_type> & paths)
+    {
+        geometry_type * pt = new geometry_type(MultiPoint);
+        int num_points = read_integer(); 
+        for (int i=0;i<num_points;++i) 
         {
-            geometry2d * pt = new point<vertex2d>;
+            pos_+=5;
             double x = read_double();
             double y = read_double();
             pt->move_to(x,y);
-            feature.add_geometry(pt);
         }
+        paths.push_back(pt);
+    }
          
-        void read_multipoint(Feature & feature)
+    void read_linestring(boost::ptr_vector<geometry_type> & paths)
+    {
+        geometry_type * line = new geometry_type(LineString);
+        int num_points=read_integer();
+        CoordinateArray ar(num_points);
+        read_coords(ar);
+        line->set_capacity(num_points);
+        line->move_to(ar[0].x,ar[0].y);
+        for (int i=1;i<num_points;++i)
         {
-            int num_points = read_integer();
-            for (int i=0;i<num_points;++i) 
-            {
-                pos_+=5;
-                read_point(feature);
-            }
+            line->line_to(ar[i].x,ar[i].y);
         }
+        paths.push_back(line);
+    }
          
-        void read_multipoint_2(Feature & feature)
+    void read_multilinestring(boost::ptr_vector<geometry_type> & paths)
+    {
+        int num_lines=read_integer();
+        for (int i=0;i<num_lines;++i)
         {
-            geometry2d * pt = new point<vertex2d>;
-            int num_points = read_integer(); 
-            for (int i=0;i<num_points;++i) 
-            {
-                pos_+=5;
-                double x = read_double();
-                double y = read_double();
-                pt->move_to(x,y);
-            }
-            feature.add_geometry(pt);
+            pos_+=5;
+            read_linestring(paths);
         }
-         
-        void read_linestring(Feature & feature)
+    }
+
+    void read_multilinestring_2(boost::ptr_vector<geometry_type> & paths)
+    {
+        geometry_type * line = new geometry_type(MultiLineString);
+        int num_lines=read_integer();
+        unsigned capacity = 0;
+        for (int i=0;i<num_lines;++i)
         {
-            geometry2d * line = new line_string<vertex2d>;
+            pos_+=5;
             int num_points=read_integer();
-            CoordinateArray ar(num_points);
+            capacity+=num_points;
+            CoordinateArray ar(num_points); 
             read_coords(ar);
-            line->set_capacity(num_points);
-            line->move_to(ar[0].x,ar[0].y);
-            for (int i=1;i<num_points;++i)
-            {
-                line->line_to(ar[i].x,ar[i].y);
-            }
-            feature.add_geometry(line);
+            line->set_capacity(capacity);
+            line->move_to(ar[0].x,ar[0].y); 
+            for (int j=1;j<num_points;++j) 
+            { 
+                line->line_to(ar[j].x,ar[j].y); 
+            } 
         }
+        paths.push_back(line);
+    }
          
-        void read_multilinestring(Feature & feature)
+    void read_polygon(boost::ptr_vector<geometry_type> & paths) 
+    {
+        geometry_type * poly = new geometry_type(Polygon);
+        int num_rings=read_integer();
+        unsigned capacity = 0;
+        for (int i=0;i<num_rings;++i)
         {
-            int num_lines=read_integer();
-            for (int i=0;i<num_lines;++i)
+            int num_points=read_integer();
+            capacity+=num_points;
+            CoordinateArray ar(num_points);
+            read_coords(ar);
+            poly->set_capacity(capacity);
+            poly->move_to(ar[0].x,ar[0].y);
+            for (int j=1;j<num_points;++j)
             {
-                pos_+=5;
-                read_linestring(feature);
+                poly->line_to(ar[j].x,ar[j].y);
             }
         }
-
-        void read_multilinestring_2(Feature & feature)
+        paths.push_back(poly);
+    }
+        
+    void read_multipolygon(boost::ptr_vector<geometry_type> & paths)
+    {
+        int num_polys=read_integer();
+        for (int i=0;i<num_polys;++i)
         {
-            geometry2d * line = new line_string<vertex2d>;
-            int num_lines=read_integer();
-            unsigned capacity = 0;
-            for (int i=0;i<num_lines;++i)
-            {
-                pos_+=5;
-                int num_points=read_integer();
-                capacity+=num_points;
-                CoordinateArray ar(num_points); 
-                read_coords(ar);
-                line->set_capacity(capacity);
-                line->move_to(ar[0].x,ar[0].y); 
-                for (int i=1;i<num_points;++i) 
-                { 
-                    line->line_to(ar[i].x,ar[i].y); 
-                } 
-            }
-            feature.add_geometry(line);
+            pos_+=5;
+            read_polygon(paths);
         }
-         
-        void read_polygon(Feature & feature) 
+    }
+    
+    void read_multipolygon_2(boost::ptr_vector<geometry_type> & paths)
+    {
+        geometry_type * poly = new geometry_type(MultiPolygon);
+        int num_polys=read_integer();
+        unsigned capacity = 0;
+        for (int i=0;i<num_polys;++i)
         {
-            geometry2d * poly = new polygon<vertex2d>;
+            pos_+=5;
             int num_rings=read_integer();
-            unsigned capacity = 0;
-            for (int i=0;i<num_rings;++i)
+            for (int r=0;r<num_rings;++r)
             {
                 int num_points=read_integer();
-                capacity+=num_points;
+                capacity += num_points;
                 CoordinateArray ar(num_points);
                 read_coords(ar);
                 poly->set_capacity(capacity);
@@ -298,59 +335,43 @@ namespace mapnik
                 {
                     poly->line_to(ar[j].x,ar[j].y);
                 }
-            }
-            feature.add_geometry(poly);
-        }
-	
-        void read_multipolygon(Feature & feature)
-        {
-            int num_polys=read_integer();
-            for (int i=0;i<num_polys;++i)
-            {
-                pos_+=5;
-                read_polygon(feature);
+                poly->line_to(ar[0].x,ar[0].y);
             }
         }
+        paths.push_back(poly);
+    }
 
-        void read_multipolygon_2(Feature & feature)
+    void read_collection(boost::ptr_vector<geometry_type> & paths)
+    {
+        int num_geometries=read_integer();
+        for (int i=0;i<num_geometries;++i)
         {
-            geometry2d * poly = new polygon<vertex2d>;
-            int num_polys=read_integer();
-            unsigned capacity = 0;
-            for (int i=0;i<num_polys;++i)
-            {
-                pos_+=5;
-                int num_rings=read_integer();
-                for (int i=0;i<num_rings;++i)
-                {
-                    int num_points=read_integer();
-                    capacity += num_points;
-                    CoordinateArray ar(num_points);
-                    read_coords(ar);
-                    poly->set_capacity(capacity);
-                    poly->move_to(ar[0].x,ar[0].y);
-                  
-                    for (int j=1;j<num_points;++j)
-                    {
-                        poly->line_to(ar[j].x,ar[j].y);
-                    }
-                    poly->line_to(ar[0].x,ar[0].y);
-                }
-            }
-            feature.add_geometry(poly);
+            pos_+=1; // skip byte order
+            read(paths);
         }
-    };
+    }
     
-    void geometry_utils::from_wkb (Feature & feature,
-                                   const char* wkb,
-                                   unsigned size,
-                                   bool multiple_geometries,
-                                   wkbFormat format) 
+    void read_collection_2(boost::ptr_vector<geometry_type> & paths)
     {
-        wkb_reader reader(wkb,size,format);
-        if (multiple_geometries)
-            return reader.read_multi(feature);
-        else
-            return reader.read(feature);
-    }    
+        int num_geometries=read_integer();
+        for (int i=0;i<num_geometries;++i)
+        {
+            pos_+=1; // skip byte order
+            read_multi(paths);
+        }
+    }
+};
+
+void geometry_utils::from_wkb (boost::ptr_vector<geometry_type>& paths,
+                               const char* wkb,
+                               unsigned size,
+                               bool multiple_geometries,
+                               wkbFormat format) 
+{
+    wkb_reader reader(wkb,size,format);
+    if (multiple_geometries)
+        return reader.read_multi(paths);
+    else
+        return reader.read(paths);
+}    
 }
diff --git a/src/wkt/wkt_factory.cpp b/src/wkt/wkt_factory.cpp
new file mode 100644
index 0000000..d3abf3b
--- /dev/null
+++ b/src/wkt/wkt_factory.cpp
@@ -0,0 +1,56 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2011 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+// boost
+#include <boost/version.hpp>
+
+// mapnik
+#include <mapnik/wkt/wkt_factory.hpp>
+#include <mapnik/wkt/wkt_grammar.hpp>
+
+// stl
+#include <string>
+#include <sstream>
+
+namespace mapnik
+{
+
+bool from_wkt(std::string const& wkt, boost::ptr_vector<geometry_type> & paths)
+{
+#if BOOST_VERSION >= 104700
+    using namespace boost::spirit;
+    typedef std::string::const_iterator iterator_type;
+    iterator_type first = wkt.begin();
+    iterator_type last =  wkt.end();
+    mapnik::wkt::wkt_collection_grammar<iterator_type> grammar;
+    return qi::phrase_parse(first, last, grammar, ascii::space, paths);
+#else
+    // TODO - remove this after mapnik 2.0.0 release
+    std::ostringstream s;
+    s << BOOST_VERSION/100000 << "." << BOOST_VERSION/100 % 1000  << "." << BOOST_VERSION % 100;
+    throw std::runtime_error("mapnik::from_wkt() requires at least boost 1.47 while your build was compiled against boost " + s.str());
+    return false;
+#endif
+}
+
+}
+
diff --git a/tests/cpp_tests/build.py b/tests/cpp_tests/build.py
new file mode 100644
index 0000000..e460d6e
--- /dev/null
+++ b/tests/cpp_tests/build.py
@@ -0,0 +1,16 @@
+import os
+import glob
+from copy import copy
+
+Import ('env')
+
+test_env = env.Clone()
+
+headers = env['CPPPATH'] 
+
+libraries =  copy(env['LIBMAPNIK_LIBS'])
+libraries.append('mapnik2')
+
+for cpp_test in glob.glob('*_test.cpp'):
+    test_program = test_env.Program(cpp_test.replace('.cpp',''), [cpp_test], CPPPATH=headers, LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS'])
+    Depends(test_program, env.subst('../../src/%s' % env['MAPNIK_LIB_NAME']))
diff --git a/tests/cpp_tests/font_registration_test.cpp b/tests/cpp_tests/font_registration_test.cpp
new file mode 100644
index 0000000..1906d89
--- /dev/null
+++ b/tests/cpp_tests/font_registration_test.cpp
@@ -0,0 +1,77 @@
+//#include <boost/config/warning_disable.hpp>
+
+#include <boost/filesystem/convenience.hpp>
+namespace fs = boost::filesystem;
+using fs::path;
+namespace sys = boost::system;
+
+#include <boost/detail/lightweight_test.hpp>
+//#include <boost/bind.hpp>
+//#include <fstream>
+#include <iostream>
+#include <mapnik/font_engine_freetype.hpp>
+
+
+//  --------------------------------------------------------------------------//
+
+int main( int, char*[] )
+{
+
+
+//  font registration() tests  ----------------------------------------------//
+
+  std::string fontdir("fonts/");
+  
+  BOOST_TEST( fs::exists( fontdir ) );
+  BOOST_TEST( fs::is_directory( fontdir ) );
+
+  std::vector<std::string> face_names;
+
+  std::string foo("foo");
+
+  // fake directories
+  BOOST_TEST( !mapnik::freetype_engine::register_fonts(foo , true ) );
+  face_names = mapnik::freetype_engine::face_names();
+  BOOST_TEST( face_names.size() == 0 );
+  BOOST_TEST( !mapnik::freetype_engine::register_fonts(foo) );
+  face_names = mapnik::freetype_engine::face_names();
+  BOOST_TEST( face_names.size() == 0 );
+
+  // directories without fonts
+  std::string src("src");
+  // a legitimate directory will return true even it is does not 
+  // successfully register a font...
+  BOOST_TEST( mapnik::freetype_engine::register_fonts(src , true ) );
+  face_names = mapnik::freetype_engine::face_names();
+  BOOST_TEST( face_names.size() == 0 );
+  std::clog << "number of registered fonts: " << face_names.size() << std::endl;
+
+  // register unifont
+  BOOST_TEST( mapnik::freetype_engine::register_fonts(fontdir) );
+  face_names = mapnik::freetype_engine::face_names();
+  std::clog << "number of registered fonts: " << face_names.size() << std::endl;
+  BOOST_TEST( face_names.size() > 0 );
+  BOOST_TEST( face_names.size() == 1 );
+
+  // re-register unifont, should not have any affect
+  BOOST_TEST( mapnik::freetype_engine::register_fonts(fontdir, false) );
+  face_names = mapnik::freetype_engine::face_names();
+  std::clog << "number of registered fonts: " << face_names.size() << std::endl;
+  BOOST_TEST( face_names.size() == 1 );
+
+  // register a single dejavu font
+  std::string dejavu_bold_oblique("tests/data/fonts/DejaVuSansMono-BoldOblique.ttf");
+  BOOST_TEST( mapnik::freetype_engine::register_font(dejavu_bold_oblique) );
+  face_names = mapnik::freetype_engine::face_names();
+  std::clog << "number of registered fonts: " << face_names.size() << std::endl;
+  BOOST_TEST( face_names.size() == 2 );
+
+
+  // recurse to find all dejavu fonts
+  BOOST_TEST( mapnik::freetype_engine::register_fonts(fontdir, true) );
+  face_names = mapnik::freetype_engine::face_names();
+  std::clog << "number of registered fonts: " << face_names.size() << std::endl;
+  BOOST_TEST( face_names.size() == 21 );
+
+  return ::boost::report_errors();
+}
diff --git a/tests/cpp_tests/svg_renderer_tests/background_color_test.cpp b/tests/cpp_tests/svg_renderer_tests/background_color_test.cpp
new file mode 100644
index 0000000..03cda25
--- /dev/null
+++ b/tests/cpp_tests/svg_renderer_tests/background_color_test.cpp
@@ -0,0 +1,165 @@
+#define BOOST_TEST_MODULE background_color_test
+
+/*
+ * This test module contains several generators for 
+ * the implementation of a background color in SVG
+ * using a rectangle.
+ */
+
+// boost.test
+#include <boost/test/included/unit_test.hpp>
+
+// boost.spirit
+#include <boost/spirit/include/karma.hpp>
+#include <boost/spirit/repository/include/karma_confix.hpp>
+
+// boost
+#include <boost/fusion/tuple.hpp>
+
+// stl
+#include <string>
+#include <sstream>
+
+namespace karma = boost::spirit::karma;
+namespace repository = boost::spirit::repository;
+namespace fusion = boost::fusion;
+using namespace karma;
+
+struct F 
+{
+    F() :
+    x(0),
+    y(0),
+    width(100),
+    height(100),
+    bgcolor("#ffffff"),
+    expected_output("<rect x=\"0\" y=\"0\" width=\"100px\" height=\"100px\" style=\"fill: #ffffff\"/>") {}
+    
+    ~F() {}
+
+    const int x;
+    const int y;
+    const int width;
+    const int height;
+    const std::string bgcolor;
+    const std::string expected_output;
+    std::ostringstream actual_output;
+};
+
+/*
+ * This test case uses one compound generator to generate the SVG element.
+ *
+ * It makes only one call to the format function and uses an ostringstream
+ * as its output destination.
+ *
+ * The attribute values are provided as arguments to the format function.
+ * The disadvantage of this is that the number of arguments is limited
+ * by the preprocessor constant SPIRIT_ARGUMENTS_LIMIT, whose default
+ * value is 10. The advantage is that they can be of any type (as long
+ * as they are compatible with the corresponding generator type).
+ */
+BOOST_FIXTURE_TEST_CASE(bgcolor_stream_test_case, F)
+{
+    actual_output
+    << format(
+        "<rect x=\"" << int_ << "\" "
+        << "y=\"" << int_ << "\" "
+        << "width=\"" << int_ << string << "\" "
+        << "height=\"" << int_ << string << "\" "
+        << "style=\"fill: " << string << "\""
+        << "/>",
+        x, y, width, "px", height, "px", bgcolor);
+
+    BOOST_CHECK_EQUAL(actual_output.str(), expected_output);
+}
+
+/*
+ * This test case uses confix to wrap each xml attribute's value
+ * inside double quotes.
+ *
+ * Notice that the generators' attribute list contains also tuples.
+ * Tuples are needed to specify each confix's attributes that contain
+ * more than one generator, like confix()[int_ << string] (this 
+ * generator needs a tuple: tuple<int, string>).
+ *
+ * The difference between this generator and the one in test case
+ * 'bgcolor_stream_test_case' is the use of less << operators and
+ * a more clean handling of double quotes.
+ */
+BOOST_FIXTURE_TEST_CASE(bgcolor_stream_confix_test_case, F)
+{
+    using repository::confix;
+    using fusion::tuple;
+
+    actual_output
+    << format(
+        "<rect x=" << confix('"', '"')[int_]
+        << " y=" << confix('"', '"')[int_]
+        << " width=" << confix('"', '"')[int_ << string]
+        << " height=" << confix('"', '"')[int_ << string]
+        << " style=" << confix('"', '"')["fill: " << string]
+        << "/>",
+        x, y, tuple<int, std::string>(width, "px"), tuple<int, std::string>(height, "px"), bgcolor); 
+    
+    BOOST_CHECK_EQUAL(actual_output.str(), expected_output);
+}
+
+/*
+ * This test case generates the angle brackets of the svg/xml tag
+ * using confix. notice that a confix generator can be part of another
+ * confix generator's expression.
+ *
+ * Notice also that the attribute list is the same as in 
+ * 'bgcolor_stream_confix_test_case'. From this one can see that each 
+ * generator is meant to have a list of attributes if it has more than one. 
+ *
+ * If the generator is nested inside another generator, the former's attribute 
+ * list will be another list (a tuple, for example) inside the latter's.
+ */
+BOOST_FIXTURE_TEST_CASE(bgcolor_stream_confix_complete_test_case, F)
+{
+    using repository::confix;
+    using fusion::tuple;
+
+    actual_output
+    << format(
+        confix('<', "/>")[
+        "rect x=" << confix('"', '"')[int_]
+        << " y=" << confix('"', '"')[int_]
+        << " width=" << confix('"', '"')[int_ << string]
+        << " height=" << confix('"', '"')[int_ << string]
+        << " style=" << confix('"', '"')["fill: " << string]],
+        x, y, tuple<int, std::string>(width, "px"), tuple<int, std::string>(height, "px"), bgcolor); 
+    
+    BOOST_CHECK_EQUAL(actual_output.str(), expected_output);
+}
+
+/*
+ * This test case uses an iterator to receive the generated
+ * output. The iterator comes from the std::ostringstream that's
+ * been used in the previous test cases, so the output is
+ * actually generated into the stream.
+ *
+ * Using iterators instead of streams has the advantage that
+ * more advanced concepts are implemented in karma for them,
+ * like rules and grammars.
+ */
+BOOST_FIXTURE_TEST_CASE(bgcolor_stream_iterator_test_case, F)
+{
+    using repository::confix;
+    using fusion::tuple;
+
+    std::ostream_iterator<char> actual_output_iterator(actual_output);
+
+    generate(
+    actual_output_iterator,
+    confix("<", "/>")[
+        "rect x=" << confix('"', '"')[int_]
+        << " y=" << confix('"', '"')[int_]
+        << " width=" << confix('"', '"')[int_ << string]
+        << " height=" << confix('"', '"')[int_ << string]
+        << " style=" << confix('"', '"')["fill: " << string]],
+    x, y, tuple<int, std::string>(width, "px"), tuple<int, std::string>(height, "px"), bgcolor);
+
+    BOOST_CHECK_EQUAL(actual_output.str(), expected_output);
+}
diff --git a/tests/cpp_tests/svg_renderer_tests/build.py b/tests/cpp_tests/svg_renderer_tests/build.py
new file mode 100644
index 0000000..8a1f52f
--- /dev/null
+++ b/tests/cpp_tests/svg_renderer_tests/build.py
@@ -0,0 +1,22 @@
+import os
+import glob
+
+Import ('env')
+
+headers = env['CPPPATH'] 
+
+filesystem = 'boost_filesystem%s' % env['BOOST_APPEND']
+system = 'boost_system%s' % env['BOOST_APPEND']
+regex = 'boost_regex%s' % env['BOOST_APPEND']
+
+libraries =  [filesystem, 'mapnik2']
+
+if env['PLATFORM'] == 'Darwin':
+    libraries.append(env['ICU_LIB_NAME'])
+    libraries.append(regex)
+
+if env['HAS_BOOST_SYSTEM']:
+    libraries.append(system)
+
+for cpp_test in glob.glob('path_element_test.cpp'):
+    env.Program(cpp_test.replace('.cpp',''), [cpp_test], CPPPATH=headers, LIBS=libraries)
\ No newline at end of file
diff --git a/tests/cpp_tests/svg_renderer_tests/combined_test.cpp b/tests/cpp_tests/svg_renderer_tests/combined_test.cpp
new file mode 100644
index 0000000..ffd1730
--- /dev/null
+++ b/tests/cpp_tests/svg_renderer_tests/combined_test.cpp
@@ -0,0 +1,56 @@
+#define BOOST_TEST_MODULE combined_tests
+
+// boost.test
+#include <boost/test/included/unit_test.hpp>
+
+// mapnik
+#include <mapnik/map.hpp>
+#include <mapnik/svg_renderer.hpp>
+#include <mapnik/color_factory.hpp>
+
+// std
+#include <string>
+#include <sstream>
+#include <iterator>
+
+/**
+ * This test case tests all the generators inside svg_renderer,
+ * verifying the correctness of the whole SVG document.
+ *
+ * The test sets the svg_renderer object with a simple Map that
+ * has only its dimensions specified and calls the apply()
+ * method to produce the output.
+ *
+ * The output stream is a stringstream (the output is generated
+ * into a stringstream).
+ */
+BOOST_AUTO_TEST_CASE(combined_test_case)
+{
+    using namespace mapnik;
+    typedef svg_renderer<std::ostream_iterator<char> > svg_ren;
+
+    Map map(800, 600);
+    map.set_background(color_factory::from_string("white"));
+
+    std::ostringstream output_stream;
+    std::ostream_iterator<char> output_stream_iterator(output_stream);
+    svg_ren renderer(map, output_stream_iterator);
+    renderer.apply();
+
+    std::string expected_output = 
+        svg_ren::XML_DECLARATION 
+        + "\n" 
+        + svg_ren::SVG_DTD 
+        + "\n" 
+        + "<svg width=\"800px\" height=\"600px\" version=\"1.1\" xmlns=\"" 
+        + svg_ren::SVG_NAMESPACE_URL 
+        + "\">"
+        +"\n"
+        +"<rect x=\"0\" y=\"0\" width=\"800px\" height=\"600px\" style=\"fill: #ffffff\"/>"
+        +"\n"
+        +"</svg>";
+
+    std::string actual_output = output_stream.str();
+    BOOST_CHECK_EQUAL(actual_output, expected_output);
+}
+
diff --git a/tests/cpp_tests/svg_renderer_tests/compilation_test.cpp b/tests/cpp_tests/svg_renderer_tests/compilation_test.cpp
new file mode 100644
index 0000000..34723d3
--- /dev/null
+++ b/tests/cpp_tests/svg_renderer_tests/compilation_test.cpp
@@ -0,0 +1,36 @@
+#define BOOST_TEST_MODULE compile_test
+
+// boost.test
+#include <boost/test/included/unit_test.hpp>
+
+// mapnik
+#include <mapnik/map.hpp>
+#include <mapnik/svg_renderer.hpp>
+
+// std
+#include <sstream>
+#include <iterator>
+
+/**
+ * This test is meant to see if the empty
+ * implementation of SVG renderer compiles
+ * and runs when using the inherited methods.
+ */
+BOOST_AUTO_TEST_CASE(compile_test_case)
+{
+    using namespace mapnik;
+
+    Map map(800, 600);
+
+    try
+    {
+        std::ostringstream output_stream;
+        std::ostream_iterator<char> output_stream_iterator(output_stream);
+        svg_renderer<std::ostream_iterator<char> > renderer(map, output_stream_iterator);
+        renderer.apply();
+    }
+    catch(...)
+    {
+        BOOST_FAIL("Empty implementation throws exception.");
+    }
+}
diff --git a/tests/cpp_tests/svg_renderer_tests/file_output_test.cpp b/tests/cpp_tests/svg_renderer_tests/file_output_test.cpp
new file mode 100644
index 0000000..0b0e0ae
--- /dev/null
+++ b/tests/cpp_tests/svg_renderer_tests/file_output_test.cpp
@@ -0,0 +1,69 @@
+#define BOOST_TEST_MODULE file_output_test
+
+/*
+ * This test module contains test cases that
+ * verify the correct generation of SVG output
+ * using file streams as destinations.
+ */
+
+// boost.test
+#include <boost/test/included/unit_test.hpp>
+
+// boost.filesystem
+#include <boost/filesystem.hpp>
+
+// mapnik
+#include <mapnik/map.hpp>
+#include <mapnik/svg_renderer.hpp>
+#include <mapnik/color_factory.hpp>
+
+// stl
+#include <fstream>
+#include <iterator>
+
+namespace filesystem = boost::filesystem;
+
+/*
+ * This test case tests the generation of an SVG document
+ * using a file stream. It uses svg_renderer parameterized
+ * with an std::ofstream as a target for output.
+ *
+ * It's important to notice that svg_renderer doesn't create
+ * or close the file stream, but leaves that task to the client.
+ *
+ * The test fails if the file can't be created and succeeds
+ * otherwise.
+ *
+ * Note: the file is created in the directory in which the
+ * test is run.
+ */
+BOOST_AUTO_TEST_CASE(file_output_test_case)
+{
+    using namespace mapnik;
+    typedef svg_renderer<std::ostream_iterator<char> > svg_ren;
+
+    Map map(800, 600);
+    map.set_background(color_factory::from_string("blue"));
+
+    std::string output_filename = "file_output_test_case.svg";
+    std::ofstream output_stream(output_filename.c_str());
+
+    if(output_stream)
+    {
+        std::ostream_iterator<char> output_stream_iterator(output_stream);
+    
+        svg_ren renderer(map, output_stream_iterator);
+        renderer.apply();
+    
+        output_stream.close();
+    
+        filesystem::path output_filename_path = 
+            filesystem::system_complete(filesystem::path(".")) / filesystem::path(output_filename);
+    
+        BOOST_CHECK_MESSAGE(filesystem::exists(output_filename_path), "File '"+output_filename_path.string()+"' was created.");
+    }
+    else
+    {
+        BOOST_FAIL("Could not create create/open file '"+output_filename+"'.");
+    }
+}
diff --git a/tests/cpp_tests/svg_renderer_tests/path_element_test.cpp b/tests/cpp_tests/svg_renderer_tests/path_element_test.cpp
new file mode 100644
index 0000000..3a1d79f
--- /dev/null
+++ b/tests/cpp_tests/svg_renderer_tests/path_element_test.cpp
@@ -0,0 +1,231 @@
+#define BOOST_TEST_MODULE path_element_tests
+
+// boost.test
+#include <boost/test/included/unit_test.hpp>
+
+// boost.spirit
+#include <boost/spirit/include/karma.hpp>
+
+// boost.filesystem
+#include <boost/filesystem.hpp>
+
+// mapnik
+#include <mapnik/map.hpp>
+#include <mapnik/svg_renderer.hpp>
+#include <mapnik/datasource_cache.hpp>
+#include <mapnik/font_engine_freetype.hpp>
+#include <mapnik/filter_factory.hpp>
+#include <mapnik/color_factory.hpp>
+
+// stl
+#include <fstream>
+#include <iterator>
+
+namespace filesystem = boost::filesystem;
+using namespace mapnik;
+
+void prepare_map(Map& m)
+{      
+    const std::string mapnik_dir("../../..");
+    std::cout << " looking for 'shape.input' plugin in... " << mapnik_dir << "/plugins/input/" << "\n";
+    datasource_cache::instance()->register_datasources(mapnik_dir + "/plugins/input/"); 
+
+    // create styles
+
+    // Provinces (polygon)
+    feature_type_style provpoly_style;
+       
+    rule provpoly_rule_on;
+    provpoly_rule_on.set_filter(parse_expression("[NAME_EN] = 'Ontario'"));
+    provpoly_rule_on.append(polygon_symbolizer(color(250, 190, 183)));
+    provpoly_style.add_rule(provpoly_rule_on);
+        
+    rule provpoly_rule_qc;
+    provpoly_rule_qc.set_filter(parse_expression("[NOM_FR] = 'Québec'"));
+    provpoly_rule_qc.append(polygon_symbolizer(color(217, 235, 203)));
+    provpoly_style.add_rule(provpoly_rule_qc);
+        
+    m.insert_style("provinces",provpoly_style);
+
+    // Provinces (polyline)
+    feature_type_style provlines_style;
+        
+    stroke provlines_stk (color(0,0,0),1.0);
+    provlines_stk.add_dash(8, 4);
+    provlines_stk.add_dash(2, 2);
+    provlines_stk.add_dash(2, 2);
+        
+    rule provlines_rule;
+    provlines_rule.append(line_symbolizer(provlines_stk));
+    provlines_style.add_rule(provlines_rule);
+        
+    m.insert_style("provlines",provlines_style);
+        
+    // Drainage 
+    feature_type_style qcdrain_style;
+        
+    rule qcdrain_rule;
+    qcdrain_rule.set_filter(parse_expression("[HYC] = 8"));
+    qcdrain_rule.append(polygon_symbolizer(color(153, 204, 255)));
+    qcdrain_style.add_rule(qcdrain_rule);
+        
+    m.insert_style("drainage",qcdrain_style);
+        
+    // Roads 3 and 4 (The "grey" roads)
+    feature_type_style roads34_style;    
+    rule roads34_rule;
+    roads34_rule.set_filter(parse_expression("[CLASS] = 3 or [CLASS] = 4"));
+    stroke roads34_rule_stk(color(171,158,137),2.0);
+    roads34_rule_stk.set_line_cap(ROUND_CAP);
+    roads34_rule_stk.set_line_join(ROUND_JOIN);
+    roads34_rule.append(line_symbolizer(roads34_rule_stk));
+    roads34_style.add_rule(roads34_rule);
+        
+    m.insert_style("smallroads",roads34_style);
+        
+    // Roads 2 (The thin yellow ones)
+    feature_type_style roads2_style_1;
+    rule roads2_rule_1;
+    roads2_rule_1.set_filter(parse_expression("[CLASS] = 2"));
+    stroke roads2_rule_stk_1(color(171,158,137),4.0);
+    roads2_rule_stk_1.set_line_cap(ROUND_CAP);
+    roads2_rule_stk_1.set_line_join(ROUND_JOIN);
+    roads2_rule_1.append(line_symbolizer(roads2_rule_stk_1));
+    roads2_style_1.add_rule(roads2_rule_1);
+        
+    m.insert_style("road-border", roads2_style_1);
+        
+    feature_type_style roads2_style_2;
+    rule roads2_rule_2;
+    roads2_rule_2.set_filter(parse_expression("[CLASS] = 2"));
+    stroke roads2_rule_stk_2(color(255,250,115),2.0);
+    roads2_rule_stk_2.set_line_cap(ROUND_CAP);
+    roads2_rule_stk_2.set_line_join(ROUND_JOIN);
+    roads2_rule_2.append(line_symbolizer(roads2_rule_stk_2));
+    roads2_style_2.add_rule(roads2_rule_2);
+        
+    m.insert_style("road-fill", roads2_style_2);
+        
+    // Roads 1 (The big orange ones, the highways)
+    feature_type_style roads1_style_1;
+    rule roads1_rule_1;
+    roads1_rule_1.set_filter(parse_expression("[CLASS] = 1"));
+    stroke roads1_rule_stk_1(color(188,149,28),7.0);
+    roads1_rule_stk_1.set_line_cap(ROUND_CAP);
+    roads1_rule_stk_1.set_line_join(ROUND_JOIN);
+    roads1_rule_1.append(line_symbolizer(roads1_rule_stk_1));
+    roads1_style_1.add_rule(roads1_rule_1);
+    m.insert_style("highway-border", roads1_style_1);
+        
+    feature_type_style roads1_style_2;
+    rule roads1_rule_2;
+    roads1_rule_2.set_filter(parse_expression("[CLASS] = 1"));
+    stroke roads1_rule_stk_2(color(242,191,36),5.0);
+    roads1_rule_stk_2.set_line_cap(ROUND_CAP);
+    roads1_rule_stk_2.set_line_join(ROUND_JOIN);
+    roads1_rule_2.append(line_symbolizer(roads1_rule_stk_2));
+    roads1_style_2.add_rule(roads1_rule_2);
+    m.insert_style("highway-fill", roads1_style_2);        
+       
+    // layers
+    // Provincial  polygons
+    {
+        parameters p;
+        p["type"]="shape";
+        p["file"]=mapnik_dir+"/demo/data/boundaries";
+                
+        layer lyr("Provinces"); 
+        lyr.set_datasource(datasource_cache::instance()->create(p));
+        lyr.add_style("provinces");    
+        m.addLayer(lyr);
+    }
+        
+    // Drainage
+    {
+        parameters p;
+        p["type"]="shape";
+        p["file"]=mapnik_dir+"/demo/data/qcdrainage";
+        layer lyr("Quebec Hydrography");
+        lyr.set_datasource(datasource_cache::instance()->create(p));
+        lyr.add_style("drainage");    
+        m.addLayer(lyr);
+    }
+        
+    {
+        parameters p;
+        p["type"]="shape";
+        p["file"]=mapnik_dir+"/demo/data/ontdrainage";
+                
+        layer lyr("Ontario Hydrography"); 
+        lyr.set_datasource(datasource_cache::instance()->create(p));
+        lyr.add_style("drainage");    
+        m.addLayer(lyr);
+    }
+        
+    // Provincial boundaries
+    {
+        parameters p;
+        p["type"]="shape";
+        p["file"]=mapnik_dir+"/demo/data/boundaries_l";
+        layer lyr("Provincial borders"); 
+        lyr.set_datasource(datasource_cache::instance()->create(p));
+        lyr.add_style("provlines");    
+        m.addLayer(lyr);
+    }
+    
+    // Roads
+    {
+        parameters p;
+        p["type"]="shape";
+        p["file"]=mapnik_dir+"/demo/data/roads";        
+        layer lyr("Roads"); 
+        lyr.set_datasource(datasource_cache::instance()->create(p));
+        lyr.add_style("smallroads");
+        lyr.add_style("road-border");
+        lyr.add_style("road-fill");
+        lyr.add_style("highway-border");
+        lyr.add_style("highway-fill");
+    
+        m.addLayer(lyr);        
+    }
+}
+
+void render_to_file(Map const& m, const std::string output_filename)
+{
+    std::ofstream output_stream(output_filename.c_str());
+
+    if(output_stream)
+    {
+        typedef svg_renderer<std::ostream_iterator<char> > svg_ren;
+    
+        std::ostream_iterator<char> output_stream_iterator(output_stream);
+    
+        svg_ren renderer(m, output_stream_iterator);
+        renderer.apply();
+    
+        output_stream.close();
+    
+        filesystem::path output_filename_path = 
+            filesystem::system_complete(filesystem::path(".")) / filesystem::path(output_filename);
+    
+        BOOST_CHECK_MESSAGE(filesystem::exists(output_filename_path), 
+           "File '"+output_filename_path.string()+"' was created.");
+    }
+    else
+    {
+        BOOST_FAIL("Could not create create/open file '"+output_filename+"'.");
+    }
+}
+
+BOOST_AUTO_TEST_CASE(path_element_test_case_1)
+{
+    Map m(800,600);
+    m.set_background(color_factory::from_string("steelblue"));      
+
+    prepare_map(m);
+        
+    //m.zoom_to_box(box2d<double>(1405120.04127408, -247003.813399447,
+                //1706357.31328276, -25098.593149577));
+    m.zoom_all();    
+    render_to_file(m, "path_element_test_case_1.svg");
+}
diff --git a/tests/cpp_tests/svg_renderer_tests/root_element_test.cpp b/tests/cpp_tests/svg_renderer_tests/root_element_test.cpp
new file mode 100644
index 0000000..c98755b
--- /dev/null
+++ b/tests/cpp_tests/svg_renderer_tests/root_element_test.cpp
@@ -0,0 +1,158 @@
+#define BOOST_TEST_MODULE root_element_test
+
+/*
+ * This test module contains several generators for 
+ * the SVG root element.
+ */
+
+// boost.test
+#include <boost/test/included/unit_test.hpp>
+
+// boost.spirit
+#include <boost/spirit/include/karma.hpp>
+#include <boost/spirit/repository/include/karma_confix.hpp>
+
+// boost
+#include <boost/fusion/tuple.hpp>
+
+// stl
+#include <string>
+#include <sstream>
+
+namespace karma = boost::spirit::karma;
+namespace repository = boost::spirit::repository;
+namespace fusion = boost::fusion;
+using namespace karma;
+
+struct F 
+{
+    F() :
+    width(100),
+    height(100),
+    version(1.1),
+    xmlns("http://www.w3.org/2000/svg"),
+    expected_output("<svg width=\"100px\" height=\"100px\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">") {}
+
+    ~F() {}
+
+    const int width;
+    const int height;
+    const float version;
+    const std::string xmlns;
+    const std::string expected_output;
+    std::ostringstream actual_output;
+};
+
+/*
+ * This test case uses one compound generator to generate the SVG  element.
+ *
+ * It makes only one call to the format function and uses an ostringstream
+ * as its output destination.
+ *
+ * The attribute values are provided as arguments to the format function.
+ * The disadvantage of this is that the number of arguments is limited
+ * by the preprocessor constant SPIRIT_ARGUMENTS_LIMIT, whose default
+ * value is 10. The advantage is that they can be of any type (as long
+ * as they are compatible with the corresponding generator type).
+ */
+BOOST_FIXTURE_TEST_CASE(bgcolor_stream_test_case, F)
+{
+    actual_output
+    << format(
+        "<svg width=\"" << int_ << string << "\" "
+        << "height=\"" << int_ << string << "\" "
+        << "version=\"" << float_ << "\" "
+        << "xmlns=\"" << string << "\""
+        << ">",
+        width, "px", height, "px", version, xmlns);
+
+    BOOST_CHECK_EQUAL(actual_output.str(), expected_output);
+}
+
+/*
+ * This test case uses confix to wrap each xml attribute's value
+ * inside double quotes.
+ *
+ * Notice that the generators' attribute list contains also tuples.
+ * Tuples are needed to specify each confix's attributes that contain
+ * more than one generator, like confix()[int_ << string] (this 
+ * generator needs a tuple: tuple<int, string>).
+ *
+ * The difference between this generator and the one in test case
+ * 'bgcolor_stream_test_case' is the use of less << operators and
+ * a more clean handling of double quotes.
+ */
+BOOST_FIXTURE_TEST_CASE(bgcolor_stream_confix_test_case, F)
+{
+    using repository::confix;
+    using fusion::tuple;
+
+    actual_output
+    << format(
+        "<svg width=" << confix('"', '"')[int_ << string]
+        << " height=" << confix('"', '"')[int_ << string]
+        << " version=" << confix('"', '"')[float_]
+        << " xmlns=" << confix('"', '"')[string]
+        << ">",
+        tuple<int, std::string>(width, "px"), tuple<int, std::string>(height, "px"), version, xmlns); 
+    
+    BOOST_CHECK_EQUAL(actual_output.str(), expected_output);
+}
+
+/*
+ * This test case generates the angle brackets of the svg/xml tag
+ * using confix. notice that a confix generator can be part of another
+ * confix generator's expression.
+ *
+ * Notice also that the attribute list is the same as in 
+ * 'bgcolor_stream_confix_test_case'. From this one can see that each 
+ * generator is meant to have a list of attributes if it has more than one. 
+ *
+ * If the generator is nested inside another generator, the former's attribute 
+ * list will be another list (a tuple, for example) inside the latter's.
+ */
+BOOST_FIXTURE_TEST_CASE(bgcolor_stream_confix_complete_test_case, F)
+{
+    using repository::confix;
+    using fusion::tuple;
+
+    actual_output
+    << format(
+        confix('<', ">")[
+        "svg width=" << confix('"', '"')[int_ << string]
+        << " height=" << confix('"', '"')[int_ << string]
+        << " version=" << confix('"', '"')[float_]
+        << " xmlns=" << confix('"', '"')[string]],
+        tuple<int, std::string>(width, "px"), tuple<int, std::string>(height, "px"), version, xmlns); 
+    
+    BOOST_CHECK_EQUAL(actual_output.str(), expected_output);
+}
+
+/*
+ * This test case uses an iterator to receive the generated
+ * output. The iterator comes from the std::ostringstream that's
+ * been used in the previous test cases, so the output is
+ * actually generated into the stream.
+ *
+ * Using iterators instead of streams has the advantage that
+ * more advanced concepts are implemented in karma for them,
+ * like rules and grammars.
+ */
+BOOST_FIXTURE_TEST_CASE(bgcolor_stream_iterator_test_case, F)
+{
+    using repository::confix;
+    using fusion::tuple;
+
+    std::ostream_iterator<char> actual_output_iterator(actual_output);
+
+    generate(
+    actual_output_iterator,
+    confix("<", ">")[
+        "svg width=" << confix('"', '"')[int_ << string]
+        << " height=" << confix('"', '"')[int_ << string]
+        << " version=" << confix('"', '"')[float_]
+        << " xmlns=" << confix('"', '"')[string]],
+    tuple<int, std::string>(width, "px"), tuple<int, std::string>(height, "px"), version, xmlns);
+
+    BOOST_CHECK_EQUAL(actual_output.str(), expected_output);
+}
diff --git a/tests/data/broken_maps/amenity.xml b/tests/data/broken_maps/amenity.xml
index 5e80035..450f29d 100644
--- a/tests/data/broken_maps/amenity.xml
+++ b/tests/data/broken_maps/amenity.xml
@@ -1,25 +1,25 @@
-<Style name="amenity">
+<Style name="amenity" minimum-version="0.7.2">
 <Rule>
   <MaxScaleDenominator>5000</MaxScaleDenominator>
   <Filter>[amenity]='post_box'</Filter>
-  <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/post_box.png" type="png" width="16" height="16" />
+  <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/post_box.png" type="png" width="16" height="16"/>
 </Rule>
 <Rule>
   <MaxScaleDenominator>5000</MaxScaleDenominator>
   <Filter>[amenity]='post_office'</Filter>
-  <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/post_office.png" type="png" width="16" height="16" />
+  <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/post_office.png" type="png" width="16" height="16"/>
 </Rule>
 
 <Rule>
   <MaxScaleDenominator>250000</MaxScaleDenominator>
   <MinScaleDenominator>25000</MinScaleDenominator> 
   <Filter>[railway]='station'</Filter>
-  <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/station_small.png" type="png" width="5" height="5" />
+  <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/station_small.png" type="png" width="5" height="5"/>
 </Rule>
  <Rule>
   <MaxScaleDenominator>25000</MaxScaleDenominator>
   <Filter>[railway]='station'</Filter>
-  <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/station.png" type="png" width="9" height="9" />
+  <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/station.png" type="png" width="9" height="9"/>
 </Rule>
 <Rule>
   <MaxScaleDenominator>50000</MaxScaleDenominator>
@@ -36,34 +36,34 @@
 <Rule>
   <MaxScaleDenominator>10000</MaxScaleDenominator>
   <Filter>[amenity]='pub'</Filter>
-  <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/pub.png" type="png" width="16" height="16" />
+  <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/pub.png" type="png" width="16" height="16"/>
 </Rule>
 <Rule>
   <MaxScaleDenominator>100000</MaxScaleDenominator>
   <Filter>[natural]='peak'</Filter>
-  <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/peak.png" type="png" width="8" height="8" />
+  <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/peak.png" type="png" width="8" height="8"/>
 </Rule>
 <Rule>
   <MaxScaleDenominator>5000</MaxScaleDenominator>
   <Filter>[man_made]='mast'</Filter>
-  <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/tower.png" type="png" width="32" height="32" />
+  <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/tower.png" type="png" width="32" height="32"/>
 </Rule>
 <Rule>
   <MaxScaleDenominator>10000</MaxScaleDenominator>
   <Filter>[amenity]='recycling'</Filter>
-  <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/recycling.png" type="png" width="20" height="20" />
+  <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/recycling.png" type="png" width="20" height="20"/>
 </Rule>
 
 <Rule>
   <MaxScaleDenominator>20000</MaxScaleDenominator>
   <Filter>[amenity]='hospital'</Filter>
-  <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/hospital.png" type="png" width="20" height="20" />
+  <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/hospital.png" type="png" width="20" height="20"/>
 </Rule>
 
 <Rule>
   <MaxScaleDenominator>5000</MaxScaleDenominator>
   <Filter>[amenity]='bus_stop' or [highway]='bus_stop'</Filter>      
-  <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/bus_stop.png" type="png" width="30" height="12" />
+  <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/bus_stop.png" type="png" width="30" height="12"/>
 </Rule>
 
 <Rule>
@@ -82,5 +82,4 @@
   <Filter>[amenity]='airport'</Filter>
   <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/airport.png" type="png" width="16" height="16" allow_overlap="false"/>
  </Rule>
-</Style>
-
+</Style>
\ No newline at end of file
diff --git a/tests/data/broken_maps/bgcolor_broken.xml b/tests/data/broken_maps/bgcolor_broken.xml
index 5604b30..ea93683 100644
--- a/tests/data/broken_maps/bgcolor_broken.xml
+++ b/tests/data/broken_maps/bgcolor_broken.xml
@@ -1,3 +1,2 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map bgcolor="darkfoo"/>
+<!DOCTYPE Map>
+<Map background-color="darkfoo" minimum-version="0.7.2"/>
\ No newline at end of file
diff --git a/tests/data/broken_maps/bool_value_broken.xml b/tests/data/broken_maps/bool_value_broken.xml
index d3a1c1d..2b1bca9 100644
--- a/tests/data/broken_maps/bool_value_broken.xml
+++ b/tests/data/broken_maps/bool_value_broken.xml
@@ -1,10 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map bgcolor="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs">
+<!DOCTYPE Map>
+<Map background-color="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs" minimum-version="0.7.2">
     <Style name="test 1">
         <Rule>
-            <PointSymbolizer file="data/images/dummy.png" type="png" width="16"
-                        height="16" allow_overlap="maybe" />
+            <PointSymbolizer file="data/images/dummy.png" allow-overlap="maybe"/>
         </Rule>
     </Style>
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/color_value_broken.xml b/tests/data/broken_maps/color_value_broken.xml
deleted file mode 100644
index 72292b1..0000000
--- a/tests/data/broken_maps/color_value_broken.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map bgcolor="red">
-    <Style name="some_style">
-      <Rule name="some_rule">
-        <LineSymbolizer>
-          <CssParameter name="stroke">#DEADBEEF</CssParameter>
-        </LineSymbolizer>
-      </Rule>
-    </Style>
-</Map>
diff --git a/tests/data/broken_maps/css_value_broken.xml b/tests/data/broken_maps/css_value_broken.xml
index 56086d4..251d2ee 100644
--- a/tests/data/broken_maps/css_value_broken.xml
+++ b/tests/data/broken_maps/css_value_broken.xml
@@ -1,11 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map>
+<!DOCTYPE Map>
+<Map minimum-version="0.7.2">
     <Style name="some_style">
       <Rule>
-        <LineSymbolizer>
-          <CssParameter name="stroke-width">foobar</CssParameter>
-        </LineSymbolizer>
+        <LineSymbolizer stroke-width="foobar"/>
       </Rule>
     </Style>
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/datasource_type_broken.xml b/tests/data/broken_maps/datasource_type_broken.xml
index 4a060d9..3349b5e 100644
--- a/tests/data/broken_maps/datasource_type_broken.xml
+++ b/tests/data/broken_maps/datasource_type_broken.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map bgcolor="red">
+<!DOCTYPE Map>
+<Map background-color="red" minimum-version="0.7.2">
   <Layer name="some_layer" status="on" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs">
     <Datasource>
       <Parameter name="type">foobar_db</Parameter>
@@ -10,4 +9,4 @@
     </Datasource>
   </Layer>
 
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/datasource_type_missing.xml b/tests/data/broken_maps/datasource_type_missing.xml
index bac8281..fe1396a 100644
--- a/tests/data/broken_maps/datasource_type_missing.xml
+++ b/tests/data/broken_maps/datasource_type_missing.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map bgcolor="red">
+<!DOCTYPE Map>
+<Map background-color="red" minimum-version="0.7.2">
   <Layer name="some_layer" status="on" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs">
     <Datasource>
       <Parameter name="user">some_one</Parameter>
@@ -9,4 +8,4 @@
     </Datasource>
   </Layer>
 
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/db_host_broken.xml b/tests/data/broken_maps/db_host_broken.xml
index 0480113..a4a2a20 100644
--- a/tests/data/broken_maps/db_host_broken.xml
+++ b/tests/data/broken_maps/db_host_broken.xml
@@ -1,16 +1,15 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[
-    <!ENTITY db_name "gis">
-    <!ENTITY db_host "/no/socket/here">
+<!DOCTYPE Map [
+<!ENTITY db_name "gis">
+<!ENTITY db_host "/no/socket/here">
 ]>
-<Map bgcolor="red">
+<Map background-color="red" minimum-version="0.7.2">
   <Layer name="some_layer" status="on" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs">
     <Datasource>
       <Parameter name="type">postgis</Parameter>
-      <Parameter name="host">&db_host;</Parameter>
+      <Parameter name="host">/no/socket/here</Parameter>
       <Parameter name="password">SECRET</Parameter>
-      <Parameter name="dbname">&db_name;</Parameter>
+      <Parameter name="dbname">gis</Parameter>
     </Datasource>
   </Layer>
 
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/db_user_broken.xml b/tests/data/broken_maps/db_user_broken.xml
index a6d13ed..1ca2e49 100644
--- a/tests/data/broken_maps/db_user_broken.xml
+++ b/tests/data/broken_maps/db_user_broken.xml
@@ -1,16 +1,15 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[
-    <!ENTITY db_user "foobar">
-    <!ENTITY db_name "gis">
+<!DOCTYPE Map [
+<!ENTITY db_user "foobar">
+<!ENTITY db_name "gis">
 ]>
-<Map bgcolor="red">
+<Map background-color="red" minimum-version="0.7.2">
   <Layer name="some_layer" status="on" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs">
     <Datasource>
       <Parameter name="type">postgis</Parameter>
-      <Parameter name="user">&db_user;</Parameter>
+      <Parameter name="user">foobar</Parameter>
       <Parameter name="password">SECRET</Parameter>
-      <Parameter name="dbname">&db_name;</Parameter>
+      <Parameter name="dbname">gis</Parameter>
     </Datasource>
   </Layer>
 
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/expression_broken.xml b/tests/data/broken_maps/expression_broken.xml
index a0420e4..3bed629 100644
--- a/tests/data/broken_maps/expression_broken.xml
+++ b/tests/data/broken_maps/expression_broken.xml
@@ -1,9 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map>
+<!DOCTYPE Map>
+<Map minimum-version="0.7.2">
     <Style name="some_style">
         <Rule>
             <Filter>[mapnik:geometry] = foobar </Filter> 
         </Rule>
     </Style>
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/font_name_broken.xml b/tests/data/broken_maps/font_name_broken.xml
index 95a306c..6faed73 100644
--- a/tests/data/broken_maps/font_name_broken.xml
+++ b/tests/data/broken_maps/font_name_broken.xml
@@ -1,9 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map bgcolor="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs">
+<!DOCTYPE Map>
+<Map background-color="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs" minimum-version="0.7.2">
     <Style name="some_style">
         <Rule>
-            <TextSymbolizer name="foo" face_name="foobar" size="12"/>
+            <TextSymbolizer name="[foo]" size="12" face-name="foobar"/>
         </Rule>
     </Style>
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/line_cap_style_broken.xml b/tests/data/broken_maps/line_cap_style_broken.xml
index 9229899..0867233 100644
--- a/tests/data/broken_maps/line_cap_style_broken.xml
+++ b/tests/data/broken_maps/line_cap_style_broken.xml
@@ -1,11 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map bgcolor="red">
+<!DOCTYPE Map>
+<Map background-color="red" minimum-version="0.7.2">
     <Style name="some_style">
       <Rule name="some_rule">
-        <LineSymbolizer>
-          <CssParameter name="stroke-linecap">fooish</CssParameter>
-        </LineSymbolizer>
+        <LineSymbolizer stroke-linecap="fooish"/>
       </Rule>
     </Style>
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/line_join_style_broken.xml b/tests/data/broken_maps/line_join_style_broken.xml
index 736e0a7..281b835 100644
--- a/tests/data/broken_maps/line_join_style_broken.xml
+++ b/tests/data/broken_maps/line_join_style_broken.xml
@@ -1,11 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map bgcolor="red">
+<!DOCTYPE Map>
+<Map background-color="red" minimum-version="0.7.2">
     <Style name="some_style">
       <Rule name="some_rule">
-        <LineSymbolizer>
-          <CssParameter name="stroke-linejoin">meta</CssParameter>
-        </LineSymbolizer>
+        <LineSymbolizer stroke-linejoin="meta"/>
       </Rule>
     </Style>
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/line_pattern_symbolizer_broken.xml b/tests/data/broken_maps/line_pattern_symbolizer_broken.xml
deleted file mode 100644
index 7101aec..0000000
--- a/tests/data/broken_maps/line_pattern_symbolizer_broken.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map bgcolor="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs">
-    <Style name="some_style">
-        <Rule>
-            <LinePatternSymbolizer file="foo.png"/>
-        </Rule>
-    </Style>
-</Map>
diff --git a/tests/data/broken_maps/mapnik_min_version.xml b/tests/data/broken_maps/mapnik_min_version.xml
index adb379a..877603d 100644
--- a/tests/data/broken_maps/mapnik_min_version.xml
+++ b/tests/data/broken_maps/mapnik_min_version.xml
@@ -1,3 +1,3 @@
-<Map bgcolor="steelblue" minimum_version="50.0.0">
+<Map background-color="steelblue" minimum-version="100.0.0">
 <!-- arbitrarily large version number that should throw error -->
 </Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/max_scale_denom_broken.xml b/tests/data/broken_maps/max_scale_denom_broken.xml
index 60ada9c..441cfd1 100644
--- a/tests/data/broken_maps/max_scale_denom_broken.xml
+++ b/tests/data/broken_maps/max_scale_denom_broken.xml
@@ -1,9 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map>
+<!DOCTYPE Map>
+<Map minimum-version="0.7.2">
     <Style name="some_style">
       <Rule>
         <MaxScaleDenominator>3,141</MaxScaleDenominator>
       </Rule>
     </Style>
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/min_scale_denom_broken.xml b/tests/data/broken_maps/min_scale_denom_broken.xml
index 3c68435..0604f7f 100644
--- a/tests/data/broken_maps/min_scale_denom_broken.xml
+++ b/tests/data/broken_maps/min_scale_denom_broken.xml
@@ -1,9 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map>
+<!DOCTYPE Map>
+<Map minimum-version="0.7.2">
     <Style name="some_style">
       <Rule>
         <MinScaleDenominator>foobar</MinScaleDenominator>
       </Rule>
     </Style>
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/missing_icon.xml b/tests/data/broken_maps/missing_icon.xml
deleted file mode 100644
index cd3687c..0000000
--- a/tests/data/broken_maps/missing_icon.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map bgcolor="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs">
-    <Style name="some_style">
-        <Rule>
-            <PolygonPatternSymbolizer width="16" height="16" type="png" file="/no/shuch/icon.png"/>
-        </Rule>
-    </Style>
-</Map>
diff --git a/tests/data/broken_maps/point_symbolizer_broken.xml b/tests/data/broken_maps/point_symbolizer_broken.xml
deleted file mode 100644
index b898497..0000000
--- a/tests/data/broken_maps/point_symbolizer_broken.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map bgcolor="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs">
-    <Style name="some_style">
-        <Rule>
-            <PointSymbolizer file="foo.png"/>
-        </Rule>
-    </Style>
-</Map>
diff --git a/tests/data/broken_maps/polygon_pattern_symbolizer_broken.xml b/tests/data/broken_maps/polygon_pattern_symbolizer_broken.xml
index 455f249..c587738 100644
--- a/tests/data/broken_maps/polygon_pattern_symbolizer_broken.xml
+++ b/tests/data/broken_maps/polygon_pattern_symbolizer_broken.xml
@@ -1,9 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map bgcolor="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs">
+<!DOCTYPE Map>
+<Map background-color="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs" minimum-version="0.7.2">
     <Style name="some_style">
         <Rule>
-            <PolygonPatternSymbolizer width="16" type="png"/>
+            <PolygonPatternSymbolizer/>
         </Rule>
     </Style>
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/shield_symbolizer_broken.xml b/tests/data/broken_maps/shield_symbolizer_broken.xml
index 9d58f4e..ea1b83a 100644
--- a/tests/data/broken_maps/shield_symbolizer_broken.xml
+++ b/tests/data/broken_maps/shield_symbolizer_broken.xml
@@ -1,10 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map bgcolor="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs">
+<!DOCTYPE Map>
+<Map background-color="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs" minimum-version="0.7.2">
     <Style name="some_style">
         <Rule>
-            <ShieldSymbolizer name="foo.ttf" face_name="bold" size="10" fill="#444"
-                              file="data/images/dummy.png" type="png" width="16"/>
+            <ShieldSymbolizer name="[foo.ttf]" size="10" fill="#444" file="data/images/dummy.png" face-name="bold"/>
         </Rule>
     </Style>
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/stroke_dasharray_broken.xml b/tests/data/broken_maps/stroke_dasharray_broken.xml
index ad3de7d..770015a 100644
--- a/tests/data/broken_maps/stroke_dasharray_broken.xml
+++ b/tests/data/broken_maps/stroke_dasharray_broken.xml
@@ -1,12 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map bgcolor="red">
+<!DOCTYPE Map>
+<Map background-color="red" minimum-version="0.7.2">
     <Style name="some_style">
       <Rule name="some_rule">
-        <LineSymbolizer>
-          <CssParameter name="stroke">red</CssParameter>
-          <CssParameter name="stroke-dasharray">1.0, 4.0, foo, 6.0</CssParameter>
-        </LineSymbolizer>
+        <LineSymbolizer stroke="red" stroke-dasharray="1.0, 4.0, foo, 6.0"/>
       </Rule>
     </Style>
 </Map>
diff --git a/tests/data/broken_maps/style_name_missing.xml b/tests/data/broken_maps/style_name_missing.xml
index 5d95cb1..5e9392f 100644
--- a/tests/data/broken_maps/style_name_missing.xml
+++ b/tests/data/broken_maps/style_name_missing.xml
@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map>
+<!DOCTYPE Map>
+<Map minimum-version="0.7.2">
     <Style/>
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/text_symbolizer_broken.xml b/tests/data/broken_maps/text_symbolizer_broken.xml
index 6b22318..dec23ec 100644
--- a/tests/data/broken_maps/text_symbolizer_broken.xml
+++ b/tests/data/broken_maps/text_symbolizer_broken.xml
@@ -1,9 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map bgcolor="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs">
+<!DOCTYPE Map>
+<Map background-color="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs" minimum-version="0.7.2">
     <Style name="some_style">
         <Rule>
-            <TextSymbolizer name="foo.ttf" face_name="bold" size="-5"/>
+            <TextSymbolizer name="[foo.ttf]" size="-5" face-name="bold"/>
         </Rule>
     </Style>
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/xml_tag_mismatch.xml b/tests/data/broken_maps/xml_tag_mismatch.xml
index 480bd1b..fed2057 100644
--- a/tests/data/broken_maps/xml_tag_mismatch.xml
+++ b/tests/data/broken_maps/xml_tag_mismatch.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE Map  >
-<Map bgcolor="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs">
+<Map background-color="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs">
     <Style name="some_style">
         <Rule>
             <Filter>[mapnik:geometry] = 1</Filter> 
diff --git a/tests/data/csv/points.csv b/tests/data/csv/points.csv
new file mode 100644
index 0000000..4852c0f
--- /dev/null
+++ b/tests/data/csv/points.csv
@@ -0,0 +1,6 @@
+x,y,label
+0,0,"0,0"
+5,5,"5,5"
+0,5,"0,5"
+5,0,"5,0"
+2,2,"2.5,2.5"
diff --git a/tests/data/csv/points.vrt b/tests/data/csv/points.vrt
new file mode 100644
index 0000000..708fd0f
--- /dev/null
+++ b/tests/data/csv/points.vrt
@@ -0,0 +1,8 @@
+<OGRVRTDataSource>
+    <OGRVRTLayer name="points">
+        <SrcDataSource relativeToVRT="1">./points.csv</SrcDataSource>
+        <GeometryType>wkbPoint</GeometryType>
+        <LayerSRS>WGS84</LayerSRS>
+        <GeometryField encoding="PointFromColumns" x="x" y="y"/>
+    </OGRVRTLayer>
+</OGRVRTDataSource>
\ No newline at end of file
diff --git a/fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansMono-BoldOblique.ttf b/tests/data/fonts/DejaVuSansMono-BoldOblique.ttf
similarity index 100%
rename from fonts/dejavu-fonts-ttf-2.30/ttf/DejaVuSansMono-BoldOblique.ttf
rename to tests/data/fonts/DejaVuSansMono-BoldOblique.ttf
diff --git a/tests/data/fonts/LICENCE.txt b/tests/data/fonts/LICENCE.txt
new file mode 100644
index 0000000..abf98c4
--- /dev/null
+++ b/tests/data/fonts/LICENCE.txt
@@ -0,0 +1 @@
+XB Fonts.ttf from http://wiki.irmug.org/index.php/X_Series_2
\ No newline at end of file
diff --git a/tests/data/fonts/XB Zar.ttf b/tests/data/fonts/XB Zar.ttf
new file mode 100644
index 0000000..7a168b6
Binary files /dev/null and b/tests/data/fonts/XB Zar.ttf differ
diff --git a/tests/data/good_maps/agg_poly_gamma_map.xml b/tests/data/good_maps/agg_poly_gamma_map.xml
index 4471019..ef608e5 100644
--- a/tests/data/good_maps/agg_poly_gamma_map.xml
+++ b/tests/data/good_maps/agg_poly_gamma_map.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Map srs="+proj=merc +lon_0=0 +lat_ts=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs" bgcolor="steelblue">
-    <Style name="world_merc20090930161252883_style">
+<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="steelblue" minimum-version="0.7.2">
+    <Style name="style">
         
         <!-- Asia - default dark color behind light polygon 
         leads to "ghost lines" show-through
@@ -8,54 +7,41 @@
         
         <Rule>
             <Filter>([REGION]=142)</Filter>
-            <PolygonSymbolizer>
-                <CssParameter name="fill">yellow</CssParameter>
-            </PolygonSymbolizer>
+            <PolygonSymbolizer fill="yellow"/>
         </Rule>
 
         <!-- Europe, using Opacity avoids "ghost lines" 
         -->
         <Rule>
             <Filter>([REGION]=150)</Filter>
-            <PolygonSymbolizer>
-                <CssParameter name="fill">rgb(176,151,238)</CssParameter>
-                <CssParameter name="fill-opacity">.3</CssParameter>
-            </PolygonSymbolizer>
+            <PolygonSymbolizer fill="rgb(176,151,238)" fill-opacity=".3"/>
         </Rule>
         
         <!-- Americas, using gamma of .65 to remove blue lines works as well..
         -->
         <Rule>
             <Filter>([REGION]=19)</Filter>
-            <PolygonSymbolizer>
-                <CssParameter name="fill">rgb(136,172,2)</CssParameter>
-                <CssParameter name="gamma">.6</CssParameter>
-            </PolygonSymbolizer>
+            <PolygonSymbolizer fill="rgb(136,172,2)" gamma=".6"/>
         </Rule>
 
         <!-- Africa, using gamma of .65 to remove blue lines works as well..
         -->
         <Rule>
             <Filter>([REGION]=2)</Filter>
-            <PolygonSymbolizer>
-                <CssParameter name="fill">rgb(239,98,133)</CssParameter>
-                <CssParameter name="gamma">.65</CssParameter>
-            </PolygonSymbolizer>
+            <PolygonSymbolizer fill="rgb(239,98,133)" gamma=".65"/>
         </Rule>
 
         <!-- Oceana, all disjunct polygons so it does not matter -->
         <Rule>
             <Filter>([REGION]=9)</Filter>
-            <PolygonSymbolizer>
-                <CssParameter name="fill">rgb(212,9,14)</CssParameter>
-            </PolygonSymbolizer>
+            <PolygonSymbolizer fill="rgb(212,9,14)"/>
         </Rule>
     </Style>
-    <Layer name="world_merc20090930161252883" srs="+proj=merc +lon_0=0 +lat_ts=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs" status="1" clear_label_cache="0" queryable="1">
-        <StyleName>world_merc20090930161252883_style</StyleName>
+    <Layer name="world" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
+        <StyleName>style</StyleName>
         <Datasource>
             <Parameter name="file">../../data/shp/world_merc</Parameter>
             <Parameter name="type">shape</Parameter>
         </Datasource>
     </Layer>
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/also_and_else_filter.xml b/tests/data/good_maps/also_and_else_filter.xml
new file mode 100644
index 0000000..10d7c3a
--- /dev/null
+++ b/tests/data/good_maps/also_and_else_filter.xml
@@ -0,0 +1,17 @@
+<!DOCTYPE Map>
+<Map background-color="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs" minimum-version="0.7.2" paths-from-xml="false">
+    <Style name="test 1">
+        <Rule>
+            <Filter>[foo]='bar'</Filter>
+            <PointSymbolizer file="../data/images/foobar.png"/>
+        </Rule>
+        <Rule>
+            <ElseFilter/>
+            <PointSymbolizer file="../data/images/else.png"/>
+        </Rule>
+        <Rule>
+            <AlsoFilter/>
+            <PointSymbolizer file="../data/images/also.png"/>
+        </Rule>
+    </Style>
+</Map>
diff --git a/tests/data/good_maps/background-image.xml b/tests/data/good_maps/background-image.xml
new file mode 100644
index 0000000..1b09e01
--- /dev/null
+++ b/tests/data/good_maps/background-image.xml
@@ -0,0 +1,2 @@
+<Map background-image="../../data/images/checker.jpg" minimum-version="0.7.2">  
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/bool_values.xml b/tests/data/good_maps/bool_values.xml
index 7241d9f..f23833a 100644
--- a/tests/data/good_maps/bool_values.xml
+++ b/tests/data/good_maps/bool_values.xml
@@ -1,52 +1,43 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map bgcolor="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs" paths_from_xml="false">
+<!DOCTYPE Map>
+<Map background-color="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs" minimum-version="0.7.2" paths-from-xml="false">
     <Style name="test 1">
         <Rule>
-            <PointSymbolizer file="../data/images/dummy.png" type="png" width="16"
-                        height="16" allow_overlap="true" />
+            <PointSymbolizer file="../data/images/dummy.png" allow-overlap="true"/>
         </Rule>
     </Style>
     <Style name="test 2">
         <Rule>
-            <PointSymbolizer file="../data/images/dummy.png" type="png" width="16"
-                        height="16" allow_overlap="yes" />
+            <PointSymbolizer file="../data/images/dummy.png" allow-overlap="yes"/>
         </Rule>
     </Style>
     <Style name="test 3">
         <Rule>
-            <PointSymbolizer file="../data/images/dummy.png" type="png" width="16"
-                        height="16" allow_overlap="on" />
+            <PointSymbolizer file="../data/images/dummy.png" allow-overlap="on"/>
         </Rule>
     </Style>
     <Style name="test 4">
         <Rule>
-            <PointSymbolizer file="../data/images/dummy.png" type="png" width="16"
-                        height="16" allow_overlap="1" />
+            <PointSymbolizer file="../data/images/dummy.png" allow-overlap="1"/>
         </Rule>
     </Style>
     <Style name="test 5">
         <Rule>
-            <PointSymbolizer file="../data/images/dummy.png" type="png" width="16"
-                        height="16" allow_overlap="false" />
+            <PointSymbolizer file="../data/images/dummy.png" allow-overlap="false"/>
         </Rule>
     </Style>
     <Style name="test 6">
         <Rule>
-            <PointSymbolizer file="../data/images/dummy.png" type="png" width="16"
-                        height="16" allow_overlap="no" />
+            <PointSymbolizer file="../data/images/dummy.png" allow-overlap="no"/>
         </Rule>
     </Style>
     <Style name="test 7">
         <Rule>
-            <PointSymbolizer file="../data/images/dummy.png" type="png" width="16"
-                        height="16" allow_overlap="off" />
+            <PointSymbolizer file="../data/images/dummy.png" allow-overlap="off"/>
         </Rule>
     </Style>
     <Style name="test 8">
         <Rule>
-            <PointSymbolizer file="../data/images/dummy.png" type="png" width="16"
-                        height="16" allow_overlap="0" />
+            <PointSymbolizer file="../data/images/dummy.png" allow-overlap="0"/>
         </Rule>
     </Style>
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/bounds_clipping.xml b/tests/data/good_maps/bounds_clipping.xml
new file mode 100644
index 0000000..0901f78
--- /dev/null
+++ b/tests/data/good_maps/bounds_clipping.xml
@@ -0,0 +1,47 @@
+<!-- without maximum-extent this will drop features if a 
+     buffer_size is used of >= 128 which can be simulated with:
+     
+a tile request like: /2/0/1.png
+
+or using nik2img:
+
+nik2img.py tests/data/good_maps/bounds_clipping.xml t.png -e -20037508.34 -5009377.085697313 -5009377.08569731 15028131.25709193 -d 256 256
+
+no buffer can be simulated with:
+
+nik2img.py tests/data/good_maps/bounds_clipping.xml t.png -d 256 256 -e -20037508.342789244 0 -10018754.171394622 10018754.17139462
+
++proj=krovak +lat_0=49.5 +lon_0=24.83333333333333 +alpha=30.28813975277778 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +towgs84=498.17,136.89,510.08,6.007,4.343,3.831,3.38 +no_defs
+
+-->
+
+<Map 
+  srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" 
+  minimum-version="2.0.0" 
+  buffer-size="128"
+  maximum-extent="-20037508.34,-20037508.34,20037508.34,20037508.34"
+>
+
+  <Style name="style">
+     <Rule>
+        <PolygonSymbolizer fill="darkred"/>
+     </Rule>
+    
+   </Style>
+
+  <!-- layer in standard mercator: being protected into 
+       spherical mercator makes it prone to feature loss
+       when using map buffer
+  -->
+  <Layer 
+      name="countries" 
+      srs="+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs"
+  >
+    <StyleName>style</StyleName>
+    <Datasource>
+      <Parameter name="type">shape</Parameter>
+      <Parameter name="file">../shp/world_merc2.shp</Parameter>
+    </Datasource>
+  </Layer>
+
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/building_symbolizer.xml b/tests/data/good_maps/building_symbolizer.xml
index 4a59178..37129e2 100644
--- a/tests/data/good_maps/building_symbolizer.xml
+++ b/tests/data/good_maps/building_symbolizer.xml
@@ -1,12 +1,8 @@
-<Map bgcolor="steelblue" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs">
+<Map background-color="steelblue" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs" minimum-version="0.7.2">
 
   <Style name="test">
     <Rule>
-      <BuildingSymbolizer>
-        <CssParameter name="fill">yellow</CssParameter>
-        <CssParameter name="fill-opacity">.7</CssParameter>
-        <CssParameter name="height">30</CssParameter>
-      </BuildingSymbolizer>
+      <BuildingSymbolizer fill="yellow" fill-opacity=".7" height="30"/>
     </Rule>  
   </Style>
 
diff --git a/tests/data/good_maps/datasource.xml b/tests/data/good_maps/datasource.xml
index 7bf565d..64a90bb 100644
--- a/tests/data/good_maps/datasource.xml
+++ b/tests/data/good_maps/datasource.xml
@@ -1,14 +1,20 @@
-<!-- see: http://trac.mapnik.org/changeset/574 -->
-<Map bgcolor="steelblue" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs">
+<!-- see: http://trac.mapnik.org/changeset/574 --><Map background-color="steelblue" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs" minimum-version="0.7.2">
 
-  <Datasource name="shp">
-    <Parameter name="file">../../data/shp/poly.shp</Parameter>
-  </Datasource>
+    <Style name="test">
+      <Rule>
+         <PolygonSymbolizer/>
+      </Rule>
+    </Style>
+
+    <Datasource name="shp">
+      <Parameter name="type">shape</Parameter>
+      <Parameter name="base">../../data/shp/</Parameter>
+    </Datasource>
 
   <Layer name="lay" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs">
     <StyleName>test</StyleName>
     <Datasource base="shp">
-      <Parameter name="type">shape</Parameter>
+      <Parameter name="file">poly.shp</Parameter>
     </Datasource>
   </Layer>
   
diff --git a/tests/data/good_maps/entities.xml b/tests/data/good_maps/entities.xml
deleted file mode 100644
index 11aa3d9..0000000
--- a/tests/data/good_maps/entities.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map [
-<!ENTITY % entities SYSTEM "../inc/entities.xml.inc">
-%entities;
-]>
-<Map bgcolor="#b5d0d0" srs="&srs900913;">
-  &fontset-settings;
-<Style name="turning_circle">
-    <Rule>
-      &maxscale_zoom15;
-      &minscale_zoom16;
-      <PointSymbolizer file="&symbols;/dummy.png" type="png" width="15" height="15" />
-    </Rule>
-    <Rule>
-      &maxscale_zoom17;
-      <PointSymbolizer file="&symbols;/dummy.png" type="png" width="19" height="19" />
-    </Rule>
-</Style>
-<Layer name="area-text" status="on" srs="&srs900913;">
-    <StyleName>turning_circle</StyleName>
-</Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/filesource.xml b/tests/data/good_maps/filesource.xml
index 59ad65d..6e44f62 100644
--- a/tests/data/good_maps/filesource.xml
+++ b/tests/data/good_maps/filesource.xml
@@ -1,16 +1,11 @@
-<!-- see: http://trac.mapnik.org/changeset/574 -->
-<Map bgcolor="steelblue" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs">
+<!-- see: http://trac.mapnik.org/changeset/574 --><Map background-color="steelblue" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs" minimum-version="0.7.2">
 
   <FileSource name="foo">../images/</FileSource>
   
   <Style name="test">
     <Rule>
-      <BuildingSymbolizer>
-        <CssParameter name="fill">darkred</CssParameter>
-        <CssParameter name="fill-opacity">1</CssParameter>
-        <CssParameter name="height">30</CssParameter>
-      </BuildingSymbolizer>
-      <PointSymbolizer base="foo" file="dummy.png" width="16" height="16" type="png" />
+      <BuildingSymbolizer fill="darkred" fill-opacity="1" height="30"/>
+      <PointSymbolizer base="foo" file="dummy.png"/>
     </Rule>  
   </Style>
 
diff --git a/tests/data/good_maps/glyph_symbolizer.xml b/tests/data/good_maps/glyph_symbolizer.xml
new file mode 100644
index 0000000..eca9325
--- /dev/null
+++ b/tests/data/good_maps/glyph_symbolizer.xml
@@ -0,0 +1,8 @@
+<Map minimum-version="0.7.2">
+    <Style name="arrows">
+    <Rule>
+      <GlyphSymbolizer size="10" char="'í'" value="[value]" angle="[azimuth]+90" face-name="DejaVu Sans Condensed" allow-overlap="1" avoid-edges="0" halo-fill="rgba(0%,0%,0%,.1)" halo-radius="1" angle-mode="azimuth">
+      </GlyphSymbolizer>
+    </Rule>
+  </Style>
+</Map>
diff --git a/tests/data/good_maps/interior_point.xml b/tests/data/good_maps/interior_point.xml
new file mode 100644
index 0000000..923fd0c
--- /dev/null
+++ b/tests/data/good_maps/interior_point.xml
@@ -0,0 +1,31 @@
+<Map srs="+init=epsg:4326" background-color="rgb(233,233,233)" minimum-version="0.7.2">
+
+    <Style name="multipolygon_style">
+        <Rule>
+            <PolygonSymbolizer fill="pink" gamma="0.7"/>
+            <LineSymbolizer stroke="darkred"/>
+        </Rule>
+        <Rule>
+            <!-- Text using interior point -->
+            <!-- Using normal centroid algorithm -->
+            <TextSymbolizer dy="2" name="'interior point'" placement="interior" face-name="DejaVu Sans Book" halo-radius="2" allow-overlap="true"/>
+            <PointSymbolizer placement="interior" allow-overlap="true"/>
+        </Rule>
+        <Rule>
+            <!-- Text using interior point -->
+            <!-- Using normal centroid algorithm -->
+            <TextSymbolizer dy="-2" name="'centroid'" face-name="DejaVu Sans Book" halo-radius="2" allow-overlap="true"/>
+            <PointSymbolizer allow-overlap="true"/>
+        </Rule>
+    </Style>
+    
+    <Layer name="multipolygon" srs="+init=epsg:4326">
+        <StyleName>multipolygon_style</StyleName>
+        <Datasource>
+            <Parameter name="type">sqlite</Parameter>
+            <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
+            <Parameter name="table">multipolygon</Parameter>
+            <Parameter name="wkb_format">spatialite</Parameter>
+        </Datasource>
+    </Layer>
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/line_symbolizer.xml b/tests/data/good_maps/line_symbolizer.xml
new file mode 100644
index 0000000..93ab9e9
--- /dev/null
+++ b/tests/data/good_maps/line_symbolizer.xml
@@ -0,0 +1,22 @@
+<Map background-color="steelblue" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs" minimum-version="0.7.2">
+
+  <Style name="test">
+    <Rule>
+       <!-- big, thick, aliased lines -->
+      <LineSymbolizer stroke="white" stroke-gamma="0" stroke-width="10"/>
+
+       <!-- small, clean, anti-aliased lines -->
+      <LineSymbolizer stroke="red" stroke-gamma="1" stroke-width=".5"/>
+
+    </Rule>  
+  </Style>
+
+  <Layer name="lay" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs">
+    <StyleName>test</StyleName>
+    <Datasource base="shp">
+      <Parameter name="type">shape</Parameter>
+      <Parameter name="file">../../data/shp/poly.shp</Parameter>
+    </Datasource>
+  </Layer>
+  
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/line_symbolizer2.xml b/tests/data/good_maps/line_symbolizer2.xml
new file mode 100644
index 0000000..5de4241
--- /dev/null
+++ b/tests/data/good_maps/line_symbolizer2.xml
@@ -0,0 +1,38 @@
+<Map srs="+init=epsg:4326" background-color="rgb(233,233,233)" minimum-version="0.7.2">
+
+    <Datasource name="sqlite">
+        <Parameter name="type">sqlite</Parameter>
+        <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
+        <Parameter name="wkb_format">spatialite</Parameter>
+        <Parameter name="multiple_geometries">true</Parameter>
+    </Datasource>
+
+    <Style name="polygon_style">
+        <Rule>
+            <MarkersSymbolizer fill="darkgreen" placement="point" allow-overlap="true"/>
+            <PolygonSymbolizer fill="green"/>
+        </Rule>
+    </Style>
+
+    <Layer name="polygons" srs="+init=epsg:4326">
+        <StyleName>polygon_style</StyleName>
+        <Datasource base="sqlite">
+            <Parameter name="table">multipolygon</Parameter>
+        </Datasource>
+    </Layer>
+
+    <Style name="line_style">
+        <Rule>
+            <MarkersSymbolizer fill="darkred" placement="point" allow-overlap="true"/>
+            <LineSymbolizer stroke="red"/>
+        </Rule>
+    </Style>
+    
+    <Layer name="lines" srs="+init=epsg:4326">
+        <StyleName>line_style</StyleName>
+        <Datasource base="sqlite">
+            <Parameter name="table">lines</Parameter>
+        </Datasource>
+    </Layer>
+
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/mapnik_min_version.xml b/tests/data/good_maps/mapnik_min_version.xml
deleted file mode 100644
index 3a657e5..0000000
--- a/tests/data/good_maps/mapnik_min_version.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<Map bgcolor="steelblue" minimum_version="0.6.1">
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/markers_symbolizer_lines.xml b/tests/data/good_maps/markers_symbolizer_lines.xml
new file mode 100644
index 0000000..7adad85
--- /dev/null
+++ b/tests/data/good_maps/markers_symbolizer_lines.xml
@@ -0,0 +1,20 @@
+<!DOCTYPE Map>
+<Map background-color="white" srs="+init=epsg:4326" minimum-version="2.0.0">
+    <Style name="1">
+        <Rule title="foo">
+            <MarkersSymbolizer stroke="green" stroke-width="1.3" fill="yellow"/>
+            <LineSymbolizer stroke-width=".2" stroke="grey"/>
+        </Rule>
+    </Style>
+
+    <Layer name="point" srs="+init=epsg:4326">
+        <StyleName>1</StyleName>
+        <Datasource>
+            <Parameter name="type">sqlite</Parameter>
+            <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
+            <Parameter name="table">lines</Parameter>
+            <Parameter name="wkb_format">spatialite</Parameter>
+        </Datasource>
+    </Layer>
+
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/markers_symbolizer_points.xml b/tests/data/good_maps/markers_symbolizer_points.xml
new file mode 100644
index 0000000..865d7ff
--- /dev/null
+++ b/tests/data/good_maps/markers_symbolizer_points.xml
@@ -0,0 +1,59 @@
+<!DOCTYPE Map>
+<Map background-color="white" srs="+init=epsg:4326" minimum-version="2.0.0">
+
+    <Style name="1">
+        <Rule title="foo">
+            <Filter>([name]='CHILE')</Filter>
+             <MarkersSymbolizer fill="darkgreen" opacity=".7" width="15" height="10" stroke="green" stroke-width="7" stroke-opacity=".2" placement="point" marker-type="ellipse"/>
+        </Rule>
+        <Rule title="foo">
+            <Filter>([name]='Australia')</Filter>
+             <MarkersSymbolizer fill="darkblue" opacity=".7" width="10" height="20" stroke="blue" stroke-width="7" stroke-opacity=".2" placement="point" marker-type="ellipse"/>
+        </Rule>
+        <Rule title="foo1">
+            <Filter>([name]='Brazil')</Filter>
+             <MarkersSymbolizer fill="darkorange" opacity=".7" width="20" height="10" stroke="orange" stroke-width="7" stroke-opacity=".2" placement="point" marker-type="ellipse"/>
+        </Rule>
+        <Rule title="foo">
+            <Filter>([name]='Mongolia')</Filter>
+             <MarkersSymbolizer fill="darkgoldenrod" opacity=".7" width="25" height="10" stroke="yellow" stroke-width="7" stroke-opacity=".2" placement="point" marker-type="ellipse"/>
+        </Rule>
+        <Rule title="foo">
+            <Filter>([name]='Sudan')</Filter>
+             <MarkersSymbolizer fill="darkcyan" opacity=".7" width="15" height="10" stroke="cadetblue" stroke-width="7" stroke-opacity=".2" placement="point" marker-type="ellipse"/>
+        </Rule>
+        <Rule title="foo">
+            <Filter>([name]='United States')</Filter>
+             <MarkersSymbolizer fill="#cc3344" opacity=".7" width="15" height="10" stroke="#cc3344" stroke-width="7" stroke-opacity=".2" placement="point" marker-type="ellipse"/>
+        </Rule>
+        <Rule title="foo">
+            <ElseFilter/>
+            <PointSymbolizer file="../svg/ellipses.svg"/>
+        </Rule>
+    </Style>
+    <Layer name="point" srs="+init=epsg:4326">
+        <StyleName>1</StyleName>
+        <Datasource>
+            <Parameter name="type">sqlite</Parameter>
+            <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
+            <Parameter name="table">point</Parameter>
+            <Parameter name="wkb_format">spatialite</Parameter>
+        </Datasource>
+    </Layer>
+<!--
+  <Style name="meta_point_bboxs">
+    <Rule>
+          <LineSymbolizer stroke="green" stroke-width=".5"/>
+    </Rule>
+  </Style>
+
+  <Layer name="points" status="on" srs="+proj=latlong +datum=WGS84">
+    <StyleName>meta_point_bboxs</StyleName>
+    <Datasource>
+      <Parameter name="type">ogr</Parameter>
+      <Parameter name="layer">OGRGeoJSON</Parameter>
+      <Parameter name="file">../../../markers.json</Parameter>
+    </Datasource>
+  </Layer>  
+-->
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/markers_symbolizer_points_gradient.xml b/tests/data/good_maps/markers_symbolizer_points_gradient.xml
new file mode 100644
index 0000000..503b71c
--- /dev/null
+++ b/tests/data/good_maps/markers_symbolizer_points_gradient.xml
@@ -0,0 +1,27 @@
+<Map srs="+init=epsg:4326" minimum-version="2.0.0">
+
+    <Style name="1">
+        <Rule>
+             <MarkersSymbolizer fill="black" opacity=".01" width="10" stroke-width="0" allow-overlap="true"/>
+             <MarkersSymbolizer fill="black" opacity=".05" width="9" stroke-width="0" allow-overlap="true"/>
+             <MarkersSymbolizer fill="black" opacity="0.1" width="8" stroke-width="0" allow-overlap="true"/>
+             <MarkersSymbolizer fill="black" opacity="0.1" width="7" stroke-width="0" allow-overlap="true"/>
+             <MarkersSymbolizer fill="black" opacity="0.1" width="6" stroke-width="0" allow-overlap="true"/>
+             <MarkersSymbolizer fill="black" opacity="0.1" width="5" stroke-width="0" allow-overlap="true"/>
+             <MarkersSymbolizer fill="black" opacity="0.1" width="4" stroke-width="0" allow-overlap="true"/>
+             <MarkersSymbolizer fill="black" opacity="0.1" width="3" stroke-width="0" allow-overlap="true"/>
+             <MarkersSymbolizer fill="black" opacity="0.2" width="2" stroke-width="0" allow-overlap="true"/>
+             <MarkersSymbolizer fill="black" opacity="0.2" width="1" stroke-width="0" allow-overlap="true"/>
+        </Rule>
+    </Style>
+    
+    <Layer name="point" srs="+init=epsg:4326">
+        <StyleName>1</StyleName>
+        <Datasource>
+            <Parameter name="type">sqlite</Parameter>
+            <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
+            <Parameter name="table">point</Parameter>
+            <Parameter name="wkb_format">spatialite</Parameter>
+        </Datasource>
+    </Layer>
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/markers_symbolizer_points_stacked.xml b/tests/data/good_maps/markers_symbolizer_points_stacked.xml
new file mode 100644
index 0000000..564618d
--- /dev/null
+++ b/tests/data/good_maps/markers_symbolizer_points_stacked.xml
@@ -0,0 +1,29 @@
+<Map background-color="lightgrey" srs="+init=epsg:4326" minimum-version="2.0.0">
+
+    <Style name="1">
+        <Rule>
+            <Filter>([name]='CHILE' or [name]='Australia' or [name]='Brazil')</Filter>
+             <!-- stacked without outlines -->
+             <MarkersSymbolizer fill="red" width="5" stroke-width="0" allow-overlap="true"/>
+             <MarkersSymbolizer fill="orange" width="4" stroke-width="0" allow-overlap="true"/>
+             <MarkersSymbolizer fill="yellow" width="3" stroke-width="0" allow-overlap="true"/>
+             <MarkersSymbolizer fill="green" width="2" stroke-width="0" allow-overlap="true"/>
+             <MarkersSymbolizer fill="blue" width="1" stroke-width="0" allow-overlap="true"/>
+             <MarkersSymbolizer fill="purple" width=".5" stroke-width="0" allow-overlap="true"/>
+        </Rule>
+        <Rule>
+             <ElseFilter/>
+             <!-- single with without outline using stroke params -->
+             <MarkersSymbolizer fill="white" stroke-width=".3" stroke="green" stroke-opacity=".5" allow-overlap="true"/>
+        </Rule>
+    </Style>
+    <Layer name="point" srs="+init=epsg:4326">
+        <StyleName>1</StyleName>
+        <Datasource>
+            <Parameter name="type">sqlite</Parameter>
+            <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
+            <Parameter name="table">point</Parameter>
+            <Parameter name="wkb_format">spatialite</Parameter>
+        </Datasource>
+    </Layer>
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/oblique_or_italic_fonts.xml b/tests/data/good_maps/oblique_or_italic_fonts.xml
deleted file mode 100644
index 47cfc23..0000000
--- a/tests/data/good_maps/oblique_or_italic_fonts.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<!-- see: http://trac.mapnik.org/changeset/574 -->
-<Map bgcolor="transparent" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs">
-
-  <FileSource name="foo">../images/</FileSource>
-  
-  <Style name="test">
-    <Rule>
-      <PolygonSymbolizer />
-      <LineSymbolizer />
-    </Rule>  
-  </Style>
-
-  <Style name="labels">
-    <Rule>
-      <TextSymbolizer name="PRFEDEA" face_name="DejaVu Sans Oblique" size="16" color="white"/>
-    </Rule>  
-  </Style>
-
-  <Layer name="lay" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs ">
-    <StyleName>test</StyleName>
-    <StyleName>labels</StyleName>
-    <Datasource>
-      <Parameter name="type">shape</Parameter>
-      <Parameter name="base">../../data/shp/</Parameter>
-      <Parameter name="file">poly.shp</Parameter>
-    </Datasource>
-  </Layer>
-  
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/osm-styles.xml b/tests/data/good_maps/osm-styles.xml
index 0d5c79e..044f811 100644
--- a/tests/data/good_maps/osm-styles.xml
+++ b/tests/data/good_maps/osm-styles.xml
@@ -1,1063 +1,604 @@
-<?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE Map>
-<Map bgcolor="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs">
-    <Style name="mapnik:selection">
-      <Rule>
-        <Filter>[mapnik:geometry] = 1</Filter> 
-        <PointSymbolizer/>
-      </Rule>
-      <Rule>
-        <Filter>[mapnik:geometry] = 2</Filter> 
-        <LineSymbolizer>
-          <CssParameter name="stroke">red</CssParameter>
-          <CssParameter name="stroke-width">6</CssParameter>
-          <CssParameter name="stroke-opacity">0.5</CssParameter>
-        </LineSymbolizer>
-        <LineSymbolizer>
-          <CssParameter name="stroke">yellow</CssParameter>
-          <CssParameter name="stroke-width">2</CssParameter>
-          <CssParameter name="stroke-opacity">1.0</CssParameter>
-        </LineSymbolizer>
-      </Rule>
-      <Rule>
-        <Filter>[mapnik:geometry] = 3</Filter> 
-        <PolygonSymbolizer>
-          <CssParameter name="fill">red</CssParameter>
-          <CssParameter name="fill-opacity">0.5</CssParameter>
-        </PolygonSymbolizer>
-      </Rule>
-    </Style>
-
-   <Style name="world-1">
+<Map background-color="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs" minimum-version="0.7.2">
+  <Style name="mapnik:selection">
+    <Rule>
+      <Filter>[mapnik:geometry] = 1</Filter>
+      <PointSymbolizer/>
+    </Rule>
+    <Rule>
+      <Filter>[mapnik:geometry] = 2</Filter>
+      <LineSymbolizer stroke="red" stroke-width="6" stroke-opacity="0.5"/>
+      <LineSymbolizer stroke="yellow" stroke-width="2" stroke-opacity="1.0"/>
+    </Rule>
+    <Rule>
+      <Filter>[mapnik:geometry] = 3</Filter>
+      <PolygonSymbolizer fill-opacity="0.5" fill="red"/>
+    </Rule>
+  </Style>
+  <Style name="world-1">
     <Rule>
       <MaxScaleDenominator>250000000000</MaxScaleDenominator>
       <MinScaleDenominator>6000000</MinScaleDenominator>
-      <PolygonSymbolizer>
-        <CssParameter name="fill">#f2efe9</CssParameter>
-      </PolygonSymbolizer>
-       <LineSymbolizer>
-        <CssParameter name="stroke">#b5d0d0</CssParameter>
-	<CssParameter name="stroke-width">0.5</CssParameter>
-      </LineSymbolizer>
+      <PolygonSymbolizer fill="#f2efe9"/>
+      <LineSymbolizer stroke="#b5d0d0" stroke-width="0.5"/>
     </Rule>
   </Style>
   <Style name="world">
     <Rule>
       <MaxScaleDenominator>6000000</MaxScaleDenominator>
       <MinScaleDenominator>600000</MinScaleDenominator>
-      <PolygonSymbolizer>
-        <CssParameter name="fill">#f2efe9</CssParameter>
-      </PolygonSymbolizer>
+      <PolygonSymbolizer fill="#f2efe9"/>
     </Rule>
   </Style>
-
   <Style name="coast-poly">
     <Rule>
       <MaxScaleDenominator>600000</MaxScaleDenominator>
-      <PolygonSymbolizer>
-        <CssParameter name="fill">#f2efe9</CssParameter>
-      </PolygonSymbolizer>
+      <PolygonSymbolizer fill="#f2efe9"/>
     </Rule>
   </Style>
-
   <Style name="coast-line">
     <Rule>
       <MaxScaleDenominator>600000</MaxScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">skyblue</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="skyblue"/>
     </Rule>
   </Style>
-  
   <Style name="builtup">
     <Rule>
       <MaxScaleDenominator>2500000</MaxScaleDenominator>
       <MinScaleDenominator>500000</MinScaleDenominator>
-      <PolygonSymbolizer>
-        <CssParameter name="fill">#ddd</CssParameter>
-      </PolygonSymbolizer>
+      <PolygonSymbolizer fill="#ddd"/>
     </Rule>
   </Style>
-  
   <Style name="places">
     <Rule>
       <MaxScaleDenominator>50000000</MaxScaleDenominator>
       <MinScaleDenominator>10000000</MinScaleDenominator>
-      <TextSymbolizer name="place_name" face_name="DejaVu Sans Book" size="10" fill="#444" halo_radius="1" wrap_width="0"/>
+      <TextSymbolizer name="[place_name]" size="10" fill="#444" face-name="DejaVu Sans Book" halo-radius="1" wrap-width="0"/>
     </Rule>
   </Style>
-  
   <Style name="text">
     <Rule>
       <Filter>[place] = 'city'</Filter>
       <MaxScaleDenominator>10000000</MaxScaleDenominator>
       <MinScaleDenominator>2000000</MinScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="10" fill="#000" dy="0" halo_radius="1" wrap_width="0"/>
+      <TextSymbolizer name="[name]" size="10" fill="#000" dy="0" face-name="DejaVu Sans Book" halo-radius="1" wrap-width="0"/>
     </Rule>
     <Rule>
       <Filter>[place] = 'city'</Filter>
       <MaxScaleDenominator>2000000</MaxScaleDenominator>
       <MinScaleDenominator>20000</MinScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="14" fill="#000" dy="0" halo_radius="2" wrap_width="0"/>
+      <TextSymbolizer name="[name]" size="14" fill="#000" dy="0" face-name="DejaVu Sans Book" halo-radius="2" wrap-width="0"/>
     </Rule>
     <Rule>
       <Filter>[place] = 'town'</Filter>
       <MaxScaleDenominator>2000000</MaxScaleDenominator>
       <MinScaleDenominator>50000</MinScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="11" fill="#000" halo_radius="2" wrap_width="20"/>
+      <TextSymbolizer name="[name]" size="11" fill="#000" face-name="DejaVu Sans Book" halo-radius="2" wrap-width="20"/>
     </Rule>
     <Rule>
       <Filter>[place] = 'town'</Filter>
       <MaxScaleDenominator>50000</MaxScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="14" fill="#777777" halo_radius="1" wrap_width="20"/>
+      <TextSymbolizer name="[name]" size="14" fill="#777777" face-name="DejaVu Sans Book" halo-radius="1" wrap-width="20"/>
     </Rule>
     <Rule>
       <Filter>[place] = 'village'</Filter>
       <MaxScaleDenominator>250000</MaxScaleDenominator>
       <MinScaleDenominator>50000</MinScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="8" fill="#000" halo_radius="2" wrap_width="0"/>
+      <TextSymbolizer name="[name]" size="8" fill="#000" face-name="DejaVu Sans Book" halo-radius="2" wrap-width="0"/>
     </Rule>
     <Rule>
       <Filter>[place] = 'village'</Filter>
       <MaxScaleDenominator>50000</MaxScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="11" fill="#777777" halo_radius="1" wrap_width="0"/>
+      <TextSymbolizer name="[name]" size="11" fill="#777777" face-name="DejaVu Sans Book" halo-radius="1" wrap-width="0"/>
     </Rule>
-
     <Rule>
       <Filter>[place] = 'hamlet'</Filter>
       <MaxScaleDenominator>125000</MaxScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="8" fill="#000" halo_radius="1" wrap_width="0"/>
+      <TextSymbolizer name="[name]" size="8" fill="#000" face-name="DejaVu Sans Book" halo-radius="1" wrap-width="0"/>
     </Rule>
-    
     <Rule>
       <Filter>[amenity] = 'pub'</Filter>
       <MaxScaleDenominator>5000</MaxScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Bold" size="10" fill="brown" dy="16" halo_radius="1" wrap_width="0"/>
+      <TextSymbolizer name="[name]" size="10" fill="brown" dy="16" face-name="DejaVu Sans Bold" halo-radius="1" wrap-width="0"/>
     </Rule>
-     <Rule>
+    <Rule>
       <Filter>[amenity] = 'place_of_worship'</Filter>
       <MaxScaleDenominator>5000</MaxScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="10" fill="#000033" dy="12" halo_radius="1" wrap_width="20"/>
+      <TextSymbolizer name="[name]" size="10" fill="#000033" dy="12" face-name="DejaVu Sans Book" halo-radius="1" wrap-width="20"/>
     </Rule>
-
     <Rule>
       <Filter>[leisure] <> '' or [landuse] <> '' </Filter>
       <MaxScaleDenominator>20000</MaxScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="10" fill="#000" halo_radius="2" wrap_width="10"/>
+      <TextSymbolizer name="[name]" size="10" fill="#000" face-name="DejaVu Sans Book" halo-radius="2" wrap-width="10"/>
     </Rule>
     <Rule>
       <Filter>[natural] = 'wood'</Filter>
       <MaxScaleDenominator>20000</MaxScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="10" fill="#000" halo_radius="2" wrap_width="10"/>
+      <TextSymbolizer name="[name]" size="10" fill="#000" face-name="DejaVu Sans Book" halo-radius="2" wrap-width="10"/>
     </Rule>
     <Rule>
       <Filter>[natural] = 'peak'</Filter>
       <MaxScaleDenominator>100000</MaxScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="10" fill="brown" dy="10" halo_radius="1" wrap_width="20"/>
+      <TextSymbolizer name="[name]" size="10" fill="brown" dy="10" face-name="DejaVu Sans Book" halo-radius="1" wrap-width="20"/>
     </Rule>
     <Rule>
       <Filter>[natural] = 'water' or [natural] = 'lake' or [landuse] = 'reservoir'</Filter>
       <MaxScaleDenominator>20000</MaxScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="10" fill="#6699cc" halo_radius="1" wrap_width="20"/>
+      <TextSymbolizer name="[name]" size="10" fill="#6699cc" face-name="DejaVu Sans Book" halo-radius="1" wrap-width="20"/>
     </Rule>
-
     <Rule>
       <Filter>[tourism] <> ''</Filter>
       <MaxScaleDenominator>10000</MaxScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="10" fill="#660033" halo_radius="2" wrap_width="10"/>
+      <TextSymbolizer name="[name]" size="10" fill="#660033" face-name="DejaVu Sans Book" halo-radius="2" wrap-width="10"/>
     </Rule>
     <Rule>
       <Filter>[amenity] = 'school' or [amenity] = 'university'</Filter>
       <MaxScaleDenominator>25000</MaxScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="8" fill="#000033" halo_radius="2" wrap_width="12"/>
+      <TextSymbolizer name="[name]" size="8" fill="#000033" face-name="DejaVu Sans Book" halo-radius="2" wrap-width="12"/>
     </Rule>
     <Rule>
       <Filter>[amenity] = 'hospital'</Filter>
       <MaxScaleDenominator>25000</MaxScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="8" fill="#000033" dy="12" halo_radius="2" wrap_width="12"/>
+      <TextSymbolizer name="[name]" size="8" fill="#000033" dy="12" face-name="DejaVu Sans Book" halo-radius="2" wrap-width="12"/>
     </Rule>
-    
   </Style>
-  
-   <Style name="water">
+  <Style name="water">
     <Rule>
       <Filter>[landuse] = 'reservoir' or [landuse] = 'water'</Filter>
       <MaxScaleDenominator>1000000</MaxScaleDenominator>
-      <PolygonSymbolizer>
-        <CssParameter name="fill">#b5d0d0</CssParameter>
-     </PolygonSymbolizer>
+      <PolygonSymbolizer fill="#b5d0d0"/>
     </Rule>
-    
     <Rule>
       <Filter>[natural] = 'lake' or [natural] = 'water'</Filter>
       <MaxScaleDenominator>1000000</MaxScaleDenominator>
-      <PolygonSymbolizer>
-        <CssParameter name="fill">#b5d0d0</CssParameter>
-     </PolygonSymbolizer>
+      <PolygonSymbolizer fill="#b5d0d0"/>
     </Rule>
-
     <Rule>
       <Filter>[natural] = 'land'</Filter>
       <MaxScaleDenominator>1000000</MaxScaleDenominator>
-      <PolygonSymbolizer>
-        <CssParameter name="fill">#f2efe9</CssParameter>
-     </PolygonSymbolizer>
+      <PolygonSymbolizer fill="#f2efe9"/>
     </Rule>
-
     <Rule>
       <Filter>[waterway]='river'</Filter>
       <MaxScaleDenominator>250000</MaxScaleDenominator>
       <MinScaleDenominator>25000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#b5d0d0</CssParameter>
-        <CssParameter name="stroke-width">2</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#b5d0d0" stroke-width="2" stroke-linecap="round"/>
     </Rule>
     <Rule>
       <Filter>[waterway]='canal'</Filter>
       <MaxScaleDenominator>250000</MaxScaleDenominator>
       <MinScaleDenominator>100000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#b5d0d0</CssParameter>
-        <CssParameter name="stroke-width">3</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#b5d0d0" stroke-width="3" stroke-linecap="round"/>
     </Rule>
     <Rule>
       <Filter>[waterway]='canal'</Filter>
       <MaxScaleDenominator>100000</MaxScaleDenominator>
       <MinScaleDenominator>50000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#b5d0d0</CssParameter>
-        <CssParameter name="stroke-width">4</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="8" fill="#6699cc" halo_radius="1" placement="line"/>
+      <LineSymbolizer stroke-linejoin="round" stroke="#b5d0d0" stroke-width="4" stroke-linecap="round"/>
+      <TextSymbolizer name="[name]" size="8" fill="#6699cc" placement="line" face-name="DejaVu Sans Book" halo-radius="1"/>
     </Rule>
-
     <Rule>
-      <ElseFilter/> 
+      <ElseFilter/>
       <MaxScaleDenominator>100000</MaxScaleDenominator>
       <MinScaleDenominator>25000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#b5d0d0</CssParameter>
-        <CssParameter name="stroke-width">1</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#b5d0d0" stroke-width="1"/>
     </Rule>
     <Rule>
       <Filter>[waterway]='river'</Filter>
       <MaxScaleDenominator>25000</MaxScaleDenominator>
       <MinScaleDenominator>1000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#b5d0d0</CssParameter>
-        <CssParameter name="stroke-width">10</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="10" fill="#6699cc" halo_radius="1" placement="line"/>
+      <LineSymbolizer stroke-linejoin="round" stroke="#b5d0d0" stroke-width="10" stroke-linecap="round"/>
+      <TextSymbolizer name="[name]" size="10" fill="#6699cc" placement="line" face-name="DejaVu Sans Book" halo-radius="1"/>
     </Rule>
     <Rule>
       <Filter>[waterway]='canal'</Filter>
       <MaxScaleDenominator>50000</MaxScaleDenominator>
       <MinScaleDenominator>1000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#b5d0d0</CssParameter>
-        <CssParameter name="stroke-width">7</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="9" fill="#6699cc" halo_radius="1" placement="line"/>
+      <LineSymbolizer stroke-linejoin="round" stroke="#b5d0d0" stroke-width="7" stroke-linecap="round"/>
+      <TextSymbolizer name="[name]" size="9" fill="#6699cc" placement="line" face-name="DejaVu Sans Book" halo-radius="1"/>
     </Rule>
     <Rule>
       <ElseFilter/>
       <MaxScaleDenominator>25000</MaxScaleDenominator>
       <MinScaleDenominator>1000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#b5d0d0</CssParameter>
-        <CssParameter name="stroke-width">2</CssParameter>
-      </LineSymbolizer>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="8" fill="#6699cc" halo_radius="1" placement="line"/>
+      <LineSymbolizer stroke="#b5d0d0" stroke-width="2"/>
+      <TextSymbolizer name="[name]" size="8" fill="#6699cc" placement="line" face-name="DejaVu Sans Book" halo-radius="1"/>
     </Rule>
-
   </Style>
-
   <Style name="minor-roads-casing">
-     <Rule>
+    <Rule>
       <Filter>[highway] = 'motorway' or [highway]='motorway_link'</Filter>
       <MaxScaleDenominator>150000</MaxScaleDenominator>
       <MinScaleDenominator>75000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#506077</CssParameter>
-        <CssParameter name="stroke-width">4</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#506077" stroke-width="4" stroke-linecap="round"/>
     </Rule>
-      
     <Rule>
       <Filter>[highway] = 'motorway' or [highway]='motorway_link'</Filter>
       <MaxScaleDenominator>75000</MaxScaleDenominator>
       <MinScaleDenominator>25000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#506077</CssParameter>
-        <CssParameter name="stroke-width">7</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#506077" stroke-width="7" stroke-linecap="round"/>
     </Rule>
     <Rule>
       <Filter>[highway] = 'motorway' or [highway]='motorway_link'</Filter>
       <MaxScaleDenominator>25000</MaxScaleDenominator>
       <MinScaleDenominator>5000</MinScaleDenominator>
-      <LineSymbolizer>        
-        <CssParameter name="stroke">#506077</CssParameter>
-        <CssParameter name="stroke-width">14</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#506077" stroke-width="14" stroke-linecap="round"/>
     </Rule>
     <Rule>
       <Filter>[highway] = 'motorway' or [highway]='motorway_link'</Filter>
       <MaxScaleDenominator>5000</MaxScaleDenominator>
       <MinScaleDenominator>1000</MinScaleDenominator>
-      <LineSymbolizer>        
-        <CssParameter name="stroke">#506077</CssParameter>
-        <CssParameter name="stroke-width">17</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
-    </Rule>
-    
-   <Rule>
+      <LineSymbolizer stroke-linejoin="round" stroke="#506077" stroke-width="17" stroke-linecap="round"/>
+    </Rule>
+    <Rule>
       <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
       <MaxScaleDenominator>150000</MaxScaleDenominator>
       <MinScaleDenominator>75000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#477147</CssParameter>
-        <CssParameter name="stroke-width">4</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#477147" stroke-width="4" stroke-linecap="round"/>
     </Rule>
-  
     <Rule>
       <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
       <MaxScaleDenominator>75000</MaxScaleDenominator>
       <MinScaleDenominator>25000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#477147</CssParameter>
-        <CssParameter name="stroke-width">11</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#477147" stroke-width="11" stroke-linecap="round"/>
     </Rule>
-    
     <Rule>
-     <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
+      <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
       <MaxScaleDenominator>25000</MaxScaleDenominator>
       <MinScaleDenominator>5000</MinScaleDenominator>
-      <LineSymbolizer>        
-        <CssParameter name="stroke">#477147</CssParameter>
-        <CssParameter name="stroke-width">14</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#477147" stroke-width="14" stroke-linecap="round"/>
     </Rule>
     <Rule>
-     <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
+      <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
       <MaxScaleDenominator>5000</MaxScaleDenominator>
       <MinScaleDenominator>1000</MinScaleDenominator>
-      <LineSymbolizer>        
-        <CssParameter name="stroke">#477147</CssParameter>
-        <CssParameter name="stroke-width">17</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#477147" stroke-width="17" stroke-linecap="round"/>
     </Rule>
-    
     <Rule>
       <Filter>[highway] = 'primary' or [highway] = 'primary_link'</Filter>
       <MaxScaleDenominator>150000</MaxScaleDenominator>
       <MinScaleDenominator>75000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#8d4346</CssParameter>
-        <CssParameter name="stroke-width">4</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#8d4346" stroke-width="4" stroke-linecap="round"/>
     </Rule>
-    
     <Rule>
       <Filter>[highway] = 'primary' or [highway] = 'primary_link'</Filter>
       <MaxScaleDenominator>75000</MaxScaleDenominator>
       <MinScaleDenominator>25000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#8d4346</CssParameter>
-        <CssParameter name="stroke-width">10</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#8d4346" stroke-width="10" stroke-linecap="round"/>
     </Rule>
     <Rule>
       <Filter>[highway] = 'primary' or [highway] = 'primary_link'</Filter>
       <MaxScaleDenominator>25000</MaxScaleDenominator>
-      <MinScaleDenominator>5000</MinScaleDenominator>      
-      <LineSymbolizer>
-        <CssParameter name="stroke">#8d4346</CssParameter>
-        <CssParameter name="stroke-width">12</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <MinScaleDenominator>5000</MinScaleDenominator>
+      <LineSymbolizer stroke-linejoin="round" stroke="#8d4346" stroke-width="12" stroke-linecap="round"/>
     </Rule>
-
     <Rule>
       <Filter>[highway] = 'primary' or [highway] = 'primary_link'</Filter>
-      <MaxScaleDenominator>5000</MaxScaleDenominator>      
+      <MaxScaleDenominator>5000</MaxScaleDenominator>
       <MinScaleDenominator>1000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#8d4346</CssParameter>
-        <CssParameter name="stroke-width">17</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#8d4346" stroke-width="17" stroke-linecap="round"/>
     </Rule>
-    
     <Rule>
       <Filter>[highway] = 'secondary' or [highway] = 'secondary_link'</Filter>
       <MaxScaleDenominator>150000</MaxScaleDenominator>
       <MinScaleDenominator>75000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#a37b48</CssParameter>
-        <CssParameter name="stroke-width">4</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#a37b48" stroke-width="4" stroke-linecap="round"/>
     </Rule>
-    
     <Rule>
       <Filter>[highway] = 'secondary' or [highway] = 'secondary_link'</Filter>
       <MaxScaleDenominator>75000</MaxScaleDenominator>
       <MinScaleDenominator>25000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#a37b48</CssParameter>
-        <CssParameter name="stroke-width">10</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#a37b48" stroke-width="10" stroke-linecap="round"/>
     </Rule>
     <Rule>
       <Filter>[highway] = 'secondary' or [highway] = 'secondary_link'</Filter>
-      <MaxScaleDenominator>25000</MaxScaleDenominator>     
+      <MaxScaleDenominator>25000</MaxScaleDenominator>
       <MinScaleDenominator>5000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#a37b48</CssParameter>
-        <CssParameter name="stroke-width">12</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#a37b48" stroke-width="12" stroke-linecap="round"/>
     </Rule>
     <Rule>
       <Filter>[highway] = 'secondary' or [highway] = 'secondary_link'</Filter>
-      <MaxScaleDenominator>5000</MaxScaleDenominator>      
+      <MaxScaleDenominator>5000</MaxScaleDenominator>
       <MinScaleDenominator>1000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#a37b48</CssParameter>
-        <CssParameter name="stroke-width">17</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#a37b48" stroke-width="17" stroke-linecap="round"/>
     </Rule>
-    
     <Rule>
       <Filter>[highway] = 'tertiary'</Filter>
       <MaxScaleDenominator>100000</MaxScaleDenominator>
       <MinScaleDenominator>50000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#999</CssParameter>
-        <CssParameter name="stroke-width">7</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#999" stroke-width="7" stroke-linecap="round"/>
     </Rule>
-
     <Rule>
       <Filter>[highway] = 'residential' or [highway] = 'minor' or [highway] = 'unclassified'</Filter>
       <MaxScaleDenominator>100000</MaxScaleDenominator>
       <MinScaleDenominator>50000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#999</CssParameter>
-        <CssParameter name="stroke-width">3</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#999" stroke-width="3" stroke-linecap="round"/>
     </Rule>
-
     <Rule>
       <Filter>[highway] = 'tertiary'</Filter>
       <MaxScaleDenominator>50000</MaxScaleDenominator>
       <MinScaleDenominator>25000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#999</CssParameter>
-        <CssParameter name="stroke-width">9</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#999" stroke-width="9" stroke-linecap="round"/>
     </Rule>
-    
     <Rule>
       <Filter>[highway] = 'residential' or [highway] = 'minor' or [highway] = 'unclassified'</Filter>
       <MaxScaleDenominator>50000</MaxScaleDenominator>
       <MinScaleDenominator>25000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#999</CssParameter>
-        <CssParameter name="stroke-width">4.5</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#999" stroke-width="4.5" stroke-linecap="round"/>
     </Rule>
-    
     <Rule>
       <Filter>[highway] = 'tertiary' or [highway] = 'residential' or [highway] = 'minor' or [highway] = 'unclassified'</Filter>
       <MaxScaleDenominator>25000</MaxScaleDenominator>
       <MinScaleDenominator>5000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#999</CssParameter>
-        <CssParameter name="stroke-width">11</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#999" stroke-width="11" stroke-linecap="round"/>
     </Rule>
-
     <Rule>
       <Filter>[highway] = 'tertiary' or [highway] = 'residential' or [highway] = 'minor' or [highway] = 'unclassified'</Filter>
       <MaxScaleDenominator>5000</MaxScaleDenominator>
       <MinScaleDenominator>100</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#999</CssParameter>
-        <CssParameter name="stroke-width">16</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#999" stroke-width="16" stroke-linecap="round"/>
     </Rule>
-
     <Rule>
       <Filter>[highway] = 'service'</Filter>
       <MaxScaleDenominator>50000</MaxScaleDenominator>
       <MinScaleDenominator>25000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#999</CssParameter>
-        <CssParameter name="stroke-width">3</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#999" stroke-width="3" stroke-linecap="round"/>
     </Rule>
     <Rule>
       <Filter>[highway] = 'service'</Filter>
       <MaxScaleDenominator>25000</MaxScaleDenominator>
       <MinScaleDenominator>1000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#999</CssParameter>
-        <CssParameter name="stroke-width">8</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
-   </Rule>
+      <LineSymbolizer stroke-linejoin="round" stroke="#999" stroke-width="8" stroke-linecap="round"/>
+    </Rule>
   </Style>
-  
   <Style name="minor-roads">
     <!-- level 10 -->
     <Rule>
       <Filter>[highway] = 'motorway' or [highway] = 'motorway_link'</Filter>
       <MaxScaleDenominator>500000</MaxScaleDenominator>
       <MinScaleDenominator>25000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#809bc0</CssParameter>
-        <CssParameter name="stroke-width">4</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#809bc0" stroke-width="4"/>
     </Rule>
-    
-    
     <!-- level 11 ...-->
     <Rule>
       <Filter>[highway] = 'motorway' or [highway] = 'motorway_link'</Filter>
       <MaxScaleDenominator>25000</MaxScaleDenominator>
       <MinScaleDenominator>10000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#809bc0</CssParameter>
-        <CssParameter name="stroke-width">8</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#809bc0" stroke-width="8" stroke-linecap="round"/>
     </Rule>
-    
     <Rule>
       <Filter>[highway] = 'motorway' or [highway] = 'motorway_link'</Filter>
       <MaxScaleDenominator>10000</MaxScaleDenominator>
       <MinScaleDenominator>5000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#809bc0</CssParameter>
-        <CssParameter name="stroke-width">12</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#809bc0" stroke-width="12" stroke-linecap="round"/>
     </Rule>
     <Rule>
       <Filter>[highway] = 'motorway' or [highway] = 'motorway_link'</Filter>
       <MaxScaleDenominator>5000</MaxScaleDenominator>
       <MinScaleDenominator>1000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#809bc0</CssParameter>
-        <CssParameter name="stroke-width">14</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#809bc0" stroke-width="14" stroke-linecap="round"/>
     </Rule>
-
     <Rule>
       <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
       <MaxScaleDenominator>100000</MaxScaleDenominator>
       <MinScaleDenominator>25000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#7fc97f</CssParameter>
-        <CssParameter name="stroke-width">8</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#7fc97f" stroke-width="8" stroke-linecap="round"/>
     </Rule>
-    
     <Rule>
       <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
       <MaxScaleDenominator>50000</MaxScaleDenominator>
       <MinScaleDenominator>5000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#7fc97f</CssParameter>
-        <CssParameter name="stroke-width">10</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#7fc97f" stroke-width="10" stroke-linecap="round"/>
     </Rule>
-     
     <Rule>
       <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
       <MaxScaleDenominator>5000</MaxScaleDenominator>
       <MinScaleDenominator>1000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#7fc97f</CssParameter>
-        <CssParameter name="stroke-width">14</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#7fc97f" stroke-width="14" stroke-linecap="round"/>
     </Rule>
-   
     <Rule>
       <Filter>[highway] = 'primary' or [highway] = 'primary_link'</Filter>
       <MaxScaleDenominator>100000</MaxScaleDenominator>
       <MinScaleDenominator>25000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#e46d71</CssParameter>
-        <CssParameter name="stroke-width">8</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#e46d71" stroke-width="8" stroke-linecap="round"/>
     </Rule>
     <Rule>
       <Filter>[highway] = 'primary' or [highway] = 'primary_link'</Filter>
       <MaxScaleDenominator>25000</MaxScaleDenominator>
       <MinScaleDenominator>5000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#e46d71</CssParameter>
-        <CssParameter name="stroke-width">10</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#e46d71" stroke-width="10" stroke-linecap="round"/>
     </Rule>
-    
     <Rule>
       <Filter>[highway] = 'primary' or [highway] = 'primary_link'</Filter>
       <MaxScaleDenominator>5000</MaxScaleDenominator>
       <MinScaleDenominator>1000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#e46d71</CssParameter>
-        <CssParameter name="stroke-width">14</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
-    </Rule>
-    
+      <LineSymbolizer stroke-linejoin="round" stroke="#e46d71" stroke-width="14" stroke-linecap="round"/>
+    </Rule>
     <!-- level 11 ..-->
-   <Rule>
+    <Rule>
       <Filter>[highway] = 'secondary' or [highway] = 'secondary_link'</Filter>
       <MaxScaleDenominator>150000</MaxScaleDenominator>
       <MinScaleDenominator>75000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#fdbf6f</CssParameter>
-        <CssParameter name="stroke-width">2</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#fdbf6f" stroke-width="2" stroke-linecap="round"/>
     </Rule>
-    
     <Rule>
       <Filter>[highway] = 'secondary' or [highway] = 'secondary_link'</Filter>
       <MaxScaleDenominator>75000</MaxScaleDenominator>
       <MinScaleDenominator>25000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#fdbf6f</CssParameter>
-        <CssParameter name="stroke-width">8</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#fdbf6f" stroke-width="8" stroke-linecap="round"/>
     </Rule>
-    
     <Rule>
       <Filter>[highway] = 'secondary' or [highway] = 'secondary_link'</Filter>
       <MaxScaleDenominator>25000</MaxScaleDenominator>
       <MinScaleDenominator>5000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#fdbf6f</CssParameter>
-        <CssParameter name="stroke-width">10</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#fdbf6f" stroke-width="10" stroke-linecap="round"/>
     </Rule>
     <Rule>
       <Filter>[highway] = 'secondary' or [highway] = 'secondary_link'</Filter>
       <MaxScaleDenominator>5000</MaxScaleDenominator>
       <MinScaleDenominator>1000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#fdbf6f</CssParameter>
-        <CssParameter name="stroke-width">14</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
-    </Rule>    
-     <Rule>
+      <LineSymbolizer stroke-linejoin="round" stroke="#fdbf6f" stroke-width="14" stroke-linecap="round"/>
+    </Rule>
+    <Rule>
       <MaxScaleDenominator>100000</MaxScaleDenominator>
       <MinScaleDenominator>1000</MinScaleDenominator>
       <Filter>[railway] = 'tram' or [railway] = 'light_rail'</Filter>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#aaa</CssParameter>
-        <CssParameter name="stroke-width">2</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#aaa" stroke-width="2"/>
     </Rule>
-     
-
     <Rule>
       <MaxScaleDenominator>200000</MaxScaleDenominator>
       <MinScaleDenominator>1000</MinScaleDenominator>
       <Filter>[railway]='subway'</Filter>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#777</CssParameter>
-        <CssParameter name="stroke-width">2</CssParameter>
-	<CssParameter name="stroke-dasharray">6,2</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#777" stroke-width="2" stroke-dasharray="6,2"/>
     </Rule>
-
     <Rule>
       <Filter>[highway] = 'tertiary' or [highway] = 'residential' or [highway] = 'unclassified'</Filter>
       <MaxScaleDenominator>1000000</MaxScaleDenominator>
       <MinScaleDenominator>100000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#ccc</CssParameter>
-        <CssParameter name="stroke-width">1</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#ccc" stroke-width="1"/>
     </Rule>
-    
     <Rule>
       <Filter>[highway] = 'residential' or [highway] = 'minor' or [highway] = 'unclassified'</Filter>
       <MaxScaleDenominator>100000</MaxScaleDenominator>
       <MinScaleDenominator>50000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#fff</CssParameter>
-        <CssParameter name="stroke-width">2</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#fff" stroke-width="2" stroke-linecap="round"/>
     </Rule>
-    
     <Rule>
       <Filter>[highway] = 'residential'  or [highway] = 'minor' or [highway] = 'unclassified'</Filter>
       <MaxScaleDenominator>50000</MaxScaleDenominator>
       <MinScaleDenominator>15000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#fff</CssParameter>
-        <CssParameter name="stroke-width">3</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#fff" stroke-width="3" stroke-linecap="round"/>
     </Rule>
-    
     <Rule>
       <Filter>[highway] = 'residential'  or [highway] = 'minor' or [highway] = 'unclassified'</Filter>
       <MaxScaleDenominator>25000</MaxScaleDenominator>
       <MinScaleDenominator>5000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#fff</CssParameter>
-        <CssParameter name="stroke-width">9.4</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#fff" stroke-width="9.4" stroke-linecap="round"/>
     </Rule>
-
-
     <Rule>
       <Filter>[highway] = 'residential'  or [highway] = 'minor' or [highway] = 'unclassified'</Filter>
       <MaxScaleDenominator>5000</MaxScaleDenominator>
       <MinScaleDenominator>100</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#fff</CssParameter>
-        <CssParameter name="stroke-width">13</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#fff" stroke-width="13" stroke-linecap="round"/>
     </Rule>
-
     <Rule>
       <Filter>[highway] = 'tertiary'</Filter>
       <MaxScaleDenominator>100000</MaxScaleDenominator>
       <MinScaleDenominator>50000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#ffffcc</CssParameter>
-        <CssParameter name="stroke-width">5</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#ffffcc" stroke-width="5" stroke-linecap="round"/>
     </Rule>
-    
     <Rule>
       <Filter>[highway] = 'tertiary'</Filter>
       <MaxScaleDenominator>50000</MaxScaleDenominator>
       <MinScaleDenominator>25000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#ffffcc</CssParameter>
-        <CssParameter name="stroke-width">7</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
-    </Rule>
-    
-   <Rule>
+      <LineSymbolizer stroke-linejoin="round" stroke="#ffffcc" stroke-width="7" stroke-linecap="round"/>
+    </Rule>
+    <Rule>
       <Filter>[highway] = 'tertiary'</Filter>
       <MaxScaleDenominator>25000</MaxScaleDenominator>
       <MinScaleDenominator>5000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#ffffcc</CssParameter>
-        <CssParameter name="stroke-width">9.4</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#ffffcc" stroke-width="9.4" stroke-linecap="round"/>
     </Rule>
     <Rule>
       <Filter>[highway] = 'tertiary'</Filter>
       <MaxScaleDenominator>5000</MaxScaleDenominator>
       <MinScaleDenominator>1000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#ffffcc</CssParameter>
-        <CssParameter name="stroke-width">13</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#ffffcc" stroke-width="13" stroke-linecap="round"/>
     </Rule>
     <Rule>
       <Filter>[highway] = 'service'</Filter>
       <MaxScaleDenominator>100000</MaxScaleDenominator>
       <MinScaleDenominator>50000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#bbbbbb</CssParameter>
-        <CssParameter name="stroke-width">1</CssParameter>
-      </LineSymbolizer>
-   </Rule>
+      <LineSymbolizer stroke="#bbbbbb" stroke-width="1"/>
+    </Rule>
     <Rule>
       <Filter>[highway] = 'service'</Filter>
       <MaxScaleDenominator>50000</MaxScaleDenominator>
       <MinScaleDenominator>25000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">white</CssParameter>
-        <CssParameter name="stroke-width">2</CssParameter>
-      </LineSymbolizer>
-   </Rule>
-       
+      <LineSymbolizer stroke="white" stroke-width="2"/>
+    </Rule>
     <Rule>
       <Filter>[highway] = 'service'</Filter>
       <MaxScaleDenominator>25000</MaxScaleDenominator>
       <MinScaleDenominator>1000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">white</CssParameter>
-        <CssParameter name="stroke-width">6</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
-   </Rule>
-
-   <Rule>
+      <LineSymbolizer stroke-linejoin="round" stroke="white" stroke-width="6" stroke-linecap="round"/>
+    </Rule>
+    <Rule>
       <Filter>[highway] = 'bridleway'</Filter>
       <MaxScaleDenominator>100000</MaxScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#fff</CssParameter>
-        <CssParameter name="stroke-width">4</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-        <CssParameter name="stroke-opacity">0.4</CssParameter>
-      </LineSymbolizer>
-      <LineSymbolizer>
-        <CssParameter name="stroke">green</CssParameter>
-        <CssParameter name="stroke-width">1.5</CssParameter>
-        <CssParameter name="stroke-dasharray">4,2</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="#fff" stroke-width="4" stroke-linecap="round" stroke-opacity="0.4"/>
+      <LineSymbolizer stroke="green" stroke-width="1.5" stroke-dasharray="4,2"/>
     </Rule>
     <Rule>
       <Filter>[highway] = 'footway'</Filter>
       <MaxScaleDenominator>100000</MaxScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#fff</CssParameter>
-        <CssParameter name="stroke-width">6</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-        <CssParameter name="stroke-opacity">0.4</CssParameter>
-      </LineSymbolizer>
-      <LineSymbolizer>
-        <CssParameter name="stroke">salmon</CssParameter>
-        <CssParameter name="stroke-width">2.0</CssParameter>
-        <CssParameter name="stroke-dasharray">1,3</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
-    </Rule>
-
+      <LineSymbolizer stroke-linejoin="round" stroke="#fff" stroke-width="6" stroke-linecap="round" stroke-opacity="0.4"/>
+      <LineSymbolizer stroke-linejoin="round" stroke="salmon" stroke-width="2.0" stroke-dasharray="1,3" stroke-linecap="round"/>
+    </Rule>
     <Rule>
       <Filter>[highway] = 'cycleway'</Filter>
       <MaxScaleDenominator>100000</MaxScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">white</CssParameter>
-        <CssParameter name="stroke-width">4</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-        <CssParameter name="stroke-opacity">0.4</CssParameter>
-      </LineSymbolizer>
-      <LineSymbolizer>
-        <CssParameter name="stroke">green</CssParameter>
-        <CssParameter name="stroke-width">1.5</CssParameter>
-        <CssParameter name="stroke-dasharray">1,3</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="white" stroke-width="4" stroke-linecap="round" stroke-opacity="0.4"/>
+      <LineSymbolizer stroke-linejoin="round" stroke="green" stroke-width="1.5" stroke-dasharray="1,3" stroke-linecap="round"/>
     </Rule>
     <Rule>
       <Filter>[highway] = 'track'</Filter>
       <MaxScaleDenominator>100000</MaxScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">white</CssParameter>
-        <CssParameter name="stroke-width">6</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-        <CssParameter name="stroke-opacity">0.4</CssParameter>
-      </LineSymbolizer>
-      <LineSymbolizer>
-        <CssParameter name="stroke">salmon</CssParameter>
-        <CssParameter name="stroke-width">2.0</CssParameter>
-        <CssParameter name="stroke-dasharray">4,2</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke-linejoin="round" stroke="white" stroke-width="6" stroke-linecap="round" stroke-opacity="0.4"/>
+      <LineSymbolizer stroke-linejoin="round" stroke="salmon" stroke-width="2.0" stroke-dasharray="4,2" stroke-linecap="round"/>
     </Rule>
     <Rule>
       <Filter>[highway] = 'pedestrian'</Filter>
       <MaxScaleDenominator>50000</MaxScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">grey</CssParameter>
-        <CssParameter name="stroke-width">5</CssParameter>
-      </LineSymbolizer>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#ededed</CssParameter>
-        <CssParameter name="stroke-width">4</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="grey" stroke-width="5"/>
+      <LineSymbolizer stroke="#ededed" stroke-width="4"/>
     </Rule>
     <Rule>
       <Filter>[highway] = 'unsurfaced' or [highway] = 'byway'</Filter>
       <MaxScaleDenominator>100000</MaxScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#fff</CssParameter>
-        <CssParameter name="stroke-width">6</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-        <CssParameter name="stroke-opacity">0.4</CssParameter>
-      </LineSymbolizer>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#ffc000</CssParameter>
-        <CssParameter name="stroke-width">2.0</CssParameter>
-        <CssParameter name="stroke-dasharray">4,4</CssParameter>
-        <CssParameter name="stroke-linejoin">round</CssParameter>
-        <CssParameter name="stroke-linecap">round</CssParameter>
-      </LineSymbolizer>
-    </Rule>
-     <Rule>
+      <LineSymbolizer stroke-linejoin="round" stroke="#fff" stroke-width="6" stroke-linecap="round" stroke-opacity="0.4"/>
+      <LineSymbolizer stroke-linejoin="round" stroke="#ffc000" stroke-width="2.0" stroke-dasharray="4,4" stroke-linecap="round"/>
+    </Rule>
+    <Rule>
       <Filter>[route] = 'ferry'</Filter>
       <MaxScaleDenominator>500000</MaxScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">navy</CssParameter>
-        <CssParameter name="stroke-width">0.8</CssParameter>
-        <CssParameter name="stroke-dasharray">6,6</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="navy" stroke-width="0.8" stroke-dasharray="6,6"/>
     </Rule>
-
     <Rule>
       <Filter>[aeroway] = 'runway'</Filter>
       <MaxScaleDenominator>500000</MaxScaleDenominator>
       <MinScaleDenominator>200000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#bbc</CssParameter>
-        <CssParameter name="stroke-width">2</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#bbc" stroke-width="2"/>
     </Rule>
     <Rule>
       <Filter>[aeroway] = 'runway'</Filter>
       <MaxScaleDenominator>200000</MaxScaleDenominator>
       <MinScaleDenominator>50000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#bbc</CssParameter>
-        <CssParameter name="stroke-width">7</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#bbc" stroke-width="7"/>
     </Rule>
     <Rule>
       <Filter>[aeroway] = 'runway'</Filter>
       <MaxScaleDenominator>50000</MaxScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#bbc</CssParameter>
-        <CssParameter name="stroke-width">18</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#bbc" stroke-width="18"/>
     </Rule>
     <Rule>
       <Filter>[aeroway] = 'taxiway'</Filter>
       <MaxScaleDenominator>500000</MaxScaleDenominator>
       <MinScaleDenominator>50000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#bbc</CssParameter>
-        <CssParameter name="stroke-width">1</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#bbc" stroke-width="1"/>
     </Rule>
     <Rule>
       <Filter>[aeroway] = 'taxiway'</Filter>
       <MaxScaleDenominator>50000</MaxScaleDenominator>
       <MinScaleDenominator>20000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#bbc</CssParameter>
-        <CssParameter name="stroke-width">4</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#bbc" stroke-width="4"/>
     </Rule>
     <Rule>
       <Filter>[aeroway] = 'taxiway'</Filter>
       <MaxScaleDenominator>20000</MaxScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#bbc</CssParameter>
-        <CssParameter name="stroke-width">6</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#bbc" stroke-width="6"/>
     </Rule>
   </Style>
- 
   <Style name="roads">
     <!-- MOTORWAY-->
     <!-- level 4-5 -->
@@ -1065,136 +606,92 @@
       <Filter>[highway] = 'motorway' or [highway] = 'motorway_link'</Filter>
       <MaxScaleDenominator>25000000</MaxScaleDenominator>
       <MinScaleDenominator>5000000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#809bc0</CssParameter>
-        <CssParameter name="stroke-width">1</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#809bc0" stroke-width="1"/>
     </Rule>
     <!-- level 6-8 -->
     <Rule>
       <Filter>[highway] = 'motorway' or [highway] = 'motorway_link'</Filter>
       <MaxScaleDenominator>5000000</MaxScaleDenominator>
       <MinScaleDenominator>1000000</MinScaleDenominator>
-      <LineSymbolizer>
-       <CssParameter name="stroke">#809bc0</CssParameter>
-       <CssParameter name="stroke-width">2</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#809bc0" stroke-width="2"/>
     </Rule>
     <!-- level 9 -->
-   <Rule>
-     <Filter>[highway] = 'motorway' or [highway] = 'motorway_link'</Filter>
+    <Rule>
+      <Filter>[highway] = 'motorway' or [highway] = 'motorway_link'</Filter>
       <MaxScaleDenominator>1000000</MaxScaleDenominator>
       <MinScaleDenominator>500000</MinScaleDenominator>
-      <LineSymbolizer>
-      <CssParameter name="stroke">#809bc0</CssParameter>
-      <CssParameter name="stroke-width">3</CssParameter>
-    </LineSymbolizer>
-   </Rule>
-    
+      <LineSymbolizer stroke="#809bc0" stroke-width="3"/>
+    </Rule>
     <!-- TRUNK -->
     <!--level 4-6-->
     <Rule>
       <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
       <MaxScaleDenominator>25000000</MaxScaleDenominator>
       <MinScaleDenominator>2500000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#7fc97f</CssParameter>
-        <CssParameter name="stroke-width">1</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#7fc97f" stroke-width="1"/>
     </Rule>
     <!-- level 7-9 -->
     <Rule>
       <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
       <MaxScaleDenominator>2500000</MaxScaleDenominator>
       <MinScaleDenominator>500000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#7fc97f</CssParameter>
-        <CssParameter name="stroke-width">2</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#7fc97f" stroke-width="2"/>
     </Rule>
     <!-- level 10-->
     <Rule>
       <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
       <MaxScaleDenominator>500000</MaxScaleDenominator>
       <MinScaleDenominator>100000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#7fc97f</CssParameter>
-        <CssParameter name="stroke-width">3</CssParameter>
-      </LineSymbolizer>
-    </Rule>
-    
-   <!-- PRIMARY-->
-   <!-- level 5-6-->
-   <Rule>
+      <LineSymbolizer stroke="#7fc97f" stroke-width="3"/>
+    </Rule>
+    <!-- PRIMARY-->
+    <!-- level 5-6-->
+    <Rule>
       <Filter>[highway] = 'primary' or [highway] = 'primary_link'</Filter>
       <MaxScaleDenominator>5000000</MaxScaleDenominator>
       <MinScaleDenominator>2000000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#e46d71</CssParameter>
-        <CssParameter name="stroke-width">0.7</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#e46d71" stroke-width="0.7"/>
     </Rule>
     <!-- level 7-9-->
     <Rule>
       <Filter>[highway] = 'primary' or [highway] = 'primary_link'</Filter>
       <MaxScaleDenominator>2000000</MaxScaleDenominator>
       <MinScaleDenominator>500000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#e46d71</CssParameter>
-        <CssParameter name="stroke-width">2.0</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#e46d71" stroke-width="2.0"/>
     </Rule>
-    <!-- level 10 -->    
+    <!-- level 10 -->
     <Rule>
       <Filter>[highway] = 'primary' or [highway] = 'primary_link'</Filter>
       <MaxScaleDenominator>500000</MaxScaleDenominator>
       <MinScaleDenominator>100000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#e46d71</CssParameter>
-        <CssParameter name="stroke-width">3</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#e46d71" stroke-width="3"/>
     </Rule>
-
-    
     <!-- SECONDARY -->
     <!-- level 7-9 -->
     <Rule>
       <Filter>[highway] = 'secondary' or [highway] = 'secondary_link'</Filter>
       <MaxScaleDenominator>2000000</MaxScaleDenominator>
       <MinScaleDenominator>500000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#fdbf6f</CssParameter>
-        <CssParameter name="stroke-width">1</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#fdbf6f" stroke-width="1"/>
     </Rule>
     <Rule>
       <Filter>[highway] = 'secondary' or [highway] = 'secondary_link'</Filter>
       <MaxScaleDenominator>500000</MaxScaleDenominator>
       <MinScaleDenominator>100000</MinScaleDenominator>
-      <LineSymbolizer>
-        <CssParameter name="stroke">#fdbf6f</CssParameter>
-        <CssParameter name="stroke-width">2</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#fdbf6f" stroke-width="2"/>
     </Rule>
-    
     <!-- RAIL -->
     <Rule>
       <MaxScaleDenominator>2500000</MaxScaleDenominator>
       <MinScaleDenominator>1000000</MinScaleDenominator>
       <Filter>[railway] = 'rail' or [railway] = 'tram' or [railway] = 'light_rail'</Filter>
-       <LineSymbolizer>
-        <CssParameter name="stroke">#777</CssParameter>
-        <CssParameter name="stroke-width">1</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#777" stroke-width="1"/>
     </Rule>
     <Rule>
       <MaxScaleDenominator>1000000</MaxScaleDenominator>
       <MinScaleDenominator>100000</MinScaleDenominator>
       <Filter>[railway] = 'rail' or [railway] = 'tram' or [railway] = 'light_rail'</Filter>
-       <LineSymbolizer>
-        <CssParameter name="stroke">#777</CssParameter>
-        <CssParameter name="stroke-width">2</CssParameter>
-      </LineSymbolizer>
+      <LineSymbolizer stroke="#777" stroke-width="2"/>
     </Rule>
     <Rule>
       <MaxScaleDenominator>100000</MaxScaleDenominator>
@@ -1204,13 +701,10 @@
       <LinePatternSymbolizer file="/home/steve/symbols/rail_preserved.png" type="png" width="20" height="3" />
       -->
     </Rule>
-    
   </Style>
-
-  
   <!-- ROADS TEXT -->
   <Style name="roads-text">
-      <!--
+    <!--
     <Rule>
       <Filter>[highway] = 'motorway' and [length] = 2</Filter>
       <MaxScaleDenominator>500000</MaxScaleDenominator>
@@ -1234,29 +728,25 @@
       <Filter>[highway] = 'trunk' or [highway] = 'primary' or [highway] = 'secondary'</Filter>
       <MaxScaleDenominator>75000</MaxScaleDenominator>
       <MinScaleDenominator>50000</MinScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="8" fill="black" halo_radius="0" placement="line"/>
+      <TextSymbolizer name="[name]" size="8" fill="black" placement="line" face-name="DejaVu Sans Book" halo-radius="0"/>
     </Rule>
-    
     <Rule>
       <Filter>[highway] = 'trunk' or [highway] = 'primary' or [highway] = 'secondary'</Filter>
       <MaxScaleDenominator>50000</MaxScaleDenominator>
       <MinScaleDenominator>1000</MinScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="10" fill="black" halo_radius="0" placement="line"/>
+      <TextSymbolizer name="[name]" size="10" fill="black" placement="line" face-name="DejaVu Sans Book" halo-radius="0"/>
     </Rule>
-    
     <Rule>
       <ElseFilter/>
       <MaxScaleDenominator>25000</MaxScaleDenominator>
       <MinScaleDenominator>5000</MinScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="9" fill="#000" halo_radius="1"  placement="line" />
+      <TextSymbolizer name="[name]" size="9" fill="#000" placement="line" face-name="DejaVu Sans Book" halo-radius="1"/>
     </Rule>
-
     <Rule>
       <ElseFilter/>
       <MaxScaleDenominator>5000</MaxScaleDenominator>
       <MinScaleDenominator>100</MinScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="11" fill="#000" halo_radius="1"  placement="line" />
+      <TextSymbolizer name="[name]" size="11" fill="#000" placement="line" face-name="DejaVu Sans Book" halo-radius="1"/>
     </Rule>
-   
   </Style>
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/osm_nodes_ways.xml b/tests/data/good_maps/osm_nodes_ways.xml
new file mode 100644
index 0000000..9b8620a
--- /dev/null
+++ b/tests/data/good_maps/osm_nodes_ways.xml
@@ -0,0 +1,35 @@
+<!DOCTYPE Map>
+<Map srs="+proj=latlong +datum=WGS84" background-color="steelblue" minimum-version="0.7.2">
+
+  <Style name="red">
+    <Rule>
+      <LineSymbolizer stroke="darkred" stroke-width="1.5"/>
+      <LineSymbolizer stroke="red" stroke-width="1"/>
+      <MarkersSymbolizer fill="yellow" width="5" stroke="green" stroke-width=".5"/>
+    </Rule>
+  </Style>
+
+  <Style name="green">
+    <Rule>
+      <MarkersSymbolizer fill="yellow" width="7" height="5" stroke="green" stroke-width="1.5"/>
+    </Rule>
+  </Style>
+
+  <Layer name="red" status="on" srs="+proj=latlong +datum=WGS84">
+    <StyleName>red</StyleName>
+    <Datasource>
+      <Parameter name="type">osm</Parameter>
+      <Parameter name="file">../osm/ways.osm</Parameter>
+    </Datasource>
+  </Layer>
+
+  <Layer name="green" status="on" srs="+proj=latlong +datum=WGS84">
+    <StyleName>green</StyleName>
+    <Datasource>
+      <Parameter name="type">osm</Parameter>
+      <Parameter name="file">../osm/nodes.osm</Parameter>
+    </Datasource>
+  </Layer>
+
+
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/paths_relative_to_script.xml b/tests/data/good_maps/paths_relative_to_script.xml
index fef0411..b096f3f 100644
--- a/tests/data/good_maps/paths_relative_to_script.xml
+++ b/tests/data/good_maps/paths_relative_to_script.xml
@@ -1,4 +1,4 @@
-<Map paths_from_xml="false">
+<Map minimum-version="0.7.2" paths-from-xml="false">
 
   <Layer name="lay">
     <Datasource base="shp">
diff --git a/tests/data/good_maps/paths_relative_to_xml.xml b/tests/data/good_maps/paths_relative_to_xml.xml
index 4df6c71..6c63bd1 100644
--- a/tests/data/good_maps/paths_relative_to_xml.xml
+++ b/tests/data/good_maps/paths_relative_to_xml.xml
@@ -1,4 +1,4 @@
-<Map paths_from_xml="true"><!-- default is true -->
+<Map minimum-version="0.7.2" paths-from-xml="true"><!-- default is true -->
 
   <Layer name="lay">
     <Datasource base="shp">
diff --git a/tests/data/good_maps/point_csv.xml b/tests/data/good_maps/point_csv.xml
new file mode 100644
index 0000000..db1bd24
--- /dev/null
+++ b/tests/data/good_maps/point_csv.xml
@@ -0,0 +1,31 @@
+<!DOCTYPE Map>
+<Map background-color="#b5d0d0" srs="+init=epsg:4326" minimum-version="0.7.0">
+    <Style name="1">
+        <Rule title="foo">
+            <Filter>([x]=0)</Filter>
+            <TextSymbolizer name="[label]" size="10" dy="-10" face-name="DejaVu Sans Book" halo-radius="1" allow-overlap="true"/>
+            <PointSymbolizer/>
+        </Rule>
+        <Rule title="foo">
+            <Filter>([y]=0)</Filter>
+            <TextSymbolizer name="[label]" size="10" dy="5" face-name="DejaVu Sans Book" halo-radius="1"/>
+            <PointSymbolizer/>
+        </Rule>
+        <Rule title="foo">
+            <ElseFilter/>
+            <TextSymbolizer name="[label]" size="10" dy="-5" face-name="DejaVu Sans Book" halo-radius="1"/>
+            <PointSymbolizer/>
+        </Rule>
+        
+    </Style>
+
+    <Layer name="point" srs="+init=epsg:4326">
+        <StyleName>1</StyleName>
+        <Datasource>
+            <Parameter name="file">../csv/points.vrt</Parameter>
+            <Parameter name="layer_by_index">0</Parameter>
+            <Parameter name="type">ogr</Parameter>
+        </Datasource>
+    </Layer>
+
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/point_json.xml b/tests/data/good_maps/point_json.xml
new file mode 100644
index 0000000..0092aa2
--- /dev/null
+++ b/tests/data/good_maps/point_json.xml
@@ -0,0 +1,31 @@
+<!DOCTYPE Map>
+<Map background-color="#b5d0d0" srs="+init=epsg:4326" minimum-version="0.7.0">
+    <Style name="1">
+        <Rule title="foo">
+            <Filter>([x]=0)</Filter>
+            <TextSymbolizer name="[label]" size="10" dy="-10" face-name="DejaVu Sans Book" halo-radius="1" allow-overlap="true"/>
+            <PointSymbolizer/>
+        </Rule>
+        <Rule title="foo">
+            <Filter>([y]=0)</Filter>
+            <TextSymbolizer name="[label]" size="10" dy="5" face-name="DejaVu Sans Book" halo-radius="1"/>
+            <PointSymbolizer/>
+        </Rule>
+        <Rule title="foo">
+            <ElseFilter/>
+            <TextSymbolizer name="[label]" size="10" dy="-5" face-name="DejaVu Sans Book" halo-radius="1"/>
+            <PointSymbolizer/>
+        </Rule>
+        
+    </Style>
+
+    <Layer name="point" srs="+init=epsg:4326">
+        <StyleName>1</StyleName>
+        <Datasource>
+            <Parameter name="file">../json/points.json</Parameter>
+            <Parameter name="layer_by_index">0</Parameter>
+            <Parameter name="type">ogr</Parameter>
+        </Datasource>
+    </Layer>
+
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/point_json_inline.xml b/tests/data/good_maps/point_json_inline.xml
new file mode 100644
index 0000000..0ce26b8
--- /dev/null
+++ b/tests/data/good_maps/point_json_inline.xml
@@ -0,0 +1,70 @@
+<!DOCTYPE Map>
+<Map background-color="#b5d0d0" srs="+init=epsg:4326" minimum-version="0.7.0">
+    <Style name="1">
+        <Rule title="foo">
+            <Filter>([x]=0)</Filter>
+            <TextSymbolizer name="[label]" size="10" dy="-10" face-name="DejaVu Sans Book" halo-radius="1" allow-overlap="true"/>
+            <PointSymbolizer/>
+        </Rule>
+        <Rule title="foo">
+            <Filter>([y]=0)</Filter>
+            <TextSymbolizer name="[label]" size="10" dy="5" face-name="DejaVu Sans Book" halo-radius="1"/>
+            <PointSymbolizer/>
+        </Rule>
+        <Rule title="foo">
+            <ElseFilter/>
+            <TextSymbolizer name="[label]" size="10" dy="-5" face-name="DejaVu Sans Book" halo-radius="1"/>
+            <PointSymbolizer/>
+        </Rule>
+        
+    </Style>
+
+    <Layer name="point" srs="+init=epsg:4326">
+        <StyleName>1</StyleName>
+        <Datasource>
+            <Parameter name="string">
+
+            {
+            
+            "type": "FeatureCollection",
+            
+            /* comment */
+            
+            "features": [
+            
+                { "type": "Feature", 
+                
+                    "properties": { "x": 0, "y": 0, "label": "0,0" },
+                    "geometry"  : { "type": "Point", "coordinates": [ 0, 0 ] }
+                },
+                { "type": "Feature", 
+                
+                    "properties": { "x": 5, "y": 5, "label": "5,5" },
+                    "geometry"  : { "type": "Point", "coordinates": [ 5, 5 ] }
+                },
+                { "type": "Feature", 
+                
+                    "properties": { "x": 0, "y": 0, "label": "0,5" },
+                    "geometry"  : { "type": "Point", "coordinates": [ 0, 5 ] }
+                },
+                { "type": "Feature", 
+                
+                    "properties": { "x": 5, "y": 0, "label": "5,0" },
+                    "geometry"  : { "type": "Point", "coordinates": [ 5, 0 ] }
+                },
+                { "type": "Feature", 
+                
+                    "properties": { "x": 2.5, "y": 2.5, "label": "2.5,2.5" },
+                    "geometry"  : { "type": "Point", "coordinates": [ 2.5, 2.5 ] }
+                },
+                
+                ]
+            }
+            
+            </Parameter>
+            <Parameter name="layer_by_index">0</Parameter>
+            <Parameter name="type">ogr</Parameter>
+        </Datasource>
+    </Layer>
+
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/point_symbolizer.xml b/tests/data/good_maps/point_symbolizer.xml
index 00b4b06..2979c8c 100644
--- a/tests/data/good_maps/point_symbolizer.xml
+++ b/tests/data/good_maps/point_symbolizer.xml
@@ -1,33 +1,52 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map bgcolor="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs" min_version="0.7.1">
-    <Style name="test 1">
-        <Rule name="rule t1">
-            <Filter>[landuse] = 'meadow' or [landuse] = 'wood' or [landuse] = 'forest'</Filter>
-            <MinScaleDenominator>1000</MinScaleDenominator>
+<!DOCTYPE Map>
+<Map background-color="#b5d0d0" srs="+init=epsg:4326" minimum-version="0.8.0">
+    <Style name="1">
+        <Rule title="foo">
+            <Filter>([name]='CHILE')</Filter>
+            <TextSymbolizer size="10" name="[name] + ' (default OGC pixel)'" dy="5" face-name="DejaVu Sans Book" text-transform="lowercase" wrap-width="10" wrap-character=" " halo-radius="1"/>
             <PointSymbolizer/>
         </Rule>
-    </Style>
-    <Style name="test 2">
         <Rule title="foo">
-            <ElseFilter/>
-            <MaxScaleDenominator>1000000</MaxScaleDenominator>
-            <PointSymbolizer file="../images/dummy.png" type="png" width="16" height="16"/>
+            <Filter>([name]='Australia')</Filter>
+            <TextSymbolizer size="10" name="[name] + ' (png)'" dy="20" face-name="DejaVu Sans Book" halo-radius="1"/>
+            <PointSymbolizer file="../images/dummy.png" allow-overlap="true"/>
+        </Rule>
+        <Rule title="foo1">
+            <Filter>([name]='Brazil')</Filter>
+            <TextSymbolizer size="10" name="[name] + ' (svg & tif)'" dy="20" face-name="DejaVu Sans Book" halo-radius="1"/>
+            <PointSymbolizer file="../images/dummy.tif" allow-overlap="true"/>
+            <PointSymbolizer file="../svg/ellipses.svg" allow-overlap="true"/>
         </Rule>
-    </Style>
-    <Style name="test 3">
         <Rule title="foo">
-            <PointSymbolizer file="../images/dummy.png" type="png"/>
+            <Filter>([name]='Mongolia')</Filter>
+            <TextSymbolizer size="10" name="[name] + ' (tiff)'" dy="20" face-name="DejaVu Sans Book" halo-radius="1"/>
+            <PointSymbolizer file="../images/dummy.tiff" allow-overlap="true"/>
         </Rule>
-    </Style>
-    <Style name="test 4">
         <Rule title="foo">
-            <PointSymbolizer file="../images/dummy.png" width="16" height="16"/>
+            <Filter>([name]='Sudan')</Filter>
+            <TextSymbolizer size="10" name="[name] + ' (jpeg)'" dy="20" face-name="DejaVu Sans Book" halo-radius="1"/>
+            <PointSymbolizer file="../images/dummy.jpeg"/>
         </Rule>
-    </Style>
-    <Style name="test 5">
         <Rule title="foo">
-            <PointSymbolizer file="../images/dummy.png"/>
+            <Filter>([name]='United States')</Filter>
+            <TextSymbolizer size="10" name="[name] + ' (jpg)'" dy="20" face-name="DejaVu Sans Book" halo-radius="1"/>
+            <PointSymbolizer file="../images/dummy.jpg"/>
+        </Rule>
+        <Rule title="foo">
+            <ElseFilter/>
+            <TextSymbolizer size="10" name="[name]" dy="20" face-name="DejaVu Sans Book" halo-radius="1"/>
+            <PointSymbolizer file="../images/bogus_will_fail.png"/>
         </Rule>
     </Style>
-</Map>
+
+    <Layer name="point" srs="+init=epsg:4326">
+        <StyleName>1</StyleName>
+        <Datasource>
+            <Parameter name="type">sqlite</Parameter>
+            <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
+            <Parameter name="table">point</Parameter>
+            <Parameter name="wkb_format">spatialite</Parameter>
+        </Datasource>
+    </Layer>
+
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/point_symbolizer_ignore_placements.xml b/tests/data/good_maps/point_symbolizer_ignore_placements.xml
new file mode 100644
index 0000000..ecbb8d8
--- /dev/null
+++ b/tests/data/good_maps/point_symbolizer_ignore_placements.xml
@@ -0,0 +1,27 @@
+<!DOCTYPE Map>
+<Map background-color="#b5d0d0" srs="+init=epsg:4326" minimum-version="0.8.0">
+    <Style name="1">
+        <Rule title="foo1">
+            <Filter>([name]='Brazil' or [name]='Mongolia' or [name]='Sudan')</Filter>
+            <PointSymbolizer file="../svg/point_sm.svg" allow-overlap="true"/>
+        </Rule>
+        <Rule title="foo">
+            <ElseFilter/>
+            <PointSymbolizer file="../svg/point_sm.svg" ignore-placement="true"/>
+            <PointSymbolizer/>
+            <TextSymbolizer size="10" name="'should be a black square on top of this symbol'" dy="10" face-name="DejaVu Sans Book" halo-radius="1" wrap-width="15" allow-overlap="true"/>
+
+        </Rule>
+    </Style>
+
+    <Layer name="point" srs="+init=epsg:4326">
+        <StyleName>1</StyleName>
+        <Datasource>
+            <Parameter name="type">sqlite</Parameter>
+            <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
+            <Parameter name="table">point</Parameter>
+            <Parameter name="wkb_format">spatialite</Parameter>
+        </Datasource>
+    </Layer>
+
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/point_symbolizer_on_polygon_map.xml b/tests/data/good_maps/point_symbolizer_on_polygon_map.xml
index 3caff11..a36b7cd 100644
--- a/tests/data/good_maps/point_symbolizer_on_polygon_map.xml
+++ b/tests/data/good_maps/point_symbolizer_on_polygon_map.xml
@@ -1,31 +1,28 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map bgcolor="#b5d0d0" min_version="0.7.1">
+<!DOCTYPE Map>
+<Map background-color="#b5d0d0" minimum-version="0.8.0">
     <Style name="test">
         <Rule title="asia">
             <Filter>([REGION]=142)</Filter>
-            <PointSymbolizer file="../images/dummy.png" allow_overlap="true"/>
+            <PointSymbolizer file="../images/dummy.png" allow-overlap="true"/>
         </Rule>
         <Rule title="europe">
             <Filter>([REGION]=150)</Filter>
             <!-- requires at least Mapnik 0.7.1 to work due to http://trac.mapnik.org/ticket/508 -->
-            <PolygonPatternSymbolizer file="../images/dummy.png" />
+            <PolygonPatternSymbolizer file="../images/dummy.png"/>
         </Rule>
         <Rule title="americas">
             <Filter>([REGION]=19)</Filter>
             <!-- requires at least Mapnik 0.7.1 to work due to http://trac.mapnik.org/ticket/508 -->
-            <LinePatternSymbolizer file="../images/dummy.png" />
+            <LinePatternSymbolizer file="../images/dummy.png"/>
         </Rule>
         <Rule title="Africa">
             <Filter>([REGION]=2)</Filter>
-            <ShieldSymbolizer name="NAME" placement="vertex" face_name="DejaVu Sans Bold" size="10" fill="#000000" file="../images/dummy.png" />
+            <ShieldSymbolizer name="[NAME]" placement="vertex" size="10" fill="#000000" file="../images/dummy.png" face-name="DejaVu Sans Bold"/>
         </Rule>
 
         <Rule title="rest">
-            <ElseFilter />
-            <LineSymbolizer>
-                    <CssParameter name="stroke-width">.1</CssParameter>
-            </LineSymbolizer>
+            <ElseFilter/>
+            <LineSymbolizer stroke-width="1"/>
         </Rule>
     </Style>
 
@@ -36,4 +33,4 @@
             <Parameter name="type">shape</Parameter>
         </Datasource>
     </Layer>
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/polygon_pattern_seamless.xml b/tests/data/good_maps/polygon_pattern_seamless.xml
new file mode 100644
index 0000000..2177304
--- /dev/null
+++ b/tests/data/good_maps/polygon_pattern_seamless.xml
@@ -0,0 +1,19 @@
+<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="steelblue" minimum-version="0.7.2">
+    <Style name="style">
+        
+        <!-- Asia - default dark color behind light polygon 
+        leads to "ghost lines" show-through
+        -->
+        
+        <Rule>
+            <PolygonPatternSymbolizer alignment="global" file="../images/stripes_pattern.png"/>
+        </Rule>
+    </Style>
+    <Layer name="world" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
+        <StyleName>style</StyleName>
+        <Datasource>
+            <Parameter name="file">../../data/shp/world_merc</Parameter>
+            <Parameter name="type">shape</Parameter>
+        </Datasource>
+    </Layer>
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/polygon_pattern_symbolizer.xml b/tests/data/good_maps/polygon_pattern_symbolizer.xml
new file mode 100644
index 0000000..d9d2f0e
--- /dev/null
+++ b/tests/data/good_maps/polygon_pattern_symbolizer.xml
@@ -0,0 +1,30 @@
+<Map srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs" minimum-version="0.7.2">
+
+  <FileSource name="foo">../images/</FileSource>
+  
+  <Style name="1">
+    <Rule>
+        <Filter>([EAS_ID]<=170) and ([EAS_ID] <> 165)</Filter>
+        <!-- alignment="local" is default -->
+        <PolygonPatternSymbolizer alignment="local" file="../images/checker.jpg"/>
+        <LineSymbolizer stroke="green" stroke-width="2"/>
+        <TextSymbolizer size="10" name="'local'" dy="20" face-name="DejaVu Sans Book" halo-radius="1"/>
+    </Rule>
+    <Rule>
+        <ElseFilter/>
+        <PolygonPatternSymbolizer alignment="global" file="../images/checker.jpg"/>
+        <LineSymbolizer stroke="yellow" stroke-width=".5"/>
+        <TextSymbolizer size="10" name="'global'" dy="20" face-name="DejaVu Sans Book" halo-radius="1"/>
+    </Rule>
+  </Style>
+
+  <Layer name="lay" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs">
+    <StyleName>1</StyleName>
+    <Datasource>
+      <Parameter name="type">shape</Parameter>
+      <Parameter name="base">../../data/shp/</Parameter>
+      <Parameter name="file">poly.shp</Parameter>
+    </Datasource>
+  </Layer>
+  
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/polygon_symbolizer.xml b/tests/data/good_maps/polygon_symbolizer.xml
index 4efdfc1..f88794f 100644
--- a/tests/data/good_maps/polygon_symbolizer.xml
+++ b/tests/data/good_maps/polygon_symbolizer.xml
@@ -1,19 +1,15 @@
-<!-- see: http://trac.mapnik.org/changeset/574 -->
-<Map bgcolor="transparent" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs">
+<!-- see: http://trac.mapnik.org/changeset/574 --><Map background-color="transparent" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs" minimum-version="0.7.2">
 
   <FileSource name="foo">../images/</FileSource>
   
   <Style name="test">
     <Rule>
-      <PolygonSymbolizer>
-        <CssParameter name="fill">lavender</CssParameter>
-        <CssParameter name="fill-opacity">.5</CssParameter>
-      </PolygonSymbolizer>
-      <PointSymbolizer base="foo" file="dummy.png" width="16" height="16" type="png" />
+      <PolygonSymbolizer fill="lavender" fill-opacity=".5"/>
+      <PointSymbolizer base="foo" file="dummy.png"/>
     </Rule>  
   </Style>
 
-  <Layer name="lay" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs ">
+  <Layer name="lay" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs">
     <StyleName>test</StyleName>
     <Datasource>
       <Parameter name="type">shape</Parameter>
diff --git a/tests/data/good_maps/raster_colorizer.xml b/tests/data/good_maps/raster_colorizer.xml
new file mode 100644
index 0000000..3a5a871
--- /dev/null
+++ b/tests/data/good_maps/raster_colorizer.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Map background-color="white" srs="+init=epsg:32630">
+
+<!-- blue yellow orange indigo green red transparent black white -->
+
+  <Style name="DISCRETE RAINBOW">
+    <Rule>
+      <RasterSymbolizer>
+        <RasterColorizer default-mode="discrete" default-color="white" >
+            <stop color="red"    value = "0"  />
+            <stop color="orange" value = "5"  />
+            <stop color="yellow" value = "10" />
+            <stop color="green"  value = "15" />
+            <stop color="blue"   value = "20" />
+            <stop color="indigo" value = "25" />
+        </RasterColorizer>
+      </RasterSymbolizer>
+    </Rule>
+  </Style>
+
+  <Style name="LINEAR BLEND">
+    <Rule>
+      <RasterSymbolizer>
+        <RasterColorizer default-mode="discrete" default-color="white" >
+            <stop color="#222222" value = "0" mode = "linear" />
+            <stop color="#EEEEEE" value = "25" />
+        </RasterColorizer>
+      </RasterSymbolizer>
+    </Rule>
+  </Style>
+
+  <Style name="BANDED">
+    <Rule>
+      <RasterSymbolizer>
+        <RasterColorizer default-mode="discrete" default-color="white" >
+            <stop color="red"    value = "0" mode = "exact" />
+            <stop color="orange"    value = "2" mode = "exact" />
+            <stop color="yellow"    value = "4" mode = "exact" />
+            <stop color="green"    value = "6" mode = "exact" />
+            <stop color="blue"    value = "8" mode = "exact" />
+            <stop color="indigo"    value = "10" mode = "exact" />
+            <stop color="violet"    value = "12" mode = "exact" />
+        </RasterColorizer>
+      </RasterSymbolizer>
+    </Rule>
+  </Style>  
+
+  <Style name="MIXED">
+    <Rule>
+      <RasterSymbolizer>
+        <RasterColorizer default-mode="discrete" default-color="white" >
+            <stop color="red"    value = "0"  />
+            <stop color="orange" value = "5"  />
+            <stop color="yellow" value = "10" mode = "exact" />
+            <stop color="green" value = "13" mode = "exact" />
+            <stop color="#222222"  value = "15" mode = "linear" />
+            <stop color="#EEEEEE" value = "25" />
+        </RasterColorizer>
+      </RasterSymbolizer>
+    </Rule>
+  </Style>  
+
+  <Layer name="dataraster" srs="+init=epsg:32630">
+      <StyleName>DISCRETE RAINBOW</StyleName>
+      <Datasource>
+          <Parameter name="file">../raster/dataraster.tif</Parameter>
+          <Parameter name="type">gdal</Parameter>
+          <Parameter name="band">1</Parameter>
+      </Datasource>
+  </Layer>
+
+</Map>
+
+ 
diff --git a/tests/data/good_maps/raster_symbolizer.xml b/tests/data/good_maps/raster_symbolizer.xml
new file mode 100644
index 0000000..a4cd82a
--- /dev/null
+++ b/tests/data/good_maps/raster_symbolizer.xml
@@ -0,0 +1,35 @@
+<Map background-color="white" srs="+init=epsg:32630" minimum-version="0.7.2">
+
+  <Style name="two-value">
+    <Rule>
+      <RasterSymbolizer opacity="1">
+        <RasterColorizer default-mode="discrete" default-color="#000000">
+          <stop value="0" color="yellow"></stop>
+          <stop value="26" color="purple"></stop>
+         </RasterColorizer>
+      </RasterSymbolizer>
+    </Rule>
+  </Style>
+
+  <Style name="ramped">
+    <Rule>
+      <RasterSymbolizer>
+        <RasterColorizer default-mode="linear" default-color="#000000">
+          <stop value="0" color="red"></stop>
+          <stop value="26" color="green"></stop>
+         </RasterColorizer>
+      </RasterSymbolizer>
+    </Rule>
+  </Style>
+
+  <Layer name="dataraster" srs="+init=epsg:32630">
+      <StyleName>ramped</StyleName>
+      <Datasource>
+          <!-- get stats on this file with gdalinfo ../raster/dataraster.tif -stats -->
+          <Parameter name="file">../raster/dataraster.tif</Parameter>
+          <Parameter name="type">gdal</Parameter>
+          <Parameter name="band">1</Parameter>
+      </Datasource>
+  </Layer>
+
+</Map>
diff --git a/tests/data/good_maps/rtl_text_map.xml b/tests/data/good_maps/rtl_text_map.xml
new file mode 100644
index 0000000..21113bb
--- /dev/null
+++ b/tests/data/good_maps/rtl_text_map.xml
@@ -0,0 +1,18 @@
+<!-- nik2img.py -b 60 46 80 28 rtl_text_map.xml text_styles.png --><Map background-color="#eee" srs="+init=epsg:4326" minimum-version="0.1.1" font-directory="../fonts/">
+  
+  <Style name="custom_font">
+    <Rule>
+      <TextSymbolizer name="[NAME_FA]" fill="#000" size="20" dy="-2" face-name="XB Zar Regular" halo-fill="#fff" halo-radius="2" wrap-width="50" line-spacing="3" allow-overlap="true"/>
+      <TextSymbolizer name="[NAME_EN]" fill="#000" opacity="0.6" size="10" dy="2" face-name="DejaVu Sans Book" text-transform="uppercase" halo-fill="#fff" halo-radius="2" character-spacing="3" wrap-width="50" line-spacing="4" allow-overlap="true"/>
+    </Rule>
+  </Style>
+
+  <Layer srs="+init=epsg:4326">
+    <StyleName>custom_font</StyleName>
+    <Datasource>
+      <Parameter name="file">../shp/farsi-labels</Parameter>
+      <Parameter name="type">shape</Parameter>
+    </Datasource>
+  </Layer>
+
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/shield_symbolizer.xml b/tests/data/good_maps/shield_symbolizer.xml
new file mode 100644
index 0000000..c8d4f7c
--- /dev/null
+++ b/tests/data/good_maps/shield_symbolizer.xml
@@ -0,0 +1,38 @@
+<!DOCTYPE Map>
+<Map background-color="#b5d0d0" srs="+init=epsg:4326" minimum-version="0.7.0">
+    <Style name="1">
+        <Rule>
+            <ShieldSymbolizer name="[label]" file="../images/dummy.png" size="10" transform="scale(5) translate(15, 15) rotate(20) skewX(20) skewY(5)" dy="-5" dx="-5" opacity=".5" text-opacity=".3" face-name="DejaVu Sans Book" halo-radius="1" shield-dx="10" shield-dy="10" no-text="false" allow-overlap="true" avoid-edges="false"/>
+        </Rule>
+        <Rule>
+            <PointSymbolizer allow-overlap="true"/>
+        </Rule>
+    </Style>
+    <Style name="2">
+        <Rule>
+            <LineSymbolizer/>
+        </Rule>
+        <Rule>
+            <ShieldSymbolizer name="[label]" file="../svg/ellipses.svg" size="10" opacity=".5" text-opacity=".3" spacing="50" placement="line" allow-overlap="true" face-name="DejaVu Sans Book" no-text="false" line-spacing="10"/>
+        </Rule>
+    </Style>
+
+    <Layer name="line" srs="+init=epsg:4326">
+        <StyleName>2</StyleName>
+        <Datasource>
+            <Parameter name="file">../json/lines.json</Parameter>
+            <Parameter name="layer_by_index">0</Parameter>
+            <Parameter name="type">ogr</Parameter>
+        </Datasource>
+    </Layer>
+
+    <Layer name="point" srs="+init=epsg:4326">
+        <StyleName>1</StyleName>
+        <Datasource>
+            <Parameter name="file">../json/points.json</Parameter>
+            <Parameter name="layer_by_index">0</Parameter>
+            <Parameter name="type">ogr</Parameter>
+        </Datasource>
+    </Layer>
+
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/sqlite.xml b/tests/data/good_maps/sqlite.xml
new file mode 100644
index 0000000..1c85bc9
--- /dev/null
+++ b/tests/data/good_maps/sqlite.xml
@@ -0,0 +1,54 @@
+<Map srs="+init=epsg:4326" background-color="rgb(255,255,255)" minimum-version="0.7.2">
+
+    <Style name="world_borders_style1">
+        <Rule>
+            <!-- glow underneath continents -->
+            <LineSymbolizer stroke="green" stroke-width="1.5"/>
+        </Rule>
+    </Style>
+
+    <!-- layer created by ogr like: ogr2ogr -t_srs EPSG:4326 -f SQLite ../sqlite/world.sqlite world_merc.shp -->
+    <!-- here we read with the ogr plugin -->
+    <Layer name="world_borders1" srs="+init=epsg:4326">
+        <StyleName>world_borders_style1</StyleName>
+        <Datasource>
+            <Parameter name="type">ogr</Parameter>
+            <Parameter name="file">../sqlite/world.sqlite</Parameter>
+            <Parameter name="layer">world_merc</Parameter>
+        </Datasource>
+    </Layer>
+
+    <Style name="world_borders_style2">
+        <Rule>
+            <PolygonSymbolizer fill="yellow" gamma="0.5"/>
+        </Rule>
+    </Style>
+
+    <!-- here we read with native sqlite plugin -->
+    <Layer name="world_borders2" srs="+init=epsg:4326">
+        <StyleName>world_borders_style2</StyleName>
+        <Datasource>
+            <Parameter name="type">sqlite</Parameter>
+            <Parameter name="file">../sqlite/world.sqlite</Parameter>
+            <Parameter name="table">world_merc</Parameter>
+        </Datasource>
+    </Layer>
+
+    <Style name="point_style">
+        <Rule>
+            <PointSymbolizer file="../svg/point_sm.svg"/>
+            <TextSymbolizer size="12" name="[name]" dy="-5" face-name="DejaVu Sans Book" halo-fill="rgba(255,255,255,.5)" halo-radius=".5"/>
+        </Rule>
+    </Style>
+
+    <!-- file created by QGIS read with native sqlite plugin -->
+    <Layer name="point" srs="+init=epsg:4326">
+        <StyleName>point_style</StyleName>
+        <Datasource>
+            <Parameter name="type">sqlite</Parameter>
+            <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
+            <Parameter name="table">point</Parameter>
+            <Parameter name="wkb_format">spatialite</Parameter>
+        </Datasource>
+    </Layer>
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/sqlite_attachdb.xml b/tests/data/good_maps/sqlite_attachdb.xml
new file mode 100644
index 0000000..478c775
--- /dev/null
+++ b/tests/data/good_maps/sqlite_attachdb.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
+
+<Style name="world">
+  <Rule>
+    <PolygonSymbolizer fill="green" />
+  </Rule>
+</Style>
+
+<Layer name="world" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
+    <StyleName>world</StyleName>
+    <Datasource>
+       <Parameter name="type">sqlite</Parameter>
+       <Parameter name="file">../sqlite/world.sqlite</Parameter>
+       <!-- should work with or without leveraging and index -->
+       <Parameter name="use_spatial_index">true</Parameter>
+
+       <!-- key_field is required if a subquery AND spatial index
+         is used. see: http://trac.mapnik.org/ticket/821 
+       -->
+       <Parameter name="key_field">OGC_FID</Parameter>
+       <!--
+       <Parameter name="table">(SELECT * FROM world_merc)</Parameter>
+       -->
+       <Parameter name="table">(SELECT *,world_merc.rowid FROM world_merc INNER JOIN business ON business.ISO3 = world_merc.iso3) as s</Parameter>
+
+       <!--
+       sqlite3 world.sqlite
+       ATTACH DATABASE 'business.sqlite' AS business;
+       SELECT count(*) FROM "10m_admin_0_countries" INNER JOIN business ON business.ISO3 = iso_a3;
+       -->
+       <Parameter name="attachdb">business at business.sqlite</Parameter>
+       
+    </Datasource>
+  </Layer>
+
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/text_breaks.xml b/tests/data/good_maps/text_breaks.xml
new file mode 100644
index 0000000..5a9dca7
--- /dev/null
+++ b/tests/data/good_maps/text_breaks.xml
@@ -0,0 +1,64 @@
+<!DOCTYPE Map>
+<Map background-color="#b5d0d0" srs="+init=epsg:4326" minimum-version="0.7.0">
+    <Style name="1">
+        <Rule>
+            <Filter>([label]='center')</Filter>
+            <TextSymbolizer name="'one
two
three'" size="10" dy="-5" face-name="DejaVu Sans Book" wrap-character="," wrap-width="1" halo-radius="1"/>
+            <PointSymbolizer/>
+        </Rule>
+        <Rule>
+            <ElseFilter/>
+            <TextSymbolizer name="[label]" size="10" dy="-5" face-name="DejaVu Sans Book" wrap-character="," wrap-width="1" halo-radius="1"/>
+            <PointSymbolizer/>
+        </Rule>        
+    </Style>
+
+    <Layer name="point" srs="+init=epsg:4326">
+        <StyleName>1</StyleName>
+        <Datasource>
+            <Parameter name="string">
+
+            {
+            
+            "type": "FeatureCollection",
+            
+            /* comment */
+            
+            "features": [
+            
+                { "type": "Feature", 
+                
+                    "properties": { "x": 0, "y": 0, "label": "0\n0" },
+                    "geometry"  : { "type": "Point", "coordinates": [ 0, 0 ] }
+                },
+                { "type": "Feature", 
+                
+                    "properties": { "x": 5, "y": 5, "label": "5\n5" },
+                    "geometry"  : { "type": "Point", "coordinates": [ 5, 5 ] }
+                },
+                { "type": "Feature", 
+                
+                    "properties": { "x": 0, "y": 0, "label": "0,5" },
+                    "geometry"  : { "type": "Point", "coordinates": [ 0, 5 ] }
+                },
+                { "type": "Feature", 
+                
+                    "properties": { "x": 5, "y": 0, "label": "5,0" },
+                    "geometry"  : { "type": "Point", "coordinates": [ 5, 0 ] }
+                },
+                { "type": "Feature", 
+                
+                    "properties": { "x": 2.5, "y": 2.5, "label": "center" },
+                    "geometry"  : { "type": "Point", "coordinates": [ 2.5, 2.5 ] }
+                },
+                
+                ]
+            }
+            
+            </Parameter>
+            <Parameter name="layer_by_index">0</Parameter>
+            <Parameter name="type">ogr</Parameter>
+        </Datasource>
+    </Layer>
+
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/text_rotation.xml b/tests/data/good_maps/text_rotation.xml
new file mode 100644
index 0000000..4979a43
--- /dev/null
+++ b/tests/data/good_maps/text_rotation.xml
@@ -0,0 +1,45 @@
+<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="steelblue" minimum-version="0.7.2">
+
+    <Style name="labels">
+        <Rule title="foo">
+            <Filter>([name]='CHILE')</Filter>
+            <TextSymbolizer size="15" name="'45˚ angle'" orientation="45" face-name="DejaVu Sans Book" halo-radius="1"/>
+        </Rule>
+        <Rule title="foo">
+            <Filter>([name]='Australia')</Filter>
+            <TextSymbolizer size="15" name="'- 45˚ angle'" orientation="-45" face-name="DejaVu Sans Book" halo-radius="1"/>
+        </Rule>
+        <Rule title="foo1">
+            <Filter>([name]='Brazil')</Filter>
+            <TextSymbolizer size="15" name="'90˚ angle'" orientation="90" face-name="DejaVu Sans Book" halo-radius="1"/>
+        </Rule>
+        <Rule title="foo">
+            <Filter>([name]='Mongolia')</Filter>
+            <TextSymbolizer size="15" name="'- 90˚ angle'" orientation="-90" face-name="DejaVu Sans Book" halo-radius="1"/>
+        </Rule>
+        <Rule title="foo">
+            <Filter>([name]='South Sudan')</Filter>
+            <TextSymbolizer size="15" name="'180˚ angle'" orientation="180" face-name="DejaVu Sans Book" halo-radius="1"/>
+        </Rule>
+        <Rule title="foo">
+            <Filter>([name]='United States')</Filter>
+            <TextSymbolizer size="15" name="'no rotation of text'" face-name="DejaVu Sans Book" halo-radius="1"/>
+        </Rule>
+        <Rule title="foo">
+            <ElseFilter/>
+            <TextSymbolizer size="15" name="[name]" face-name="DejaVu Sans Book" halo-radius="1"/>
+        </Rule>
+    </Style>
+
+    <Layer name="point" srs="+init=epsg:4326">
+        <StyleName>labels</StyleName>
+        <Datasource>
+            <Parameter name="type">sqlite</Parameter>
+            <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
+            <Parameter name="geometry_field">geometry</Parameter>
+            <Parameter name="table">point</Parameter>
+            <Parameter name="wkb_format">spatialite</Parameter>
+        </Datasource>
+    </Layer>
+    
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/unique_filter_map.xml b/tests/data/good_maps/unique_filter_map.xml
index 8398796..796d90c 100644
--- a/tests/data/good_maps/unique_filter_map.xml
+++ b/tests/data/good_maps/unique_filter_map.xml
@@ -1,42 +1,25 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Map srs="+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +units=m +no_defs" bgcolor="rgba(0,0,0,0)">
-    <Style name="poly20090929162130952_style">
-
-        <Rule>
-            <Filter>([EAS_ID]!=158)</Filter>
-            <PolygonSymbolizer>
-                <CssParameter name="fill">blue</CssParameter>
-            </PolygonSymbolizer>
-            <LineSymbolizer>
-                <CssParameter name="stroke">blue</CssParameter>
-                <CssParameter name="stroke-width">4</CssParameter>
-            </LineSymbolizer>
-        </Rule>
-
-        <Rule>
-            <Filter>([EAS_ID]<>158)</Filter>
-            <PolygonSymbolizer>
-                <CssParameter name="fill">green</CssParameter>
-            </PolygonSymbolizer>
-            <LineSymbolizer>
-                <CssParameter name="stroke">green</CssParameter>
-                <CssParameter name="stroke-width">2</CssParameter>
-            </LineSymbolizer>
-        </Rule>
-        
-        <Rule>
-            <ElseFilter />
-            <PolygonSymbolizer>
-                <CssParameter name="fill">red</CssParameter>
-            </PolygonSymbolizer>
-        </Rule>
-
-    </Style>
-    <Layer name="poly20090929162130952" srs="+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +units=m +no_defs" status="1" clear_label_cache="1" queryable="1">
-        <StyleName>poly20090929162130952_style</StyleName>
-        <Datasource>
-            <Parameter name="file">../../data/shp/poly.shp</Parameter>
-            <Parameter name="type">shape</Parameter>
-        </Datasource>
-    </Layer>
+<Map srs="+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +units=m +no_defs" background-color="rgba(0,0,0,0)" minimum-version="0.7.2">
+  <Style name="poly20090929162130952_style">
+    <Rule>
+      <Filter>([EAS_ID]!=158)</Filter>
+      <PolygonSymbolizer fill="blue"/>
+      <LineSymbolizer stroke="blue" stroke-width="4"/>
+    </Rule>
+    <Rule>
+      <Filter>([EAS_ID]<>158)</Filter>
+      <PolygonSymbolizer fill="green"/>
+      <LineSymbolizer stroke="green" stroke-width="2"/>
+    </Rule>
+    <Rule>
+      <ElseFilter/>
+      <PolygonSymbolizer fill="red"/>
+    </Rule>
+  </Style>
+  <Layer name="poly20090929162130952" srs="+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +units=m +no_defs">
+    <StyleName>poly20090929162130952_style</StyleName>
+    <Datasource>
+      <Parameter name="file">../../data/shp/poly.shp</Parameter>
+      <Parameter name="type">shape</Parameter>
+    </Datasource>
+  </Layer>
 </Map>
diff --git a/tests/data/good_maps/whitespace_at_end_of_filter_expression.xml b/tests/data/good_maps/whitespace_at_end_of_filter_expression.xml
index d6454d7..0d4a8c2 100644
--- a/tests/data/good_maps/whitespace_at_end_of_filter_expression.xml
+++ b/tests/data/good_maps/whitespace_at_end_of_filter_expression.xml
@@ -1,11 +1,10 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map  >
-<Map bgcolor="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs">
+<!DOCTYPE Map>
+<Map background-color="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs" minimum-version="0.7.2">
   <Style name="text">
     <Rule>
       <Filter>[leisure] <> '' or [landuse] <> '' </Filter>
       <MaxScaleDenominator>20000</MaxScaleDenominator>
-      <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="10" fill="#000" halo_radius="2" wrap_width="10"/>
+      <TextSymbolizer name="[name]" size="10" fill="#000" face-name="DejaVu Sans Book" halo-radius="2" wrap-width="10"/>
     </Rule>
   </Style>
-</Map>
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/xinclude/layers.xml b/tests/data/good_maps/xinclude/layers.xml
new file mode 100644
index 0000000..1dda442
--- /dev/null
+++ b/tests/data/good_maps/xinclude/layers.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Include  xmlns:xi="http://www.w3.org/2001/XInclude">
+
+    <Layer name="world_borders" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
+        <StyleName>world_borders_style</StyleName>
+        <StyleName>point_style</StyleName>
+        <Datasource>
+            <Parameter name="file">../../shp/world_merc.shp</Parameter>
+            <Parameter name="type">shape</Parameter>
+        </Datasource>
+    </Layer>
+
+</Include>
\ No newline at end of file
diff --git a/tests/data/good_maps/xinclude/layers_with_entities.xml b/tests/data/good_maps/xinclude/layers_with_entities.xml
new file mode 100644
index 0000000..a611112
--- /dev/null
+++ b/tests/data/good_maps/xinclude/layers_with_entities.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE Include SYSTEM "zoom_scales.xml">
+
+<Include  xmlns:xi="http://www.w3.org/2001/XInclude">
+
+    <Layer name="world_borders" minzoom="&zoom02min;" maxzoom="&zoom00max;" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
+        <StyleName>world_borders_style</StyleName>
+        <StyleName>point_style</StyleName>
+        <Datasource>
+            <Parameter name="file">../../shp/world_merc.shp</Parameter>
+            <Parameter name="type">shape</Parameter>
+        </Datasource>
+    </Layer>
+
+</Include>
\ No newline at end of file
diff --git a/tests/data/good_maps/xinclude/map.xml b/tests/data/good_maps/xinclude/map.xml
new file mode 100644
index 0000000..02eb9f3
--- /dev/null
+++ b/tests/data/good_maps/xinclude/map.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE Map  >
+<Map xmlns:xi="http://www.w3.org/2001/XInclude" srs="+init=epsg:4326" background-color="rgb(255,255,255)" >
+
+<!-- http://www.oreillynet.com/xml/blog/2004/05/transclude_with_xinclude_and_x.html -->
+
+<xi:include href="styles.xml" />
+
+<xi:include href="layers.xml" />
+
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/xinclude/map_with_entities_and_includes.xml b/tests/data/good_maps/xinclude/map_with_entities_and_includes.xml
new file mode 100644
index 0000000..6226ff0
--- /dev/null
+++ b/tests/data/good_maps/xinclude/map_with_entities_and_includes.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE Map  >
+<Map xmlns:xi="http://www.w3.org/2001/XInclude" srs="+init=epsg:4326" background-color="rgb(255,255,255)" >
+
+<!-- http://www.oreillynet.com/xml/blog/2004/05/transclude_with_xinclude_and_x.html -->
+
+<xi:include href="styles.xml" />
+
+<xi:include href="layers_with_entities.xml" />
+
+</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/xinclude/styles.xml b/tests/data/good_maps/xinclude/styles.xml
new file mode 100644
index 0000000..b970ff6
--- /dev/null
+++ b/tests/data/good_maps/xinclude/styles.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Include>
+
+    <Style name="point_style">
+        <Rule>
+            <PointSymbolizer file="../../svg/point.svg"/>
+            <TextSymbolizer face_name="DejaVu Sans Book" size="12" name="[name]" halo_fill="rgb(255,255,255,100)" halo_radius="1" dy="-5"/>
+        </Rule>
+    </Style>
+    
+    <Style name="world_borders_style">
+        <Rule>
+            <PolygonSymbolizer fill="grey" gamma="0.7"/>
+        </Rule>
+    </Style>
+
+</Include>
+
diff --git a/tests/data/good_maps/xinclude/zoom_scales.xml b/tests/data/good_maps/xinclude/zoom_scales.xml
new file mode 100644
index 0000000..8b0d439
--- /dev/null
+++ b/tests/data/good_maps/xinclude/zoom_scales.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!ENTITY zoom00max    "750000000" >
+<!ENTITY zoom00min    "540000000" >
+
+<!ENTITY zoom01max    "500000000" >
+<!ENTITY zoom01min    "270000000" >
+
+<!ENTITY zoom02max    "250000000" >
+<!ENTITY zoom02min    "130000000" >
+
+<!ENTITY zoom03max    "100000000" >
+<!ENTITY zoom03min    "60000000" >
+
+<!ENTITY zoom04max    "50000000" >
+<!ENTITY zoom04min    "30000000" >
+
+<!ENTITY zoom05max    "25000000" >
+<!ENTITY zoom05min    "15000000" >
+
+<!ENTITY zoom06max    "10000000" >
+<!ENTITY zoom06min    "8000000" >
+
+<!ENTITY zoom07max    "5000000" >
+<!ENTITY zoom07min    "4000000" >
+
+<!ENTITY zoom08max    "2500000" >
+<!ENTITY zoom08min    "2000000" >
+
+<!ENTITY zoom09max    "1500000" >
+<!ENTITY zoom09min    "1000000" >
+
+<!ENTITY zoom10max    "750000" >
+<!ENTITY zoom10min    "540000" >
+
+<!ENTITY zoom11max    "500000" >
+<!ENTITY zoom11min    "270000" >
+
+<!ENTITY zoom12max    "250000" >
+<!ENTITY zoom12min    "130000" >
+
+<!ENTITY zoom13max    "100000" >
+<!ENTITY zoom13min    "60000" >
+
+<!ENTITY zoom14max    "50000" >
+<!ENTITY zoom14min    "30000" >
+
+<!ENTITY zoom15max    "25000" >
+<!ENTITY zoom15min    "15000" >
+
+<!ENTITY zoom16max    "10000" >
+<!ENTITY zoom16min    "8000" >
+
+<!ENTITY zoom17max    "5000" >
+<!ENTITY zoom17min    "4000" >
+
+<!ENTITY zoom18max    "2500" >
+<!ENTITY zoom18min    "2000" >
+
+<!ENTITY zoom19max    "1500" >
+<!ENTITY zoom19min    "1000" >
+
+<!ENTITY zoom20max    "750" >
+<!ENTITY zoom20min    "520" >
+
+<!ENTITY zoom21max    "500" >
+<!ENTITY zoom21min    "260" >
diff --git a/tests/data/images/13_4194_2747.png b/tests/data/images/13_4194_2747.png
new file mode 100644
index 0000000..8813920
Binary files /dev/null and b/tests/data/images/13_4194_2747.png differ
diff --git a/tests/data/images/checker.jpg b/tests/data/images/checker.jpg
new file mode 100644
index 0000000..6d5549e
Binary files /dev/null and b/tests/data/images/checker.jpg differ
diff --git a/tests/data/images/dummy.jpeg b/tests/data/images/dummy.jpeg
new file mode 100644
index 0000000..81e1a80
Binary files /dev/null and b/tests/data/images/dummy.jpeg differ
diff --git a/tests/data/images/dummy.jpg b/tests/data/images/dummy.jpg
new file mode 100644
index 0000000..81e1a80
Binary files /dev/null and b/tests/data/images/dummy.jpg differ
diff --git a/tests/data/images/dummy.tif b/tests/data/images/dummy.tif
new file mode 100644
index 0000000..7c20279
Binary files /dev/null and b/tests/data/images/dummy.tif differ
diff --git a/tests/data/images/dummy.tiff b/tests/data/images/dummy.tiff
new file mode 100644
index 0000000..7c20279
Binary files /dev/null and b/tests/data/images/dummy.tiff differ
diff --git a/tests/data/images/stripes_pattern.png b/tests/data/images/stripes_pattern.png
new file mode 100644
index 0000000..08b5098
Binary files /dev/null and b/tests/data/images/stripes_pattern.png differ
diff --git a/tests/data/inc/entities.xml.inc b/tests/data/inc/entities.xml.inc
deleted file mode 100644
index a9b2dd3..0000000
--- a/tests/data/inc/entities.xml.inc
+++ /dev/null
@@ -1,7 +0,0 @@
-<!ENTITY fontset-settings SYSTEM "fontset-settings.xml.inc">
-<!ENTITY srs900913 "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs +over">
-<!ENTITY srsmercator "+proj=merc +datum=WGS84 +over">
-<!ENTITY srs4326 "+init=epsg:4326">
-<!ENTITY symbols "../images">
-<!ENTITY % scales SYSTEM "scales.xml.inc">
-%scales;
\ No newline at end of file
diff --git a/tests/data/inc/expected.xml b/tests/data/inc/expected.xml
deleted file mode 100644
index e69de29..0000000
diff --git a/tests/data/inc/fontset-settings.xml.inc b/tests/data/inc/fontset-settings.xml.inc
deleted file mode 100644
index 51094cc..0000000
--- a/tests/data/inc/fontset-settings.xml.inc
+++ /dev/null
@@ -1,12 +0,0 @@
-<FontSet name="book-fonts">
-  <Font face_name="DejaVu Sans Book" />
-  <!--Font face_name="unifont Medium" /-->
-</FontSet>
-<FontSet name="bold-fonts">
-  <Font face_name="DejaVu Sans Bold" />
-  <!--Font face_name="unifont Medium" /-->
-</FontSet>
-<FontSet name="oblique-fonts">
-  <Font face_name="DejaVu Sans Oblique" />
-  <!--Font face_name="unifont Medium" /-->
-</FontSet>
diff --git a/tests/data/inc/scales.xml.inc b/tests/data/inc/scales.xml.inc
deleted file mode 100644
index f5f5a25..0000000
--- a/tests/data/inc/scales.xml.inc
+++ /dev/null
@@ -1,37 +0,0 @@
-<!ENTITY maxscale_zoom0 "<MaxScaleDenominator>250000000000</MaxScaleDenominator>">
-<!ENTITY maxscale_zoom1 "<MaxScaleDenominator>500000000</MaxScaleDenominator>">
-<!ENTITY minscale_zoom1 "<MinScaleDenominator>200000000</MinScaleDenominator>">
-<!ENTITY maxscale_zoom2 "<MaxScaleDenominator>200000000</MaxScaleDenominator>">
-<!ENTITY minscale_zoom2 "<MinScaleDenominator>100000000</MinScaleDenominator>">
-<!ENTITY maxscale_zoom3 "<MaxScaleDenominator>100000000</MaxScaleDenominator>">
-<!ENTITY minscale_zoom3 "<MinScaleDenominator>50000000</MinScaleDenominator>">
-<!ENTITY maxscale_zoom4 "<MaxScaleDenominator>50000000</MaxScaleDenominator>">
-<!ENTITY minscale_zoom4 "<MinScaleDenominator>25000000</MinScaleDenominator>">
-<!ENTITY maxscale_zoom5 "<MaxScaleDenominator>25000000</MaxScaleDenominator>">
-<!ENTITY minscale_zoom5 "<MinScaleDenominator>12500000</MinScaleDenominator>">
-<!ENTITY maxscale_zoom6 "<MaxScaleDenominator>12500000</MaxScaleDenominator>">
-<!ENTITY minscale_zoom6 "<MinScaleDenominator>6500000</MinScaleDenominator>">
-<!ENTITY maxscale_zoom7 "<MaxScaleDenominator>6500000</MaxScaleDenominator>">
-<!ENTITY minscale_zoom7 "<MinScaleDenominator>3000000</MinScaleDenominator>">
-<!ENTITY maxscale_zoom8 "<MaxScaleDenominator>3000000</MaxScaleDenominator>">
-<!ENTITY minscale_zoom8 "<MinScaleDenominator>1500000</MinScaleDenominator>">
-<!ENTITY maxscale_zoom9 "<MaxScaleDenominator>1500000</MaxScaleDenominator>">
-<!ENTITY minscale_zoom9 "<MinScaleDenominator>750000</MinScaleDenominator>">
-<!ENTITY maxscale_zoom10 "<MaxScaleDenominator>750000</MaxScaleDenominator>">
-<!ENTITY minscale_zoom10 "<MinScaleDenominator>400000</MinScaleDenominator>">
-<!ENTITY maxscale_zoom11 "<MaxScaleDenominator>400000</MaxScaleDenominator>">
-<!ENTITY minscale_zoom11 "<MinScaleDenominator>200000</MinScaleDenominator>">
-<!ENTITY maxscale_zoom12 "<MaxScaleDenominator>200000</MaxScaleDenominator>">
-<!ENTITY minscale_zoom12 "<MinScaleDenominator>100000</MinScaleDenominator>">
-<!ENTITY maxscale_zoom13 "<MaxScaleDenominator>100000</MaxScaleDenominator>">
-<!ENTITY minscale_zoom13 "<MinScaleDenominator>50000</MinScaleDenominator>">
-<!ENTITY maxscale_zoom14 "<MaxScaleDenominator>50000</MaxScaleDenominator>">
-<!ENTITY minscale_zoom14 "<MinScaleDenominator>25000</MinScaleDenominator>">
-<!ENTITY maxscale_zoom15 "<MaxScaleDenominator>25000</MaxScaleDenominator>">
-<!ENTITY minscale_zoom15 "<MinScaleDenominator>12500</MinScaleDenominator>">
-<!ENTITY maxscale_zoom16 "<MaxScaleDenominator>12500</MaxScaleDenominator>">
-<!ENTITY minscale_zoom16 "<MinScaleDenominator>5000</MinScaleDenominator>">
-<!ENTITY maxscale_zoom17 "<MaxScaleDenominator>5000</MaxScaleDenominator>">
-<!ENTITY minscale_zoom17 "<MinScaleDenominator>2500</MinScaleDenominator>">
-<!ENTITY maxscale_zoom18 "<MaxScaleDenominator>2500</MaxScaleDenominator>">
-<!ENTITY minscale_zoom18 "<MinScaleDenominator>1000</MinScaleDenominator>">
\ No newline at end of file
diff --git a/tests/data/json/lines.json b/tests/data/json/lines.json
new file mode 100644
index 0000000..f3babc9
--- /dev/null
+++ b/tests/data/json/lines.json
@@ -0,0 +1,21 @@
+{
+
+"type": "FeatureCollection",
+
+/* comment */
+
+"features": [
+
+    { "type": "Feature", 
+    
+        "properties": { "x": 0, "y": 0, "label": "D" },
+        "geometry"  : { "type": "LineString", "coordinates": [ [1, 0], [2, 1], [3, 2], [4, 3], [5, 4], [6, 5] ] }
+    },
+    { "type": "Feature", 
+    
+        "properties": { "x": 2, "y": 0, "label": "V" },
+        "geometry"  : { "type": "LineString", "coordinates": [ [2, 0], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5] ] }
+    },
+    
+]
+}
diff --git a/tests/data/json/points.json b/tests/data/json/points.json
new file mode 100644
index 0000000..8b11160
--- /dev/null
+++ b/tests/data/json/points.json
@@ -0,0 +1,36 @@
+{
+
+"type": "FeatureCollection",
+
+/* comment */
+
+"features": [
+
+    { "type": "Feature", 
+    
+        "properties": { "x": 0, "y": 0, "label": "0,0" },
+        "geometry"  : { "type": "Point", "coordinates": [ 0, 0 ] }
+    },
+    { "type": "Feature", 
+    
+        "properties": { "x": 5, "y": 5, "label": "5,5" },
+        "geometry"  : { "type": "Point", "coordinates": [ 5, 5 ] }
+    },
+    { "type": "Feature", 
+    
+        "properties": { "x": 0, "y": 5, "label": "0,5" },
+        "geometry"  : { "type": "Point", "coordinates": [ 0, 5 ] }
+    },
+    { "type": "Feature", 
+    
+        "properties": { "x": 5, "y": 0, "label": "5,0" },
+        "geometry"  : { "type": "Point", "coordinates": [ 5, 0 ] }
+    },
+    { "type": "Feature", 
+    
+        "properties": { "x": 2.5, "y": 2.5, "label": "2.5,2.5" },
+        "geometry"  : { "type": "Point", "coordinates": [ 2.5, 2.5 ] }
+    },
+    
+]
+}
diff --git a/tests/data/osm/nodes.osm b/tests/data/osm/nodes.osm
new file mode 100644
index 0000000..ce06231
--- /dev/null
+++ b/tests/data/osm/nodes.osm
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<osm version="0.6" generator="mapnik">
+  <node lat="0" lon="2" id="1"/>
+  <node lat="2" lon="0" id="2"/>
+  <node lat="0" lon="-2" id="3"/>
+  <node lat="-2" lon="0" id="4"/>
+  <way id="1">
+    <nd ref="1"/>
+  </way>
+  <way id="2">
+    <nd ref="2"/>
+  </way>
+  <way id="2">
+    <nd ref="3"/>
+  </way>
+  <way id="2">
+    <nd ref="4"/>
+  </way>
+</osm>
\ No newline at end of file
diff --git a/tests/data/osm/t.png b/tests/data/osm/t.png
new file mode 100644
index 0000000..5e6d151
Binary files /dev/null and b/tests/data/osm/t.png differ
diff --git a/tests/data/osm/ways.osm b/tests/data/osm/ways.osm
new file mode 100644
index 0000000..f25b357
--- /dev/null
+++ b/tests/data/osm/ways.osm
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<osm version="0.6" generator="mapnik">
+  <node lat="0" lon="2" id="1"/>
+  <node lat="2" lon="0" id="2"/>
+  <node lat="0" lon="-2" id="3"/>
+  <node lat="-2" lon="0" id="4"/>
+  <way id="1">
+    <nd ref="2"/>
+    <nd ref="4"/>
+  </way>
+  <way id="2">
+    <nd ref="1"/>
+    <nd ref="3"/>
+  </way>
+</osm>
\ No newline at end of file
diff --git a/tests/data/raster/dataraster.tif b/tests/data/raster/dataraster.tif
new file mode 100644
index 0000000..778b321
Binary files /dev/null and b/tests/data/raster/dataraster.tif differ
diff --git a/tests/data/raster/white-alpha.png b/tests/data/raster/white-alpha.png
new file mode 100755
index 0000000..40ed381
Binary files /dev/null and b/tests/data/raster/white-alpha.png differ
diff --git a/tests/data/shp/arrows.dbf b/tests/data/shp/arrows.dbf
new file mode 100644
index 0000000..64b2c24
Binary files /dev/null and b/tests/data/shp/arrows.dbf differ
diff --git a/tests/data/shp/arrows.shp b/tests/data/shp/arrows.shp
new file mode 100644
index 0000000..27247e1
Binary files /dev/null and b/tests/data/shp/arrows.shp differ
diff --git a/tests/data/shp/arrows.shx b/tests/data/shp/arrows.shx
new file mode 100644
index 0000000..f6038c9
Binary files /dev/null and b/tests/data/shp/arrows.shx differ
diff --git a/tests/data/shp/farsi-labels.dbf b/tests/data/shp/farsi-labels.dbf
new file mode 100644
index 0000000..6b5d117
Binary files /dev/null and b/tests/data/shp/farsi-labels.dbf differ
diff --git a/tests/data/shp/farsi-labels.prj b/tests/data/shp/farsi-labels.prj
new file mode 100644
index 0000000..a30c00a
--- /dev/null
+++ b/tests/data/shp/farsi-labels.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
\ No newline at end of file
diff --git a/tests/data/shp/farsi-labels.shp b/tests/data/shp/farsi-labels.shp
new file mode 100644
index 0000000..5c2380e
Binary files /dev/null and b/tests/data/shp/farsi-labels.shp differ
diff --git a/tests/data/shp/farsi-labels.shx b/tests/data/shp/farsi-labels.shx
new file mode 100644
index 0000000..6fe17c7
Binary files /dev/null and b/tests/data/shp/farsi-labels.shx differ
diff --git a/tests/data/shp/world_merc2.dbf b/tests/data/shp/world_merc2.dbf
new file mode 100644
index 0000000..d9a9142
Binary files /dev/null and b/tests/data/shp/world_merc2.dbf differ
diff --git a/tests/data/shp/world_merc2.prj b/tests/data/shp/world_merc2.prj
new file mode 100644
index 0000000..a04443e
--- /dev/null
+++ b/tests/data/shp/world_merc2.prj
@@ -0,0 +1 @@
+PROJCS["WGS_84_World_Mercator",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator"],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1],PARAMETER["standard_parallel_1",0.0]]
\ No newline at end of file
diff --git a/tests/data/shp/world_merc2.shp b/tests/data/shp/world_merc2.shp
new file mode 100644
index 0000000..bbdb453
Binary files /dev/null and b/tests/data/shp/world_merc2.shp differ
diff --git a/tests/data/shp/world_merc2.shx b/tests/data/shp/world_merc2.shx
new file mode 100644
index 0000000..4b20df3
Binary files /dev/null and b/tests/data/shp/world_merc2.shx differ
diff --git a/tests/data/sqlite/business.sqlite b/tests/data/sqlite/business.sqlite
new file mode 100755
index 0000000..fd8a246
Binary files /dev/null and b/tests/data/sqlite/business.sqlite differ
diff --git a/tests/data/sqlite/qgis_spatiallite.sqlite b/tests/data/sqlite/qgis_spatiallite.sqlite
new file mode 100644
index 0000000..ff9639b
Binary files /dev/null and b/tests/data/sqlite/qgis_spatiallite.sqlite differ
diff --git a/tests/data/sqlite/world.sqlite b/tests/data/sqlite/world.sqlite
new file mode 100644
index 0000000..1ecc88d
Binary files /dev/null and b/tests/data/sqlite/world.sqlite differ
diff --git a/tests/data/svg/ellipses.svg b/tests/data/svg/ellipses.svg
new file mode 100644
index 0000000..114cf9e
--- /dev/null
+++ b/tests/data/svg/ellipses.svg
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   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="100%"
+   height="100%"
+   version="1.1"
+   id="svg2"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="ellipses.svg">
+  <metadata
+     id="metadata16">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1280"
+     inkscape:window-height="758"
+     id="namedview14"
+     showgrid="false"
+     inkscape:zoom="21.841736"
+     inkscape:cx="-11.26864"
+     inkscape:cy="1072.9165"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg2" />
+  <defs
+     id="defs12">
+    <linearGradient
+       collect="always"
+       id="linearGradient3775"
+       x1="0"
+       y1="-30"
+       x2="0"
+       y2="-10"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#008000;stop-opacity:1;"
+         offset="0"
+         id="stop3771" />
+      <stop
+         style="stop-color:#008000;stop-opacity:0;"
+         offset="1"
+         id="stop3773" />
+    </linearGradient>
+    <radialGradient
+       collect="always"
+       id="radialGradient3765"
+       cx="-2.5"
+       cy="-22.5"
+       fx="0.5"
+       fy="-20.5"
+       r="5"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#ff0000;stop-opacity:1;"
+         offset="0"
+         id="stop3761" />
+      <stop
+         id="stop3764"
+         offset="0.5"
+         style="stop-color:#ff4040;stop-opacity:1;" />
+      <stop
+         id="stop3767"
+         offset="0.6"
+         style="stop-color:#80ff80;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffacac;stop-opacity:1;"
+         offset="0.75"
+         id="stop3762" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3763" />
+    </radialGradient>
+  </defs>
+  <ellipse
+     cy="-20"
+     rx="10"
+     ry="4"
+     fill="green"
+     id="ellipse4"
+     style="fill-opacity:1;fill:url(#linearGradient3775)" />
+  <ellipse
+     cy="-20"
+     rx="4"
+     ry="10"
+     fill="blue"
+     id="ellipse6" />
+  <circle
+     cy="-20"
+     r="5"
+     stroke="green"
+     stroke-width=".4"
+     fill="red"
+     id="circle8"
+     style="fill-opacity:1;fill:url(#radialGradient3765);stroke-width:0.40000000000000002;stroke-miterlimit:4;stroke-dasharray:none" />
+</svg>
diff --git a/tests/data/svg/point.svg b/tests/data/svg/point.svg
new file mode 100644
index 0000000..bb71f43
--- /dev/null
+++ b/tests/data/svg/point.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+
+<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
+
+<circle cx="0" cy="0" r="50" stroke="green" stroke-width=".4" fill="red"/>
+
+</svg>
+
diff --git a/tests/data/svg/point_sm.svg b/tests/data/svg/point_sm.svg
new file mode 100644
index 0000000..2a47ccf
--- /dev/null
+++ b/tests/data/svg/point_sm.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+
+<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
+
+<circle cx="0" cy="0" r="10" fill="red"/>
+
+</svg>
+
diff --git a/tests/data/svg/radial.svg b/tests/data/svg/radial.svg
new file mode 100644
index 0000000..1dc3dcc
--- /dev/null
+++ b/tests/data/svg/radial.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   width="500"
+   height="500"
+   version="1.1" >
+
+    <radialGradient id="rad" >
+       <stop style="stop-color:#000000;stop-opacity:1;" offset="0" />
+       <stop style="stop-color:#000000;stop-opacity:0;" offset="1" />
+    </radialGradient>
+
+    <circle fill="url(#rad)" cx="250" cy="250" r="250"/>
+</svg>
diff --git a/tests/data/svg/radial_combo.svg b/tests/data/svg/radial_combo.svg
new file mode 100644
index 0000000..27a454d
--- /dev/null
+++ b/tests/data/svg/radial_combo.svg
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   width="500"
+   height="500"
+   id="svg2"
+   version="1.1" >
+
+    <radialGradient id="rad1" cx="0%" cy="0%" r="100%">
+       <stop style="stop-color:#888888;stop-opacity:1;" offset="0" />
+       <stop style="stop-color:#000000;stop-opacity:0;" offset="1" />
+    </radialGradient>
+    <radialGradient id="rad2" gradientUnits="userSpaceOnUse" cx="0" cy="0" r="100">
+       <stop style="stop-color:#FF0000;stop-opacity:1;" offset="0" />
+       <stop style="stop-color:#000000;stop-opacity:0;" offset="1" />
+    </radialGradient>
+    <radialGradient id="rad3" cx="0" cy="1" r="1">
+       <stop style="stop-color:#00FF00;stop-opacity:1;" offset="0" />
+       <stop style="stop-color:#000000;stop-opacity:0;" offset="1" />
+    </radialGradient>
+    <radialGradient id="rad4" gradientUnits="userSpaceOnUse" cx="50%" cy="50%" r="50%">
+       <stop style="stop-color:#0000FF;stop-opacity:1;" offset="0" />
+       <stop style="stop-color:#000000;stop-opacity:0;" offset="1" />
+    </radialGradient>
+
+  <circle fill="url(#rad1)" cx="50" cy="50" r="50"/>
+  <circle fill="url(#rad2)" cx="-50" cy="50" r="50"/>
+  <circle fill="url(#rad3)" cx="50" cy="-50" r="50"/>
+  <circle fill="url(#rad4)" cx="-50" cy="-50" r="50"/>
+
+</svg>
diff --git a/tests/data/svg/rect.svg b/tests/data/svg/rect.svg
new file mode 100644
index 0000000..e05c3ba
--- /dev/null
+++ b/tests/data/svg/rect.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+
+<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
+
+<rect width="20" height="15" style="fill:rgb(0,0,255);stroke-width:1;stroke:rgb(0,0,0)" />
+
+</svg>
\ No newline at end of file
diff --git a/tests/data/warning_maps/line_pattern_symbolizer_broken.xml b/tests/data/warning_maps/line_pattern_symbolizer_broken.xml
new file mode 100644
index 0000000..2f2763f
--- /dev/null
+++ b/tests/data/warning_maps/line_pattern_symbolizer_broken.xml
@@ -0,0 +1,8 @@
+<!DOCTYPE Map>
+<Map background-color="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs" minimum-version="0.7.2">
+    <Style name="some_style">
+        <Rule>
+            <LinePatternSymbolizer file="foo.png"/>
+        </Rule>
+    </Style>
+</Map>
\ No newline at end of file
diff --git a/tests/data/warning_maps/missing_icon.xml b/tests/data/warning_maps/missing_icon.xml
new file mode 100644
index 0000000..fa1f091
--- /dev/null
+++ b/tests/data/warning_maps/missing_icon.xml
@@ -0,0 +1,8 @@
+<!DOCTYPE Map>
+<Map background-color="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs" minimum-version="0.7.2">
+    <Style name="some_style">
+        <Rule>
+            <PolygonPatternSymbolizer file="/no/shuch/icon.png"/>
+        </Rule>
+    </Style>
+</Map>
\ No newline at end of file
diff --git a/tests/data/warning_maps/point_symbolizer_broken.xml b/tests/data/warning_maps/point_symbolizer_broken.xml
new file mode 100644
index 0000000..98c22a8
--- /dev/null
+++ b/tests/data/warning_maps/point_symbolizer_broken.xml
@@ -0,0 +1,8 @@
+<!DOCTYPE Map>
+<Map background-color="#b5d0d0" srs="+proj=merc +datum=WGS84  +k=1.0 +units=m +over +no_defs" minimum-version="0.7.2">
+    <Style name="some_style">
+        <Rule>
+            <PointSymbolizer file="foo.png"/>
+        </Rule>
+    </Style>
+</Map>
\ No newline at end of file
diff --git a/tests/python_tests/cairo_test.py b/tests/python_tests/cairo_test.py
index f0a2c2f..95a1755 100644
--- a/tests/python_tests/cairo_test.py
+++ b/tests/python_tests/cairo_test.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 import os
-import mapnik
+import mapnik2
 from nose.tools import *
 from utilities import execution_path,Todo
 
@@ -11,13 +11,13 @@ def setup():
     os.chdir(execution_path('.'))
 
 def _pycairo_surface(type,sym):
-    if mapnik.has_pycairo():
+    if mapnik2.has_pycairo():
         import cairo
         test_cairo_file = 'test.%s' % type
-        m = mapnik.Map(256,256)
-        mapnik.load_map(m,'../data/good_maps/%s_symbolizer.xml' % sym)
+        m = mapnik2.Map(256,256)
+        mapnik2.load_map(m,'../data/good_maps/%s_symbolizer.xml' % sym)
         surface = getattr(cairo,'%sSurface' % type.upper())(test_cairo_file, m.width,m.height)
-        mapnik.render(m, surface)
+        mapnik2.render(m, surface)
         surface.finish()        
         
         if os.path.exists(test_cairo_file):
@@ -53,3 +53,7 @@ def test_pycairo_svg_surface():
     
 def test_pycairo_svg_surface():
     return _pycairo_surface('ps','polygon')
+
+if __name__ == "__main__":
+    setup()
+    [eval(run)() for run in dir() if 'test_' in run]
diff --git a/tests/python_tests/datasource_test.py b/tests/python_tests/datasource_test.py
index 220cb72..4d84b33 100644
--- a/tests/python_tests/datasource_test.py
+++ b/tests/python_tests/datasource_test.py
@@ -3,7 +3,7 @@
 from nose.tools import *
 from utilities import execution_path
 
-import os, mapnik
+import os, mapnik2
 
 def setup():
     # All of the paths used are relative, if we run the tests
@@ -11,21 +11,36 @@ def setup():
     os.chdir(execution_path('.'))
     
 def test_field_listing():
-    lyr = mapnik.Layer('test')
-    lyr.datasource = mapnik.Shapefile(file='../data/shp/poly.shp')
+    lyr = mapnik2.Layer('test')
+    lyr.datasource = mapnik2.Shapefile(file='../data/shp/poly.shp')
     fields = lyr.datasource.fields()
     eq_(fields, ['AREA', 'EAS_ID', 'PRFEDEA'])
 
-def test_total_feature_count():
-    lyr = mapnik.Layer('test')
-    lyr.datasource = mapnik.Shapefile(file='../data/shp/poly.shp')
+def test_total_feature_count_shp():
+    lyr = mapnik2.Layer('test')
+    lyr.datasource = mapnik2.Shapefile(file='../data/shp/poly.shp')
     features = lyr.datasource.all_features()
     num_feats = len(features)
     eq_(num_feats, 10)
 
+def test_total_feature_count_json():
+    lyr = mapnik2.Layer('test')
+    lyr.datasource = mapnik2.Ogr(file='../data/json/points.json',layer_by_index=0)
+    features = lyr.datasource.all_features()
+    num_feats = len(features)
+    eq_(num_feats, 5)
+
+def test_reading_json_from_string():
+    json = open('../data/json/points.json','r').read()
+    lyr = mapnik2.Layer('test')
+    lyr.datasource = mapnik2.Ogr(file=json,layer_by_index=0)
+    features = lyr.datasource.all_features()
+    num_feats = len(features)
+    eq_(num_feats, 5)
+    
 def test_feature_envelope():
-    lyr = mapnik.Layer('test')
-    lyr.datasource = mapnik.Shapefile(file='../data/shp/poly.shp')
+    lyr = mapnik2.Layer('test')
+    lyr.datasource = mapnik2.Shapefile(file='../data/shp/poly.shp')
     features = lyr.datasource.all_features()
     for feat in features:
         env = feat.envelope()
@@ -35,12 +50,41 @@ def test_feature_envelope():
         eq_(intersects, True)
 
 def test_feature_attributes():
-    lyr = mapnik.Layer('test')
-    lyr.datasource = mapnik.Shapefile(file='../data/shp/poly.shp')
+    lyr = mapnik2.Layer('test')
+    lyr.datasource = mapnik2.Shapefile(file='../data/shp/poly.shp')
     features = lyr.datasource.all_features()
     feat = features[0]
     attrs = {'PRFEDEA': u'35043411', 'EAS_ID': 168, 'AREA': 215229.266}
     eq_(feat.attributes, attrs)
     eq_(lyr.datasource.fields(),['AREA', 'EAS_ID', 'PRFEDEA'])
-    eq_(lyr.datasource.field_types(),[float,int,str])
-    
\ No newline at end of file
+    eq_(lyr.datasource.field_types(),['float','int','str'])
+
+def test_hit_grid():
+    import os
+    from itertools import groupby
+
+    def rle_encode(l):
+        """ encode a list of strings with run-length compression """
+        return ["%d:%s" % (len(list(group)), name) for name, group in groupby(l)]
+
+    m = mapnik2.Map(256,256);
+    mapnik2.load_map(m,'../data/good_maps/agg_poly_gamma_map.xml');
+    m.zoom_all()
+    join_field = 'NAME'
+    fg = [] # feature grid
+    for y in range(0, 256, 4):
+        for x in range(0, 256, 4):
+            featureset = m.query_map_point(0,x,y)
+            added = False
+            for feature in featureset.features:
+                fg.append(feature[join_field])
+                added = True
+            if not added:
+                fg.append('')
+    hit_list = '|'.join(rle_encode(fg))
+    eq_(hit_list[:16],'730:|2:Greenland')
+    eq_(hit_list[-12:],'1:Chile|812:')
+
+if __name__ == '__main__':
+    setup()
+    [eval(run)() for run in dir() if 'test_' in run]
diff --git a/tests/python_tests/feature_id_test.py b/tests/python_tests/feature_id_test.py
new file mode 100644
index 0000000..2db7e9b
--- /dev/null
+++ b/tests/python_tests/feature_id_test.py
@@ -0,0 +1,69 @@
+#!/usr/bin/env python
+
+from nose.tools import *
+
+from utilities import execution_path, Todo
+
+import os, sys, glob, mapnik2
+
+def setup():
+    # All of the paths used are relative, if we run the tests
+    # from another directory we need to chdir()
+    os.chdir(execution_path('.'))
+
+def compare_shape_between_mapnik_and_ogr(shapefile,query=None):
+    ds1 = mapnik2.Ogr(file=shapefile,layer_by_index=0)
+    ds2 = mapnik2.Shapefile(file=shapefile)
+    if query:
+        fs1 = ds1.features(query)
+        fs2 = ds2.features(query)
+    else:
+        fs1 = ds1.featureset()
+        fs2 = ds2.featureset()
+    count = 0;
+    while(True):
+        count += 1
+        feat1 = fs1.next()
+        feat2 = fs2.next()
+        if not feat1:
+            break
+        #import pdb;pdb.set_trace()
+        eq_(feat1.id(),feat2.id(),
+            '%s : ogr feature id %s "%s" does not equal shapefile feature id %s "%s"' 
+              % (count,feat1.id(),str(feat1.attributes), feat2.id(),str(feat2.attributes)) )
+        
+    return True
+    
+
+
+def test_shapefile_line_featureset_id():
+    compare_shape_between_mapnik_and_ogr('../data/shp/polylines.shp')
+
+def test_shapefile_polygon_featureset_id():
+    compare_shape_between_mapnik_and_ogr('../data/shp/poly.shp')
+
+def test_shapefile_polygon_feature_query_id():
+    bbox = (15523428.2632, 4110477.6323, -11218494.8310, 7495720.7404)
+    query = mapnik2.Query(mapnik2.Box2d(*bbox))
+    ds = mapnik2.Ogr(file='../data/shp/world_merc.shp',layer_by_index=0)
+    for fld in ds.fields():
+        query.add_property_name(fld)
+    compare_shape_between_mapnik_and_ogr('../data/shp/world_merc.shp',query)
+
+def test_feature_hit_count():
+    raise Todo("need to optimize multigeom bbox handling in shapeindex")
+    # results in different results between shp and ogr!
+    #bbox = (-14284551.8434, 2074195.1992, -7474929.8687, 8140237.7628)
+    bbox = (1113194.91,4512803.085,2226389.82,6739192.905)
+    query = mapnik2.Query(mapnik2.Box2d(*bbox))
+    ds1 = mapnik2.Ogr(file='../data/shp/world_merc.shp',layer_by_index=0)
+    for fld in ds1.fields():
+        query.add_property_name(fld)
+    ds2 = mapnik2.Shapefile(file='../data/shp/world_merc.shp')
+    count1 = len(ds1.features(query).features)
+    count2 = len(ds2.features(query).features)
+    eq_(count1,count2,"Feature count differs between OGR driver (%s features) and Shapefile Driver (%s features) when querying the same bbox" % (count1,count2))
+
+if __name__ == "__main__":
+    setup()
+    [eval(run)() for run in dir() if 'test_' in run]
diff --git a/tests/python_tests/feature_test.py b/tests/python_tests/feature_test.py
new file mode 100644
index 0000000..b933a43
--- /dev/null
+++ b/tests/python_tests/feature_test.py
@@ -0,0 +1,76 @@
+#encoding: utf8
+import itertools
+import unittest
+
+from utilities import Todo
+
+class FeatureTest(unittest.TestCase):
+    def makeOne(self, *args, **kw):
+        from mapnik2 import Feature
+        return Feature(*args, **kw)
+    
+    def test_default_constructor(self):
+        f = self.makeOne(1)
+        self.failUnless(f is not None)
+
+    def test_python_extended_constructor(self):
+        from mapnik2 import Box2d
+        f = self.makeOne(1, 'POLYGON ((35 10, 10 20, 15 40, 45 45, 35 10),(20 30, 35 35, 30 20, 20 30))', foo="bar")
+        self.failUnlessEqual(f['foo'], 'bar')
+        self.failUnlessEqual(f.envelope(),Box2d(10.0,10.0,45.0,45.0))
+        area = 0.0
+        for g in f.geometries():
+            area += g.area()
+        self.failUnlessEqual(area,-450.0)
+    
+    def test_set_get_properties(self):
+        f = self.makeOne(1)
+        counter = itertools.count(0)
+        def test_val(expected):
+            key = 'prop%d'%counter.next()
+            try:
+                f[key] = expected
+            except TypeError:
+                self.fail("%r (%s)"%(expected, type(expected)))
+            self.failUnlessEqual(f[key], expected)
+        for v in (1, True, 1.4, "foo", u"avión"):
+            test_val(v)
+
+    def test_add_wkt_geometry(self):
+        from mapnik2 import Box2d
+        def add_geom_wkt(wkt):
+            f = self.makeOne(1)
+            self.failUnlessEqual(len(f.geometries()), 0)
+            f.add_geometries_from_wkt(wkt)
+            self.failUnlessEqual(len(f.geometries()), 3)
+            e = Box2d()
+            self.failUnlessEqual(e.valid(), False)
+            for g in f.geometries():
+                if not e.valid():
+                    e = g.envelope()
+                else:
+                    e +=g.envelope()
+                    
+            self.failUnlessEqual(e, f.envelope())
+        from binascii import unhexlify
+        def add_geom_wkb(wkb):
+            f = self.makeOne(1)
+            self.failUnlessEqual(len(f.geometries()), 0)
+            f.add_geometries_from_wkb(unhexlify(wkb))
+            self.failUnlessEqual(len(f.geometries()), 1)
+            e = Box2d()
+            self.failUnlessEqual(e.valid(), False)
+            for g in f.geometries():
+                if not e.valid():
+                    e = g.envelope()
+                else:
+                    e +=g.envelope()
+                    
+            self.failUnlessEqual(e, f.envelope())
+        def run() :
+            add_geom_wkt('GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10),POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10)))')
+            add_geom_wkb('010300000001000000050000000000000000003e4000000000000024400000000000002440000000000000344000000000000034400000000000004440000000000000444000000000000044400000000000003e400000000000002440') # POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10))
+        run()
+        
+if __name__ == "__main__":
+    [eval(run)() for run in dir() if 'test_' in run]
diff --git a/tests/python_tests/filter_test.py b/tests/python_tests/filter_test.py
index 7a547e1..21e4865 100644
--- a/tests/python_tests/filter_test.py
+++ b/tests/python_tests/filter_test.py
@@ -1,9 +1,13 @@
 #!/usr/bin/env python
+# -*- coding: utf-8 -*-
 
 from nose.tools import *
 from utilities import Todo
 
-import mapnik
+import mapnik2
+
+if hasattr(mapnik2,'Expression'):
+    mapnik2.Filter = mapnik2.Expression
 
 map_ = '''<Map>
     <Style name="s">
@@ -39,28 +43,34 @@ map_ = '''<Map>
         </Rule>
 
     </Style>
+    <Style name="s2" filter-mode="first">
+        <Rule>
+        </Rule>
+        <Rule>
+        </Rule>
+    </Style>
 </Map>'''
 
 def test_filter_init():    
-    m = mapnik.Map(1,1)
-    mapnik.load_map_from_string(m,map_)
+    m = mapnik2.Map(1,1)
+    mapnik2.load_map_from_string(m,map_)
     filters = []
-    filters.append(mapnik.Filter("([region]>=0) and ([region]<=50)"))
-    filters.append(mapnik.Filter("(([region]>=0) and ([region]<=50))"))
-    filters.append(mapnik.Filter("((([region]>=0) and ([region]<=50)))"))
-    filters.append(mapnik.Filter('((([region]>=0) and ([region]<=50)))'))
-    filters.append(mapnik.Filter('''((([region]>=0) and ([region]<=50)))'''))
-    filters.append(mapnik.Filter('''
+    filters.append(mapnik2.Filter("([region]>=0) and ([region]<=50)"))
+    filters.append(mapnik2.Filter("(([region]>=0) and ([region]<=50))"))
+    filters.append(mapnik2.Filter("((([region]>=0) and ([region]<=50)))"))
+    filters.append(mapnik2.Filter('((([region]>=0) and ([region]<=50)))'))
+    filters.append(mapnik2.Filter('''((([region]>=0) and ([region]<=50)))'''))
+    filters.append(mapnik2.Filter('''
     ((([region]>=0)
     and
     ([region]<=50)))
     '''))
-    filters.append(mapnik.Filter('''
+    filters.append(mapnik2.Filter('''
     ([region]>=0)
     and
     ([region]<=50)
     '''))
-    filters.append(mapnik.Filter('''
+    filters.append(mapnik2.Filter('''
     ([region]
     >=
     0)
@@ -77,4 +87,38 @@ def test_filter_init():
     
     first = filters[0]
     for f in filters:
-        eq_(str(first),str(f))
\ No newline at end of file
+        eq_(str(first),str(f))
+    
+    s = m.find_style('s2')
+    
+    eq_(s.filter_mode,mapnik2.filter_mode.FIRST)
+
+
+def test_regex_match():
+    f = mapnik2.Feature(0)
+    f["name"] = 'test'
+    expr = mapnik2.Expression("[name].match('test')")
+    eq_(expr.evaluate(f),True) # 1 == True
+
+def test_unicode_regex_match():
+    f = mapnik2.Feature(0)
+    f["name"] = 'Québec'
+    expr = mapnik2.Expression("[name].match('Québec')")
+    eq_(expr.evaluate(f),True) # 1 == True
+
+def test_regex_replace():
+    f = mapnik2.Feature(0)
+    f["name"] = 'test'
+    expr = mapnik2.Expression("[name].replace('(\B)|( )','$1 ')")
+    eq_(expr.evaluate(f),'t e s t')
+
+def test_unicode_regex_replace():
+    f = mapnik2.Feature(0)
+    f["name"] = 'Québec'
+    expr = mapnik2.Expression("[name].replace('(\B)|( )','$1 ')")
+    eq_(expr.evaluate(f), u'Q u é b e c')
+
+if __name__ == "__main__":
+    [eval(run)() for run in dir() if 'test_' in run]
+
+
diff --git a/tests/python_tests/font_test.py b/tests/python_tests/font_test.py
index c0d8efa..8603bdf 100644
--- a/tests/python_tests/font_test.py
+++ b/tests/python_tests/font_test.py
@@ -2,7 +2,7 @@
 
 from nose.tools import *
 
-import mapnik, pickle
+import mapnik2, pickle
 
 # Tests that exercise fonts. 
 
@@ -10,4 +10,7 @@ import mapnik, pickle
 # Todo: Add logic to use this TextSymbolizer in a rendering
 #@raises(UserWarning)
 #def test_invalid_font():
-#    ts = mapnik.TextSymbolizer('Name', 'Invalid Font Name', int(8), mapnik.Color('black'))
+#    ts = mapnik2.TextSymbolizer('Name', 'Invalid Font Name', int(8), mapnik2.Color('black'))
+
+if __name__ == "__main__":
+    [eval(run)() for run in dir() if 'test_' in run]
diff --git a/tests/python_tests/glyph_symbolizer_test.py b/tests/python_tests/glyph_symbolizer_test.py
new file mode 100644
index 0000000..48c35cc
--- /dev/null
+++ b/tests/python_tests/glyph_symbolizer_test.py
@@ -0,0 +1,99 @@
+#encoding: utf8
+#!/usr/bin/env python
+
+from nose.tools import *
+
+from utilities import execution_path, save_data, contains_word
+
+import os, mapnik2
+
+def test_renders_with_agg():
+    sym = mapnik2.GlyphSymbolizer("DejaVu Sans Condensed",
+                                  mapnik2.Expression("'í'"))
+    sym.allow_overlap = True
+    sym.angle = mapnik2.Expression("[azimuth]+90") #+90 so the top of the glyph points upwards
+    sym.size = mapnik2.Expression("[value]")
+    sym.color = mapnik2.Expression("'#ff0000'")
+
+    _map = create_map_and_append_symbolyzer(sym)
+    im = mapnik2.Image(_map.width,_map.height)
+    mapnik2.render(_map, im)
+    save_data('agg_glyph_symbolizer.png', im.tostring('png'))
+    assert contains_word('\xff\x00\x00\xff', im.tostring())
+
+def test_renders_with_cairo():
+    if not mapnik2.has_pycairo():
+        return
+    sym = mapnik2.GlyphSymbolizer("DejaVu Sans Condensed",
+                                  mapnik2.Expression("'í'"))
+    sym.allow_overlap = True
+    sym.angle = mapnik2.Expression("[azimuth]+90") #+90 so the top of the glyph points upwards
+    sym.size = mapnik2.Expression("[value]")
+    sym.color = mapnik2.Expression("'#ff0000'")
+    _map = create_map_and_append_symbolyzer(sym)
+
+    from cStringIO import StringIO
+    import cairo
+    surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 256, 256)
+    mapnik2.render(_map, surface)
+    im = mapnik2.Image.from_cairo(surface)
+    save_data('cairo_glyph_symbolizer.png', im.tostring('png'))
+    assert contains_word('\xff\x00\x00\xff', im.tostring())
+
+def test_load_save_load_map():
+    map = mapnik2.Map(256,256)
+    in_map = "../data/good_maps/glyph_symbolizer.xml"
+    mapnik2.load_map(map, in_map)
+    style = map.find_style('arrows')
+    sym = style.rules[0].symbols[0]
+    assert isinstance(sym, mapnik2.GlyphSymbolizer)
+    assert sym.angle_mode == mapnik2.angle_mode.AZIMUTH
+
+    out_map = mapnik2.save_map_to_string(map).decode('utf8')
+    map = mapnik2.Map(256,256)
+    mapnik2.load_map_from_string(map, out_map.encode('utf8'))
+    assert 'GlyphSymbolizer' in out_map
+    # make sure non-ascii characters are well supported since most interesting
+    # glyphs for symbology are usually in that range
+    assert u'í' in out_map, out_map
+
+#
+# Utilities and setup code
+#
+
+def setup():
+    # All of the paths used are relative, if we run the tests
+    # from another directory we need to chdir()
+    os.chdir(execution_path('.'))
+    
+def create_map_and_append_symbolyzer(sym):
+    srs = '+init=epsg:32630'
+    lyr = mapnik2.Layer('arrows')
+    lyr.datasource = mapnik2.Shapefile(
+        file = '../data/shp/arrows.shp',
+        )
+    lyr.srs = srs
+    _map = mapnik2.Map(256,256, srs)
+    style = mapnik2.Style()
+    rule = mapnik2.Rule()
+    rule.symbols.append(sym)
+
+    # put a test symbolizer to see what is the azimuth being read
+    ts = mapnik2.TextSymbolizer(mapnik2.Expression('[azimuth]'),
+                               "DejaVu Sans Book",
+                               10,
+                               mapnik2.Color("black"))
+    ts.allow_overlap = True
+    rule.symbols.append(ts)
+
+    style.rules.append(rule)
+    _map.append_style('foo', style)
+    lyr.styles.append('foo')
+    _map.layers.append(lyr)
+    _map.zoom_to_box(mapnik2.Box2d(0,0,8,8))
+    return _map
+
+if __name__ == "__main__":
+    setup()
+    [eval(run)() for run in dir() if 'test_' in run]
+
diff --git a/tests/python_tests/introspection_test.py b/tests/python_tests/introspection_test.py
index 433a38c..2eec53f 100644
--- a/tests/python_tests/introspection_test.py
+++ b/tests/python_tests/introspection_test.py
@@ -1,13 +1,20 @@
 #!/usr/bin/env python
 
+import os
 from nose.tools import *
+from utilities import execution_path
 from utilities import Todo
 
-import mapnik
+import mapnik2
+
+def setup():
+    # All of the paths used are relative, if we run the tests
+    # from another directory we need to chdir()
+    os.chdir(execution_path('.'))
 
 def test_introspect_symbolizers():
     # create a symbolizer
-    p = mapnik.PointSymbolizer("../data/images/dummy.png", "png", 16, 16)
+    p = mapnik2.PointSymbolizer(mapnik2.PathExpression("../data/images/dummy.png"))
     p.allow_overlap = True
     p.opacity = 0.5
     
@@ -22,11 +29,11 @@ def test_introspect_symbolizers():
     eq_(p.filename,'../data/images/dummy.png')
     
     # contruct objects to hold it
-    r = mapnik.Rule()
+    r = mapnik2.Rule()
     r.symbols.append(p)
-    s = mapnik.Style()
+    s = mapnik2.Style()
     s.rules.append(r)
-    m = mapnik.Map(0,0)
+    m = mapnik2.Map(0,0)
     m.append_style('s',s)
 
     # try to figure out what is
@@ -44,7 +51,7 @@ def test_introspect_symbolizers():
     sym = syms[0]
     # this is hackish at best
     p2 = sym.symbol()
-    assert isinstance(p2,mapnik.PointSymbolizer)
+    assert isinstance(p2,mapnik2.PointSymbolizer)
 
     eq_(p2.allow_overlap, True)
     eq_(p2.opacity, 0.5)
@@ -52,10 +59,14 @@ def test_introspect_symbolizers():
         
     ## but we need to be able to do:
     p2 = syms[0] # get the actual symbolizer, not the variant object
-    # this will throw ...
-    raise Todo('need to expose symbolizer instances')
-    assert isinstance(p2,mapnik.PointSymbolizer)
+    # this will throw for now...
+    assert isinstance(p2,mapnik2.PointSymbolizer)
     
     eq_(p2.allow_overlap, True)
     eq_(p2.opacity, 0.5)
-    eq_(p2.filename,'../data/images/dummy.png')
\ No newline at end of file
+    eq_(p2.filename,'../data/images/dummy.png')
+
+
+if __name__ == "__main__":
+    setup()
+    [eval(run)() for run in dir() if 'test_' in run]
diff --git a/tests/python_tests/layer_modification_test.py b/tests/python_tests/layer_modification_test.py
new file mode 100644
index 0000000..f25cbb2
--- /dev/null
+++ b/tests/python_tests/layer_modification_test.py
@@ -0,0 +1,74 @@
+#!/usr/bin/env python
+
+from nose.tools import *
+
+import os
+from nose.tools import *
+from utilities import execution_path
+import mapnik2
+
+def setup():
+    # All of the paths used are relative, if we run the tests
+    # from another directory we need to chdir()
+    os.chdir(execution_path('.'))
+
+def test_adding_datasource_to_layer():
+    map_string = '''<?xml version="1.0" encoding="utf-8"?>
+<Map>
+
+    <Layer name="world_borders">
+        <StyleName>world_borders_style</StyleName>
+        <StyleName>point_style</StyleName>
+        <!-- leave datasource empty -->
+        <!--
+        <Datasource>
+            <Parameter name="file">../data/shp/world_merc.shp</Parameter>
+            <Parameter name="type">shape</Parameter>
+        </Datasource>
+        -->
+    </Layer>
+
+</Map>
+'''
+    m = mapnik2.Map(256, 256)
+    
+    mapnik2.load_map_from_string(m, map_string)
+    
+    # validate it loaded fine
+    eq_(m.layers[0].styles[0],'world_borders_style')
+    eq_(m.layers[0].styles[1],'point_style')
+    eq_(len(m.layers),1)
+    
+    # also assign a variable reference to that layer
+    # below we will test that this variable references
+    # the same object that is attached to the map
+    lyr = m.layers[0]
+
+    # ensure that there was no datasource for the layer...
+    eq_(m.layers[0].datasource,None)
+    eq_(lyr.datasource,None)
+    
+    # also note that since the srs was black it defaulted to wgs84
+    eq_(m.layers[0].srs,'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
+    eq_(lyr.srs,'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
+    
+    # now add a datasource one...
+    ds = mapnik2.Shapefile(file='../data/shp/world_merc.shp')
+    m.layers[0].datasource = ds
+    
+    # now ensure it is attached
+    eq_(m.layers[0].datasource.name(),"shape")
+    eq_(lyr.datasource.name(),"shape")
+    
+    # and since we have now added a shapefile in spherical mercator, adjust the projection
+    lyr.srs = '+proj=merc +lon_0=0 +lat_ts=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs'
+    
+    # test that assignment
+    eq_(m.layers[0].srs,'+proj=merc +lon_0=0 +lat_ts=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs')
+    eq_(lyr.srs,'+proj=merc +lon_0=0 +lat_ts=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs')
+
+if __name__ == "__main__":
+    setup()
+    [eval(run)() for run in dir() if 'test_' in run]
+ 
+    
\ No newline at end of file
diff --git a/tests/python_tests/load_map_test.py b/tests/python_tests/load_map_test.py
index 80b777a..6b902df 100644
--- a/tests/python_tests/load_map_test.py
+++ b/tests/python_tests/load_map_test.py
@@ -3,7 +3,7 @@
 from nose.tools import *
 from utilities import execution_path
 
-import os, sys, glob, mapnik
+import os, sys, glob, mapnik2
 
 def setup():
     # All of the paths used are relative, if we run the tests
@@ -13,15 +13,15 @@ def setup():
 # We expect these files to not raise any
 # exceptions at all
 def assert_loads_successfully(file):
-    m = mapnik.Map(512, 512)
+    m = mapnik2.Map(512, 512)
 
     strict = True
-    mapnik.load_map(m, file, strict)
+    mapnik2.load_map(m, file, strict)
     
     # libxml2 is not smart about paths, and clips the last directory off
     # of a path if it does not end in a trailing slash
     base_path = os.path.dirname(file) + '/'
-    mapnik.load_map_from_string(m,open(file,'rb').read(),strict,base_path)
+    mapnik2.load_map_from_string(m,open(file,'rb').read(),strict,base_path)
     
 
 # We expect these files to raise a RuntimeError
@@ -29,10 +29,10 @@ def assert_loads_successfully(file):
 # of exception)
 @raises(RuntimeError)
 def assert_raises_runtime_error(file):
-    m = mapnik.Map(512, 512)
+    m = mapnik2.Map(512, 512)
 
     strict = True
-    mapnik.load_map(m, file, strict)
+    mapnik2.load_map(m, file, strict)
 
 def test_broken_files():
     broken_files = glob.glob("../data/broken_maps/*.xml")
@@ -48,3 +48,7 @@ def test_good_files():
 
     for file in good_files:
         yield assert_loads_successfully, file
+
+if __name__ == "__main__":
+    setup()
+    [eval(run)() for run in dir() if 'test_' in run]
diff --git a/tests/python_tests/mapnik_config_test.py b/tests/python_tests/mapnik_config_test.py
new file mode 100644
index 0000000..68995b4
--- /dev/null
+++ b/tests/python_tests/mapnik_config_test.py
@@ -0,0 +1,35 @@
+#!/usr/bin/env python
+
+from nose.tools import *
+from subprocess import call
+import os
+
+#import os, sys, glob, mapnik2
+
+#def test():
+#    # mapnik-config program
+#    # should be on default path...
+#    mc = 'mapnik-config'
+#    valid = ['--help',
+#             '--prefix',
+#             '--libs',
+#             '--dep-libs',
+#             '--ldflags',
+#             '--cflags',
+#             '--fonts',
+#             '--input-plugins',
+#             '-v',
+#             '--version',
+#             '--svn-revision',
+#    ]
+#
+#    # valid args should return 1
+#    for item in valid:
+#        eq_(0,call([mc,item]))
+#    
+#    # errors should return 1
+#    eq_(1,call([mc,'']))
+#    eq_(1,call([mc,'foo']))
+
+if __name__ == "__main__":
+    [eval(run)() for run in dir() if 'test_' in run]
diff --git a/tests/python_tests/memory_datasource_test.py b/tests/python_tests/memory_datasource_test.py
new file mode 100644
index 0000000..f692bfc
--- /dev/null
+++ b/tests/python_tests/memory_datasource_test.py
@@ -0,0 +1,42 @@
+#encoding: utf8
+import itertools
+import unittest
+
+from utilities import Todo
+
+class MemoryDatasource(unittest.TestCase):
+    ids = itertools.count(0)
+
+    def makeOne(self, *args, **kw):
+        from mapnik2 import MemoryDatasource
+        return MemoryDatasource(*args, **kw)
+
+    def makeFeature(self, wkt, **properties):
+        from mapnik2 import Feature
+        f = Feature(self.ids.next())
+        f.add_geometries_from_wkt(wkt)
+        for k,v in properties.iteritems():
+            f[k] = v
+        return f
+
+    def test_default_constructor(self):
+        f = self.makeOne()
+        self.failUnless(f is not None)
+
+    def test_add_feature(self):
+        md = self.makeOne()
+        self.failUnlessEqual(md.num_features(), 0)
+        md.add_feature(self.makeFeature('Point(2 3)', foo='bar'))
+        self.failUnlessEqual(md.num_features(), 1)
+
+        from mapnik2 import Coord
+        retrieved = md.features_at_point(Coord(2,3)).features
+        self.failUnlessEqual(len(retrieved), 1)
+        f = retrieved[0]
+        self.failUnlessEqual(f['foo'], 'bar')
+
+        retrieved = md.features_at_point(Coord(20,30)).features
+        self.failUnlessEqual(len(retrieved), 0)
+
+if __name__ == "__main__":
+    [eval(run)() for run in dir() if 'test_' in run]
diff --git a/tests/python_tests/object_test.py b/tests/python_tests/object_test.py
index c370d1e..43d3671 100644
--- a/tests/python_tests/object_test.py
+++ b/tests/python_tests/object_test.py
@@ -1,62 +1,153 @@
 #!/usr/bin/env python
 
+import os
 from nose.tools import *
+from utilities import execution_path
 from utilities import Todo
 
-import mapnik, pickle
+import mapnik2, pickle
+
+def setup():
+    # All of the paths used are relative, if we run the tests
+    # from another directory we need to chdir()
+    os.chdir(execution_path('.'))
 
 # Tests that exercise the functionality of Mapnik classes.
 
+# LineSymbolizer initialization
+def test_line_symbolizer_init():
+    s = mapnik2.LineSymbolizer()
+    eq_(s.rasterizer, mapnik2.line_rasterizer.FULL)
+
 # ShieldSymbolizer initialization
 def test_shieldsymbolizer_init():
-    s = mapnik.ShieldSymbolizer('Field Name', 'DejaVu Sans Bold', 6, mapnik.Color('#000000'), '../data/images/dummy.png', 'png', 16, 16)
+    s = mapnik2.ShieldSymbolizer(mapnik2.Expression('[Field Name]'), 'DejaVu Sans Bold', 6, mapnik2.Color('#000000'), mapnik2.PathExpression('../data/images/dummy.png'))
+    eq_(s.anchor, (0.0,0.5,))
+    eq_(s.displacement, (0.0,0.0))
+    eq_(s.allow_overlap, False)
+    eq_(s.avoid_edges, False)
+    eq_(s.character_spacing,0)
+    eq_(str(s.name), str(mapnik2.Expression('[Field Name]')))
+    eq_(s.face_name, 'DejaVu Sans Bold')
+    eq_(s.allow_overlap, False)
+    eq_(s.fill, mapnik2.Color('#000000'))
+    eq_(s.force_odd_labels, False)
+    eq_(s.halo_fill, mapnik2.Color('rgb(255,255,255)'))
+    eq_(s.halo_radius, 0)
+    eq_(s.label_placement, mapnik2.label_placement.POINT_PLACEMENT)
+    eq_(s.minimum_distance, 0.0)
+    eq_(s.text_ratio, 0)
+    eq_(s.text_size, 6)
+    eq_(s.wrap_width, 0)
+    eq_(s.vertical_alignment, mapnik2.vertical_alignment.MIDDLE)
+    eq_(s.label_spacing, 0)
+    eq_(s.label_position_tolerance, 0)
+    # 22.5 * M_PI/180.0 initialized by default
+    assert_almost_equal(s.max_char_angle_delta, 0.39269908169872414)
+    
+    eq_(s.wrap_character, ' ')
+    eq_(s.text_transform, mapnik2.text_transform.NONE)
+    eq_(s.line_spacing, 0)
+    eq_(s.character_spacing, 0)
+    
+    # r1341
+    eq_(s.wrap_before, False)
+    eq_(s.horizontal_alignment, mapnik2.horizontal_alignment.MIDDLE)
+    eq_(s.justify_alignment, mapnik2.justify_alignment.MIDDLE)
+    eq_(s.opacity, 1.0)
+    
+    # r2300
+    eq_(s.minimum_padding, 0.0)
+    
+    # was mixed with s.opacity
+    eq_(s.text_opacity, 1.0)
+
+    eq_(s.shield_displacement, (0.0,0.0))
+    # TODO - the pattern in bindings seems to be to get/set
+    # strings for PathExpressions... should we pass objects?
+    eq_(s.filename, '../data/images/dummy.png')
+
+    eq_(s.transform, 'matrix(1, 0, 0, 1, 0, 0)')
+        
+    raise Todo("FontSet pickling support needed: http://trac.mapnik2.org/ticket/348")
+    eq_(s.fontset, '')
+
 
 # ShieldSymbolizer missing image file
- at raises(RuntimeError)
-def test_shieldsymbolizer_missing_image():
-    s = mapnik.ShieldSymbolizer('Field Name', 'DejaVu Sans Bold', 6, mapnik.Color('#000000'), '../data/images/broken.png', 'png', 16, 16)
+# images paths are now PathExpressions are evaluated at runtime
+# so it does not make sense to throw...
+#@raises(RuntimeError)
+#def test_shieldsymbolizer_missing_image():
+#    s = mapnik2.ShieldSymbolizer(mapnik2.Expression('[Field Name]'), 'DejaVu Sans Bold', 6, mapnik2.Color('#000000'), mapnik2.PathExpression('../#data/images/broken.png'))
+
+def test_polygonsymbolizer_init():
+    p = mapnik2.PolygonSymbolizer()
+
+    eq_(p.fill, mapnik2.Color('gray'))
+    eq_(p.fill_opacity, 1)
+    eq_(p.placement, mapnik2.point_placement.CENTROID)
+
+    p = mapnik2.PolygonSymbolizer(mapnik2.Color('blue'))
+    p.placement = mapnik2.point_placement.INTERIOR
+
+    eq_(p.fill, mapnik2.Color('blue'))
+    eq_(p.fill_opacity, 1)
+    eq_(p.placement, mapnik2.point_placement.INTERIOR)
 
 # PointSymbolizer initialization
 def test_pointsymbolizer_init():
-    p = mapnik.PointSymbolizer() 
+    p = mapnik2.PointSymbolizer() 
     eq_(p.allow_overlap, False)
     eq_(p.opacity,1)
     eq_(p.filename,'')
-
-    p = mapnik.PointSymbolizer("../data/images/dummy.png", "png", 16, 16)
-    eq_(p.allow_overlap, False)
-    eq_(p.opacity, 1)
+    eq_(p.ignore_placement,False)
+    eq_(p.placement, mapnik2.point_placement.CENTROID)
+
+    p = mapnik2.PointSymbolizer(mapnik2.PathExpression("../data/images/dummy.png"))
+    p.allow_overlap = True
+    p.opacity = 0.5
+    p.ignore_placement = True
+    p.placement = mapnik2.point_placement.INTERIOR
+    eq_(p.allow_overlap, True)
+    eq_(p.opacity, 0.5)
     eq_(p.filename,'../data/images/dummy.png')
+    eq_(p.ignore_placement,True)
+    eq_(p.placement, mapnik2.point_placement.INTERIOR)
 
 # PointSymbolizer missing image file
- at raises(RuntimeError)
-def test_pointsymbolizer_missing_image():
-    p = mapnik.PointSymbolizer("../data/images/broken.png", "png", 16, 16)
+# images paths are now PathExpressions are evaluated at runtime
+# so it does not make sense to throw...
+#@raises(RuntimeError)
+#def test_pointsymbolizer_missing_image():
+ #   p = mapnik2.PointSymbolizer(mapnik2.PathExpression("../data/images/broken.png"))
 
 # PointSymbolizer pickling
 def test_pointsymbolizer_pickle():
-    p = mapnik.PointSymbolizer("../data/images/dummy.png", "png", 16, 16)
+    raise Todo("point_symbolizer pickling currently disabled")
+    p = mapnik2.PointSymbolizer(mapnik2.PathExpression("../data/images/dummy.png"))
     p2 = pickle.loads(pickle.dumps(p,pickle.HIGHEST_PROTOCOL))
     # image type, width, and height only used in contructor...
     eq_(p.filename, p2.filename)
     eq_(p.allow_overlap, p2.allow_overlap)
     eq_(p.opacity, p2.opacity)
+    eq_(p.ignore_placement, p2.ignore_placement)
+    eq_(p.placement, p2.placement)
 
 # PolygonSymbolizer initialization
 def test_polygonsymbolizer_init():
-    p = mapnik.PolygonSymbolizer()
+    p = mapnik2.PolygonSymbolizer()
 
-    eq_(p.fill, mapnik.Color('gray'))
+    eq_(p.fill, mapnik2.Color('gray'))
     eq_(p.fill_opacity, 1)
 
-    p = mapnik.PolygonSymbolizer(mapnik.Color('blue'))
+    p = mapnik2.PolygonSymbolizer(mapnik2.Color('blue'))
 
-    eq_(p.fill, mapnik.Color('blue'))
+    eq_(p.fill, mapnik2.Color('blue'))
     eq_(p.fill_opacity, 1)
 
 # PolygonSymbolizer pickling
 def test_polygonsymbolizer_pickle():
-    p = mapnik.PolygonSymbolizer(mapnik.Color('black'))
+    p = mapnik2.PolygonSymbolizer(mapnik2.Color('black'))
     p.fill_opacity = .5
     # does not work for some reason...
     #eq_(pickle.loads(pickle.dumps(p)), p)
@@ -67,25 +158,28 @@ def test_polygonsymbolizer_pickle():
 
 # Stroke initialization
 def test_stroke_init():
-    s = mapnik.Stroke()
+    s = mapnik2.Stroke()
 
     eq_(s.width, 1)
     eq_(s.opacity, 1)
-    eq_(s.color, mapnik.Color('black'))
-    eq_(s.line_cap, mapnik.line_cap.BUTT_CAP)
-    eq_(s.line_join, mapnik.line_join.MITER_JOIN)
+    eq_(s.color, mapnik2.Color('black'))
+    eq_(s.line_cap, mapnik2.line_cap.BUTT_CAP)
+    eq_(s.line_join, mapnik2.line_join.MITER_JOIN)
+    eq_(s.gamma,1.0)
 
-    s = mapnik.Stroke(mapnik.Color('blue'), 5.0)
+    s = mapnik2.Stroke(mapnik2.Color('blue'), 5.0)
+    s.gamma = .5
 
     eq_(s.width, 5)
     eq_(s.opacity, 1)
-    eq_(s.color, mapnik.Color('blue'))
-    eq_(s.line_cap, mapnik.line_cap.BUTT_CAP)
-    eq_(s.line_join, mapnik.line_join.MITER_JOIN)
+    eq_(s.color, mapnik2.Color('blue'))
+    eq_(s.gamma, .5)
+    eq_(s.line_cap, mapnik2.line_cap.BUTT_CAP)
+    eq_(s.line_join, mapnik2.line_join.MITER_JOIN)
 
 # Stroke dashes
 def test_stroke_dash_arrays():
-    s = mapnik.Stroke()
+    s = mapnik2.Stroke()
     s.add_dash(1,2)
     s.add_dash(3,4)
     s.add_dash(5,6)
@@ -94,10 +188,10 @@ def test_stroke_dash_arrays():
 
 # Stroke pickling
 def test_stroke_pickle():
-    s = mapnik.Stroke(mapnik.Color('black'),4.5)
+    s = mapnik2.Stroke(mapnik2.Color('black'),4.5)
 
     eq_(s.width, 4.5)
-    eq_(s.color, mapnik.Color('black'))
+    eq_(s.color, mapnik2.Color('black'))
 
     s.add_dash(1,2)
     s.add_dash(3,4)
@@ -114,34 +208,34 @@ def test_stroke_pickle():
     
 # LineSymbolizer initialization
 def test_linesymbolizer_init():
-    l = mapnik.LineSymbolizer()
+    l = mapnik2.LineSymbolizer()
    
     eq_(l.stroke.width, 1)
     eq_(l.stroke.opacity, 1)
-    eq_(l.stroke.color, mapnik.Color('black'))
-    eq_(l.stroke.line_cap, mapnik.line_cap.BUTT_CAP)
-    eq_(l.stroke.line_join, mapnik.line_join.MITER_JOIN)
+    eq_(l.stroke.color, mapnik2.Color('black'))
+    eq_(l.stroke.line_cap, mapnik2.line_cap.BUTT_CAP)
+    eq_(l.stroke.line_join, mapnik2.line_join.MITER_JOIN)
 
-    l = mapnik.LineSymbolizer(mapnik.Color('blue'), 5.0)
+    l = mapnik2.LineSymbolizer(mapnik2.Color('blue'), 5.0)
 
     eq_(l.stroke.width, 5)
     eq_(l.stroke.opacity, 1)
-    eq_(l.stroke.color, mapnik.Color('blue'))
-    eq_(l.stroke.line_cap, mapnik.line_cap.BUTT_CAP)
-    eq_(l.stroke.line_join, mapnik.line_join.MITER_JOIN)
+    eq_(l.stroke.color, mapnik2.Color('blue'))
+    eq_(l.stroke.line_cap, mapnik2.line_cap.BUTT_CAP)
+    eq_(l.stroke.line_join, mapnik2.line_join.MITER_JOIN)
     
-    s = mapnik.Stroke(mapnik.Color('blue'), 5.0)
-    l = mapnik.LineSymbolizer(s)
+    s = mapnik2.Stroke(mapnik2.Color('blue'), 5.0)
+    l = mapnik2.LineSymbolizer(s)
     
     eq_(l.stroke.width, 5)
     eq_(l.stroke.opacity, 1)
-    eq_(l.stroke.color, mapnik.Color('blue'))
-    eq_(l.stroke.line_cap, mapnik.line_cap.BUTT_CAP)
-    eq_(l.stroke.line_join, mapnik.line_join.MITER_JOIN)
+    eq_(l.stroke.color, mapnik2.Color('blue'))
+    eq_(l.stroke.line_cap, mapnik2.line_cap.BUTT_CAP)
+    eq_(l.stroke.line_join, mapnik2.line_join.MITER_JOIN)
 
 # LineSymbolizer pickling
 def test_linesymbolizer_pickle():
-    p = mapnik.LineSymbolizer()
+    p = mapnik2.LineSymbolizer()
     p2 = pickle.loads(pickle.dumps(p,pickle.HIGHEST_PROTOCOL))
     # line and stroke eq fails, so we compare attributes for now..
     s,s2 = p.stroke, p2.stroke
@@ -154,7 +248,7 @@ def test_linesymbolizer_pickle():
 
 # Shapefile initialization
 def test_shapefile_init():
-    s = mapnik.Shapefile(file='../../demo/data/boundaries')
+    s = mapnik2.Shapefile(file='../../demo/data/boundaries')
 
     e = s.envelope()
    
@@ -165,41 +259,48 @@ def test_shapefile_init():
 
 # Shapefile properties
 def test_shapefile_properties():
-    s = mapnik.Shapefile(file='../../demo/data/boundaries', encoding='latin1')
+    s = mapnik2.Shapefile(file='../../demo/data/boundaries', encoding='latin1')
     f = s.features_at_point(s.envelope().center()).features[0]
 
-    eq_(f.properties['CGNS_FID'], u'6f733341ba2011d892e2080020a0f4c9')
-    eq_(f.properties['COUNTRY'], u'CAN')
-    eq_(f.properties['F_CODE'], u'FA001')
-    eq_(f.properties['NAME_EN'], u'Quebec')
-    eq_(f.properties['NOM_FR'], u'Qu\xe9bec')
-    eq_(f.properties['Shape_Area'], 1512185733150.0)
+    eq_(f['CGNS_FID'], u'6f733341ba2011d892e2080020a0f4c9')
+    eq_(f['COUNTRY'], u'CAN')
+    eq_(f['F_CODE'], u'FA001')
+    eq_(f['NAME_EN'], u'Quebec')
+    eq_(f['NOM_FR'], u'Qu\xe9bec')
+    eq_(f['Shape_Area'], 1512185733150.0)
+    eq_(f['Shape_Leng'], 19218883.724300001)
+
+    # Check that the deprecated interface still works,
+    # remove me once the deprecated code is cleaned up
     eq_(f.properties['Shape_Leng'], 19218883.724300001)
 
 # TextSymbolizer initialization
 def test_textsymbolizer_init():
-    ts = mapnik.TextSymbolizer('Field Name', 'Font Name', 8, mapnik.Color('black'))
+    ts = mapnik2.TextSymbolizer(mapnik2.Expression('[Field_Name]'), 'Font Name', 8, mapnik2.Color('black'))
 
-    eq_(ts.name, 'Field Name')
+    eq_(str(ts.name), str(mapnik2.Expression('[Field_Name]')))
     eq_(ts.face_name, 'Font Name')
     eq_(ts.text_size, 8)
-    eq_(ts.fill, mapnik.Color('black'))
+    eq_(ts.fill, mapnik2.Color('black'))
+    eq_(ts.label_placement, mapnik2.label_placement.POINT_PLACEMENT)
 
 # TextSymbolizer pickling
 def test_textsymbolizer_pickle():
-    ts = mapnik.TextSymbolizer('Field Name', 'Font Name', 8, mapnik.Color('black'))
+    ts = mapnik2.TextSymbolizer(mapnik2.Expression('[Field_Name]'), 'Font Name', 8, mapnik2.Color('black'))
 
-    eq_(ts.name, 'Field Name')
+    eq_(str(ts.name), str(mapnik2.Expression('[Field_Name]')))
     eq_(ts.face_name, 'Font Name')
     eq_(ts.text_size, 8)
-    eq_(ts.fill, mapnik.Color('black'))
+    eq_(ts.fill, mapnik2.Color('black'))
+    
+    raise Todo("text_symbolizer pickling currently disabled")
 
     ts2 = pickle.loads(pickle.dumps(ts,pickle.HIGHEST_PROTOCOL))
     eq_(ts.name, ts2.name)
     eq_(ts.face_name, ts2.face_name)
     eq_(ts.allow_overlap, ts2.allow_overlap)
-    eq_(ts.get_displacement(), ts2.get_displacement())
-    eq_(ts.get_anchor(), ts2.get_anchor())
+    eq_(ts.displacement, ts2.displacement)
+    eq_(ts.anchor, ts2.anchor)
     eq_(ts.fill, ts2.fill)
     eq_(ts.force_odd_labels, ts2.force_odd_labels)
     eq_(ts.halo_fill, ts2.halo_fill)
@@ -212,9 +313,11 @@ def test_textsymbolizer_pickle():
     eq_(ts.vertical_alignment, ts2.vertical_alignment)
     eq_(ts.label_spacing, ts2.label_spacing)
     eq_(ts.label_position_tolerance, ts2.label_position_tolerance)
+    # 22.5 * M_PI/180.0 initialized by default
+    assert_almost_equal(s.max_char_angle_delta, 0.39269908169872414)
     
     eq_(ts.wrap_character, ts2.wrap_character)
-    eq_(ts.text_convert, ts2.text_convert)
+    eq_(ts.text_transform, ts2.text_transform)
     eq_(ts.line_spacing, ts2.line_spacing)
     eq_(ts.character_spacing, ts2.character_spacing)
     
@@ -223,28 +326,44 @@ def test_textsymbolizer_pickle():
     eq_(ts.horizontal_alignment, ts2.horizontal_alignment)
     eq_(ts.justify_alignment, ts2.justify_alignment)
     eq_(ts.opacity, ts2.opacity)
+
+    # r2300
+    eq_(s.minimum_padding, 0.0)
         
-    raise Todo("FontSet pickling support needed: http://trac.mapnik.org/ticket/348")
+    raise Todo("FontSet pickling support needed: http://trac.mapnik2.org/ticket/348")
     eq_(ts.fontset, ts2.fontset)
 
 
 # Map initialization
+def test_layer_init():
+    l = mapnik2.Layer('test')
+    eq_(l.name,'test')
+    eq_(l.envelope(),mapnik2.Box2d())
+    eq_(l.clear_label_cache,False)
+    eq_(l.cache_features,False)
+    eq_(l.visible(1),True)
+    eq_(l.abstract,'')
+    eq_(l.active,True)
+    eq_(l.datasource,None)
+    eq_(l.queryable,False)
+    eq_(l.srs,'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
+    eq_(l.title,'')
+
+# Map initialization
 def test_map_init():
-    m = mapnik.Map(256, 256)
+    m = mapnik2.Map(256, 256)
    
     eq_(m.width, 256)
     eq_(m.height, 256)
-    eq_(m.srs, '+proj=latlong +datum=WGS84')
+    eq_(m.srs, '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
+    eq_(m.base, '')
 
-    m = mapnik.Map(256, 256, '+proj=latlong')
-    
-    eq_(m.width, 256)
-    eq_(m.height, 256)
+    m = mapnik2.Map(256, 256, '+proj=latlong')
     eq_(m.srs, '+proj=latlong')
 
 # Map initialization from string
 def test_map_init_from_string():
-    map_string = '''<Map bgcolor="steelblue" srs="+proj=latlong +datum=WGS84">
+    map_string = '''<Map background-color="steelblue" base="./" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
      <Style name="My Style">
       <Rule>
        <PolygonSymbolizer>
@@ -265,11 +384,20 @@ def test_map_init_from_string():
       </Layer>
     </Map>'''
 
-    m = mapnik.Map(600, 300)
-    
-    mapnik.load_map_from_string(m, map_string)
-    mapnik.load_map_from_string(m, map_string, False, "")
-    mapnik.load_map_from_string(m, map_string, True, "")
+    m = mapnik2.Map(600, 300)
+    eq_(m.base, '')
+    mapnik2.load_map_from_string(m, map_string)
+    eq_(m.base, './')
+    mapnik2.load_map_from_string(m, map_string, False, "") # this "" will have no effect
+    eq_(m.base, './')
+    try:
+        mapnik2.load_map_from_string(m, map_string, False, "/tmp")
+    except RuntimeError:
+        pass # runtime error expected because shapefile path should be wrong and datasource will throw
+    eq_(m.base, '/tmp') # /tmp will be set despite the exception because load_map mostly worked
+    m.base = 'foo'
+    mapnik2.load_map_from_string(m, map_string, True, ".")
+    eq_(m.base, '.')
     raise(Todo("Need to write more map property tests in 'object_test.py'..."))
 
 # Map pickling
@@ -277,17 +405,26 @@ def test_map_pickle():
     # Fails due to scale() not matching, possibly other things
     raise(Todo("Map does not support pickling yet (Tickets #345)."))
 
-    m = mapnik.Map(256, 256)
+    m = mapnik2.Map(256, 256)
 
     eq_(pickle.loads(pickle.dumps(m)), m)
 
-    m = mapnik.Map(256, 256, '+proj=latlong')
+    m = mapnik2.Map(256, 256, '+proj=latlong')
 
     eq_(pickle.loads(pickle.dumps(m)), m)
 
 # Color initialization
+
+ at raises(Exception) # Boost.Python.ArgumentError
+def test_color_init_errors():
+    c = mapnik2.Color()
+
+ at raises(RuntimeError)
+def test_color_init_errors():
+    c = mapnik2.Color('foo') # mapnik config 
+
 def test_color_init():
-    c = mapnik.Color('blue')
+    c = mapnik2.Color('blue')
 
     eq_(c.a, 255)
     eq_(c.r, 0)
@@ -296,7 +433,7 @@ def test_color_init():
 
     eq_(c.to_hex_string(), '#0000ff')
 
-    c = mapnik.Color('#f2eff9')
+    c = mapnik2.Color('#f2eff9')
     
     eq_(c.a, 255)
     eq_(c.r, 242)
@@ -305,7 +442,7 @@ def test_color_init():
 
     eq_(c.to_hex_string(), '#f2eff9')
 
-    c = mapnik.Color('rgb(50%,50%,50%)')
+    c = mapnik2.Color('rgb(50%,50%,50%)')
 
     eq_(c.a, 255)
     eq_(c.r, 128)
@@ -314,7 +451,7 @@ def test_color_init():
 
     eq_(c.to_hex_string(), '#808080')
 
-    c = mapnik.Color(0, 64, 128)
+    c = mapnik2.Color(0, 64, 128)
 
     eq_(c.a, 255)
     eq_(c.r, 0)
@@ -323,21 +460,23 @@ def test_color_init():
 
     eq_(c.to_hex_string(), '#004080')
     
-    c = mapnik.Color(0, 64, 128, 192)
+    c = mapnik2.Color(0, 64, 128, 192)
 
     eq_(c.a, 192)
     eq_(c.r, 0)
     eq_(c.g, 64)
     eq_(c.b, 128)
 
-    eq_(c.to_hex_string(), '#004080')
+    eq_(c.to_hex_string(), '#004080c0')
 
 # Color equality
 def test_color_equality():
-    c1 = mapnik.Color('blue')
-    c2 = mapnik.Color('blue')
-    c3 = mapnik.Color('black')
-
+    
+    c1 = mapnik2.Color('blue')
+    c2 = mapnik2.Color(0,0,255)
+    c3 = mapnik2.Color('black')
+    
+    
     c3.r = 0
     c3.g = 0
     c3.b = 255
@@ -346,10 +485,10 @@ def test_color_equality():
     eq_(c1, c2)
     eq_(c1, c3)
 
-    c1 = mapnik.Color(0, 64, 128)
-    c2 = mapnik.Color(0, 64, 128)
-    c3 = mapnik.Color(0, 0, 0)
-
+    c1 = mapnik2.Color(0, 64, 128)
+    c2 = mapnik2.Color(0, 64, 128)
+    c3 = mapnik2.Color(0, 0, 0)
+    
     c3.r = 0
     c3.g = 64
     c3.b = 128
@@ -357,9 +496,9 @@ def test_color_equality():
     eq_(c1, c2)
     eq_(c1, c3)
 
-    c1 = mapnik.Color(0, 64, 128, 192)
-    c2 = mapnik.Color(0, 64, 128, 192)
-    c3 = mapnik.Color(0, 0, 0, 255)
+    c1 = mapnik2.Color(0, 64, 128, 192)
+    c2 = mapnik2.Color(0, 64, 128, 192)
+    c3 = mapnik2.Color(0, 0, 0, 255)
 
     c3.r = 0
     c3.g = 64
@@ -369,26 +508,35 @@ def test_color_equality():
     eq_(c1, c2)
     eq_(c1, c3)
     
-    c1 = mapnik.Color('rgb(50%,50%,50%)')
-    c2 = mapnik.Color(128, 128, 128, 255)
-    c3 = mapnik.Color('#808080')
-    c4 = mapnik.Color('gray')
-
+    c1 = mapnik2.Color('rgb(50%,50%,50%)')
+    c2 = mapnik2.Color(128, 128, 128, 255)
+    c3 = mapnik2.Color('#808080')
+    c4 = mapnik2.Color('gray')
+    
     eq_(c1, c2)
     eq_(c1, c3)
     eq_(c1, c4)
-
+    
+    c1 = mapnik2.Color('hsl(0, 100%, 50%)')   # red
+    c2 = mapnik2.Color('hsl(120, 100%, 50%)') # lime
+    c3 = mapnik2.Color('hsla(240, 100%, 50%, 0.5)') # semi-transparent solid blue
+    
+    eq_(c1, mapnik2.Color('red'))
+    eq_(c2, mapnik2.Color('lime'))
+    eq_(c3, mapnik2.Color(0,0,255,128))
+    
+    
 # Color pickling
 def test_color_pickle():
-    c = mapnik.Color('blue')
+    c = mapnik2.Color('blue')
 
     eq_(pickle.loads(pickle.dumps(c)), c)
 
-    c = mapnik.Color(0, 64, 128)
+    c = mapnik2.Color(0, 64, 128)
 
     eq_(pickle.loads(pickle.dumps(c)), c)
 
-    c = mapnik.Color(0, 64, 128, 192)
+    c = mapnik2.Color(0, 64, 128, 192)
 
     eq_(pickle.loads(pickle.dumps(c)), c)
 
@@ -397,59 +545,81 @@ def test_rule_init():
     min_scale = 5
     max_scale = 10
     
-    r = mapnik.Rule()
+    r = mapnik2.Rule()
    
     eq_(r.name, '')
     eq_(r.title, '')
     eq_(r.min_scale, 0)
     eq_(r.max_scale, float('inf'))
+    eq_(r.has_else(), False)
+    eq_(r.has_also(), False)
+    
+    r = mapnik2.Rule()
     
-    r = mapnik.Rule("Name")
+    r.set_else(True)
+    eq_(r.has_else(), True)
+    eq_(r.has_also(), False)
+    
+    r = mapnik2.Rule()
+    
+    r.set_also(True)
+    eq_(r.has_else(), False)
+    eq_(r.has_also(), True)
+    
+    r = mapnik2.Rule("Name")
     
     eq_(r.name, 'Name')
     eq_(r.title, '')
     eq_(r.min_scale, 0)
     eq_(r.max_scale, float('inf'))
+    eq_(r.has_else(), False)
+    eq_(r.has_also(), False)
     
-    r = mapnik.Rule("Name", "Title")
+    r = mapnik2.Rule("Name", "Title")
     
     eq_(r.name, 'Name')
     eq_(r.title, 'Title')
     eq_(r.min_scale, 0)
     eq_(r.max_scale, float('inf'))
+    eq_(r.has_else(), False)
+    eq_(r.has_also(), False)
     
-    r = mapnik.Rule("Name", "Title", min_scale)
+    r = mapnik2.Rule("Name", "Title", min_scale)
     
     eq_(r.name, 'Name')
     eq_(r.title, 'Title')
     eq_(r.min_scale, min_scale)
     eq_(r.max_scale, float('inf'))
+    eq_(r.has_else(), False)
+    eq_(r.has_also(), False)
     
-    r = mapnik.Rule("Name", "Title", min_scale, max_scale)
+    r = mapnik2.Rule("Name", "Title", min_scale, max_scale)
     
     eq_(r.name, 'Name')
     eq_(r.title, 'Title')
     eq_(r.min_scale, min_scale)
     eq_(r.max_scale, max_scale)
+    eq_(r.has_else(), False)
+    eq_(r.has_also(), False)
     
 # Coordinate initialization
 def test_coord_init():
-    c = mapnik.Coord(100, 100)
+    c = mapnik2.Coord(100, 100)
 
     eq_(c.x, 100)
     eq_(c.y, 100)
 
 # Coordinate multiplication
 def test_coord_multiplication():
-    c = mapnik.Coord(100, 100)
+    c = mapnik2.Coord(100, 100)
     c *= 2
 
     eq_(c.x, 200)
     eq_(c.y, 200)
 
-# Envelope initialization
+# Box2d initialization
 def test_envelope_init():
-    e = mapnik.Envelope(100, 100, 200, 200)
+    e = mapnik2.Box2d(100, 100, 200, 200)
 
     assert_true(e.contains(100, 100))
     assert_true(e.contains(100, 200))
@@ -471,21 +641,73 @@ def test_envelope_init():
 
     eq_(e.maxx, 200)
     eq_(e.maxy, 200)
+    
+    eq_(e[0],100)
+    eq_(e[1],100)
+    eq_(e[2],200)
+    eq_(e[3],200)
+    eq_(e[0],e[-4])
+    eq_(e[1],e[-3])
+    eq_(e[2],e[-2])
+    eq_(e[3],e[-1])
+    
+    c = e.center()
+
+    eq_(c.x, 150)
+    eq_(c.y, 150)
+
+# Box2d static initialization
+def test_envelope_static_init():
+    e = mapnik2.Box2d.from_string('100 100 200 200')
+    e2 = mapnik2.Box2d.from_string('100,100,200,200')
+    e3 = mapnik2.Box2d.from_string('100 , 100 , 200 , 200')
+    eq_(e,e2)
+    eq_(e,e3)
+
+    assert_true(e.contains(100, 100))
+    assert_true(e.contains(100, 200))
+    assert_true(e.contains(200, 200))
+    assert_true(e.contains(200, 100))
+
+    assert_true(e.contains(e.center()))
+    
+    assert_false(e.contains(99.9, 99.9))
+    assert_false(e.contains(99.9, 200.1))
+    assert_false(e.contains(200.1, 200.1))
+    assert_false(e.contains(200.1, 99.9))
+
+    eq_(e.width(), 100)
+    eq_(e.height(), 100)
+
+    eq_(e.minx, 100)
+    eq_(e.miny, 100)
 
+    eq_(e.maxx, 200)
+    eq_(e.maxy, 200)
+    
+    eq_(e[0],100)
+    eq_(e[1],100)
+    eq_(e[2],200)
+    eq_(e[3],200)
+    eq_(e[0],e[-4])
+    eq_(e[1],e[-3])
+    eq_(e[2],e[-2])
+    eq_(e[3],e[-1])
+    
     c = e.center()
 
     eq_(c.x, 150)
     eq_(c.y, 150)
 
-# Envelope pickling
+# Box2d pickling
 def test_envelope_pickle():
-    e = mapnik.Envelope(100, 100, 200, 200)
+    e = mapnik2.Box2d(100, 100, 200, 200)
 
     eq_(pickle.loads(pickle.dumps(e)), e)
 
-# Envelope multiplication
+# Box2d multiplication
 def test_envelope_multiplication():
-    e = mapnik.Envelope(100, 100, 200, 200)
+    e = mapnik2.Box2d(100, 100, 200, 200)
     e *= 2
     
     assert_true(e.contains(50, 50))
@@ -513,3 +735,27 @@ def test_envelope_multiplication():
 
     eq_(c.x, 150)
     eq_(c.y, 150)
+
+# Box2d clipping
+def test_envelope_pickle():
+    e1 = mapnik2.Box2d(-180,-90,180,90)
+    e2 = mapnik2.Box2d(-120,40,-110,48)
+    e1.clip(e2)
+    eq_(e1,e2)
+    
+    # madagascar in merc
+    e1 = mapnik2.Box2d(4772116.5490, -2744395.0631, 5765186.4203, -1609458.0673)
+    e2 = mapnik2.Box2d(5124338.3753, -2240522.1727, 5207501.8621, -2130452.8520)
+    e1.clip(e2)
+    eq_(e1,e2)
+    
+    # nz in lon/lat
+    e1 = mapnik2.Box2d(163.8062, -47.1897, 179.3628, -33.9069)
+    e2 = mapnik2.Box2d(173.7378, -39.6395, 174.4849, -38.9252)
+    e1.clip(e2)
+    eq_(e1,e2)
+
+if __name__ == "__main__":
+    setup()
+    [eval(run)() for run in dir() if 'test_' in run]
+
diff --git a/tests/python_tests/projection_test.py b/tests/python_tests/projection_test.py
index 5b9c648..c2e7c82 100644
--- a/tests/python_tests/projection_test.py
+++ b/tests/python_tests/projection_test.py
@@ -2,16 +2,22 @@
 
 from nose.tools import *
 
-import mapnik, pickle
+import mapnik2, pickle
 
 # Tests that exercise map projections.
 
+def test_normalizing_definition():
+    p = mapnik2.Projection('+init=epsg:4326')
+    expanded = p.expanded()
+    eq_('+proj=longlat' in expanded,True)
+
+
 # Trac Ticket #128
 def test_wgs84_inverse_forward():
-    p = mapnik.Projection('+init=epsg:4326')
+    p = mapnik2.Projection('+init=epsg:4326')
 
-    c = mapnik.Coord(3.01331418311, 43.3333092669)
-    e = mapnik.Envelope(-122.54345245, 45.12312553, 68.2335581353, 48.231231233)
+    c = mapnik2.Coord(3.01331418311, 43.3333092669)
+    e = mapnik2.Box2d(-122.54345245, 45.12312553, 68.2335581353, 48.231231233)
 
     # It appears that the y component changes very slightly, is this OK?
     # so we test for 'almost equal float values'
@@ -38,4 +44,7 @@ def test_wgs84_inverse_forward():
     assert_almost_equal(e.inverse(p).center().x, e.center().x)
 
     assert_almost_equal(e.forward(p).center().y, e.center().y)
-    assert_almost_equal(e.forward(p).center().x, e.center().x)
\ No newline at end of file
+    assert_almost_equal(e.forward(p).center().x, e.center().x)
+
+if __name__ == "__main__":
+    [eval(run)() for run in dir() if 'test_' in run]
diff --git a/tests/python_tests/raster_colorizer_test.py b/tests/python_tests/raster_colorizer_test.py
new file mode 100644
index 0000000..3e65a2d
--- /dev/null
+++ b/tests/python_tests/raster_colorizer_test.py
@@ -0,0 +1,109 @@
+#coding=utf8
+import os
+import mapnik2
+from utilities import execution_path
+from nose.tools import *
+
+def setup():
+    # All of the paths used are relative, if we run the tests
+    # from another directory we need to chdir()
+    os.chdir(execution_path('.'))
+
+def test_gen_map():
+    mapxmlfile = '../data/good_maps/raster_colorizer.xml'
+    mapxmloutputfile = 'raster_colorizer_test_save.xml'
+    outputfile = 'raster_colorizer_test.png'
+
+    m = mapnik2.Map(800, 600)
+    mapnik2.load_map(m, mapxmlfile)
+    mapnik2.save_map(m, mapxmloutputfile)
+    m.zoom_all()
+    mapnik2.render_to_file(m, outputfile)
+
+#test discrete colorizer mode
+def test_get_color_discrete():
+    #setup
+    colorizer = mapnik2.RasterColorizer();
+    colorizer.default_color = mapnik2.Color(0,0,0,0);
+    colorizer.default_mode = mapnik2.COLORIZER_DISCRETE;
+
+    colorizer.add_stop(10, mapnik2.Color(100,100,100,100));
+    colorizer.add_stop(20, mapnik2.Color(200,200,200,200));
+
+
+
+    #should be default colour
+    eq_(colorizer.get_color(-50), mapnik2.Color(0,0,0,0));
+    eq_(colorizer.get_color(0), mapnik2.Color(0,0,0,0));
+    
+    #now in stop 1
+    eq_(colorizer.get_color(10), mapnik2.Color(100,100,100,100));
+    eq_(colorizer.get_color(19), mapnik2.Color(100,100,100,100));
+    
+    #now in stop 2
+    eq_(colorizer.get_color(20), mapnik2.Color(200,200,200,200));
+    eq_(colorizer.get_color(1000), mapnik2.Color(200,200,200,200));
+
+#test exact colorizer mode
+def test_get_color_exact():
+    #setup
+    colorizer = mapnik2.RasterColorizer();
+    colorizer.default_color = mapnik2.Color(0,0,0,0);
+    colorizer.default_mode = mapnik2.COLORIZER_EXACT;
+
+    colorizer.add_stop(10, mapnik2.Color(100,100,100,100));
+    colorizer.add_stop(20, mapnik2.Color(200,200,200,200));
+
+    #should be default colour
+    eq_(colorizer.get_color(-50), mapnik2.Color(0,0,0,0));
+    eq_(colorizer.get_color(11), mapnik2.Color(0,0,0,0));
+    eq_(colorizer.get_color(20.001), mapnik2.Color(0,0,0,0));
+    
+    #should be stop 1
+    eq_(colorizer.get_color(10), mapnik2.Color(100,100,100,100));
+    
+    #should be stop 2
+    eq_(colorizer.get_color(20), mapnik2.Color(200,200,200,200));
+    
+    
+
+
+#test linear colorizer mode
+def test_get_color_linear():
+    #setup
+    colorizer = mapnik2.RasterColorizer();
+    colorizer.default_color = mapnik2.Color(0,0,0,0);
+    colorizer.default_mode = mapnik2.COLORIZER_LINEAR;
+
+    colorizer.add_stop(10, mapnik2.Color(100,100,100,100));
+    colorizer.add_stop(20, mapnik2.Color(200,200,200,200));
+
+    #should be default colour
+    eq_(colorizer.get_color(-50), mapnik2.Color(0,0,0,0));
+    eq_(colorizer.get_color(9.9), mapnik2.Color(0,0,0,0));
+    
+    #should be stop 1
+    eq_(colorizer.get_color(10), mapnik2.Color(100,100,100,100));
+    
+    #should be stop 2
+    eq_(colorizer.get_color(20), mapnik2.Color(200,200,200,200));
+
+    #half way between stops 1 and 2
+    eq_(colorizer.get_color(15), mapnik2.Color(150,150,150,150));
+
+    #after stop 2
+    eq_(colorizer.get_color(100), mapnik2.Color(200,200,200,200));
+
+
+def test_stop_label():
+    stop = mapnik2.ColorizerStop(1, mapnik2.COLORIZER_LINEAR, mapnik2.Color('red'))
+    assert not stop.label
+    label = u"32º C".encode('utf8')
+    stop.label = label
+    assert stop.label == label, stop.label
+
+if __name__ == "__main__":
+    setup()
+    [eval(run)() for run in dir() if 'test_' in run]
+
+
diff --git a/tests/python_tests/raster_symbolizer_test.py b/tests/python_tests/raster_symbolizer_test.py
new file mode 100644
index 0000000..2282192
--- /dev/null
+++ b/tests/python_tests/raster_symbolizer_test.py
@@ -0,0 +1,194 @@
+#!/usr/bin/env python
+
+from nose.tools import *
+from utilities import execution_path, save_data, contains_word
+
+import os, mapnik2
+
+def setup():
+    # All of the paths used are relative, if we run the tests
+    # from another directory we need to chdir()
+    os.chdir(execution_path('.'))
+    
+
+def test_dataraster_coloring():
+    srs = '+init=epsg:32630'
+    lyr = mapnik2.Layer('dataraster')
+    lyr.datasource = mapnik2.Gdal(
+        file = '../data/raster/dataraster.tif',
+        band = 1,
+        )
+    lyr.srs = srs
+    _map = mapnik2.Map(256,256, srs)
+    style = mapnik2.Style()
+    rule = mapnik2.Rule()
+    sym = mapnik2.RasterSymbolizer()
+    # Assigning a colorizer to the RasterSymbolizer tells the later
+    # that it should use it to colorize the raw data raster
+    sym.colorizer = mapnik2.RasterColorizer(mapnik2.COLORIZER_DISCRETE, mapnik2.Color("transparent"))
+    
+    for value, color in [
+        (  0, "#0044cc"),
+        ( 10, "#00cc00"),
+        ( 20, "#ffff00"),
+        ( 30, "#ff7f00"),
+        ( 40, "#ff0000"),
+        ( 50, "#ff007f"),
+        ( 60, "#ff00ff"),
+        ( 70, "#cc00cc"),
+        ( 80, "#990099"),
+        ( 90, "#660066"),
+        ( 200, "transparent"),
+    ]:
+        sym.colorizer.add_stop(value, mapnik2.Color(color))
+    rule.symbols.append(sym)
+    style.rules.append(rule)
+    _map.append_style('foo', style)
+    lyr.styles.append('foo')
+    _map.layers.append(lyr)
+    _map.zoom_to_box(lyr.envelope())
+
+    im = mapnik2.Image(_map.width,_map.height)
+    mapnik2.render(_map, im)
+    # save a png somewhere so we can see it
+    save_data('test_dataraster_coloring.png', im.tostring('png'))
+    imdata = im.tostring()
+    # we have some values in the [20,30) interval so check that they're colored
+    assert contains_word('\xff\xff\x00\xff', imdata)
+
+def test_dataraster_query_point():
+    srs = '+init=epsg:32630'
+    lyr = mapnik2.Layer('dataraster')
+    lyr.datasource = mapnik2.Gdal(
+        file = '../data/raster/dataraster.tif',
+        band = 1,
+        )
+    lyr.srs = srs
+    _map = mapnik2.Map(256,256, srs)
+    _map.layers.append(lyr)
+
+    # point inside raster extent with valid data
+    x, y = 427417, 4477517
+    features = _map.query_point(0,x,y).features
+    assert len(features) == 1
+    feat = features[0]
+    center = feat.envelope().center()
+    assert center.x==x and center.y==y, center
+    value = feat['value']
+    assert value == 21.0, value
+
+    # point outside raster extent
+    features = _map.query_point(0,-427417,4477517).features
+    assert len(features) == 0
+
+    # point inside raster extent with nodata
+    features = _map.query_point(0,126850,4596050).features
+    assert len(features) == 0
+
+def test_load_save_map():
+    map = mapnik2.Map(256,256)
+    in_map = "../data/good_maps/raster_symbolizer.xml"
+    mapnik2.load_map(map, in_map)
+
+    out_map = mapnik2.save_map_to_string(map)
+    assert 'RasterSymbolizer' in out_map
+    assert 'RasterColorizer' in out_map
+    assert 'stop' in out_map
+
+def test_raster_with_alpha_blends_correctly_with_background():
+    WIDTH = 500
+    HEIGHT = 500
+
+    map = mapnik2.Map(WIDTH, HEIGHT)
+    WHITE = mapnik2.Color(255, 255, 255)
+    map.background = WHITE
+
+    style = mapnik2.Style()
+    rule = mapnik2.Rule()
+    symbolizer = mapnik2.RasterSymbolizer()
+    #XXX: This fixes it, see http://trac.mapnik.org/ticket/759#comment:3
+    #     (and remove comment when this test passes)
+    #symbolizer.scaling="bilinear_old"
+
+    rule.symbols.append(symbolizer)
+    style.rules.append(rule)
+
+    map.append_style('raster_style', style)
+
+    map_layer = mapnik2.Layer('test_layer')
+    filepath = '../data/raster/white-alpha.png'
+    map_layer.datasource = mapnik2.Gdal(file=filepath)
+    map_layer.styles.append('raster_style')
+    map.layers.append(map_layer)
+
+    map.zoom_all()
+
+    mim = mapnik2.Image(WIDTH, HEIGHT)
+
+    mapnik2.render(map, mim)
+    save_data('test_raster_with_alpha_blends_correctly_with_background.png',
+              mim.tostring('png'))
+    imdata = mim.tostring()
+    # All white is expected
+    assert contains_word('\xff\xff\xff\xff', imdata)
+
+def test_raster_warping():
+    lyrSrs = "+init=epsg:32630"
+    mapSrs = '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
+    lyr = mapnik2.Layer('dataraster', lyrSrs)
+    lyr.datasource = mapnik2.Gdal(
+        file = '../data/raster/dataraster.tif',
+        band = 1,
+        )
+    sym = mapnik2.RasterSymbolizer()
+    sym.colorizer = mapnik2.RasterColorizer(mapnik2.COLORIZER_DISCRETE, mapnik2.Color(255,255,0))
+    rule = mapnik2.Rule()
+    rule.symbols.append(sym)
+    style = mapnik2.Style()
+    style.rules.append(rule)
+    _map = mapnik2.Map(256,256, mapSrs)
+    _map.append_style('foo', style)
+    lyr.styles.append('foo')
+    _map.layers.append(lyr)
+    prj_trans = mapnik2.ProjTransform(mapnik2.Projection(mapSrs),
+                                      mapnik2.Projection(lyrSrs)) 
+    _map.zoom_to_box(prj_trans.backward(lyr.envelope()))
+
+    im = mapnik2.Image(_map.width,_map.height)
+    mapnik2.render(_map, im)
+    # save a png somewhere so we can see it
+    save_data('test_raster_warping.png', im.tostring('png'))
+    imdata = im.tostring()
+    assert contains_word('\xff\xff\x00\xff', imdata)
+
+def test_raster_warping_does_not_overclip_source():
+    lyrSrs = "+init=epsg:32630"
+    mapSrs = '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
+    lyr = mapnik2.Layer('dataraster', lyrSrs)
+    lyr.datasource = mapnik2.Gdal(
+        file = '../data/raster/dataraster.tif',
+        band = 1,
+        )
+    sym = mapnik2.RasterSymbolizer()
+    sym.colorizer = mapnik2.RasterColorizer(mapnik2.COLORIZER_DISCRETE, mapnik2.Color(255,255,0))
+    rule = mapnik2.Rule()
+    rule.symbols.append(sym)
+    style = mapnik2.Style()
+    style.rules.append(rule)
+    _map = mapnik2.Map(256,256, mapSrs)
+    _map.background=mapnik2.Color('white')
+    _map.append_style('foo', style)
+    lyr.styles.append('foo')
+    _map.layers.append(lyr)
+    _map.zoom_to_box(mapnik2.Box2d(3,42,4,43))
+
+    im = mapnik2.Image(_map.width,_map.height)
+    mapnik2.render(_map, im)
+    # save a png somewhere so we can see it
+    save_data('test_raster_warping_does_not_overclip_source.png',
+              im.tostring('png'))
+    assert im.view(0,200,1,1).tostring()=='\xff\xff\x00\xff'
+    
+if __name__ == "__main__":
+    setup()
+    [eval(run)() for run in dir() if 'test_' in run]
diff --git a/tests/python_tests/render_grid_test.py b/tests/python_tests/render_grid_test.py
new file mode 100644
index 0000000..12a29a0
--- /dev/null
+++ b/tests/python_tests/render_grid_test.py
@@ -0,0 +1,146 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from nose.tools import *
+
+import os, mapnik2
+from utilities import Todo
+import json
+
+
+grid_correct = {"keys": ["", "North West", "North East", "South West", "South East"], "data": {"South East": {"Name": "South East"}, "North East": {"Name": "North East"}, "North West": {"Name": "North West"}, "South West": {"Name": "South West"}}, "grid": ["                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "         !!!                                 ###                ", "        !!!!!                               #####               ", "        !!!!!                               #####               ", "         !!!                                 ###                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "        $$$$                                %%%%                ", "        $$$$$                               %%%%%               ", "        $$$$$                               %%%%%               ", "         $$$                                 %%%                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                "]}
+
+
+grid_correct_new = {"keys": ["", "North West", "North East", "South West", "South East"], "data": {"South East": {"Name": "South East"}, "North East": {"Name": "North East"}, "North West": {"Name": "North West"}, "South West": {"Name": "South West"}}, "grid": ["                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "          !!                                  ##                ", "         !!!                                 ###                ", "          !!                                  ##                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "         $$$                                  %%                ", "         $$$                                 %%%                ", "          $$                                  %%                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                "]}
+
+def resolve(grid,x,y):
+    """ Resolve the attributes for a given pixel in a grid.
+    
+    js version: 
+      https://github.com/mapbox/mbtiles-spec/blob/master/1.1/utfgrid.md
+    spec:
+      https://github.com/mapbox/wax/blob/master/control/lib/gridutil.js
+    
+    """
+    utf_val = grid['grid'][x][y]
+    #http://docs.python.org/library/functions.html#ord
+    codepoint = ord(utf_val)
+    if (codepoint >= 93):
+        codepoint-=1
+    if (codepoint >= 35):
+        codepoint-=1
+    codepoint -= 32
+    key = grid['keys'][codepoint]
+    return grid['data'].get(key)
+
+
+def create_grid_map(width,height):
+    places_ds = mapnik2.PointDatasource()
+    places_ds.add_point(143.10,-38.60,'Name','South East')
+    places_ds.add_point(142.48,-38.60,'Name','South West')
+    places_ds.add_point(142.48,-38.38,'Name','North West')
+    places_ds.add_point(143.10,-38.38,'Name','North East')
+    s = mapnik2.Style()
+    r = mapnik2.Rule()
+    #symb = mapnik2.PointSymbolizer()
+    symb = mapnik2.MarkersSymbolizer()
+    symb.allow_overlap = True
+    r.symbols.append(symb)
+    label = mapnik2.TextSymbolizer(mapnik2.Expression('[Name]'),
+                'DejaVu Sans Book',
+                10,
+                mapnik2.Color('black')
+                )
+    label.allow_overlap = True
+    label.displacement = (0,-10)
+    #r.symbols.append(label)
+
+    s.rules.append(r)
+    lyr = mapnik2.Layer('Places')
+    lyr.datasource = places_ds
+    lyr.styles.append('places_labels')
+    m = mapnik2.Map(width,height)
+    m.append_style('places_labels',s)
+    m.layers.append(lyr)
+    return m
+    
+def test_render_grid():
+    """ test old method """
+    width,height = 256,256
+    m = create_grid_map(width,height)
+    ul_lonlat = mapnik2.Coord(142.30,-38.20)
+    lr_lonlat = mapnik2.Coord(143.40,-38.80)
+    m.zoom_to_box(mapnik2.Box2d(ul_lonlat,lr_lonlat))
+    grid = mapnik2.render_grid(m,0,key='Name',resolution=4,fields=['Name'])
+    eq_(grid,grid_correct)
+    eq_(resolve(grid,0,0),None)
+    
+    # check every pixel of the nw symbol
+    expected = {"Name": "North West"}
+    
+    # top row
+    eq_(resolve(grid,23,9),expected)
+    eq_(resolve(grid,23,10),expected)
+    eq_(resolve(grid,23,11),expected)
+
+    # core
+    eq_(resolve(grid,24,8),expected)
+    eq_(resolve(grid,24,9),expected)
+    eq_(resolve(grid,24,10),expected)
+    eq_(resolve(grid,24,11),expected)
+    eq_(resolve(grid,24,12),expected)
+    eq_(resolve(grid,25,8),expected)
+    eq_(resolve(grid,25,9),expected)
+    eq_(resolve(grid,25,10),expected)
+    eq_(resolve(grid,25,11),expected)
+    eq_(resolve(grid,25,12),expected)
+    
+    # bottom row
+    eq_(resolve(grid,26,9),expected)
+    eq_(resolve(grid,26,10),expected)
+    eq_(resolve(grid,26,11),expected)
+
+def test_render_grid2():
+    """ test old against new"""
+    width,height = 256,256
+    m = create_grid_map(width,height)
+    ul_lonlat = mapnik2.Coord(142.30,-38.20)
+    lr_lonlat = mapnik2.Coord(143.40,-38.80)
+    m.zoom_to_box(mapnik2.Box2d(ul_lonlat,lr_lonlat))
+
+    # new method
+    grid = mapnik2.Grid(m.width,m.height,key='Name')
+    mapnik2.render_layer(m,grid,layer=0,fields=['Name'])
+    utf1 = grid.encode('utf',resolution=4)
+    eq_(utf1,grid_correct_new)
+
+    # old method - to be removed
+    utf2 = mapnik2.render_grid(m,0,key='Name',resolution=4,fields=['Name'])
+    eq_(utf2,grid_correct)
+
+    # for complex polygons these will not be true
+    eq_(len(utf2['grid']),len(utf1['grid']))
+    eq_(len(utf2['keys']),len(utf1['keys']))
+    eq_(len(utf2['data']),len(utf1['data']))
+    
+    # check a full view is the same as a full image
+    grid_view = grid.view(0,0,width,height)
+    # for kicks check at full res too
+    utf3 = grid.encode('utf',resolution=1)
+    utf4 = grid_view.encode('utf',resolution=1)
+    eq_(utf3['grid'],utf4['grid'])
+    eq_(utf3['keys'],utf4['keys'])
+    eq_(utf3['data'],utf4['data'])
+    
+    eq_(resolve(utf4,0,0),None)
+    
+    # resolve some center points in the
+    # resampled view
+    utf5 = grid_view.encode('utf',resolution=4)
+    eq_(resolve(utf5,25,10),{"Name": "North West"})
+    eq_(resolve(utf5,25,46),{"Name": "North East"})
+    eq_(resolve(utf5,38,10),{"Name": "South West"})
+    eq_(resolve(utf5,38,46),{"Name": "South East"})
+    
+if __name__ == "__main__":
+    [eval(run)() for run in dir() if 'test_' in run]
diff --git a/tests/python_tests/render_test.py b/tests/python_tests/render_test.py
index b272e72..2724e14 100644
--- a/tests/python_tests/render_test.py
+++ b/tests/python_tests/render_test.py
@@ -1,24 +1,34 @@
 #!/usr/bin/env python
+# -*- coding: utf-8 -*-
 
 from nose.tools import *
 
-import os, mapnik
+import os, mapnik2
+from nose.tools import *
+
+from utilities import execution_path
 from utilities import Todo
 
+def setup():
+    # All of the paths used are relative, if we run the tests
+    # from another directory we need to chdir()
+    os.chdir(execution_path('.'))
+
+
 def test_simplest_render():
-    m = mapnik.Map(256, 256)
-    i = mapnik.Image(m.width, m.height)
+    m = mapnik2.Map(256, 256)
+    i = mapnik2.Image(m.width, m.height)
 
-    mapnik.render(m, i)
+    mapnik2.render(m, i)
 
     s = i.tostring()
 
     eq_(s, 256 * 256 * '\x00\x00\x00\x00')
 
 def test_render_image_to_string():
-    i = mapnik.Image(256, 256)
+    i = mapnik2.Image(256, 256)
     
-    i.background = mapnik.Color('black')
+    i.background = mapnik2.Color('black')
     
     s = i.tostring()
 
@@ -26,12 +36,27 @@ def test_render_image_to_string():
 
     s = i.tostring('png')
 
+def test_setting_alpha():
+    w,h = 256,256
+    im1 = mapnik2.Image(w,h)
+    # white, half transparent
+    im1.background = mapnik2.Color('rgba(255,255,255,.5)')
+    
+    # pure white
+    im2 = mapnik2.Image(w,h)
+    im2.background = mapnik2.Color('rgba(255,255,255,1)')
+    im2.set_alpha(.5)
+        
+    eq_(len(im1.tostring()), len(im2.tostring()))
+
+
 def test_render_image_to_file():
-    i = mapnik.Image(256, 256)
+    i = mapnik2.Image(256, 256)
     
-    i.background = mapnik.Color('black')
+    i.background = mapnik2.Color('black')
 
-    i.save('test.jpg')
+    if mapnik2.has_jpeg():
+        i.save('test.jpg')
     i.save('test.png', 'png')
 
     if os.path.exists('test.jpg'):
@@ -46,17 +71,17 @@ def test_render_image_to_file():
 
 def get_paired_images(w,h,mapfile):
     tmp_map = 'tmp_map.xml'
-    m = mapnik.Map(w,h)
-    mapnik.load_map(m,mapfile)
-    i = mapnik.Image(w,h)
+    m = mapnik2.Map(w,h)
+    mapnik2.load_map(m,mapfile)
+    i = mapnik2.Image(w,h)
     m.zoom_all()
-    mapnik.render(m,i)
-    mapnik.save_map(m,tmp_map)
-    m2 = mapnik.Map(w,h)
-    mapnik.load_map(m2,tmp_map)
-    i2 = mapnik.Image(w,h)
+    mapnik2.render(m,i)
+    mapnik2.save_map(m,tmp_map)
+    m2 = mapnik2.Map(w,h)
+    mapnik2.load_map(m2,tmp_map)
+    i2 = mapnik2.Image(w,h)
     m2.zoom_all()
-    mapnik.render(m2,i2)
+    mapnik2.render(m2,i2)
     os.remove(tmp_map)
     return i,i2    
 
@@ -67,53 +92,133 @@ def test_render_from_serialization():
     i,i2 = get_paired_images(100,100,'../data/good_maps/polygon_symbolizer.xml')
     eq_(i.tostring(),i2.tostring())
 
+
+grid_correct = {"keys": ["", "North West", "North East", "South West", "South East"], "data": {"South East": {"Name": "South East"}, "North East": {"Name": "North East"}, "North West": {"Name": "North West"}, "South West": {"Name": "South West"}}, "grid": ["                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "         !!!                                 ###                ", "        !!!!!                               #####               ", "        !!!!!                               #####               ", "         !!!                                 ###                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "        $$$$                                %%%%                ", "        $$$$$                               %%%%%               ", "        $$$$$                               %%%%%               ", "         $$$                                 %%%                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                ", "                                                                "]}
+
+
+def resolve(grid,x,y):
+    """ Resolve the attributes for a given pixel in a grid.
+    
+    js version: 
+      https://github.com/mapbox/mbtiles-spec/blob/master/1.1/utfgrid.md
+    spec:
+      https://github.com/mapbox/wax/blob/master/control/lib/gridutil.js
+    
+    """
+    utf_val = grid['grid'][x][y]
+    #http://docs.python.org/library/functions.html#ord
+    codepoint = ord(utf_val)
+    if (codepoint >= 93):
+        codepoint-=1
+    if (codepoint >= 35):
+        codepoint-=1
+    codepoint -= 32
+    key = grid['keys'][codepoint]
+    return grid['data'].get(key)
+
+
+def test_render_grid():
+    places_ds = mapnik2.PointDatasource()
+    places_ds.add_point(143.10,-38.60,'Name','South East')
+    places_ds.add_point(142.48,-38.60,'Name','South West')
+    places_ds.add_point(142.48,-38.38,'Name','North West')
+    places_ds.add_point(143.10,-38.38,'Name','North East')
+    s = mapnik2.Style()
+    r = mapnik2.Rule()
+    #symb = mapnik2.PointSymbolizer()
+    symb = mapnik2.MarkersSymbolizer()
+    symb.allow_overlap = True
+    r.symbols.append(symb)
+    label = mapnik2.TextSymbolizer(mapnik2.Expression('[Name]'),
+                'DejaVu Sans Book',
+                10,
+                mapnik2.Color('black')
+                )
+    label.allow_overlap = True
+    label.displacement = (0,-10)
+    #r.symbols.append(label)
+
+    s.rules.append(r)
+    lyr = mapnik2.Layer('Places')
+    lyr.datasource = places_ds
+    lyr.styles.append('places_labels')
+    m = mapnik2.Map(256,256)
+    m.append_style('places_labels',s)
+    m.layers.append(lyr)
+    ul_lonlat = mapnik2.Coord(142.30,-38.20)
+    lr_lonlat = mapnik2.Coord(143.40,-38.80)
+    m.zoom_to_box(mapnik2.Box2d(ul_lonlat,lr_lonlat))
+    grid = mapnik2.render_grid(m,0,key='Name',resolution=4,fields=['Name'])
+    eq_(grid,grid_correct)
+    eq_(resolve(grid,0,0),None)
+    
+    # check every pixel of the nw symbol
+    expected = {"Name": "North West"}
+    
+    # top row
+    eq_(resolve(grid,23,9),expected)
+    eq_(resolve(grid,23,10),expected)
+    eq_(resolve(grid,23,11),expected)
+
+    # core
+    eq_(resolve(grid,24,8),expected)
+    eq_(resolve(grid,24,9),expected)
+    eq_(resolve(grid,24,10),expected)
+    eq_(resolve(grid,24,11),expected)
+    eq_(resolve(grid,24,12),expected)
+    eq_(resolve(grid,25,8),expected)
+    eq_(resolve(grid,25,9),expected)
+    eq_(resolve(grid,25,10),expected)
+    eq_(resolve(grid,25,11),expected)
+    eq_(resolve(grid,25,12),expected)
+    
+    # bottom row
+    eq_(resolve(grid,26,9),expected)
+    eq_(resolve(grid,26,10),expected)
+    eq_(resolve(grid,26,11),expected)
+    
 def test_render_points():
-	# Test for effectivenes of ticket #402 (borderline points get lost on reprojection)
-	raise Todo("See: http://trac.mapnik.org/ticket/402")
-	
-	if not mapnik.has_pycairo(): return
-
-	# create and populate point datasource (WGS84 lat-lon coordinates)
-	places_ds = mapnik.PointDatasource()
-	places_ds.add_point(142.48,-38.38,'Name','Westernmost Point') # westernmost
-	places_ds.add_point(143.10,-38.60,'Name','Southernmost Point') # southernmost
-	# create layer/rule/style
-	s = mapnik.Style()
-	r = mapnik.Rule()
-	symb = mapnik.PointSymbolizer()
-	symb.allow_overlap = True
-	r.symbols.append(symb)
-	s.rules.append(r)
-	lyr = mapnik.Layer('Places','+proj=latlon +datum=WGS84')
-	lyr.datasource = places_ds
-	lyr.styles.append('places_labels')
-	# latlon bounding box corners
-	ul_lonlat = mapnik.Coord(142.30,-38.20)
-	lr_lonlat = mapnik.Coord(143.40,-38.80)
-	# render for different projections 
-	projs = { 
-		'latlon': '+proj=latlon +datum=WGS84',
-		'merc': '+proj=merc +datum=WGS84 +k=1.0 +units=m +over +no_defs',
-		'google': '+proj=merc +ellps=sphere +R=6378137 +a=6378137 +units=m',
-		'utm': '+proj=utm +zone=54 +datum=WGS84'
-		}
-	from cairo import SVGSurface
-	for projdescr in projs.iterkeys():
-		m = mapnik.Map(1000, 500, projs[projdescr])
-		m.append_style('places_labels',s)
-		m.layers.append(lyr)
-		p = mapnik.Projection(projs[projdescr])
-		m.zoom_to_box(p.forward(mapnik.Envelope(ul_lonlat,lr_lonlat)))
-		# Render to SVG so that it can be checked how many points are there with string comparison
-		import StringIO
-		svg_memory_file = StringIO.StringIO()
-		surface = SVGSurface(svg_memory_file, m.width, m.height)
-		mapnik.render(m, surface)
-		surface.flush()
-		surface.finish()
-		svg = svg_memory_file.getvalue()
-		svg_memory_file.close()
-		num_points_present = len(places_ds.all_features())
-		num_points_rendered = svg.count('<image ')
-		eq_(num_points_present, num_points_rendered, "Not all points were rendered (%d instead of %d) at projection %s" % (num_points_rendered, num_points_present, projdescr)) 
 
+    if not mapnik2.has_cairo(): return
+
+    # create and populate point datasource (WGS84 lat-lon coordinates)
+    places_ds = mapnik2.PointDatasource()
+    places_ds.add_point(142.48,-38.38,'Name','Westernmost Point') # westernmost
+    places_ds.add_point(143.10,-38.60,'Name','Southernmost Point') # southernmost
+    # create layer/rule/style
+    s = mapnik2.Style()
+    r = mapnik2.Rule()
+    symb = mapnik2.PointSymbolizer()
+    symb.allow_overlap = True
+    r.symbols.append(symb)
+    s.rules.append(r)
+    lyr = mapnik2.Layer('Places','+proj=latlon +datum=WGS84')
+    lyr.datasource = places_ds
+    lyr.styles.append('places_labels')
+    # latlon bounding box corners
+    ul_lonlat = mapnik2.Coord(142.30,-38.20)
+    lr_lonlat = mapnik2.Coord(143.40,-38.80)
+    # render for different projections 
+    projs = { 
+        'latlon': '+proj=latlon +datum=WGS84',
+        'merc': '+proj=merc +datum=WGS84 +k=1.0 +units=m +over +no_defs',
+        'google': '+proj=merc +ellps=sphere +R=6378137 +a=6378137 +units=m',
+        'utm': '+proj=utm +zone=54 +datum=WGS84'
+        }
+    for projdescr in projs.iterkeys():
+        m = mapnik2.Map(1000, 500, projs[projdescr])
+        m.append_style('places_labels',s)
+        m.layers.append(lyr)
+        p = mapnik2.Projection(projs[projdescr])
+        m.zoom_to_box(p.forward(mapnik2.Box2d(ul_lonlat,lr_lonlat)))
+        # Render to SVG so that it can be checked how many points are there with string comparison
+        svg_file = '/tmp/%s.svg'
+        mapnik2.render_to_file(m, svg_file)
+        num_points_present = len(places_ds.all_features())
+        svg = open(svg_file,'r').read()
+        num_points_rendered = svg.count('<image ')
+        eq_(num_points_present, num_points_rendered, "Not all points were rendered (%d instead of %d) at projection %s" % (num_points_rendered, num_points_present, projdescr)) 
+
+if __name__ == "__main__":
+    setup()
+    [eval(run)() for run in dir() if 'test_' in run]
diff --git a/tests/python_tests/save_map_test.py b/tests/python_tests/save_map_test.py
index 4470127..2c42228 100644
--- a/tests/python_tests/save_map_test.py
+++ b/tests/python_tests/save_map_test.py
@@ -1,9 +1,11 @@
 #!/usr/bin/env python
 
 from nose.tools import *
+from utilities import Todo
 from utilities import execution_path
+import tempfile
 
-import os, sys, glob, mapnik
+import os, sys, glob, mapnik2
 
 def setup():
     # All of the paths used are relative, if we run the tests
@@ -16,21 +18,44 @@ def test():
     # 2. Save map as XML
     # 3. Load map to a second object
     # 4. Compare both map objects
-    map = mapnik.Map(256, 256)
-    in_map = "../data/good_maps/osm-styles.xml"
-
-    mapnik.load_map(map, in_map)
-    test_map = "test_map.xml"
-
-    mapnik.save_map(map, test_map)
-    new_map = mapnik.Map(256, 256)
-
-    mapnik.load_map(new_map, test_map)
-
-    eq_(open(test_map).read(),mapnik.save_map_to_string(new_map))
-
-    if os.path.exists(test_map):
-        os.remove(test_map)
-    else:
-        # Fail, the map wasn't written
-        return False
+    map = mapnik2.Map(256, 256)
+
+    raise Todo("map comparison is currently broken due to lacking relative paths support (#324,#340")
+
+    def compare_map(in_map):
+        
+        mapnik2.load_map(map, in_map)
+
+        (handle, test_map) = tempfile.mkstemp(suffix='.xml', prefix='mapnik-temp-map1-')
+        os.close(handle)
+
+        (handle, test_map2) = tempfile.mkstemp(suffix='.xml', prefix='mapnik-temp-map2-')
+        os.close(handle)
+
+        if os.path.exists(test_map):
+            os.remove(test_map)
+    
+        mapnik2.save_map(map, test_map)
+        new_map = mapnik2.Map(256, 256)
+    
+        mapnik2.load_map(new_map, test_map)
+        open(test_map2,'w').write(mapnik2.save_map_to_string(new_map))
+    
+        diff = ' diff %s %s' % (os.path.abspath(test_map),os.path.abspath(test_map2))
+        try:
+            eq_(open(test_map).read(),open(test_map2).read())
+        except AssertionError, e:
+            raise AssertionError('serialized map "%s" not the same after being reloaded, \ncompare with command:\n\n$%s' % (in_map,diff))
+    
+        if os.path.exists(test_map):
+            os.remove(test_map)
+        else:
+            # Fail, the map wasn't written
+            return False
+    
+    for m in glob.glob("../data/good_maps/*.xml"):
+        compare_map(m)
+
+if __name__ == "__main__":
+    setup()
+    [eval(run)() for run in dir() if 'test_' in run]
diff --git a/tests/python_tests/speed_test.py b/tests/python_tests/speed_test.py
new file mode 100644
index 0000000..2292e1e
--- /dev/null
+++ b/tests/python_tests/speed_test.py
@@ -0,0 +1,100 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import sys
+import os, mapnik2
+from timeit import Timer, time
+from nose.tools import *
+from utilities import execution_path
+from utilities import Todo
+
+def setup():
+    # All of the paths used are relative, if we run the tests
+    # from another directory we need to chdir()
+    os.chdir(execution_path('.'))
+
+combinations = ['png',
+                'png8',
+                'png8:m=o',
+                'png8:m=h',
+                'png8:m=o:t=0',
+                'png8:m=o:t=1',
+                'png8:m=h:t=0',
+                'png8:m=h:t=1',
+                'png:z=1',
+                'png8:z=1',
+                'png8:z=1:m=o',
+                'png8:z=1:m=h',
+                'png8:z=1:c=50',
+                'png8:z=1:c=1',
+                'png8:z=1:c=50:m=h',
+                'png8:z=1:c=1:m=o',
+                'png8:z=1:c=1:m=o:s=filtered',
+                'png:z=1:s=filtered',
+                'png:z=1:s=huff',
+                'png:z=1:s=rle',
+                'png:m=h;g=2.0',
+                'png:m=h;g=1.0',
+               ]
+
+def do_encoding():
+
+    image = None
+    iterations = 10
+    
+    results = {}
+    sortable = {}
+    
+    def run(func, im, format, t):
+        global image
+        image = im
+        start = time.time()
+        set = t.repeat(iterations,1)
+        elapsed = (time.time() - start)
+        min_ = min(set)*1000
+        avg = (sum(set)/len(set))*1000
+        name = func.__name__ + ' ' + format
+        results[name] = [avg,min_,elapsed*1000,name]
+        sortable[name] = [avg]
+
+    def blank():
+        eval('image.tostring("%s")' % c)
+    blank_im = mapnik2.Image(512,512)
+
+    for c in combinations:
+        t = Timer(blank)
+        run(blank,blank_im,c,t)
+
+    def solid():
+        eval('image.tostring("%s")' % c)
+    solid_im = mapnik2.Image(512,512)
+    solid_im.background = mapnik2.Color("#f2efe9")
+
+    for c in combinations:
+        t = Timer(solid)
+        run(solid,solid_im,c,t)
+
+    def many_colors():
+        eval('image.tostring("%s")' % c)
+    # lots of colors: http://tile.osm.org/13/4194/2747.png
+    many_colors_im = mapnik2.Image.open('../data/images/13_4194_2747.png')
+
+    for c in combinations:
+        t = Timer(many_colors)
+        run(many_colors,many_colors_im,c,t)
+    
+    for key, value in sorted(sortable.iteritems(), key=lambda (k,v): (v,k)):
+        s = results[key]
+        avg = str(s[0])[:6]
+        min_ = str(s[1])[:6]
+        elapsed = str(s[2])[:6]
+        name = s[3]
+        print 'avg: %sms | min: %sms | total: %sms <-- %s' % (min_,avg,elapsed,name)
+    
+
+if __name__ == "__main__":
+    setup()
+    do_encoding()
+    for t in dir():
+        if 'test_' in t:
+            eval(t)()
diff --git a/tests/python_tests/sqlite_test.py b/tests/python_tests/sqlite_test.py
new file mode 100644
index 0000000..352213f
--- /dev/null
+++ b/tests/python_tests/sqlite_test.py
@@ -0,0 +1,65 @@
+#!/usr/bin/env python
+
+from nose.tools import *
+from utilities import execution_path
+
+import os, mapnik2
+
+def setup():
+    # All of the paths used are relative, if we run the tests
+    # from another directory we need to chdir()
+    os.chdir(execution_path('.'))
+
+# Note that without an extent or a spatial index, a sqlite
+# datasource will error on creation.  We use this fact to test
+# database attachdb and initdb options
+
+def test_attachdb_with_relative_file():
+    # The point table and index is in the qgis_spatiallite.sqlite
+    # database.  If either is not found, then this fails
+    ds = mapnik2.SQLite(file='../data/sqlite/world.sqlite', 
+        table='point',
+        attachdb='scratch at qgis_spatiallite.sqlite'
+        )
+
+def test_attachdb_with_multiple_files():
+    ds = mapnik2.SQLite(file='../data/sqlite/world.sqlite', 
+        table='attachedtest',
+        attachdb='scratch1@:memory:,scratch2@:memory:',
+        initdb='create table scratch1.attachedtest (the_geom);\n' +
+            'create virtual table scratch2.idx_attachedtest_the_geom using rtree(pkid,xmin,xmax,ymin,ymax);\n' +
+            'insert into scratch2.idx_attachedtest_the_geom values (1,-7799225.5,-7778571.0,1393264.125,1417719.375)\n'
+        )
+
+def test_attachdb_with_absolute_file():
+    # The point table and index is in the qgis_spatiallite.sqlite
+    # database.  If either is not found, then this fails
+    ds = mapnik2.SQLite(file=os.getcwd() + '/../data/sqlite/world.sqlite', 
+        table='point',
+        attachdb='scratch at qgis_spatiallite.sqlite'
+        )
+
+def test_attachdb_with_index():
+    ds = mapnik2.SQLite(file='../data/sqlite/world.sqlite', 
+        table='attachedtest',
+        attachdb='scratch@:memory:',
+        initdb='create table scratch.attachedtest (the_geom);\n' +
+            'create virtual table scratch.idx_attachedtest_the_geom using rtree(pkid,xmin,xmax,ymin,ymax);\n' +
+            'insert into scratch.idx_attachedtest_the_geom values (1,-7799225.5,-7778571.0,1393264.125,1417719.375)\n'
+        )
+    
+def test_attachdb_with_explicit_index():
+    ds = mapnik2.SQLite(file='../data/sqlite/world.sqlite', 
+        table='attachedtest',
+        index_table='myindex',
+        attachdb='scratch@:memory:',
+        initdb='create table scratch.attachedtest (the_geom);\n' +
+            'create virtual table scratch.myindex using rtree(pkid,xmin,xmax,ymin,ymax);\n' +
+            'insert into scratch.myindex values (1,-7799225.5,-7778571.0,1393264.125,1417719.375)\n'
+        )
+
+
+if __name__ == "__main__":
+    setup()
+    [eval(run)() for run in dir() if 'test_' in run]
+    
diff --git a/tests/python_tests/utilities.py b/tests/python_tests/utilities.py
index addc263..f76c5e5 100644
--- a/tests/python_tests/utilities.py
+++ b/tests/python_tests/utilities.py
@@ -14,3 +14,38 @@ class TodoPlugin(ErrorClassPlugin):
     name = "todo"
 
     todo = ErrorClass(Todo, label='TODO', isfailure=False)
+
+def save_data(filename, data, key='MAPNIK_TEST_DATA_DIR'):
+    """Saves bytestring 'data' into os.environ[key]/filename if
+    key in os.environ"""
+    if key in os.environ:
+        dir = os.environ[key]
+        if not os.path.exists(dir):
+            os.makedirs(dir)
+        fname = os.path.join(dir, filename)
+        f = open(fname, 'w')
+        try:
+            f.write(data)
+        finally:
+            f.close()
+
+def contains_word(word, bytestring_):
+    """
+    Checks that a bytestring contains a given word. len(bytestring) should be
+    a multiple of len(word).
+
+    >>> contains_word("abcd", "abcd"*5)
+    True
+
+    >>> contains_word("ab", "ba"*5)
+    False
+
+    >>> contains_word("ab", "ab"*5+"a")
+    Traceback (most recent call last):
+    ...
+    AssertionError: len(bytestring_) not multiple of len(word)
+    """
+    n = len(word)
+    assert len(bytestring_)%n == 0, "len(bytestring_) not multiple of len(word)"
+    chunks = [bytestring_[i:i+n] for i in xrange(0, len(bytestring_), n)]
+    return word in chunks
diff --git a/tests/run_tests.py b/tests/run_tests.py
index 35d7083..075a869 100755
--- a/tests/run_tests.py
+++ b/tests/run_tests.py
@@ -1,18 +1,19 @@
 #!/usr/bin/env python
 
 from python_tests.utilities import TodoPlugin
+from nose.plugins.doctests import Doctest
 
 import nose, sys, os, getopt
 
 def usage():
-    print "test.py -h | --help"
-    print "test.py [-q | -v] [-p | --prefix <path>]"
+    print("test.py -h | --help")
+    print("test.py [-q | -v] [-p | --prefix <path>]")
 
 def main():
     try:
         opts, args = getopt.getopt(sys.argv[1:], "hvqp:", ["help", "prefix="])
-    except getopt.GetoptError, err:
-        print str(err)
+    except getopt.GetoptError as err:
+        print(str(err))
         usage()
         sys.exit(2)
 
@@ -41,18 +42,19 @@ def main():
         # Allow python to find libraries for testing on the buildbot
         sys.path.insert(0, os.path.join(prefix, "lib/python%s/site-packages" % sys.version[:3]))
 
-    import mapnik
+    import mapnik2
 
     if not quiet:
-        print "- mapnik path: %s" % mapnik.__file__
-        print "- _mapnik.so path: %s" % mapnik._mapnik.__file__
-        print "- Input plugins path: %s" % mapnik.inputpluginspath
-        print "- Font path: %s" % mapnik.fontscollectionpath
-        print
-        print "- Running nosetests:"
-        print
+        print("- mapnik2 path: %s" % mapnik2.__file__)
+        if hasattr(mapnik2,'_mapnik2'):
+           print("- _mapnik2.so path: %s" % mapnik2._mapnik2.__file__)
+        print("- Input plugins path: %s" % mapnik2.inputpluginspath)
+        print("- Font path: %s" % mapnik2.fontscollectionpath)
+        print('')
+        print("- Running nosetests:")
+        print('')
 
-    argv = [__file__, '--exe', '--with-todo']
+    argv = [__file__, '--exe', '--with-todo', '--with-doctest', '--doctest-tests']
 
     if not quiet:
         argv.append('-v')
@@ -61,8 +63,10 @@ def main():
         # 3 * '-v' gets us debugging information from nose
         argv.append('-v')
         argv.append('-v')
+    
+    argv.extend(['-w','./tests/python_tests'])
 
-    if not nose.run(argv=argv, plugins=[TodoPlugin()]):
+    if not nose.run(argv=argv, plugins=[TodoPlugin(), Doctest()]):
         sys.exit(1)
     else:
         sys.exit(0)
diff --git a/utils/format_source_files/format_source_files.sh b/utils/format_source_files/format_source_files.sh
new file mode 100755
index 0000000..f215e55
--- /dev/null
+++ b/utils/format_source_files/format_source_files.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+# batch format *.{hpp,cpp} files
+
+MAPNIK_DIR="/Users/artem/projects/mapnik" 
+DIRS="$MAPNIK_DIR/src $MAPNIK_DIR/include $MAPNIK_DIR/bindings $MAPNIK_DIR/utils"
+EMACS="emacs"
+
+for file in $(find $DIRS -name '*.cpp' -o -name '*.hpp')
+do
+    $EMACS -batch $file -l $MAPNIK_DIR/utils/format_source_files/mapnik_format.el -f mapnik-format-function
+done
+
+
diff --git a/utils/format_source_files/mapnik_format.el b/utils/format_source_files/mapnik_format.el
new file mode 100644
index 0000000..143737c
--- /dev/null
+++ b/utils/format_source_files/mapnik_format.el
@@ -0,0 +1,12 @@
+(defun mapnik-format-function ()
+  "Format buffer according to mapnik style (TODO)"
+  (c-set-style "bsd")
+  (c-set-offset 'innamespace 0)
+  (c-set-offset 'template-args-cont 'c-lineup-template-args)
+  (setq c-basic-offset 4)
+  (indent-region (point-min) (point-max) nil)
+  (untabify (point-min) (point-max))
+  (save-buffer)
+)
+
+
diff --git a/utils/mapnik-config/build.py b/utils/mapnik-config/build.py
new file mode 100644
index 0000000..9dad9a2
--- /dev/null
+++ b/utils/mapnik-config/build.py
@@ -0,0 +1,110 @@
+
+import re
+import os
+import sys
+from copy import copy
+
+Import('env')
+
+config_env = env.Clone()
+
+# TODO
+# major/minor versions
+# git hash
+
+config_variables = '''#!/bin/sh
+
+## variables
+
+CONFIG_PREFIX=%(prefix)s
+CONFIG_MAPNIK_LIBNAME=%(mapnik_libname)s
+CONFIG_MAPNIK_INCLUDE=${CONFIG_PREFIX}/include
+CONFIG_MAPNIK_LIB=${CONFIG_PREFIX}/%(libdir_schema)s
+CONFIG_MAPNIK_VERSION='%(version)s'
+CONFIG_MAPNIK_LDFLAGS='%(ldflags)s'
+CONFIG_DEP_LIBS='%(dep_libs)s'
+CONFIG_OTHER_INCLUDES='%(other_includes)s'
+CONFIG_FONTS='%(fonts)s'
+CONFIG_INPUT_PLUGINS='%(input_plugins)s'
+CONFIG_SVN_REVISION='%(svn_revision)s'
+
+CONFIG_JSON="{
+  \\"prefix\\": \\"${CONFIG_PREFIX}\\",
+  \\"mapnik_libname\\": \\"${CONFIG_MAPNIK_LIBNAME}\\",
+  \\"mapnik_include\\": \\"${CONFIG_MAPNIK_INCLUDE}\\",
+  \\"mapnik_lib\\": \\"${CONFIG_MAPNIK_LIB}\\",
+  \\"version\\": \\"${CONFIG_MAPNIK_VERSION}\\",
+  \\"ldflags\\": \\"${CONFIG_MAPNIK_LDFLAGS}\\",
+  \\"dep_libs\\": \\"${CONFIG_DEP_LIBS}\\",
+  \\"other_includes\\": \\"${CONFIG_OTHER_INCLUDES}\\",
+  \\"fonts\\": \\"${CONFIG_FONTS}\\",
+  \\"input_plugins\\": \\"${CONFIG_INPUT_PLUGINS}\\",
+  \\"svn_revision\\": ${CONFIG_SVN_REVISION}
+}"
+
+'''
+
+def write_config(configuration,template,config_file):
+    template = open(template,'r').read()
+    open(config_file,'w').write(config_variables  % configuration + template)
+    try:
+        os.chmod(config_file,0755)
+    except: pass
+
+
+# todo - refine this list
+
+other_includes = ''.join([' -I%s' % i for i in config_env['CPPPATH'] if not i.startswith('#')])
+
+other_includes += ' '
+
+other_includes += ' '.join(config_env['LIBMAPNIK_CXXFLAGS'])
+
+other_includes += ' '
+
+if config_env['HAS_CAIRO']:
+    other_includes += ''.join([' -I%s' % i for i in env['CAIROMM_CPPPATHS'] if not i.startswith('#')])    
+
+
+ldflags = config_env['CUSTOM_LDFLAGS'] + ''.join([' -L%s' % i for i in config_env['LIBPATH'] if not i.startswith('#')])
+
+dep_libs = ''.join([' -l%s' % i for i in env['LIBMAPNIK_LIBS']])
+
+if env['INTERNAL_LIBAGG']:
+    dep_libs = dep_libs.replace('-lagg','')
+
+configuration = {
+    "prefix": config_env['PREFIX'],
+    "mapnik_libname": 'mapnik2',
+    "libdir_schema": config_env['LIBDIR_SCHEMA'],
+    "ldflags": ldflags,
+    "dep_libs": dep_libs,
+    "other_includes": other_includes,
+    "fonts": config_env['MAPNIK_FONTS'],
+    "input_plugins": config_env['MAPNIK_INPUT_PLUGINS'],
+    "svn_revision": config_env['SVN_REVISION'],
+    "version": config_env['MAPNIK_VERSION_STRING'],
+}
+
+
+template = 'mapnik-config.template.sh'
+config_file = 'mapnik-config'
+source = config_file
+write_config(configuration,template,config_file)
+target_path = os.path.normpath(os.path.join(config_env['INSTALL_PREFIX'],'bin'))
+full_target = os.path.join(target_path,config_file)
+
+Depends(full_target, env.subst('../../src/%s' % env['MAPNIK_LIB_NAME']))
+
+if 'install' in COMMAND_LINE_TARGETS:
+    # we must add 'install' catch here because otherwise
+    # custom command will be run when not installing
+    env.Alias('install',full_target)
+    
+    env.Command(full_target, config_file,
+       [
+       Copy("$TARGET","$SOURCE"),
+       Chmod("$TARGET", 0755),
+       ])
+
+config_env['create_uninstall_target'](env,os.path.join(target_path,config_file))
diff --git a/utils/mapnik-config/mapnik-config.template.sh b/utils/mapnik-config/mapnik-config.template.sh
new file mode 100755
index 0000000..ce2d9dc
--- /dev/null
+++ b/utils/mapnik-config/mapnik-config.template.sh
@@ -0,0 +1,107 @@
+
+## program below
+
+usage()
+{
+    cat <<EOF
+Usage: mapnik-config [OPTION]
+
+Known values for OPTION are:
+
+  --prefix          display mapnik prefix [default $CONFIG_PREFIX]
+  --prefix=DIR      change mapnik prefix [default $CONFIG_PREFIX]
+  --libs            print library linking information
+  --dep-libs        print library linking information for mapnik depedencies
+  --ldflags         print library paths (-L) information
+  --cflags          print pre-processor and compiler flags
+  --fonts           print default fonts directory
+  --input-plugins   print default input plugins directory
+  --json            print all config options as json object
+  --help            display this help and exit
+  -v --version      output version information
+  --svn-revision    output svn revision information
+EOF
+
+    exit $1
+}
+
+if test $# -eq 0; then
+    usage 1
+fi
+
+while test $# -gt 0; do
+    case "$1" in
+    -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+    *) optarg= ;;
+    esac
+
+    case "$1" in
+    
+    --prefix=*)
+      prefix=$optarg
+      includedir=$CONFIG_PREFIX/include
+      CONFIG_MAPNIK_LIB=$CONFIG_PREFIX/lib
+      ;;
+
+    --prefix)
+      echo $CONFIG_PREFIX
+      ;;
+
+    -v)
+      echo $CONFIG_VERSION
+      ;;
+
+    --version)
+      echo $CONFIG_VERSION
+      ;;
+
+    --json)
+      echo $CONFIG_JSON
+      ;;
+
+    --svn-revision)
+      echo ${CONFIG_SVN_REVISION}
+      ;;
+
+    --help)
+      usage 0
+      ;;
+
+    --fonts)
+      echo ${CONFIG_FONTS} 
+      ;;
+
+    --input-plugins)
+      echo ${CONFIG_INPUT_PLUGINS} 
+      ;;
+      
+    --cflags)
+      echo -I${CONFIG_MAPNIK_INCLUDE} ${CONFIG_OTHER_INCLUDES}
+      ;;
+
+    --libs)
+      echo -L${CONFIG_MAPNIK_LIB} -l${CONFIG_MAPNIK_LIBNAME}
+      ;;
+
+    --ldflags)
+      echo ${CONFIG_MAPNIK_LDFLAGS}
+      ;;
+
+    --lib-name)
+      echo ${CONFIG_MAPNIK_LIBNAME}
+      ;;
+
+    --dep-libs)
+      echo ${CONFIG_DEP_LIBS}
+      ;;
+
+    *)
+  # if no matches, return 'usage 1' meaning usage + 1 (error return type)
+  usage 1
+  exit 1
+  ;;
+    esac
+    shift
+done
+
+exit 0
diff --git a/utils/ogrindex/SConscript b/utils/ogrindex/SConscript
deleted file mode 100644
index c209f79..0000000
--- a/utils/ogrindex/SConscript
+++ /dev/null
@@ -1,52 +0,0 @@
-#
-# This file is part of Mapnik (c++ mapping toolkit)
-#
-# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-# $Id$
-
-import glob
-
-Import ('env')
-
-prefix = env['PREFIX']
-install_prefix = env['DESTDIR'] + '/' + prefix
-
-source = Split(
-    """
-    ogrindex.cpp
-    """
-    )
-
-headers = ['#plugins/input/ogr'] + env['CPPPATH'] 
-
-boost_program_options = 'boost_program_options%s' % env['BOOST_APPEND']
-boost_iostreams  = 'boost_iostreams%s' % env['BOOST_APPEND']
-boost_filesystem = 'boost_filesystem%s' % env['BOOST_APPEND']
-libraries =  [boost_program_options,boost_iostreams,boost_filesystem,env['PLUGINS']['ogr']['lib'],'mapnik']
-
-if env['PLATFORM'] == 'Darwin':
-    if env['HAS_BOOST_SYSTEM']:
-        boost_system = 'boost_system%s' % env['BOOST_APPEND']
-        libraries.append(boost_system)
-    libraries.append(env['ICU_LIB_NAME'])
-
-
-ogrindex = env.Program('ogrindex', source, CPPPATH=headers, LIBS=libraries)
-
-env.Install(install_prefix + '/bin', ogrindex)
-env.Alias('install', install_prefix + '/bin')
diff --git a/utils/ogrindex/build.py b/utils/ogrindex/build.py
new file mode 100644
index 0000000..4e65a3d
--- /dev/null
+++ b/utils/ogrindex/build.py
@@ -0,0 +1,56 @@
+#
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+import os
+import glob
+
+Import ('env')
+
+program_env = env.Clone()
+
+source = Split(
+    """
+    ogrindex.cpp
+    """
+    )
+
+headers = ['#plugins/input/ogr'] + env['CPPPATH'] 
+
+program_env['LIBS'] = [env['PLUGINS']['ogr']['lib']]
+
+# Link Library to Dependencies
+program_env['LIBS'].append('mapnik2')
+program_env['LIBS'].append(env['ICU_LIB_NAME'])
+program_env['LIBS'].append('boost_system%s' % env['BOOST_APPEND'])
+program_env['LIBS'].append('boost_filesystem%s' % env['BOOST_APPEND'])
+program_env['LIBS'].append('boost_program_options%s' % env['BOOST_APPEND'])
+
+if env['RUNTIME_LINK'] == 'static':
+    cmd = 'gdal-config --dep-libs'
+    program_env.ParseConfig(cmd)
+
+ogrindex = program_env.Program('ogrindex', source, CPPPATH=headers, LINKFLAGS=env['CUSTOM_LDFLAGS'])
+
+Depends(ogrindex, env.subst('../../src/%s' % env['MAPNIK_LIB_NAME']))
+
+if 'uninstall' not in COMMAND_LINE_TARGETS:
+    env.Install(os.path.join(env['INSTALL_PREFIX'],'bin'), ogrindex)
+    env.Alias('install', os.path.join(env['INSTALL_PREFIX'],'bin'))
diff --git a/utils/ogrindex/ogrindex.cpp b/utils/ogrindex/ogrindex.cpp
index 3da5f0d..4cbbc05 100644
--- a/utils/ogrindex/ogrindex.cpp
+++ b/utils/ogrindex/ogrindex.cpp
@@ -32,7 +32,7 @@
 #include <boost/program_options.hpp>
 
 #include <mapnik/datasource.hpp>
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 #include <mapnik/feature.hpp>
 #include <mapnik/feature_layer_desc.hpp>
 
@@ -43,6 +43,8 @@
 #include "ogr_featureset.cpp"
 #include "ogr_index_featureset.cpp"
 
+using mapnik::datasource_exception;
+
 const int MAXDEPTH = 64;
 const int DEFAULT_DEPTH = 8;
 const double MINRATIO=0.5;
@@ -72,13 +74,13 @@ int main (int argc,char** argv)
             ("ratio,r",    po::value<double>(), "split ratio (default 0.55)")
             ("ogr_files",  po::value<vector<string> >(), "ogr supported files to index: file1 file2 ...fileN")
             ;
-	
+        
         po::positional_options_description p;
         p.add("ogr_files",-1);
         po::variables_map vm;        
         po::store(po::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
         po::notify(vm);
-	
+        
         if (vm.count("version"))
         {
             std::clog<<"version 0.1.0" <<std::endl;
@@ -129,67 +131,87 @@ int main (int argc,char** argv)
             continue;
         }
 
-        unsigned breakpoint = ogrname.find_last_of (".");
+        // TODO - layer names don't match dataset name, so this will break for
+        // any layer types of ogr than shapefiles, etc
+        size_t breakpoint = ogrname.find_last_of (".");
         if (breakpoint == string::npos) breakpoint = ogrname.length();
         std::string ogrlayername (ogrname.substr(0, breakpoint));
 
-        if (boost::filesystem::exists (ogrlayername + ".index"))
+        if (boost::filesystem::exists (ogrlayername + ".ogrindex"))
         {
-            std::clog << "error : " << ogrlayername << ".index file already exists for " << ogrname << std::endl;
+            std::clog << "error : " << ogrlayername << ".ogrindex file already exists for " << ogrname << std::endl;
             continue;
         }
 
         mapnik::parameters params;
         params["type"] = "ogr";
         params["file"] = ogrname;
-        params["layer"] = ogrlayername;
+        //unsigned first = 0;
+        params["layer_by_index"] = 0;//ogrlayername;
         
-        ogr_datasource ogr (params);
-
-        Envelope<double> extent = ogr.envelope();
-        quadtree<int> tree (extent, depth, ratio);
-        int count=0;
-
-        std::clog << "file:" << ogrname << std::endl;
-        std::clog << "layer:" << ogrlayername << std::endl;
-        std::clog << "extent:" << extent << std::endl;
+        try
+        {
+            ogr_datasource ogr (params);
 
-        mapnik::query q (extent, 1.0);
-        mapnik::featureset_ptr itr = ogr.features (q);
 
-        while (true)
-        {
-            mapnik::feature_ptr fp = itr->next();
-            if (!fp)
+            box2d<double> extent = ogr.envelope();
+            quadtree<int> tree (extent, depth, ratio);
+            int count=0;
+    
+            std::clog << "file:" << ogrname << std::endl;
+            std::clog << "layer:" << ogrlayername << std::endl;
+            std::clog << "extent:" << extent << std::endl;
+    
+            mapnik::query q (extent, 1.0);
+            mapnik::featureset_ptr itr = ogr.features (q);
+    
+            while (true)
             {
-                break;
+                mapnik::feature_ptr fp = itr->next();
+                if (!fp)
+                {
+                    break;
+                }
+                
+                box2d<double> item_ext = fp->envelope();
+    
+                tree.insert (count, item_ext);
+                if (verbose) {
+                    std::clog << "record number " << (count + 1) << " box=" << item_ext << std::endl;
+                }
+    
+                ++count;
             }
-            
-            Envelope<double> item_ext = fp->envelope();
-
-            tree.insert (count, item_ext);
-            if (verbose) {
-                std::clog << "record number " << (count + 1) << " box=" << item_ext << std::endl;
+    
+            std::clog << " number shapes=" << count << std::endl;  
+    
+            std::fstream file((ogrlayername+".ogrindex").c_str(),
+                              std::ios::in | std::ios::out | std::ios::trunc | std::ios::binary);
+            if (!file) {
+                std::clog << "cannot open ogrindex file for writing file \"" 
+                          << (ogrlayername+".ogrindex") << "\"" << std::endl;
+            } else {
+                tree.trim();
+                std::clog<<" number nodes="<<tree.count()<<std::endl;
+                file.exceptions(std::ios::failbit | std::ios::badbit);
+                tree.write(file);
+                file.flush();
+                file.close();
             }
-
-            ++count;
+        }
+        // catch problem at the datasource creation
+        catch (const mapnik::datasource_exception & ex )
+        {
+            std::clog << ex.what() << "\n";
+            return -1;
         }
 
-        std::clog << " number shapes=" << count << std::endl;  
-
-        std::fstream file((ogrlayername+".index").c_str(),
-                          std::ios::in | std::ios::out | std::ios::trunc | std::ios::binary);
-        if (!file) {
-            std::clog << "cannot open index file for writing file \"" 
-                      << (ogrlayername+".index") << "\"" << std::endl;
-        } else {
-            tree.trim();
-            std::clog<<" number nodes="<<tree.count()<<std::endl;
-            file.exceptions(std::ios::failbit | std::ios::badbit);
-            tree.write(file);
-            file.flush();
-            file.close();
+        catch (...)
+        {
+            std::clog << "unknown exception..." << "\n";
+            return -1;
         }
+
     }
     
     std::clog << "done!" << std::endl;
diff --git a/utils/performance/build.py b/utils/performance/build.py
new file mode 100644
index 0000000..5f1c32e
--- /dev/null
+++ b/utils/performance/build.py
@@ -0,0 +1,31 @@
+#
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2010 Artem Pavlenko
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+import os
+Import ('env')
+
+TARGET = 'mapnik-speed-check'
+
+if 'uninstall' not in COMMAND_LINE_TARGETS:
+    env.Install(os.path.join(env['INSTALL_PREFIX'],'bin'), TARGET)
+    env.Alias('install', os.path.join(env['INSTALL_PREFIX'],'bin'))
+
+env['create_uninstall_target'](env, os.path.join(env['INSTALL_PREFIX'],'bin',TARGET))
diff --git a/utils/performance/mapnik-speed-check b/utils/performance/mapnik-speed-check
new file mode 100755
index 0000000..6243860
--- /dev/null
+++ b/utils/performance/mapnik-speed-check
@@ -0,0 +1,50 @@
+#!/usr/bin/env python
+
+import sys
+import mapnik2 as mapnik
+#import mapnik
+from timeit import Timer, time
+
+if not len(sys.argv) >= 3:
+    sys.exit('usage: mapnik-speed-check <stylesheet> <iterations> [minx,miny,maxx,maxy]')
+
+m = mapnik.Map(256,256)
+mapnik.load_map(m,sys.argv[1])
+m.zoom_all()
+
+TOTAL_TIME = 0
+BBOX = None
+
+def test():
+    global TOTAL_TIME
+    start = time.time()
+    im = mapnik.Image(m.width,m.height)
+    mapnik.render(m,im)
+    TOTAL_TIME += (time.time() - start)
+
+def f_(set):
+    min_ = str(min(set)*1000)[:6]
+    avg = str((sum(set)/len(set))*1000)[:6]
+    print 'min: %sms | avg: %sms | total: %ss' % (min_,avg,str(TOTAL_TIME)[:6])
+
+if __name__=='__main__':
+    
+    # if passed, set up bbox
+    if len(sys.argv) == 4:
+        bbox = sys.argv[3]
+        if ',' in bbox:
+            parts = bbox.split(',')
+        else:
+            parts = bbox.split(' ')
+        env = mapnik.Box2d(*map(float,parts))
+        m.zoom_to_box(env)
+
+    # load once - making sure mmap'd shapefiles are loaded
+    test_ = "test()"
+    eval(test_)
+    TOTAL_TIME = 0
+    
+    # now actually run the test
+    t = Timer(test_, "from __main__ import test")
+    iterations = int(sys.argv[2])
+    f_(t.repeat(iterations,1))
\ No newline at end of file
diff --git a/utils/pgsql2sqlite/SConscript b/utils/pgsql2sqlite/SConscript
deleted file mode 100644
index ed2bca0..0000000
--- a/utils/pgsql2sqlite/SConscript
+++ /dev/null
@@ -1,47 +0,0 @@
-#
-# This file is part of Mapnik (c++ mapping toolkit)
-#
-# Copyright (C) 2009 Artem Pavlenko, Dane Springmeyer
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-# $Id$
-
-Import ('env')
-
-prefix = env['PREFIX']
-install_prefix = env['DESTDIR'] + '/' + prefix
-
-source = Split(
-    """
-    main.cpp
-    sqlite.cpp
-    """
-    )
-
-headers = ['#plugins/input/postgis'] + env['CPPPATH'] 
-
-boost_program_options = 'boost_program_options%s' % env['BOOST_APPEND']
-boost_thread  = 'boost_thread%s' % env['BOOST_APPEND']
-
-libraries =  [boost_program_options,boost_thread,'sqlite3','pq','mapnik']
-
-if env['PLATFORM'] == 'Darwin':
-    libraries.append(env['ICU_LIB_NAME'])
-   
-pgsql2sqlite = env.Program('pgsql2sqlite', source, CPPPATH=headers, LIBS=libraries)
-
-env.Install(install_prefix + '/bin', pgsql2sqlite)
-env.Alias('install', install_prefix + '/bin')
\ No newline at end of file
diff --git a/utils/pgsql2sqlite/build.py b/utils/pgsql2sqlite/build.py
new file mode 100644
index 0000000..8ea1a8b
--- /dev/null
+++ b/utils/pgsql2sqlite/build.py
@@ -0,0 +1,52 @@
+#
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2009 Artem Pavlenko, Dane Springmeyer
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+import os
+from copy import copy
+
+Import ('env')
+
+prefix = env['PREFIX']
+
+program_env = env.Clone()
+
+source = Split(
+    """
+    main.cpp
+    sqlite.cpp
+    """
+    )
+
+headers = ['#plugins/input/postgis'] + env['CPPPATH'] 
+
+
+libraries = []
+boost_program_options = 'boost_program_options%s' % env['BOOST_APPEND']
+libraries.extend([boost_program_options,'sqlite3','pq','mapnik2'])
+
+pgsql2sqlite = program_env.Program('pgsql2sqlite', source, CPPPATH=headers, LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS'])
+Depends(pgsql2sqlite, env.subst('../../src/%s' % env['MAPNIK_LIB_NAME']))
+
+if 'uninstall' not in COMMAND_LINE_TARGETS:
+    env.Install(os.path.join(env['INSTALL_PREFIX'],'bin'), pgsql2sqlite)
+    env.Alias('install', os.path.join(env['INSTALL_PREFIX'],'bin'))
+
+env['create_uninstall_target'](env, os.path.join(env['INSTALL_PREFIX'],'bin','pgsql2sqlite'))
diff --git a/utils/pgsql2sqlite/main.cpp b/utils/pgsql2sqlite/main.cpp
index f8a388c..58261dd 100644
--- a/utils/pgsql2sqlite/main.cpp
+++ b/utils/pgsql2sqlite/main.cpp
@@ -35,78 +35,90 @@
 //stl
 #include <iostream>
 #include <fstream>
+#include <exception>
 
 int main ( int argc, char** argv)
 {
    
-   namespace po = boost::program_options;
+    namespace po = boost::program_options;
+    po::options_description desc("Postgresql/PostGIS to SQLite3 converter\n Options");
+    std::string usage = "usage: pgsql2sqlite --dbname db --table planet_osm_line --file osm.sqlite --query \"select * from planet_osm_line\"";
+    try 
+    {     
    
-   po::options_description desc("Postgresql/PostGIS to SQLite3 converter\n Options");
-   
-   desc.add_options()
-      ("help,?","Display this help screen.")
-      ("host,h",po::value<std::string>(),"Allows you to specify connection to a database on a machine other than the default.")
-      ("port,p",po::value<std::string>(),"Allows you to specify a database port other than the default.")
-      ("user,u",po::value<std::string>(),"Connect to the database as the specified user.")
-      ("dbname,d",po::value<std::string>(),"postgresql database name")
-      ("password,P",po::value<std::string>(),"Connect to the database with the specified password.")
-      ("query,q",po::value<std::string>(),"Name of the table/or query to pass to postmaster")
-      ("table,t",po::value<std::string>(),"Name of the table to create")
-      ("file,f",po::value<std::string>(),"Use this option to specify the name of the file to create.")
-      
-      ;
-   
-   po::positional_options_description p;
-   p.add("table",1);
-   
-   po::variables_map vm;
-   
-   try 
-   {     
-      po::store(po::command_line_parser(argc,argv).options(desc).positional(p).run(),vm);
-      po::notify(vm);
+        desc.add_options()
+            ("help,?","Display this help screen.")
+            ("host,h",po::value<std::string>(),"Allows you to specify connection to a database on a machine other than the default.")
+            ("port,p",po::value<std::string>(),"Allows you to specify a database port other than the default.")
+            ("user,u",po::value<std::string>(),"Connect to the database as the specified user.")
+            ("dbname,d",po::value<std::string>(),"postgresql database name")
+            ("password,P",po::value<std::string>(),"Connect to the database with the specified password.")
+            ("query,q",po::value<std::string>(),"Name of the table/or query to pass to postmaster")
+            ("table,t",po::value<std::string>(),"Name of the output table to create (default: table in query)")
+            ("file,f",po::value<std::string>(),"Use this option to specify the name of the file to create.")
+          
+            ;
+       
+        //po::positional_options_description p;
+        //p.add("table",1);
+       
+        po::variables_map vm;
+        //positional(p)
+        po::store(po::command_line_parser(argc,argv).options(desc).run(),vm);
+        po::notify(vm);
       
-      if (vm.count("help") || !vm.count("file") || !vm.count("query"))
-      {
-         std::cout << desc << "\n";
-         return EXIT_SUCCESS;
-      }
-   }
-   catch (...)
-   {
-      std::cout << desc << "\n";
-      return EXIT_FAILURE;
-   }
+        if (vm.count("help"))
+        {
+            std::cout << desc << "\n";
+            std::cout << usage << "\n";
+            return EXIT_SUCCESS;
+        }
+        else if ( !vm.count("dbname") || !vm.count("file") || !vm.count("query") )
+        {
+            std::cout << desc << "\n";
+            std::cout << usage << "\n";
+            std::cout << "Both --dbname, --file and, --query are required\n";
+            return EXIT_FAILURE;
+        }
    
-   boost::optional<std::string> host;
-   boost::optional<std::string> port ;
-   boost::optional<std::string> dbname;
-   boost::optional<std::string> user;
-   boost::optional<std::string> password;
-   
-   if (vm.count("host")) host = vm["host"].as<std::string>();
-   if (vm.count("port")) port = vm["port"].as<std::string>();
-   if (vm.count("dbname")) dbname = vm["dbname"].as<std::string>();
-   if (vm.count("user")) user = vm["user"].as<std::string>();
-   if (vm.count("password")) password = vm["password"].as<std::string>();
-   
-   ConnectionCreator<Connection> creator(host,port,dbname,user,password);
-   try 
-   {
-      boost::shared_ptr<Connection> conn(creator());
+        boost::optional<std::string> host;
+        boost::optional<std::string> port ;
+        boost::optional<std::string> dbname;
+        boost::optional<std::string> user;
+        boost::optional<std::string> password;
+        boost::optional<std::string> connect_timeout("4");
+        
+        if (vm.count("host")) host = vm["host"].as<std::string>();
+        if (vm.count("port")) port = vm["port"].as<std::string>();
+        if (vm.count("dbname")) dbname = vm["dbname"].as<std::string>();
+        if (vm.count("user")) user = vm["user"].as<std::string>();
+        if (vm.count("password")) password = vm["password"].as<std::string>();
+        
+        ConnectionCreator<Connection> creator(host,port,dbname,user,password,connect_timeout);
+        try 
+        {
+            boost::shared_ptr<Connection> conn(creator());
+    
+            std::string query = vm["query"].as<std::string>();      
+            std::string output_table_name = vm.count("table") ? vm["table"].as<std::string>() : mapnik::table_from_sql(query);
+            std::string output_file = vm["file"].as<std::string>();
+          
+            std::cout << "output_table : " << output_table_name << "\n";
+          
+            mapnik::pgsql2sqlite(conn,query,output_table_name,output_file);
+        }
+        catch (mapnik::datasource_exception & ex)
+        {
+            std::cerr << ex.what() << "\n";
+        }
 
-      std::string query = vm["query"].as<std::string>();      
-      std::string output_table_name = vm.count("table") ? vm["table"].as<std::string>() : mapnik::table_from_sql(query);
-      std::string output_file = vm["file"].as<std::string>();
-      
-      std::cout << "output_table : " << output_table_name << "\n";
-      
-      mapnik::pgsql2sqlite(conn,query,output_table_name,output_file);
-   }
-   catch (mapnik::datasource_exception & ex)
-   {
-      std::cerr << ex.what() << "\n";
-   }
+    }
+    catch(std::exception& e) {
+        std::cerr << desc << "\n";
+        std::cout << usage << "\n";
+        std::cerr << e.what() << "\n";
+        return EXIT_FAILURE;
+    }
    
-   return EXIT_SUCCESS;
+    return EXIT_SUCCESS;
 }
diff --git a/utils/pgsql2sqlite/pgsql2sqlite.hpp b/utils/pgsql2sqlite/pgsql2sqlite.hpp
index 6e9ac18..8710f5a 100644
--- a/utils/pgsql2sqlite/pgsql2sqlite.hpp
+++ b/utils/pgsql2sqlite/pgsql2sqlite.hpp
@@ -23,11 +23,14 @@
 
 #include "sqlite.hpp"
 
+// mapnik
 #include <mapnik/datasource.hpp>
 #include <mapnik/wkb.hpp>
+#include <mapnik/sql_utils.hpp>
 
 #include "connection_manager.hpp"
 #include "cursorresultset.hpp"
+
 // boost
 #include <boost/cstdint.hpp>
 #include <boost/optional.hpp>
@@ -44,371 +47,311 @@
 
 namespace mapnik {
 
-   std::string numeric2string(const char* buf)
-   {
-      int16_t ndigits = int2net(buf);
-      int16_t weight  = int2net(buf+2);
-      int16_t sign    = int2net(buf+4);
-      int16_t dscale  = int2net(buf+6);
-      
-      boost::scoped_array<int16_t> digits(new int16_t[ndigits]); 
-      for (int n=0; n < ndigits ;++n)
-      {
-         digits[n] = int2net(buf+8+n*2);
-      }
-      
-      std::ostringstream ss;
-      
-      if (sign == 0x4000) ss << "-";
-      
-      int i = std::max(weight,int16_t(0));
-      int d = 0;
-      while ( i >= 0)
-      {
-         if (i <= weight && d < ndigits)
-            ss <<  digits[d++];
-         else
-            ss <<  '0';
-         i--;
-      }
-      if (dscale > 0)
-      {
-         ss << '.';
-         while ( i >= -dscale)
-         {
-            if (i <= weight && d < ndigits)
-               ss <<  digits[d++];
-            i--;
-         }
-      }
-      return ss.str();
-   }
-   
-   struct blob_to_hex
-   {
-      std::string operator() (const char* blob, unsigned size)
-      {
-         std::string buf;
-         buf.reserve(size*2);
-         std::ostringstream s(buf);
-         s.seekp(0);
-         char hex[3];
-         std::memset(hex,0,3);
-         for ( unsigned pos=0; pos < size; ++pos)
-         {  
+/*
+struct blob_to_hex
+{
+    std::string operator() (const char* blob, unsigned size)
+    {
+        std::string buf;
+        buf.reserve(size*2);
+        std::ostringstream s(buf);
+        s.seekp(0);
+        char hex[3];
+        std::memset(hex,0,3);
+        for ( unsigned pos=0; pos < size; ++pos)
+        {  
             std::sprintf (hex, "%02X", int(blob[pos]) & 0xff);
             s << hex;
-         }
-         return s.str();
-      }
-   };
-
-   bool valid_envelope(mapnik::Envelope<double> const& e)
-   {
-      return (e.minx() <= e.maxx() && e.miny() <= e.maxy()) ;
-   }
-   
-   std::string table_from_sql(std::string const& sql)
-   {
-      std::string table_name = boost::algorithm::to_lower_copy(sql);
-      boost::algorithm::replace_all(table_name,"\n"," ");
-      
-      std::string::size_type idx = table_name.rfind("from");
-      if (idx!=std::string::npos)
-      {
-         
-         idx=table_name.find_first_not_of(" ",idx+4);
-         if (idx != std::string::npos)
-         {
-            table_name=table_name.substr(idx);
-         }
-         idx=table_name.find_first_of(" ),");
-         if (idx != std::string::npos)
-         {
-            table_name = table_name.substr(0,idx);
-         }
-      }
-      return table_name;
-   }
-   
-   
-   template <typename Connection>
-   void pgsql2sqlite(Connection conn, 
-                     std::string const& query, 
-                     std::string const& output_table_name, 
-                     std::string const& output_filename)
-   {   
-      namespace sqlite = mapnik::sqlite;
-      sqlite::database db(output_filename);
+        }
+        return s.str();
+    }
+};
+*/
+ 
+template <typename Connection>
+void pgsql2sqlite(Connection conn, 
+                  std::string const& query, 
+                  std::string const& output_table_name, 
+                  std::string const& output_filename)
+{   
+    namespace sqlite = mapnik::sqlite;
+    sqlite::database db(output_filename);
       
-      boost::shared_ptr<ResultSet> rs = conn->executeQuery("select * from (" + query + ") as query limit 0;");
-      int count = rs->getNumFields();
+    boost::shared_ptr<ResultSet> rs = conn->executeQuery("select * from (" + query + ") as query limit 0;");
+    int count = rs->getNumFields();
       
-      std::ostringstream select_sql;
+    std::ostringstream select_sql;
       
-      select_sql << "select ";
+    select_sql << "select ";
       
-      for (int i=0; i<count; ++i)
-      {
-         if (i!=0) select_sql << ",";
-         select_sql << "\"" <<  rs->getFieldName(i) << "\"";
-      }
+    for (int i=0; i<count; ++i)
+    {
+        if (i!=0) select_sql << ",";
+        select_sql << "\"" <<  rs->getFieldName(i) << "\"";
+    }
    
-      select_sql << " from (" << query << ") as query";
+    select_sql << " from (" << query << ") as query";
    
-      std::string table_name = table_from_sql(query);
+    std::string table_name = mapnik::table_from_sql(query);
       
-      std::string schema_name="";
-      std::string::size_type idx=table_name.find_last_of('.');
-      if (idx!=std::string::npos)
-      {
-         schema_name=table_name.substr(0,idx);
-         table_name=table_name.substr(idx+1);
-      }
-      else
-      {
-         table_name=table_name.substr(0);
-      }
+    std::string schema_name="";
+    std::string::size_type idx=table_name.find_last_of('.');
+    if (idx!=std::string::npos)
+    {
+        schema_name=table_name.substr(0,idx);
+        table_name=table_name.substr(idx+1);
+    }
+    else
+    {
+        table_name=table_name.substr(0);
+    }
       
-      std::ostringstream geom_col_sql;
-      geom_col_sql << "select f_geometry_column,srid,type from geometry_columns ";
-      geom_col_sql << "where f_table_name='" << table_name << "'";
-      if (schema_name.length() > 0)
-      {
-         geom_col_sql <<" and f_table_schema='"<< schema_name <<"'";
-      }
+    std::ostringstream geom_col_sql;
+    geom_col_sql << "select f_geometry_column,srid,type from geometry_columns ";
+    geom_col_sql << "where f_table_name='" << table_name << "'";
+    if (schema_name.length() > 0)
+    {
+        geom_col_sql <<" and f_table_schema='"<< schema_name <<"'";
+    }
       
-      rs = conn->executeQuery(geom_col_sql.str());
+    rs = conn->executeQuery(geom_col_sql.str());
    
-      int srid = -1;
-      std::string geom_col = "UNKNOWN";
-      std::string geom_type = "UNKNOWN";
+    int srid = -1;
+    std::string geom_col = "UNKNOWN";
+    std::string geom_type = "UNKNOWN";
       
-      if ( rs->next())
-      {
-         try 
-         {
+    if ( rs->next())
+    {
+        try 
+        {
             srid = boost::lexical_cast<int>(rs->getValue("srid"));
-         }
-         catch (boost::bad_lexical_cast &ex)
-         {
+        }
+        catch (boost::bad_lexical_cast &ex)
+        {
             std::clog << ex.what() << std::endl;
-         }
-         geom_col = rs->getValue("f_geometry_column");
-         geom_type = rs->getValue("type");
-      }
+        }
+        geom_col = rs->getValue("f_geometry_column");
+        geom_type = rs->getValue("type");
+    }
    
-      // add AsBinary(<geometry_column>) modifier
-      std::string select_sql_str = select_sql.str();
-      boost::algorithm::replace_all(select_sql_str, "\"" + geom_col + "\"","AsBinary(" + geom_col+") as " + geom_col);
+    // add AsBinary(<geometry_column>) modifier
+    std::string select_sql_str = select_sql.str();
+    boost::algorithm::replace_all(select_sql_str, "\"" + geom_col + "\"","AsBinary(" + geom_col+") as " + geom_col);
 
 #ifdef MAPNIK_DEBUG
-      std::cout << select_sql_str << "\n";
+    std::cout << select_sql_str << "\n";
 #endif
       
-      std::ostringstream cursor_sql;
-      std::string cursor_name("my_cursor");
+    std::ostringstream cursor_sql;
+    std::string cursor_name("my_cursor");
    
-      cursor_sql << "DECLARE " << cursor_name << " BINARY INSENSITIVE NO SCROLL CURSOR WITH HOLD FOR " << select_sql_str << " FOR READ ONLY";
-      conn->execute(cursor_sql.str());
+    cursor_sql << "DECLARE " << cursor_name << " BINARY INSENSITIVE NO SCROLL CURSOR WITH HOLD FOR " << select_sql_str << " FOR READ ONLY";
+    conn->execute(cursor_sql.str());
    
-      boost::shared_ptr<CursorResultSet> cursor(new CursorResultSet(conn,cursor_name,10000));
+    boost::shared_ptr<CursorResultSet> cursor(new CursorResultSet(conn,cursor_name,10000));
    
-      unsigned num_fields = cursor->getNumFields();
+    unsigned num_fields = cursor->getNumFields();
 
-      if (num_fields == 0) return;
+    if (num_fields == 0) return;
       
-      std::string feature_id =  "fid";
+    std::string feature_id =  "fid";
    
-      std::ostringstream create_sql;
-      create_sql << "create table if not exists " << output_table_name << " (" << feature_id << " INTEGER PRIMARY KEY AUTOINCREMENT,";
+    std::ostringstream create_sql;
+    create_sql << "create table if not exists " << output_table_name << " (" << feature_id << " INTEGER PRIMARY KEY AUTOINCREMENT,";
       
-      int geometry_oid = -1;
+    int geometry_oid = -1;
 
-      std::string output_table_insert_sql = "insert into " + output_table_name + " values (?";
+    std::string output_table_insert_sql = "insert into " + output_table_name + " values (?";
       
-      for ( unsigned pos = 0; pos < num_fields ; ++pos)
-      {
-	if (pos > 0) 
-	{
-	  create_sql << ",";
-	}
-	output_table_insert_sql +=",?";
-	int oid = cursor->getTypeOID(pos);
-	if (geom_col == cursor->getFieldName(pos))
-	{
-           geometry_oid = oid;
-           create_sql << "'" << cursor->getFieldName(pos) << "' BLOB";
-	}
+    for ( unsigned pos = 0; pos < num_fields ; ++pos)
+    {
+        if (pos > 0) 
+        {
+            create_sql << ",";
+        }
+        output_table_insert_sql +=",?";
+        int oid = cursor->getTypeOID(pos);
+        if (geom_col == cursor->getFieldName(pos))
+        {
+            geometry_oid = oid;
+            create_sql << "'" << cursor->getFieldName(pos) << "' BLOB";
+        }
         else
         {
-           create_sql << "'" << cursor->getFieldName(pos);
-           switch (oid)
-           {
-              case 700:
-              case 701:
-                 create_sql << "' REAL";
-                 break;
-              default:
-                 create_sql << "' TEXT";
-                 break;
-           }  
-            
+            create_sql << "'" << cursor->getFieldName(pos);
+            switch (oid)
+            {
+            case 20:
+            case 21:
+            case 23:
+                create_sql << "' INTEGER";
+                break;
+            case 700:
+            case 701:
+                create_sql << "' REAL";
+                break;
+            default:
+                create_sql << "' TEXT";
+                break;
+            }  
+           
         }
-      }
+    }
       
-      create_sql << ");";
-      output_table_insert_sql +=")";
+    create_sql << ");";
+    output_table_insert_sql +=")";
       
-      std::cout << "client_encoding=" << conn->client_encoding() << "\n";
-      std::cout << "geometry_column=" << geom_col << "(" << geom_type 
-                <<  ") srid=" << srid << " oid=" << geometry_oid << "\n";
+    std::cout << "client_encoding=" << conn->client_encoding() << "\n";
+    std::cout << "geometry_column=" << geom_col << "(" << geom_type 
+              <<  ") srid=" << srid << " oid=" << geometry_oid << "\n";
    
   
-      db.execute("begin;");
-       // output table sql
-      db.execute(create_sql.str());
+    db.execute("begin;");
+    // output table sql
+    db.execute(create_sql.str());
 
-      // spatial index sql
-      std::string spatial_index_sql = "create virtual table idx_" + output_table_name 
-	+ "_" + geom_col + " using rtree(pkid, xmin, xmax, ymin, ymax)";
+    // spatial index sql
+    std::string spatial_index_sql = "create virtual table idx_" + output_table_name 
+        + "_" + geom_col + " using rtree(pkid, xmin, xmax, ymin, ymax)";
       
-      db.execute(spatial_index_sql);
+    db.execute(spatial_index_sql);
       
-      //blob_to_hex hex;
-      int pkid = 0;
+    //blob_to_hex hex;
+    int pkid = 0;
       
-      std::string spatial_index_insert_sql = "insert into idx_" + output_table_name +  "_"  
-         +  geom_col + " values (?,?,?,?,?)" ;
+    std::string spatial_index_insert_sql = "insert into idx_" + output_table_name +  "_"  
+        +  geom_col + " values (?,?,?,?,?)" ;
       
-      sqlite::prepared_statement spatial_index(db,spatial_index_insert_sql);
+    sqlite::prepared_statement spatial_index(db,spatial_index_insert_sql);
 
 #ifdef MAPNIK_DEBUG
-      std::cout << output_table_insert_sql << "\n";
+    std::cout << output_table_insert_sql << "\n";
 #endif
       
-      sqlite::prepared_statement output_table(db,output_table_insert_sql);
+    sqlite::prepared_statement output_table(db,output_table_insert_sql);
       
-      while (cursor->next())
-      {
-         ++pkid;
+    while (cursor->next())
+    {
+        ++pkid;
          
-	 sqlite::record_type output_rec;
-         output_rec.push_back(sqlite::value_type(pkid));
-         bool empty_geom = true;
-         const char * buf = 0;
-         for (unsigned pos=0 ; pos < num_fields; ++pos)
-         {
+        sqlite::record_type output_rec;
+        output_rec.push_back(sqlite::value_type(pkid));
+        bool empty_geom = true;
+        const char * buf = 0;
+        for (unsigned pos=0 ; pos < num_fields; ++pos)
+        {
             if (! cursor->isNull(pos))
             {
-               int size=cursor->getFieldLength(pos);
-               int oid = cursor->getTypeOID(pos);
-               buf=cursor->getValue(pos);
+                int size=cursor->getFieldLength(pos);
+                int oid = cursor->getTypeOID(pos);
+                buf=cursor->getValue(pos);
             
-               switch (oid)
-               {
-                  case 25:
-                  case 1042:
-                  case 1043:
-                  {
-                     std::string text(buf);
-                     boost::algorithm::replace_all(text,"'","''");
-		     output_rec.push_back(sqlite::value_type(text));
-                     break;
-                  }
-                  case 23:
-                     output_rec.push_back(sqlite::value_type(int4net(buf)));
-                     break;
-                  case 21:
-                     output_rec.push_back(sqlite::value_type(int2net(buf)));
-                     break;
-                  case 700:
-                  {
-                     float val;
-                     float4net(val,buf);
-                     output_rec.push_back(sqlite::value_type(val));
-                     break;
-                  }
-                  case 701:
-                  {
-                     double val;
-                     float8net(val,buf);
-                     output_rec.push_back(sqlite::value_type(val));
-                     break;
-                  }
-                  case 1700:
-                  {
-                     std::string str = numeric2string(buf);
-                     try 
-                     {
+                switch (oid)
+                {
+                case 25:
+                case 1042:
+                case 1043:
+                {
+                    std::string text(buf);
+                    boost::algorithm::replace_all(text,"'","''");
+                    output_rec.push_back(sqlite::value_type(text));
+                    break;
+                }
+                case 23:
+                    output_rec.push_back(sqlite::value_type(int4net(buf)));
+                    break;
+                case 21:
+                    output_rec.push_back(sqlite::value_type(int2net(buf)));
+                    break;
+                case 700:
+                {
+                    float val;
+                    float4net(val,buf);
+                    output_rec.push_back(sqlite::value_type(val));
+                    break;
+                }
+                case 701:
+                {
+                    double val;
+                    float8net(val,buf);
+                    output_rec.push_back(sqlite::value_type(val));
+                    break;
+                }
+                case 1700:
+                {
+                    std::string str = mapnik::numeric2string(buf);
+                    try 
+                    {
                         double val = boost::lexical_cast<double>(str);
                         output_rec.push_back(sqlite::value_type(val));
-                     }
-                     catch (boost::bad_lexical_cast & ex)
-                     {
+                    }
+                    catch (boost::bad_lexical_cast & ex)
+                    {
                         std::clog << ex.what() << "\n"; 
-                     }
-                     break;
-                  }
+                    }
+                    break;
+                }
                   
-                  default:  
-                  {
-                     if (oid == geometry_oid)
-                     {
+                default:  
+                {
+                    if (oid == geometry_oid)
+                    {
                         mapnik::Feature feat(pkid);
-                        geometry_utils::from_wkb(feat,buf,size,false,wkbGeneric);
+                        geometry_utils::from_wkb(feat.paths(),buf,size,false,wkbGeneric);
                         if (feat.num_geometries() > 0)
                         {
-                           geometry2d const& geom=feat.get_geometry(0);
-                           Envelope<double> bbox = geom.envelope();
-                           if (valid_envelope(bbox))
-                           {
-			     sqlite::record_type rec;
-			     
-			     rec.push_back(sqlite::value_type(pkid));
-			     rec.push_back(sqlite::value_type(bbox.minx()));
-			     rec.push_back(sqlite::value_type(bbox.maxx()));
-			     rec.push_back(sqlite::value_type(bbox.miny()));
-			     rec.push_back(sqlite::value_type(bbox.maxy()));
-			     
-			     spatial_index.insert_record(rec);
-			     empty_geom = false;
-                           }
+                            geometry_type const& geom=feat.get_geometry(0);
+                            box2d<double> bbox = geom.envelope();
+                            if (bbox.valid())
+                            {
+                                sqlite::record_type rec;
+                             
+                                rec.push_back(sqlite::value_type(pkid));
+                                rec.push_back(sqlite::value_type(bbox.minx()));
+                                rec.push_back(sqlite::value_type(bbox.maxx()));
+                                rec.push_back(sqlite::value_type(bbox.miny()));
+                                rec.push_back(sqlite::value_type(bbox.maxy()));
+                             
+                                spatial_index.insert_record(rec);
+                                empty_geom = false;
+                            }
                         }
                         
-			//output_rec.push_back(sqlite::value_type("X'" + hex(buf,size) + "'"));
+                        //output_rec.push_back(sqlite::value_type("X'" + hex(buf,size) + "'"));
                         output_rec.push_back(sqlite::blob(buf,size));
-                     }
-                     else 
-		     {
-		       output_rec.push_back(sqlite::null_type());
-                     }
-                     break;
-                  }
-               }    
+                    }
+                    else 
+                    {
+                        output_rec.push_back(sqlite::null_type());
+                    }
+                    break;
+                }
+                }    
             }
             else 
             {
-	      output_rec.push_back(sqlite::null_type());
+                output_rec.push_back(sqlite::null_type());
             } 
-         }
+        }
    
-	 if (!empty_geom) output_table.insert_record(output_rec);
-	 
-         if (pkid % 1000 == 0)
-         {
+        if (!empty_geom) output_table.insert_record(output_rec);
+         
+        if (pkid % 1000 == 0)
+        {
             std::cout << "\r processing " << pkid << " features";
             std::cout.flush();
-         }
+        }
          
-	 if (pkid % 100000 == 0)
-         {
-	   db.execute("commit;begin;");	   
-         }
-      }
-      // commit
-      db.execute("commit;");
-      std::cout << "\r processed " << pkid << " features";
-      std::cout << "\n Done!" << std::endl;
-   }
+        if (pkid % 100000 == 0)
+        {
+            db.execute("commit;begin;");           
+        }
+    }
+    // commit
+    db.execute("commit;");
+    std::cout << "\r processed " << pkid << " features";
+    db.execute("VACUUM;");
+    std::cout << "\r vacumming";
+    std::cout << "\n Done!" << std::endl;
+}
 }
diff --git a/utils/pgsql2sqlite/sqlite.cpp b/utils/pgsql2sqlite/sqlite.cpp
index 0d7d0d0..ece4ce5 100644
--- a/utils/pgsql2sqlite/sqlite.cpp
+++ b/utils/pgsql2sqlite/sqlite.cpp
@@ -25,35 +25,35 @@
 
 namespace mapnik { namespace sqlite {
 
-      database::database(std::string const& name)
-      {
-         sqlite3 *db;
-         int res = sqlite3_open(name.c_str(), &db);
-         if (res)
-         {
+    database::database(std::string const& name)
+    {
+        sqlite3 *db;
+        int res = sqlite3_open(name.c_str(), &db);
+        if (res)
+        {
             sqlite3_close(db);
             throw;
-         } 
+        } 
          
-         db_ = sqlite_db(db,database_closer());
+        db_ = sqlite_db(db,database_closer());
 #ifdef MAPNIK_DEBUG
-         std::cerr << "Open database " << name << "\n";
+        std::cerr << "Open database " << name << "\n";
 #endif
-      }
+    }
       
-      database::~database() {}
+    database::~database() {}
       
-      bool database::execute(std::string const& sql)   
-      {
-         char * err_msg;
-         int res = sqlite3_exec(db_.get(),sql.c_str(),0,0,&err_msg);
-         if (res != SQLITE_OK)
-         {
+    bool database::execute(std::string const& sql)   
+    {
+        char * err_msg;
+        int res = sqlite3_exec(db_.get(),sql.c_str(),0,0,&err_msg);
+        if (res != SQLITE_OK)
+        {
             std::cerr << "SQL"<< sql << " ERR:" << err_msg << "\n";
             sqlite3_free(err_msg);
             return false;
-         }
-         return true;
-      }
+        }
+        return true;
+    }
     }
- }
+}
diff --git a/utils/pgsql2sqlite/sqlite.hpp b/utils/pgsql2sqlite/sqlite.hpp
index c4640ec..41e46fb 100644
--- a/utils/pgsql2sqlite/sqlite.hpp
+++ b/utils/pgsql2sqlite/sqlite.hpp
@@ -37,128 +37,128 @@
 
 namespace mapnik {  namespace sqlite {
 
-      class database : private boost::noncopyable
-      {
-         friend class prepared_statement;
+    class database : private boost::noncopyable
+    {
+        friend class prepared_statement;
          
-         struct database_closer
-         {
+        struct database_closer
+        {
             void operator () (sqlite3 * db)
             {
 #ifdef MAPNIK_DEBUG
-               std::cerr << "close database " << db << "\n";
+                std::cerr << "close database " << db << "\n";
 #endif
-               sqlite3_close(db);
+                sqlite3_close(db);
             }
-         };
+        };
          
-         typedef boost::shared_ptr<sqlite3> sqlite_db;    
-         sqlite_db db_;
+        typedef boost::shared_ptr<sqlite3> sqlite_db;    
+        sqlite_db db_;
          
-      public:
-         database(std::string const& name);
-         ~database();
-         bool execute(std::string const& sql);
-      };
+    public:
+        database(std::string const& name);
+        ~database();
+        bool execute(std::string const& sql);
+    };
 
-      struct null_type {};
-      struct blob 
-      {
-         blob(const char* buf, unsigned size)
+    struct null_type {};
+    struct blob 
+    {
+        blob(const char* buf, unsigned size)
             : buf_(buf), size_(size) {}
          
-         const char * buf_;
-         unsigned size_;
-      };
+        const char * buf_;
+        unsigned size_;
+    };
 
-      typedef boost::variant<int,double,std::string, blob,null_type> value_type;
-      typedef std::vector<value_type> record_type;
+    typedef boost::variant<int,double,std::string, blob,null_type> value_type;
+    typedef std::vector<value_type> record_type;
       
-      class prepared_statement : boost::noncopyable 
-      {
-         struct binder : public boost::static_visitor<bool>
-         {
+    class prepared_statement : boost::noncopyable 
+    {
+        struct binder : public boost::static_visitor<bool>
+        {
             binder(sqlite3_stmt * stmt, unsigned index)
-               : stmt_(stmt), index_(index) {}
+                : stmt_(stmt), index_(index) {}
   
-	    bool operator() (null_type )
-	    {
-	       if (sqlite3_bind_null(stmt_, index_) != SQLITE_OK)
-               {
-                  std::cerr << "cannot bind NULL\n";
-                  return false;
-               }
-               return true;
-	    }
-	    
+            bool operator() (null_type )
+            {
+                if (sqlite3_bind_null(stmt_, index_) != SQLITE_OK)
+                {
+                    std::cerr << "cannot bind NULL\n";
+                    return false;
+                }
+                return true;
+            }
+            
             bool operator() (int val)
             {
-               if (sqlite3_bind_int(stmt_, index_ , val ) != SQLITE_OK)
-               {
-                  std::cerr << "cannot bind " << val << "\n";
-                  return false;
-               }
-               return true;
+                if (sqlite3_bind_int(stmt_, index_ , val ) != SQLITE_OK)
+                {
+                    std::cerr << "cannot bind " << val << "\n";
+                    return false;
+                }
+                return true;
             }
             
             bool operator() (double val)
             {
-               if (sqlite3_bind_double(stmt_, index_ , val ) != SQLITE_OK)
-               {
-                  std::cerr << "cannot bind " << val << "\n";
-                  return false;
-               }
-               return true;
+                if (sqlite3_bind_double(stmt_, index_ , val ) != SQLITE_OK)
+                {
+                    std::cerr << "cannot bind " << val << "\n";
+                    return false;
+                }
+                return true;
             }
             
             bool operator() (std::string const& val)
             {
-               if (sqlite3_bind_text(stmt_, index_, val.c_str(), val.length(), SQLITE_STATIC) != SQLITE_OK)
-               {
-                 std::cerr << "cannot bind " << val << "\n";
-                 return false;
-               }
-               return true;
+                if (sqlite3_bind_text(stmt_, index_, val.c_str(), val.length(), SQLITE_STATIC) != SQLITE_OK)
+                {
+                    std::cerr << "cannot bind " << val << "\n";
+                    return false;
+                }
+                return true;
             }
             
             bool operator() (blob const& val)
             {
-               if (sqlite3_bind_blob(stmt_, index_, val.buf_, val.size_, SQLITE_STATIC) != SQLITE_OK)
-               {
-                 std::cerr << "cannot bind BLOB\n";
-                 return false;
-               }
-               return true;
+                if (sqlite3_bind_blob(stmt_, index_, val.buf_, val.size_, SQLITE_STATIC) != SQLITE_OK)
+                {
+                    std::cerr << "cannot bind BLOB\n";
+                    return false;
+                }
+                return true;
             }
             
             sqlite3_stmt * stmt_;
             unsigned index_;
-         };
-      public:
-         prepared_statement(database & db, std::string const& sql)
+        };
+    public:
+        prepared_statement(database & db, std::string const& sql)
             : db_(db.db_.get()), stmt_(0)
-         {
+        {
             const char * tail;
             //char * err_msg;
             int res = sqlite3_prepare_v2(db_, sql.c_str(),-1, &stmt_,&tail);
             if (res != SQLITE_OK)
             {
-               std::cerr << "ERR:"<< res << "\n";   
-               throw;
+                std::cerr << "ERR:"<< res << "\n";   
+                throw;
             }
-         }
+        }
          
-         ~prepared_statement()
-         {
-	    int res = sqlite3_finalize(stmt_);
+        ~prepared_statement()
+        {
+            int res = sqlite3_finalize(stmt_);
             if (res != SQLITE_OK)
             {
-               std::cerr << "ERR:" << res << "\n";     
+                std::cerr << "ERR:" << res << "\n";     
             }
-         }
+        }
          
-         bool insert_record(record_type const& rec) const
-         {  
+        bool insert_record(record_type const& rec) const
+        {  
 #ifdef MAPNIK_DEBUG
             assert( unsigned(sqlite3_bind_parameter_count(stmt_)) == rec.size());
 #endif
@@ -167,23 +167,23 @@ namespace mapnik {  namespace sqlite {
             int count = 1;
             for (; itr!=end;++itr)
             {
-               binder op(stmt_,count++);
-               if (!boost::apply_visitor(op,*itr))
-               {
-                  return false;
-               }
+                binder op(stmt_,count++);
+                if (!boost::apply_visitor(op,*itr))
+                {
+                    return false;
+                }
             }
             
             sqlite3_step(stmt_);
             sqlite3_reset(stmt_);
 
             return true;
-         }
+        }
 
-      private:
-         sqlite3 * db_;
-         sqlite3_stmt * stmt_;
-      };
-   }
+    private:
+        sqlite3 * db_;
+        sqlite3_stmt * stmt_;
+    };
+    }
 }
 
diff --git a/utils/shapeindex/SConscript b/utils/shapeindex/SConscript
deleted file mode 100644
index eab0f22..0000000
--- a/utils/shapeindex/SConscript
+++ /dev/null
@@ -1,53 +0,0 @@
-#
-# This file is part of Mapnik (c++ mapping toolkit)
-#
-# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-# $Id$
-
-import glob
-
-Import ('env')
-
-prefix = env['PREFIX']
-install_prefix = env['DESTDIR'] + '/' + prefix
-
-source = Split(
-    """
-    shapeindex.cpp
-    #src/envelope.cpp
-    #plugins/input/shape/shapefile.cpp
-    """
-    )
-
-headers = ['#plugins/input/shape'] + env['CPPPATH'] 
-
-boost_program_options = 'boost_program_options%s' % env['BOOST_APPEND']
-boost_iostreams  = 'boost_iostreams%s' % env['BOOST_APPEND']
-boost_filesystem = 'boost_filesystem%s' % env['BOOST_APPEND']
-libraries =  [boost_program_options,boost_iostreams,boost_filesystem]
-
-boost_system = 'boost_system%s' % env['BOOST_APPEND']
-
-if env['HAS_BOOST_SYSTEM']:
-    libraries.append(boost_system)
-
-
-shapeindex = env.Program('shapeindex', source, CPPPATH=headers, LIBS=libraries)
-
-env.Install(install_prefix + '/bin', shapeindex)
-env.Alias('install', install_prefix + '/bin')
diff --git a/utils/shapeindex/build.py b/utils/shapeindex/build.py
new file mode 100644
index 0000000..d23e639
--- /dev/null
+++ b/utils/shapeindex/build.py
@@ -0,0 +1,56 @@
+#
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+import os
+import glob
+
+Import ('env')
+
+program_env = env.Clone()
+
+source = Split(
+    """
+    shapeindex.cpp
+    """
+    )
+
+source += program_env.Object('box2d-static', '#src/box2d.cpp')
+
+headers = ['#plugins/input/shape'] + env['CPPPATH'] 
+
+boost_program_options = 'boost_program_options%s' % env['BOOST_APPEND']
+boost_filesystem = 'boost_filesystem%s' % env['BOOST_APPEND']
+libraries =  [boost_program_options, boost_filesystem]
+
+boost_system = 'boost_system%s' % env['BOOST_APPEND']
+
+if env['HAS_BOOST_SYSTEM']:
+    libraries.append(boost_system)
+
+shapeindex = program_env.Program('shapeindex', source, CPPPATH=headers, LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS'])
+
+Depends(shapeindex, env.subst('../../src/%s' % env['MAPNIK_LIB_NAME']))
+
+if 'uninstall' not in COMMAND_LINE_TARGETS:
+    env.Install(os.path.join(env['INSTALL_PREFIX'],'bin'), shapeindex)
+    env.Alias('install', os.path.join(env['INSTALL_PREFIX'],'bin'))
+
+env['create_uninstall_target'](env, os.path.join(env['INSTALL_PREFIX'],'bin','shapeindex'))
\ No newline at end of file
diff --git a/utils/shapeindex/quadtree.hpp b/utils/shapeindex/quadtree.hpp
index ba67628..e12a400 100644
--- a/utils/shapeindex/quadtree.hpp
+++ b/utils/shapeindex/quadtree.hpp
@@ -29,46 +29,46 @@
 #include <fstream>
 #include <iostream>
 // mapnik
-#include <mapnik/envelope.hpp>
+#include <mapnik/box2d.hpp>
 
-using mapnik::Envelope;
+using mapnik::box2d;
 using mapnik::coord2d;
 
 template <typename T>
 struct quadtree_node
 {
-      Envelope<double> ext_;
-      std::vector<T> data_;
-      quadtree_node<T>* children_[4];
-      quadtree_node(const Envelope<double>& ext)
-         : ext_(ext),data_()
-      {
-         memset(children_,0,sizeof(quadtree_node<T>*)*4);
-      }
+    box2d<double> ext_;
+    std::vector<T> data_;
+    quadtree_node<T>* children_[4];
+    quadtree_node(const box2d<double>& ext)
+        : ext_(ext),data_()
+    {
+        memset(children_,0,sizeof(quadtree_node<T>*)*4);
+    }
 
-      ~quadtree_node() 
-      {
-         for (int i=0;i<4;++i) 
-         {
+    ~quadtree_node() 
+    {
+        for (int i=0;i<4;++i) 
+        {
             if (children_[i]) 
             {
-               delete children_[i],children_[i]=0;
+                delete children_[i],children_[i]=0;
             }
-         }
-      }
+        }
+    }
 
-      int num_subnodes() const 
-      {
-         int count=0;
-         for (int i=0;i<4;++i) 
-         {
+    int num_subnodes() const 
+    {
+        int count=0;
+        for (int i=0;i<4;++i) 
+        {
             if (children_[i]) 
             {
-               ++count;
+                ++count;
             }
-         }
-         return count;
-      }     
+        }
+        return count;
+    }     
 };
 
 template <typename T>
@@ -79,7 +79,7 @@ private:
     const int maxdepth_;
     const double ratio_;
 public:
-    quadtree(const Envelope<double>& extent,int maxdepth,double ratio)
+    quadtree(const box2d<double>& extent,int maxdepth,double ratio)
         : root_(new quadtree_node<T>(extent)),
           maxdepth_(maxdepth),
           ratio_(ratio) {}
@@ -89,7 +89,7 @@ public:
         if (root_) delete root_;
     }
     
-    void insert(const T& data,const Envelope<double>& item_ext)
+    void insert(const T& data,const box2d<double>& item_ext)
     {
         insert(data,item_ext,root_,maxdepth_);
     }
@@ -137,8 +137,8 @@ private:
         if (node) 
         {
             for (int i=0;i<4;++i)
-            {	
-                trim_tree(node->children_[i]);	
+            {   
+                trim_tree(node->children_[i]);  
             }
 
             if (node->num_subnodes()==1 && node->data_.size()==0)
@@ -148,10 +148,10 @@ private:
                     if (node->children_[i])
                     {   
                         node=node->children_[i];
-                        break;	
+                        break;  
                     }
                 }
-            }	
+            }   
         }
     }
 
@@ -191,7 +191,7 @@ private:
         {
             if (node->children_[i])
             {
-                offset +=sizeof(Envelope<double>)+(node->children_[i]->data_.size()*sizeof(T))+3*sizeof(int);
+                offset +=sizeof(box2d<double>)+(node->children_[i]->data_.size()*sizeof(T))+3*sizeof(int);
                 offset +=subnode_offset(node->children_[i]);
             }
         }
@@ -204,11 +204,11 @@ private:
         {
             int offset=subnode_offset(node);
             int shape_count=node->data_.size();
-            int recsize=sizeof(Envelope<double>) + 3 * sizeof(int) + shape_count * sizeof(T);
+            int recsize=sizeof(box2d<double>) + 3 * sizeof(int) + shape_count * sizeof(T);
             char* node_record=new char[recsize];
             memset(node_record,0,recsize);
             memcpy(node_record,&offset,4);
-            memcpy(node_record+4,&node->ext_,sizeof(Envelope<double>));
+            memcpy(node_record+4,&node->ext_,sizeof(box2d<double>));
             memcpy(node_record+36,&shape_count,4);
             for (int i=0;i<shape_count;++i)
             {
@@ -258,7 +258,7 @@ private:
         }
     }
 
-    void insert(const T& data,const Envelope<double>& item_ext,quadtree_node<T>*  node,int maxdepth)
+    void insert(const T& data,const box2d<double>& item_ext,quadtree_node<T>*  node,int maxdepth)
     {
         if (node && node->ext_.contains(item_ext))
         {
@@ -272,11 +272,11 @@ private:
             double hix=node->ext_.maxx();
             double hiy=node->ext_.maxy();
 
-            Envelope<double> ext[4];
-            ext[0]=Envelope<double>(lox,loy,lox + width * ratio_,loy + height * ratio_);
-            ext[1]=Envelope<double>(hix - width * ratio_,loy,hix,loy + height * ratio_);
-            ext[2]=Envelope<double>(lox,hiy - height*ratio_,lox + width * ratio_,hiy);
-            ext[3]=Envelope<double>(hix - width * ratio_,hiy - height*ratio_,hix,hiy);
+            box2d<double> ext[4];
+            ext[0]=box2d<double>(lox,loy,lox + width * ratio_,loy + height * ratio_);
+            ext[1]=box2d<double>(hix - width * ratio_,loy,hix,loy + height * ratio_);
+            ext[2]=box2d<double>(lox,hiy - height*ratio_,lox + width * ratio_,hiy);
+            ext[3]=box2d<double>(hix - width * ratio_,hiy - height*ratio_,hix,hiy);
 
             if (maxdepth > 1)
             {
diff --git a/utils/shapeindex/shapeindex.cpp b/utils/shapeindex/shapeindex.cpp
index 1d234e1..02da0b9 100644
--- a/utils/shapeindex/shapeindex.cpp
+++ b/utils/shapeindex/shapeindex.cpp
@@ -65,13 +65,13 @@ int main (int argc,char** argv)
             ("ratio,r",po::value<double>(),"split ratio (default 0.55)")
             ("shape_files",po::value<vector<string> >(),"shape files to index: file1 file2 ...fileN")
             ;
-	
+        
         po::positional_options_description p;
         p.add("shape_files",-1);
         po::variables_map vm;        
         po::store(po::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
         po::notify(vm);
-	
+        
         if (vm.count("version"))
         {
             clog<<"version 0.3.0" <<std::endl;
@@ -83,6 +83,10 @@ int main (int argc,char** argv)
             clog << desc << endl;
             return 1;
         }
+        if (vm.count("verbose")) 
+        {
+            verbose = true;
+        }
         if (vm.count("depth"))
         {
             depth = vm["depth"].as<unsigned int>();
@@ -91,7 +95,7 @@ int main (int argc,char** argv)
         {
             ratio = vm["ratio"].as<double>();
         }
-	
+        
         if (vm.count("shape_files"))
         {
             shape_files=vm["shape_files"].as< vector<string> >();
@@ -115,13 +119,13 @@ int main (int argc,char** argv)
     while (itr != shape_files.end())
     {
         clog << "processing " << *itr << endl;
-        //shape_file shp;
         std::string shapename (*itr++);
+        boost::algorithm::ireplace_last(shapename,".shp","");
         std::string shapename_full (shapename+".shp");
 
         if (! boost::filesystem::exists (shapename_full))
         {
-            clog << "error : file " << shapename_full << " doesn't exists" << endl;
+            clog << "error : file " << shapename_full << " does not exist" << endl;
             continue;
         }
 
@@ -135,40 +139,40 @@ int main (int argc,char** argv)
         int code = shp.read_xdr_integer(); //file_code == 9994
         clog << code << endl;
         shp.skip(5*4); 
-	
+        
         int file_length=shp.read_xdr_integer();
         int version=shp.read_ndr_integer();
         int shape_type=shp.read_ndr_integer();
-        Envelope<double> extent;
+        box2d<double> extent;
         shp.read_envelope(extent);
-	
+        
+        
         clog << "length=" << file_length << endl;
         clog << "version=" << version << endl;
         clog << "type=" << shape_type << endl;
         clog << "extent:" << extent << endl;
-	  
+          
         int pos=50;
         shp.seek(pos*2);  
         quadtree<int> tree(extent,depth,ratio);
         int count=0;
         while (true) {
-	    
+            
             long offset=shp.pos();
             int record_number=shp.read_xdr_integer();
             int content_length=shp.read_xdr_integer();
-#ifdef MAPNIK_DEBUG            
-            std::clog << "rec number = "<< record_number << "\n";
-            std::clog << "content length = "<< content_length << "\n";
-	    std::clog << "offset= "<< offset << std::endl;
-#endif
-            shp.skip(4);	        
-            Envelope<double> item_ext;
-            if (shape_type==shape_io::shape_point)
+            shape_type = shp.read_ndr_integer();    
+            box2d<double> item_ext;
+            if (shape_type==shape_io::shape_null)
+            {
+                continue;
+            }
+            else if (shape_type==shape_io::shape_point)
             {
                 double x=shp.read_double();
                 double y=shp.read_double();
-                item_ext=Envelope<double>(x,y,x,y);
-	
+                item_ext=box2d<double>(x,y,x,y);
+        
             }
             else if (shape_type==shape_io::shape_pointm)
             {
@@ -176,8 +180,8 @@ int main (int argc,char** argv)
                 double y=shp.read_double();
                 // skip m
                 shp.read_double();
-                item_ext=Envelope<double>(x,y,x,y);
-	
+                item_ext=box2d<double>(x,y,x,y);
+        
             }
             else if (shape_type==shape_io::shape_pointz)
             {
@@ -190,9 +194,9 @@ int main (int argc,char** argv)
                 {
                     shp.read_double();
                 }
-                item_ext=Envelope<double>(x,y,x,y);
+                item_ext=box2d<double>(x,y,x,y);
             }
-	
+        
             else 
             {   
                 shp.read_envelope(item_ext);
@@ -211,8 +215,7 @@ int main (int argc,char** argv)
                 break;
             }  
         } 
-        shp.close();
-  
+        
         clog << " number shapes=" << count << endl;  
     
         std::fstream file((shapename+".index").c_str(),
diff --git a/utils/svg2png/build.py b/utils/svg2png/build.py
new file mode 100644
index 0000000..0cba8d0
--- /dev/null
+++ b/utils/svg2png/build.py
@@ -0,0 +1,50 @@
+#
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+import os
+import glob
+from copy import copy
+
+Import ('env')
+
+program_env = env.Clone()
+
+source = Split(
+    """
+    svg2png.cpp
+    """
+    )
+
+headers = env['CPPPATH'] 
+
+libraries =  copy(env['LIBMAPNIK_LIBS'])
+boost_program_options = 'boost_program_options%s' % env['BOOST_APPEND']
+libraries.extend([boost_program_options,'mapnik2'])
+
+svg2png = program_env.Program('svg2png', source, CPPPATH=headers, LIBS=libraries, LINKFLAGS=env['CUSTOM_LDFLAGS'])
+
+Depends(svg2png, env.subst('../../src/%s' % env['MAPNIK_LIB_NAME']))
+
+if 'uninstall' not in COMMAND_LINE_TARGETS:
+    env.Install(os.path.join(env['INSTALL_PREFIX'],'bin'), svg2png)
+    env.Alias('install', os.path.join(env['INSTALL_PREFIX'],'bin'))
+
+env['create_uninstall_target'](env, os.path.join(env['INSTALL_PREFIX'],'bin','svg2png'))
diff --git a/utils/svg2png/svg2png.cpp b/utils/svg2png/svg2png.cpp
new file mode 100644
index 0000000..c00e441
--- /dev/null
+++ b/utils/svg2png/svg2png.cpp
@@ -0,0 +1,165 @@
+/*****************************************************************************
+ * 
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2010 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#include <iostream>
+#include <sstream>
+#include <vector>
+//#include <string>
+
+#include <mapnik/marker.hpp>
+#include <mapnik/marker_cache.hpp>
+#include <mapnik/image_util.hpp>
+#include <mapnik/graphics.hpp>
+#include <mapnik/svg/svg_path_adapter.hpp>
+#include <mapnik/svg/svg_renderer.hpp>
+#include <mapnik/svg/svg_path_attributes.hpp>
+
+#include <boost/algorithm/string.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <boost/program_options.hpp>
+
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_basics.h"
+#include "agg_rendering_buffer.h"
+#include "agg_renderer_base.h"
+#include "agg_pixfmt_rgba.h"
+#include "agg_scanline_u.h"
+
+
+int main (int argc,char** argv) 
+{
+    namespace po = boost::program_options;
+    
+    bool verbose=false;
+    std::vector<std::string> svg_files;
+    
+    try
+    {
+        po::options_description desc("svg2png utility");
+        desc.add_options()
+            ("help,h", "produce usage message")
+            ("version,V","print version string")
+            ("verbose,v","verbose output")
+            ("svg",po::value<std::vector<std::string> >(),"svg file to read")
+            ;
+        
+        po::positional_options_description p;
+        p.add("svg",-1);
+        po::variables_map vm;        
+        po::store(po::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
+        po::notify(vm);
+
+        if (vm.count("version"))
+        {
+            std::clog<<"version 0.3.0" << std::endl;
+            return 1;
+        }
+
+        if (vm.count("help")) 
+        {
+            std::clog << desc << std::endl;
+            return 1;
+        }
+        if (vm.count("verbose")) 
+        {
+            verbose = true;
+        }
+
+        if (vm.count("svg"))
+        {
+            svg_files=vm["svg"].as< std::vector<std::string> >();
+        }
+        else
+        {
+            std::clog << "please provide an svg file!" << std::endl;
+            return -1;
+        }
+
+        std::vector<std::string>::const_iterator itr = svg_files.begin();
+        if (itr == svg_files.end())
+        {
+            std::clog << "no svg files to render" << std::endl;
+            return 0;
+        }
+        while (itr != svg_files.end())
+        {
+
+            std::string svg_name (*itr++);
+
+            boost::optional<mapnik::marker_ptr> marker_ptr = mapnik::marker_cache::instance()->find(svg_name, false);
+            if (marker_ptr) {
+            
+                mapnik::marker marker  = **marker_ptr;
+                if (marker.is_vector()) {
+    
+                    typedef agg::pixfmt_rgba32_plain pixfmt;
+                    typedef agg::renderer_base<pixfmt> renderer_base;
+                    typedef agg::renderer_scanline_aa_solid<renderer_base> renderer_solid;
+                    agg::rasterizer_scanline_aa<> ras_ptr;
+                    agg::scanline_u8 sl;
+
+                    double opacity = 1;
+                    double scale_factor_ = .95;
+                    int w = marker.width();
+                    int h = marker.height();
+                    mapnik::image_32 im(w,h);
+                    agg::rendering_buffer buf(im.raw_data(), w, h, w * 4);
+                    pixfmt pixf(buf);
+                    renderer_base renb(pixf);
+
+                    mapnik::box2d<double> const& bbox = (*marker.get_vector_data())->bounding_box();
+                    mapnik::coord<double,2> c = bbox.center();
+                    // center the svg marker on '0,0'
+                    agg::trans_affine mtx = agg::trans_affine_translation(-c.x,-c.y);
+                    // apply symbol transformation to get to map space
+                    mtx *= agg::trans_affine_scaling(scale_factor_);
+                    // render the marker at the center of the marker box
+                    mtx.translate(0.5 * w, 0.5 * h);
+
+                    mapnik::svg::vertex_stl_adapter<mapnik::svg::svg_path_storage> stl_storage((*marker.get_vector_data())->source());
+                    mapnik::svg::svg_path_adapter svg_path(stl_storage);
+                    mapnik::svg::svg_renderer<mapnik::svg::svg_path_adapter,
+                                 agg::pod_bvector<mapnik::svg::path_attributes>,
+                                 renderer_solid,
+                                 agg::pixfmt_rgba32_plain > svg_renderer_this(svg_path,
+                                         (*marker.get_vector_data())->attributes());
+
+                    svg_renderer_this.render(ras_ptr, sl, renb, mtx, opacity, bbox);
+
+                    boost::algorithm::ireplace_last(svg_name,".svg",".png");
+                    mapnik::save_to_file<mapnik::image_data_32>(im.data(),svg_name,"png");
+                    std::ostringstream s;
+                    s << "open " << svg_name;
+                    return system(s.str().c_str());
+                }
+            }
+        }
+    }
+    catch (...)
+    {
+        std::clog << "Exception of unknown type!" << std::endl;
+        return -1;
+    }
+
+    return 0;
+}
+
diff --git a/utils/upgrade_map_xml/build.py b/utils/upgrade_map_xml/build.py
new file mode 100644
index 0000000..2818798
--- /dev/null
+++ b/utils/upgrade_map_xml/build.py
@@ -0,0 +1,31 @@
+#
+# This file is part of Mapnik (c++ mapping toolkit)
+#
+# Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
+#
+# Mapnik is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# $Id$
+
+import os
+Import ('env')
+
+target = os.path.join(env['INSTALL_PREFIX'],'bin')
+
+if 'uninstall' not in COMMAND_LINE_TARGETS:
+    env.Install(target,'upgrade_map_xml.py')
+    env.Alias('install', os.path.join(env['INSTALL_PREFIX'],'bin'))
+
+env['create_uninstall_target'](env, os.path.join(target,'upgrade_map_xml.py'))
diff --git a/utils/upgrade_map_xml/upgrade_map_xml.py b/utils/upgrade_map_xml/upgrade_map_xml.py
new file mode 100755
index 0000000..1a69450
--- /dev/null
+++ b/utils/upgrade_map_xml/upgrade_map_xml.py
@@ -0,0 +1,278 @@
+#!/usr/bin/env python
+
+import os
+import re
+import sys
+import optparse
+import tempfile
+
+__version__ = '0.1.0'
+
+HAS_LXML = False
+
+try:
+    import lxml.etree as etree
+    HAS_LXML = True
+except ImportError:
+    try:
+        import elementtree.ElementTree as etree
+    except ImportError:
+        import xml.etree.ElementTree as etree
+
+def color_text(color, text):
+    if os.name == 'nt':
+        return text
+    return "\033[9%sm%s\033[0m" % (color,text)
+
+def indent(elem, level=0):
+    """ http://infix.se/2007/02/06/gentlemen-indent-your-xml
+    """
+    i = "\n" + level*"  "
+    if len(elem):
+        if not elem.text or not elem.text.strip():
+            elem.text = i + "  "
+        for e in elem:
+            indent(e, level+1)
+            if not e.tail or not e.tail.strip():
+                e.tail = i + "  "
+        if not e.tail or not e.tail.strip():
+            e.tail = i
+    else:
+        if level and (not elem.tail or not elem.tail.strip()):
+            elem.tail = i
+            
+def name2expr(sym):
+    if 'name' not in sym.attrib: return
+    name = sym.attrib['name']
+    if re.match('^\[.*\]',name) is None \
+        and '[' not in name \
+        and ']' not in name \
+        and not name.startswith("'") \
+        and not name.endswith("'") \
+        and re.match("^\'.*\'",name) is None:
+            print>>sys.stderr,"Fixing %s" % name
+            name = '[%s]' % name
+    sym.attrib.pop('name')
+    sym.text = name
+
+def handle_attr_changes(sym):
+    # http://www.w3schools.com/css/pr_text_text-transform.asp
+    # http://code.google.com/p/mapnik-utils/issues/detail?id=32&colspec=ID%20Type%20Status%20Priority%20Component%20Owner%20Summary
+    text_convert = sym.attrib.get('text_convert',sym.attrib.get('text_transform',sym.attrib.get('text_transform')))
+    if text_convert:
+        # note: css supports text-transform:capitalize but Mapnik does not (yet)
+        t_ = {'tolower':'lowercase','toupper':'uppercase','none':'none'}
+        new = t_.get(text_convert)
+        if new:
+            sym.attrib['text-transform'] = new
+        else:
+            sym.attrib['text-transform'] = text_convert
+        if sym.attrib.get('text_convert'):
+            sym.attrib.pop('text_convert')
+        if sym.attrib.get('text_transform'):
+            sym.attrib.pop('text_transform')
+    
+    # http://trac.mapnik.org/ticket/807
+    justify_alignment = sym.attrib.get('justify_alignment',sym.attrib.get('justify-alignment'))
+    if justify_alignment and justify_alignment == "middle":
+        sym.attrib['justify-alignment'] = 'center'    
+    
+    minimum_distance = sym.attrib.get('min_distance')
+    if minimum_distance:
+        sym.attrib['minimum-distance'] = minimum_distance
+        sym.attrib.pop('min_distance')
+
+    minimum_padding = sym.attrib.get('min_padding')
+    if minimum_padding:
+        sym.attrib['minimum-padding'] = minimum_padding
+        sym.attrib.pop('min_padding')
+
+def fixup_sym_with_image(sym):
+    if sym.attrib.get('width'):
+        sym.attrib.pop('width')
+    if sym.attrib.get('height'):
+        sym.attrib.pop('height')
+    if sym.attrib.get('type'):
+        sym.attrib.pop('type')
+
+def fixup_sym_attributes(sym):
+    if len(sym.findall('CssParameter')):
+        # copy, so we don't loose after clear()
+        attrib = dict(sym.attrib)
+        for css in sym.findall('CssParameter'):
+            key = css.attrib.get('name')
+            value = css.text
+            attrib[key] = value
+        sym.clear() # remove CssParameter elements
+        for k,v in attrib.items(): # insert attributes instead
+            sym.attrib[k] = v
+
+def underscore2dash(elem):
+    for i in elem.attrib.items():
+        if '_' in i[0]:
+           new = i[0].replace('_','-')
+           old = i[0]
+           elem.attrib[new] = i[1]
+           elem.attrib.pop(old)
+           print>>sys.stderr,"Changing %s to %s" % (old,new)
+
+
+def upgrade(input_xml,output_xml=None,indent_xml=True):
+
+    if not os.path.exists(input_xml):
+        sys.stderr.write('input xml "%s" does not exist' % input_xml)
+        sys.exit(1)
+    
+    pre_read = open(input_xml,'r')
+    if '!ENTITY' in pre_read.read() and not HAS_LXML:
+        sys.stderr.write('\nSorry, it appears the xml you are trying to upgrade has entities, which requires lxml (python bindings to libxml2)\n')
+        sys.stderr.write('Install lxml with: "easy_install lxml" or download from http://codespeak.net/lxml/\n')
+
+        sys.exit(1)        
+
+    try:
+        tree = etree.parse(input_xml)
+    except:
+        print 'Could not parse "%s" invalid XML' % input_xml
+        return
+    
+    if hasattr(tree,'xinclude'):
+        tree.xinclude()
+    root = tree.getroot()
+
+    # rename 'bgcolor' to 'background-color'
+    if root.attrib.get('bgcolor'):
+        root.attrib['background-color'] = root.attrib.get('bgcolor')
+        root.attrib.pop('bgcolor')
+    
+    # underscores to spaces for <Map ..>
+    underscore2dash(root)
+    
+    root.set('minimum-version', '0.7.2')
+    
+    # underscores to spaces for <FontSet ..>
+    fontset = root.findall('FontSet') or root.findall('*/FontSet')
+    for f in fontset:
+        font = f.findall('Font')
+        for f_ in font:
+            underscore2dash(f_)
+
+    # underscores to spaces for <Layer ..>
+    layers = root.findall('Layer') or root.findall('*/Layer')
+    for l in layers:
+        underscore2dash(l)
+    
+    
+    styles = root.findall('Style') or root.findall('*/Style')
+    if not len(styles):
+        sys.stderr.write('### Warning, no styles encountered and nothing able to be upgraded!\n')
+    else:
+        for style in styles:
+            for rule in style.findall('Rule'):
+                for sym in rule.findall('TextSymbolizer') or []:
+                    name2expr(sym)
+                    handle_attr_changes(sym)
+                    fixup_sym_attributes(sym)
+                    underscore2dash(sym)
+                for sym in rule.findall('ShieldSymbolizer') or []:
+                    name2expr(sym) 
+                    handle_attr_changes(sym)
+                    fixup_sym_attributes(sym)
+                    underscore2dash(sym)
+                    fixup_sym_with_image(sym)
+                for sym in rule.findall('PointSymbolizer') or []:
+                    fixup_sym_with_image(sym)
+                    fixup_sym_attributes(sym)
+                    underscore2dash(sym)
+                for sym in rule.findall('PolygonPatternSymbolizer') or []:
+                    fixup_sym_with_image(sym)
+                    fixup_sym_attributes(sym)
+                    underscore2dash(sym)
+                for sym in rule.findall('LinePatternSymbolizer') or []:
+                    fixup_sym_with_image(sym)
+                    fixup_sym_attributes(sym)
+                    underscore2dash(sym)
+                for sym in rule.findall('LineSymbolizer') or []:
+                    fixup_sym_attributes(sym)
+                    underscore2dash(sym)
+                for sym in rule.findall('PolygonSymbolizer') or []:
+                    fixup_sym_attributes(sym)
+                    underscore2dash(sym)
+                for sym in rule.findall('RasterSymbolizer') or []:
+                    fixup_sym_attributes(sym)
+                    underscore2dash(sym)
+                for sym in rule.findall('BuildingSymbolizer') or []:
+                    fixup_sym_attributes(sym)
+                    underscore2dash(sym)
+                for sym in rule.findall('GlyphSymbolizer') or []:
+                    fixup_sym_attributes(sym)
+                    underscore2dash(sym)
+                for sym in rule.findall('MarkersSymbolizer') or []:
+                    fixup_sym_attributes(sym)
+                    underscore2dash(sym)
+
+    if indent_xml:
+        indent(root)
+    
+    if output_xml:
+        tree.write(output_xml)
+    else:
+        tree.write(input_xml)
+
+parser = optparse.OptionParser(usage="""%prog <input xml> [options]
+
+Upgrade a Mapnik XML stylesheet to Mapnik 2.0
+
+Full help:
+ $ %prog -h (or --help for possible options)
+
+Read 'map.xml' and write new 'map2.xml'
+ $ %prog map.xml map2.xml
+
+Update 'map.xml' in place (*Careful*)
+ $ %prog map.xml --in-place
+
+""", version='%prog ' + __version__)
+
+parser.add_option('--indent',
+                  dest='indent_xml',
+                  action='store_true',
+                  default=False,
+                  help='Indent the resulting XML')
+
+parser.add_option('--in-place',
+                  dest='update_in_place',
+                  action='store_true',
+                  default=False,
+                  help='Update and overwrite the map in place')
+
+if __name__ == "__main__":
+
+    (options, args) = parser.parse_args()
+    if not len(args) > 0:
+        parser.error("Please provide the path to a map.xml and a new xml to write")
+    
+    input_xml = args[0]
+    output_xml = None
+
+    if len(args) < 3 and not options.update_in_place:
+        if len(args) == 2:
+            output_xml = args[1]
+            
+        if (len(args) == 1) or (input_xml == output_xml):
+            parser.error(color_text(1,'\n\nAre you sure you want to overwrite "%s"?\nIf so, then pass --in-place to confirm.\nOtherwise pass a different filename to write an upgraded copy to.\n' % input_xml))
+
+        print 'Upgrading "%s" to "%s"...' % (input_xml,output_xml)
+        upgrade(input_xml,output_xml=output_xml,indent_xml=options.indent_xml)
+    
+    elif len(args) == 1:
+        print 'Upgrading "%s"...' % (input_xml)
+        upgrade(input_xml,output_xml=output_xml,indent_xml=options.indent_xml)
+
+    elif len(args) > 1: # assume a list of inputs
+        found = []
+        for input_xml in args:
+            if os.path.exists(input_xml) and input_xml not in found:
+                print 'Upgrading "%s" in place...' % input_xml
+                found.append(input_xml)
+                upgrade(input_xml,output_xml=None,indent_xml=options.indent_xml)
diff --git a/utils/upgrade_map_xml/upgrade_map_xml_keep_ent.py b/utils/upgrade_map_xml/upgrade_map_xml_keep_ent.py
new file mode 100755
index 0000000..d51a3b2
--- /dev/null
+++ b/utils/upgrade_map_xml/upgrade_map_xml_keep_ent.py
@@ -0,0 +1,194 @@
+#!/usr/bin/env python
+import os
+import sys
+from lxml import etree
+from lxml import objectify
+import re
+import StringIO
+
+# APPROACH:
+# There is no way get the original DOCTYPE declaration with lxml, thus
+# first I have to get it with regular expressions, after updating
+# the xml it is appended under the xml declaration
+# 
+# A dummy_map tree is created to resolve some layers entities.
+# 
+# That is, the script looks into the includes folder and resolves the layer
+# entities manually to append them at the end of the xml tree 
+# and update them.
+
+# NOTE: It will only resolve entities that are declared like
+# <!ENTITY layer{-amenity-symbols} SYSTEM "layer-amenity-symbols.xml.inc">
+# 
+# If your entity name starts with `layer', the script will try to 
+# find a file where to extract from the layers to be updated
+dummy_map = """
+<Map>
+%s
+</Map>
+"""
+
+def name2expr(sym):
+    if 'name' not in sym.attrib: return
+    name = sym.attrib['name']
+    if re.match('^\[.*\]$',name) is None \
+        and '[' not in name \
+        and ']' not in name \
+        and not name.startswith("'") \
+        and not name.endswith("'") \
+        and re.match("^\'.*\'",name) is None:
+            print >> sys.stderr,"Fixing %s" % name
+            name = '[%s]' % name
+    sym.attrib.pop('name')
+    sym._setText(name)
+    
+def fixup_pointsym(sym):
+    if sym.attrib.get('width'):
+        sym.attrib.pop('width')
+    if sym.attrib.get('height'):
+        sym.attrib.pop('height')
+    if sym.attrib.get('type'):
+        sym.attrib.pop('type')
+
+def fixup_sym_attributes(sym):
+    if not hasattr(sym,'CssParameter'):
+        return
+    attrib = {}
+    for css in sym.CssParameter:
+        key = css.attrib.get('name')
+        value = css.text
+        attrib[key] = value
+    sym.clear() # remove CssParameter elements
+    for k,v in attrib.items(): # insert attributes instead
+        sym.attrib[k] = v
+    
+        
+if __name__ == "__main__":
+    
+    # Required parameters:
+    #   map_xml_file: outdated stylesheet file
+    #   output_file: new stylesheet file
+    #   includes folder
+
+    if len(sys.argv) < 4:
+        print >> sys.stderr,'Usage: %s <map_xml_file> <output_file> <includes_folder>' % sys.argv[0]
+        sys.exit(1)
+    xml = sys.argv[1]
+    
+    if sys.argv[3] is not None:
+        includes_folder = sys.argv[3]
+
+    # Get the good doctype with the unresolved external entities
+    # since it is forever lost once the xml is parsed
+    file = open(xml, 'r')
+    xml_string = file.read()
+    file.close()
+    match = re.match(r'(?ims).*DOCTYPE.*\[.*\]\>', xml_string)
+    good_doctype = ""
+    if match:
+        good_doctype = match.group()
+
+    # Two trees. One with the unresolved entities...
+    parser = objectify.makeparser(resolve_entities=False)    
+    # tree = objectify.parse(xml, parser=parser)
+    # root = tree.getroot()
+
+    # ...and another with the entities resolved.
+    # This dummy tree expands the entities that I found and puts them 
+    # in a dictionary (entity) => resolved_entity
+    # NOTE: `findall' makes the script very slow
+    
+    # First get the entities declared in the header
+    temp_xml = ''.join([good_doctype, dummy_map % '<dummy_tag></dummy_tag>'])
+    expanded_tree = objectify.parse(StringIO.StringIO(temp_xml))
+    expanded_tree_string = etree.tostring(expanded_tree, 
+                                          pretty_print=True,
+                                          xml_declaration=True,
+                                          encoding="utf-8")
+    match = re.match(r'(?ims).*DOCTYPE.*\[.*\]\>', expanded_tree_string)
+    resolved_doctype = ""
+    if match:
+        resolved_doctype = match.group()
+
+    doctype_entities = {}
+    # e.g.:
+    # <!ENTITY layer-amenity-symbols SYSTEM "layer-amenity-symbols.xml.inc">
+    for line in StringIO.StringIO(resolved_doctype).readlines():
+        entity_kv = re.match(r'(?ims)(.*ENTITY.*?(?P<entity_key>\b[a-z09].*?\b) .*\"(?P<entity_value>.*)\").*', line)
+        # Only consider internal entities
+        if (entity_kv is not None) and not (re.search("%", line)):
+            doctype_entities[''.join(['&',entity_kv.groupdict()['entity_key']])] = entity_kv.groupdict()['entity_value']
+
+    layer_entities = []
+    for entity in doctype_entities:
+        if re.search('layer', entity):
+            layer_entities.append(entity)
+
+
+    # Remove the layer entities
+    fixed_xml_string = xml_string
+    for layer in layer_entities:
+        pattern = '(?ims)%s;' % layer
+        fixed_xml_string = re.sub(pattern, '', fixed_xml_string)
+        print "removed ", layer
+
+    # Tree to be updated to be mapnik2 compliant
+    tree = objectify.parse(StringIO.StringIO(fixed_xml_string), parser=parser)
+    root = tree.getroot()
+            
+    for layer in layer_entities:
+        file = open("%s/%s" % (includes_folder, doctype_entities[layer]))
+        layer_xml_string = file.read()
+        file.close()
+
+        print "Found this layer:", layer
+        # Parse without resolving entities
+        layer_xml = ''.join([good_doctype, dummy_map % layer_xml_string])
+        layer_tree = objectify.parse(StringIO.StringIO(layer_xml), parser=parser)
+        layer_root = layer_tree.getroot()
+        layer_children = layer_root.getchildren()
+        # Append this layer's styles and layers to the tree to be updated
+        # print layer_children
+        root.extend(layer_children)
+
+    # Update the styles
+    for style in root.Style:
+        if len(style.Rule):
+            # fix [name] thing 
+            for rule in style.Rule:
+                if hasattr(rule,'TextSymbolizer'):
+                    for sym in rule.TextSymbolizer:
+                        name2expr(sym)
+                if hasattr(rule,'ShieldSymbolizer'):
+                    for sym in rule.ShieldSymbolizer:
+                        name2expr(sym)
+                if hasattr(rule,'PointSymbolizer'):
+                    for sym in rule.PointSymbolizer:
+                        fixup_pointsym(sym)
+                if hasattr(rule,'LineSymbolizer') :
+                    for sym in rule.LineSymbolizer:
+                        fixup_sym_attributes(sym)
+                if hasattr(rule,'PolygonSymbolizer') :
+                    for sym in rule.PolygonSymbolizer:
+                        fixup_sym_attributes(sym)
+                if hasattr(rule,'RasterSymbolizer') :
+                    for sym in rule.RasterSymbolizer:
+                        fixup_sym_attributes(sym)
+                if hasattr(rule,'BuildingSymbolizer') :
+                    for sym in rule.BuildingSymbolizer:
+                        fixup_sym_attributes(sym)
+                        
+    updated_xml = etree.tostring(tree,
+                                 pretty_print=True, 
+                                 xml_declaration=True,
+                                 encoding="utf-8",
+                                 standalone=True)
+
+    # Insert the original doctype declaration
+    fixed_updated_xml = re.sub(r'(?ims)^.*DOCTYPE.*\[.*\]\>', good_doctype, updated_xml)
+    
+    output_file = open(sys.argv[2], 'w')
+    output_file.write(fixed_updated_xml)
+    output_file.close()    
+    
+    # print fixed_updated_xml
diff --git a/utils/xml/mapnik2.dtd b/utils/xml/mapnik2.dtd
new file mode 100644
index 0000000..8cc7997
--- /dev/null
+++ b/utils/xml/mapnik2.dtd
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!ELEMENT Map (Datasource | FileSource | FontSet | Layer | Style)* >
+<!ATTLIST Map
+    bgcolor         CDATA    "transparent"
+    srs             CDATA    "+proj=latlong +datum=WGS84"
+    buffer_size     CDATA    "0"
+    minimum_version CDATA    #IMPLIED
+    paths_from_xml    (true|false) "true"
+>
+
+<!ELEMENT Datasource (Parameter)*>
+<!-- Template Variant -->
+<!-- name defaults to "Unnamed" -->
+<!ATTLIST Datasource
+    name            ID         #IMPLIED
+>
+
+<!-- General Form -->
+<!ATTLIST Datasource
+    base            IDREF    #IMPLIED
+>
+
+<!ELEMENT Parameter (#PCDATA)>
+<!-- gdal type: type, encoding?, band?, file, shared?
+     kismet type: type, encoding, estimate_extent?, extent?, host, port
+     occi type: type, encoding?, estimate_extent?, extent?, geometry_field?, host, initial_size?, max_size?,
+                multiple_geometries, password?, row_limit?, row_prefetch?, table, use_spatial_index?, user
+     ogr type: type, encoding?, file, layer, multiple_geometries
+     osm type: type, bbox, encoding?, file, parser?, url
+     postgis type: type, cursor_size?, dbname, estimate_extent?, extent?, extent_from_subquery?,
+                   geometry_field?, geometry_table?, host, initial_size?, max_size?, multiple_geometries?,
+                   password, persist_connection?, port, row_limit?, srid?, table, user
+     raster type: type, base?, file, format, lox, loy, hix, hiy
+     shape type: type, base?, encoding?, file
+     sqlite type: type, base, encoding?, extent?, file, geometry_field?, key_field?, metadata?,
+                  multiple_geometries?, row_offset?, row_limit?, table?, wkb_format?, use_spatial_index?
+  -->
+<!ATTLIST Parameter
+    name            (type|encoding|band|file|shared|estimate_extent|extent|host|port|
+            geometry_field|initial_size|max_size|multiple_geometries|password|row_limit|
+            row_prefetch|table|use_spatial_index|user|
+            layer|
+            bbox|parser|url|
+            cursor_size|dbname|extent_from_subquery|geometry_table|persist_connection|srid|
+            base|format|lox|loy|hix|hiy|
+            key_field|metadata|row_offset|wkb_format)    #REQUIRED
+>
+
+<!ELEMENT FileSource (#PCDATA)>
+<!ATTLIST FileSource
+          name        CDATA    #IMPLIED
+>
+
+<!ELEMENT FontSet (Font)*>
+<!ATTLIST FontSet
+          name        CDATA    #IMPLIED
+>
+
+<!ELEMENT Font EMPTY>
+<!ATTLIST Font
+          face_name        CDATA    #REQUIRED
+>
+
+<!ELEMENT Style (Rule)+>
+<!ATTLIST Style
+          name        ID        #REQUIRED
+>
+
+<!ELEMENT Layer (StyleName|Datasource)*>
+<!-- FIXME: queryable true/false ? -->
+<!ATTLIST Layer
+        abstract            CDATA    #IMPLIED
+        clear_label_cache    (yes|1|no|0)    #IMPLIED
+        minzoom                CDATA    "0"
+        maxzoom                CDATA    #IMPLIED
+        name                CDATA    #IMPLIED
+        queryable            (true|on|1|false|off|0)    "0"
+        srs                    CDATA    #IMPLIED
+        status                (on|1|off|0)    "1"
+        title                CDATA    ""
+        tolerance            CDATA    #IMPLIED
+        toleranceunits        CDATA    #IMPLIED
+>
+
+<!ELEMENT StyleName (#PCDATA)>
+
+<!ELEMENT Rule ((Filter|ElseFilter)|MaxScaleDenominator|MinScaleDenominator|
+                  BuildingSymbolizer|PointSymbolizer|LineSymbolizer|PolygonSymbolizer|PolygonPatternSymbolizer|
+                  LinePatternSymbolizer|MarkersSymbolizer|RasterSymbolizer|ShieldSymbolizer|TextSymbolizer)*>
+<!-- FIXME: MapnikXMLDescription.pdf specified name is required?  -->
+<!ATTLIST Rule
+          name        CDATA    #IMPLIED
+          title        CDATA    #IMPLIED
+>
+
+<!ELEMENT Filter (#PCDATA)>
+<!ELEMENT ElseFilter (#PCDATA)>
+<!ELEMENT MaxScaleDenominator (#PCDATA)>
+<!ELEMENT MinScaleDenominator (#PCDATA)>
+
+<!ELEMENT BuildingSymbolizer (CssParameter)*>
+<!ELEMENT CssParameter (#PCDATA)>
+<!ATTLIST CssParameter
+          name    (fill|fill-opacity|height
+                  |stroke|stroke-width|stroke-opacity|stroke-linejoin|stroke-linecap|stroke-dasharray
+                  |gamma
+                  |mode|opacity|scaling)    #IMPLIED
+>
+
+<!ELEMENT PointSymbolizer EMPTY>
+<!ATTLIST PointSymbolizer
+          allow_overlap    (yes|true|1|no|false|0)     "0"
+          base            IDREF    #IMPLIED
+          file            CDATA    #IMPLIED
+          height            CDATA    #IMPLIED
+          opacity            CDATA    #IMPLIED
+          type            (tiff|png)    #IMPLIED
+          width            CDATA    #IMPLIED
+>
+
+<!ELEMENT LineSymbolizer (CssParameter)*>
+
+<!ELEMENT LinePatternSymbolizer EMPTY>
+<!ATTLIST LinePatternSymbolizer
+        base    IDREF        #IMPLIED
+        file    CDATA        #REQUIRED
+        height    CDATA        #REQUIRED
+        type    (tiff|png)    #REQUIRED
+        width    CDATA        #REQUIRED
+>
+
+<!ELEMENT TextSymbolizer EMPTY>
+<!-- FIXME: MapnikXMLDescription: horizontal_alignment "bottom" -> "middle"? -->
+<!-- FIXME: label_position_tolerance not available in XML -->
+<!-- FIXME: text_ratio not available in XML -->
+<!ATTLIST TextSymbolizer
+        avoid_edges            (true|false)    "false"
+        allow_overlap        (true|false)     "false"
+        character_spacing    CDATA            "0"
+        dx                    CDATA            "0"
+        dy                    CDATA            "0"
+        face_name            CDATA            #IMPLIED
+        fontset_name        IDREF            #IMPLIED
+        fill                CDATA            "black"
+        force_odd_labels    (true|false)    "false"
+        halo_fill            CDATA            "white"
+        halo_radius            CDATA            "0"
+        horizontal_alignment    (left|middle|right)    "left"
+        justify_alignment        (left|middle|right)    "middle"
+        label_position_tolerance    CDATA    "0"
+        line_spacing        CDATA            "0"
+        max_char_angle_delta    CDATA        #IMPLIED
+        min_distance        CDATA            "0"
+        name                CDATA            #IMPLIED
+        opacity                CDATA            "1.0"
+        placement            (point|line)        "point"
+        size                CDATA            "10"
+        spacing                CDATA            "0"
+        text_convert        (none|toupper|tolower)    "none"
+        text_ratio            CDATA            #IMPLIED
+        vertical_alignment    (top|middle|bottom)    "middle"
+        wrap_before            (true|false)    "false"
+        wrap_character        CDATA            " "
+        wrap_width            CDATA            "0"
+>
+
+<!ELEMENT MarkersSymbolizer EMPTY>
+<!ATTLIST MarkersSymbolizer
+        allow_overlap    (yes|true|1|no|false|0)     "0"
+>
+
+<!ELEMENT PolygonSymbolizer (CssParameter)*>
+
+<!ELEMENT RasterSymbolizer (CssParameter)*>
+
+<!-- FIXME: MapnikXMLDescription: horizontal_alignment "bottom" -> "middle"? -->
+<!ELEMENT ShieldSymbolizer EMPTY>
+<!ATTLIST ShieldSymbolizer
+        allow_overlap    (true|false)     "false"
+        avoid_edges        (true|false)    "false"
+        unlock_image    (true|false)    "false"
+        opacity            CDATA            "1.0"
+        
+        base            IDREF            #IMPLIED
+        file            CDATA            #REQUIRED
+        height            CDATA            #REQUIRED
+        type            (tiff|png)        #REQUIRED
+        width            CDATA            #REQUIRED
+
+        character_spacing    CDATA        "0"
+        dx                CDATA            #IMPLIED
+        dy                CDATA            #IMPLIED
+        face_name        CDATA            #IMPLIED
+        fontset_name    IDREF            #IMPLIED
+        fill            CDATA            "black"
+        halo_fill        CDATA            "white"
+        halo_radius        CDATA            "0"
+        horizontal_alignment    (left|middle|right)    "middle"
+        justify_alignment        (left|middle|right)    "middle"
+        line_spacing    CDATA            "0"
+        min_distance    CDATA            "0"
+        name            CDATA            #IMPLIED
+        no_text            (true|false)    "false"
+        placement        (point|line|vertex)        "point"
+        size            CDATA            "10"
+        spacing            CDATA            "0"
+        text_convert    (none|toupper|tolower)    "none"
+        vertical_alignment    (top|middle|bottom)    "middle"
+        wrap_before        (true|false)    "false"
+        wrap_character    CDATA            " "
+        wrap_width        CDATA            "0"
+>
+
+<!ELEMENT PolygonPatternSymbolizer EMPTY>
+<!ATTLIST PolygonPatternSymbolizer
+        base            IDREF    #IMPLIED
+          file            CDATA    #IMPLIED
+          height            CDATA    #IMPLIED
+          type            (tiff|png)    #IMPLIED
+          width            CDATA    #IMPLIED
+>
diff --git a/workspace/mapnik.pro b/workspace/mapnik.pro
new file mode 100644
index 0000000..0736c8a
--- /dev/null
+++ b/workspace/mapnik.pro
@@ -0,0 +1,181 @@
+# -------------------------------------------------
+# QtCreator Project For Mapnik2
+# -------------------------------------------------
+QT -= core gui
+
+TARGET = mapnik2
+TEMPLATE = lib
+
+HEADERS += \
+    ../include/mapnik/svg/marker_cache.hpp \
+    ../include/mapnik/svg/svg_converter.hpp \
+    ../include/mapnik/svg/svg_parser.hpp \
+    ../include/mapnik/svg/svg_path_adapter.hpp \
+    ../include/mapnik/svg/svg_path_attributes.hpp \
+    ../include/mapnik/svg/svg_path_commands.hpp \
+    ../include/mapnik/svg/svg_path_grammar.hpp \
+    ../include/mapnik/svg/svg_path_parser.hpp \
+    ../include/mapnik/svg/svg_points_grammar.hpp \
+    ../include/mapnik/svg/svg_renderer.hpp \
+    ../include/mapnik/svg/svg_storage.hpp \
+    ../include/mapnik/svg/svg_transform_grammar.hpp \
+    ../include/mapnik/agg_renderer.hpp \
+    ../include/mapnik/agg_rasterizer.hpp \
+    ../include/mapnik/agg_renderer.hpp \
+    ../include/mapnik/arrow.hpp \
+    ../include/mapnik/attribute.hpp \
+    ../include/mapnik/attribute_collector.hpp \
+    ../include/mapnik/attribute_descriptor.hpp \
+    ../include/mapnik/box2d.hpp \
+    ../include/mapnik/cairo_renderer.hpp \
+    ../include/mapnik/color.hpp \
+    ../include/mapnik/color_factory.hpp \
+    ../include/mapnik/config.hpp \
+    ../include/mapnik/config_error.hpp \
+    ../include/mapnik/coord.hpp \
+    ../include/mapnik/coord_array.hpp \
+    ../include/mapnik/css_color_grammar.hpp \
+    ../include/mapnik/ctrans.hpp \
+    ../include/mapnik/datasource.hpp \
+    ../include/mapnik/datasource_cache.hpp \
+    ../include/mapnik/distance.hpp \
+    ../include/mapnik/ellipsoid.hpp \
+    ../include/mapnik/enumeration.hpp \
+    ../include/mapnik/expression_evaluator.hpp \
+    ../include/mapnik/expression_grammar.hpp \
+    ../include/mapnik/expression_node.hpp \
+    ../include/mapnik/expression_string.hpp \
+    ../include/mapnik/factory.hpp \
+    ../include/mapnik/feature.hpp \
+    ../include/mapnik/feature_factory.hpp \
+    ../include/mapnik/feature_layer_desc.hpp \
+    ../include/mapnik/feature_style_processor.hpp \
+    ../include/mapnik/feature_type_style.hpp \
+    ../include/mapnik/fill.hpp \
+    ../include/mapnik/filter_factory.hpp \
+    ../include/mapnik/filter_featureset.hpp \
+    ../include/mapnik/font_engine_freetype.hpp \
+    ../include/mapnik/font_set.hpp \
+    ../include/mapnik/gamma.hpp \
+    ../include/mapnik/geometry.hpp \
+    ../include/mapnik/geom_util.hpp \
+    ../include/mapnik/global.hpp \
+    ../include/mapnik/glyph_symbolizer.hpp \
+    ../include/mapnik/graphics.hpp \
+    ../include/mapnik/hextree.hpp \
+    ../include/mapnik/hit_test_filter.hpp \
+    ../include/mapnik/image_cache.hpp \
+    ../include/mapnik/image_data.hpp \
+    ../include/mapnik/image_reader.hpp \
+    ../include/mapnik/image_util.hpp \
+    ../include/mapnik/image_view.hpp \
+    ../include/mapnik/jpeg_io.hpp \
+    ../include/mapnik/label_collision_detector.hpp \
+    ../include/mapnik/label_placement.hpp \
+    ../include/mapnik/layer.hpp \
+    ../include/mapnik/libxml2_loader.hpp \
+    ../include/mapnik/line_pattern_symbolizer.hpp \
+    ../include/mapnik/line_symbolizer.hpp \
+    ../include/mapnik/load_map.hpp \
+    ../include/mapnik/map.hpp \
+    ../include/mapnik/markers_placement.hpp \
+    ../include/mapnik/markers_symbolizer.hpp \
+    ../include/mapnik/memory.hpp \
+    ../include/mapnik/memory_datasource.hpp \
+    ../include/mapnik/memory_featureset.hpp \
+    ../include/mapnik/octree.hpp \
+    ../include/mapnik/params.hpp \
+    ../include/mapnik/path_expression_grammar.hpp \
+    ../include/mapnik/placement_finder.hpp \
+    ../include/mapnik/plugin.hpp \
+    ../include/mapnik/png_io.hpp \
+    ../include/mapnik/point_symbolizer.hpp \
+    ../include/mapnik/polygon_pattern_symbolizer.hpp \
+    ../include/mapnik/polygon_symbolizer.hpp \
+    ../include/mapnik/pool.hpp \
+    ../include/mapnik/projection.hpp \
+    ../include/mapnik/proj_transform.hpp \
+    ../include/mapnik/ptree_helpers.hpp \
+    ../include/mapnik/quad_tree.hpp \
+    ../include/mapnik/query.hpp \
+    ../include/mapnik/raster.hpp \
+    ../include/mapnik/raster_colorizer.hpp \
+    ../include/mapnik/raster_symbolizer.hpp \
+    ../include/mapnik/rule.hpp \
+    ../include/mapnik/save_map.hpp \
+    ../include/mapnik/scale_denominator.hpp \
+    ../include/mapnik/shield_symbolizer.hpp \
+    ../include/mapnik/stroke.hpp \
+    ../include/mapnik/style.hpp \
+    ../include/mapnik/style_factory.hpp \
+    ../include/mapnik/symbolizer.hpp \
+    ../include/mapnik/text_path.hpp \
+    ../include/mapnik/text_symbolizer.hpp \
+    ../include/mapnik/unicode.hpp \
+    ../include/mapnik/utils.hpp \
+    ../include/mapnik/value.hpp \
+    ../include/mapnik/version.hpp \
+    ../include/mapnik/vertex.hpp \
+    ../include/mapnik/vertex_transform.hpp \
+    ../include/mapnik/vertex_vector.hpp \
+    ../include/mapnik/wall_clock_timer.hpp \
+    ../include/mapnik/wkb.hpp
+
+SOURCES += \
+    ../src/agg/process_markers_symbolizer.cpp \
+    ../src/agg/process_point_symbolizer.cpp \
+    ../src/agg/process_shield_symbolizer.cpp \
+    ../src/agg_renderer.cpp \
+    ../src/arrow.cpp \
+    ../src/box2d.cpp \
+    ../src/cairo_renderer.cpp \
+    ../src/color.cpp \
+    ../src/datasource_cache.cpp \
+    ../src/distance.cpp \
+    ../src/expression_string.cpp \
+    ../src/filter_factory.cpp \
+    ../src/font_engine_freetype.cpp \
+    ../src/font_set.cpp \
+    ../src/glyph_symbolizer.cpp \
+    ../src/graphics.cpp \
+    ../src/image_cache.cpp \
+    ../src/image_reader.cpp \
+    ../src/image_util.cpp \
+    ../src/jpeg_reader.cpp \
+    ../src/layer.cpp \
+    ../src/libxml2_loader.cpp \
+    ../src/line_pattern_symbolizer.cpp \
+    ../src/load_map.cpp \
+    ../src/map.cpp \
+    ../src/markers_cache.cpp \
+    ../src/markers_symbolizer.cpp \
+    ../src/memory.cpp \
+    ../src/memory_datasource.cpp \
+    ../src/params.cpp \
+    ../src/placement_finder.cpp \
+    ../src/plugin.cpp \
+    ../src/png_reader.cpp \
+    ../src/point_symbolizer.cpp \
+    ../src/polygon_pattern_symbolizer.cpp \
+    ../src/projection.cpp \
+    ../src/proj_transform.cpp \
+    ../src/save_map.cpp \
+    ../src/scale_denominator.cpp \
+    ../src/shield_symbolizer.cpp \
+    ../src/stroke.cpp \
+    ../src/svg_parser.cpp \
+    ../src/svg_path_parser.cpp \
+    ../src/svg_point_parser.cpp \
+    ../src/svg_transform_parser.cpp \
+    ../src/symbolizer.cpp \
+    ../src/text_symbolizer.cpp \
+    ../src/tiff_reader.cpp \
+    ../src/unicode.cpp \
+    ../src/wkb.cpp
+    
+include(plugins.pri)
+
+unix {
+    DEFINES += LINUX=1
+}
+
diff --git a/workspace/plugins.pri b/workspace/plugins.pri
new file mode 100644
index 0000000..54d1bb4
--- /dev/null
+++ b/workspace/plugins.pri
@@ -0,0 +1,83 @@
+
+HEADERS += \
+  $$PWD/../plugins/input/gdal/gdal_featureset.hpp \
+  $$PWD/../plugins/input/gdal/gdal_datasource.hpp \
+  $$PWD/../plugins/input/kismet/kismet_featureset.hpp \
+  $$PWD/../plugins/input/kismet/kismet_datasource.hpp \
+  $$PWD/../plugins/input/kismet/kismet_types.hpp \
+  $$PWD/../plugins/input/occi/occi_featureset.hpp \
+  $$PWD/../plugins/input/occi/occi_datasource.hpp \
+  $$PWD/../plugins/input/occi/occi_types.hpp \
+  $$PWD/../plugins/input/occi/spatial_classesh.h \
+  $$PWD/../plugins/input/occi/spatial_classesm.h \
+  $$PWD/../plugins/input/ogr/ogr_converter.hpp \
+  $$PWD/../plugins/input/ogr/ogr_featureset.hpp \
+  $$PWD/../plugins/input/ogr/ogr_datasource.hpp \
+  $$PWD/../plugins/input/ogr/ogr_feature_ptr.hpp \
+  $$PWD/../plugins/input/ogr/ogr_index.hpp \
+  $$PWD/../plugins/input/ogr/ogr_index_featureset.hpp \
+  $$PWD/../plugins/input/osm/basiccurl.h \
+  $$PWD/../plugins/input/osm/dataset_deliverer.h \
+  $$PWD/../plugins/input/osm/osm.h \
+  $$PWD/../plugins/input/osm/osmparser.h \
+  $$PWD/../plugins/input/osm/osmtagtypes.h \
+  $$PWD/../plugins/input/osm/osm_featureset.hpp \
+  $$PWD/../plugins/input/osm/osm_datasource.hpp \
+  $$PWD/../plugins/input/postgis/connection.hpp \
+  $$PWD/../plugins/input/postgis/connection_manager.hpp \
+  $$PWD/../plugins/input/postgis/cursorresultset.hpp \
+  $$PWD/../plugins/input/postgis/postgis.hpp \
+  $$PWD/../plugins/input/postgis/property_index.hpp \
+  $$PWD/../plugins/input/postgis/resultset.hpp \
+  $$PWD/../plugins/input/raster/raster_info.hpp \
+  $$PWD/../plugins/input/raster/raster_featureset.hpp \
+  $$PWD/../plugins/input/raster/raster_datasource.hpp \
+  $$PWD/../plugins/input/rasterlite/rasterlite_include.hpp \
+  $$PWD/../plugins/input/rasterlite/rasterlite_featureset.hpp \
+  $$PWD/../plugins/input/rasterlite/rasterlite_datasource.hpp \
+  $$PWD/../plugins/input/shape/dbffile.hpp \
+  $$PWD/../plugins/input/shape/shape.hpp \
+  $$PWD/../plugins/input/shape/shape_featureset.hpp \
+  $$PWD/../plugins/input/shape/shapefile.hpp \
+  $$PWD/../plugins/input/shape/shape_index_featureset.hpp \
+  $$PWD/../plugins/input/shape/shape_io.hpp \
+  $$PWD/../plugins/input/shape/shp_index.hpp \
+  $$PWD/../plugins/input/sqlite/sqlite_featureset.hpp \
+  $$PWD/../plugins/input/sqlite/sqlite_datasource.hpp \
+  $$PWD/../plugins/input/sqlite/sqlite_types.hpp
+
+SOURCES += \
+  $$PWD/../plugins/input/gdal/gdal_featureset.cpp \
+  $$PWD/../plugins/input/gdal/gdal_datasource.cpp \
+  $$PWD/../plugins/input/kismet/kismet_featureset.cpp \
+  $$PWD/../plugins/input/kismet/kismet_datasource.cpp \
+  $$PWD/../plugins/input/occi/occi_featureset.cpp \
+  $$PWD/../plugins/input/occi/occi_datasource.cpp \
+  $$PWD/../plugins/input/occi/occi_types.cpp \
+  $$PWD/../plugins/input/occi/spatial_classesm.cpp \
+  $$PWD/../plugins/input/occi/spatial_classeso.cpp \
+  $$PWD/../plugins/input/ogr/ogr_converter.cpp \
+  $$PWD/../plugins/input/ogr/ogr_featureset.cpp \
+  $$PWD/../plugins/input/ogr/ogr_datasource.cpp \
+  $$PWD/../plugins/input/ogr/ogr_index_featureset.hpp \
+  $$PWD/../plugins/input/osm/basiccurl.cpp \
+  $$PWD/../plugins/input/osm/dataset_deliverer.cpp \
+  $$PWD/../plugins/input/osm/osm.cpp \
+  $$PWD/../plugins/input/osm/osmparser.cpp \
+  $$PWD/../plugins/input/osm/osm_featureset.cpp \
+  $$PWD/../plugins/input/osm/osm_datasource.cpp \
+  $$PWD/../plugins/input/osm/render.cpp \
+  $$PWD/../plugins/input/postgis/postgis.cpp \
+  $$PWD/../plugins/input/postgis/postgisfs.cpp \
+  $$PWD/../plugins/input/raster/raster_info.cpp \
+  $$PWD/../plugins/input/raster/raster_featureset.cpp \
+  $$PWD/../plugins/input/raster/raster_datasource.cpp \
+  $$PWD/../plugins/input/rasterlite/rasterlite_featureset.cpp \
+  $$PWD/../plugins/input/rasterlite/rasterlite_datasource.cpp \
+  $$PWD/../plugins/input/shape/dbffile.cpp \
+  $$PWD/../plugins/input/shape/shape.cpp \
+  $$PWD/../plugins/input/shape/shape_featureset.cpp \
+  $$PWD/../plugins/input/shape/shape_index_featureset.cpp \
+  $$PWD/../plugins/input/shape/shape_io.cpp \
+  $$PWD/../plugins/input/sqlite/sqlite_featureset.cpp \
+  $$PWD/../plugins/input/sqlite/sqlite_datasource.cpp

-- 
C++/Python toolkit for developing GIS applications



More information about the Pkg-grass-devel mailing list